Щоб зробити розумний настільний футбол, нам знадобиться:
- звичайний дурний настільний футбол - 1шт.,
- контролер Arduino - 1шт.,
- лазер - 2шт.,
- фоторезистор - 2шт.,
- кілька зацікавлених людей,
- вільні вихідні.
У нашій компанії більшість співробітників не проти зіграти партійки в настільний футбол. Швидше навіть дуже люблять і, зрозуміло, однією партією справа не обмежується. Тому на обіді і ввечері біля столу збирається натовп чекають своєї черги айтішників.
І ось, одного разу, коли плутанина з чергою всім порядком набридла, нам в голову прийшла ідея:
- А давайте зробимо електронну чергу!
- І щоб стіл сам голи вважав!
- І міг визначити хто з нас крутіше!
- І смски нехай надсилає, що звільнився!
І всі розбіглися гуглити.
У п'ятницю ввечері група однодумців-футболопоклонніков зібралася біля винуватця торжества - столу - на нараду. Поділилися нагугленним, визначилися з основними вимогами і технологіями, розподілили ролі, покрутили в руках випрошений у начальства мікроконтролер.
Насамперед в суботу вранці розгвинтити стіл. Щоб навчити його відстежувати забиті голи, причепили 2 лазера і 2 фоторезистора на ворота і контролер Arduino посередині. Систему придумали таку: коли в область між лазером і фоторезистором потрапляє м'яч, контролер фіксує зміна напруги на сенсорі. Так, зміна напруги є наслідком зміни опору на фоторезистори. Принципова схема зображена нижче.
Незважаючи на граничну простоту системи, довелося все ж зіткнутися з деякими проблемами. По-перше, зміна освітлення в приміщенні з футбольним столом могло викликати хибно-позитивні спрацьовування датчиків. По-друге, особливо сильні вібрації столу під час гри могли привести до механічних пошкоджень компонентів системи.
Першу проблему усунули перекалібровка фоторезистора при кожному старті гри. Друга зважилася ще простіше - c допомогою викрутки, суперклею і, звичайно ж, синьою ізоляційної стрічки все компоненти системи були надійно зафіксовані.
Паралельно почали роботу над програмною складовою проекту. Насамперед конкретизували вимоги:
- Режими гри 1x1, 2x2.
- Рівні гравців.
- Колекціонування досягнень гравців.
- Ведення особистих і командних рейтингів.
- Звуковий супровід гри.
Треба сказати, нам дуже пощастило, що в настільний футбол любить різатися і наша креативна дизайнер. Тому до обіду у нас на руках вже були симпатичні мокап. Забігаючи вперед, покажемо що з них вийшло:
Розробка велася паралельно за трьома гілками:
- Клієнтська сторона - Angular.js, Bootstrap.
- Створили основні сторінки додатка, оформили дизайн, реалізували взаємодію з сервером через Rest API і Socket.io. Адаптували верстку під мобільні пристрої.
- Серверна сторона - Node.js, Socket.io, MongoDB.
- Створили структуру проекту, розробили модель даних, налаштували взаємозв'язок між клієнтом і сервером, розмежування з прав доступу. Реалізували логіку з розрахунку статистики, колекціонування досягнень, ведення рейтингів. Зробили оповіщення клієнта про виникаючі події за допомогою Socket.io.
- Взаємозв'язок між Arduino і сервером.
- Написали прошарок між контролером і сервером.
Тут треба зауважити, що ми вирішили поєднати приємне з корисним. Тому вибирали технології малознайомі учасникам проекту, щоб заодно прокачати Скіл.
Звичайно ж, було б правильніше організувати бездротове з'єднання з іншими Adruino і сервером, використовуючи wi-fi або bluetooth модулі для взаємодії з сервером. Або навіть використовувати Raspberry Pi як сервер для нашого застосування. Але у нас не було ні першого, ні другого, ні третього, зате був компот старий комп'ютер, який все ще міг послужити нам в якості сервера. Тому наш сервер з'єднаний зі столом за допомогою USB кабелю, і все спілкування між Arduino і сервером відбувається через COM-порт.
Arduino отримує з порту сигнали про включення / вимикання лазерів і, в свою чергу, відправляє сигнали про зафіксовані голах на сервер.
Контролер на серверній стороні:
Тут моніторимо порт, до якого підключений Arduino. При отриманні команди, генеруємо ту чи іншу подію. Для запуску і зупинки Arduino у нас є дві спеціальні функції start і stop, які керують включенням і вимиканням лазерів.
Приклад обробки подій:
Таким чином, до кінця другого дня ми отримали робочу базову функціональність клієнта і сервера і готову прошарок із взаємодії з Arduino.
У неділю нам залишалося зв'язати всі компоненти воєдино і прикрутити різні бонуси на зразок внутрішньоігрових досягнень і веселенькою Музички.
Цей день пройшов в більш творчому ключі, ми менше часу програмували, в основному придумували рівні гравців, ачівменти і музику під різні ігрові події.
Нарешті, все зібрано, підключено, запуск - запрацювало!
Приступили до функціонального тестування. Гаразд-гаразд, грали в футбол, чого вже тут)
Парочка багфіксінгов, невеликий допив і. PROFIT! Розумний футбол готовий.
В результаті вийшов прототип високотехнологічного настільного футболу, який самостійно фіксує і вважає забиті голи, веде рейтинг гравців, формує чергу і, взагалі, робить наш відпочинок набагато зручніше і цікавіше. А ще ми відмінно провели час і підвищили свої скіли, звичайно.