Лазертаг на Arduino
Пригласили нас как-то с сыном на аренный лазертаг, очень нам понравилось! Т.к. готовые комплекты стоят не мало, пришла идея собрать что-то подобное на Arduino для игры дома и на улице. Что у меня получилось, читайте ниже.
В качестве корпуса для тагера было решено использовать готовый комплект для интеграции «LSD RAVEN», в комплект входит сам корпус, излучатель с линзой, кнопка перезарядки, замок включения и спусковой крючок с микриком. Это оказалось выгоднее, чем печать корпуса на 3D-принтере и покупка излучателя.
В роли платы управления использовал Arduino Nano, для удобства её монтажа в корпусе и пайки разработал в EasyEDA печатную плату, также сделал платы для датчиков головной повязки.
Комплектующие:
Тагер | Повязка |
Arduino Nano | ИК-приёмник TL1838 — 6 шт. |
Усилитель звука PAM8403 | Светодиод индикации попадания — 6 шт. |
Buzzer | Вибромотор |
Дисплей OLED 128×64 | |
ИК-светодиод TSAL6100 | |
Светодиод подсветки выстрела | |
Вибромотор | |
Микропереключатель | |
Кнопка без фиксации — 2 шт. | |
Ключ-выключатель | |
Батарейный отсек 4xAAA |
Схема подключения
Собрал всё на макетной плате для отладки, набросал скетч и при компиляции столкнулся с проблемой:
libraries\IRremote-2.0.1\IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)':
(.text+0x0): multiple definition of `__vector_7'
sketch\PlaySound.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Nano.
Дело в том, что PlaySound и IRremote используют один и тот же аппаратный таймер, поэтому не могут работать вместе. Для решения этой проблемы нужно в библиотеке IRremote, в файле IRremoteInt.h, в блоке для Nano раскомментить IR_USE_TIMER1 и закомментить IR_USE_TIMER2.
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
#else
#define IR_USE_TIMER1 // tx = pin 9
//#define IR_USE_TIMER2 // tx = pin 3
#endif
Также не всё было гладко с комплектным излучателем:
Я его разделил — отдельно плата подсветки выстрела и плата с ИК-диодом + заменил ИК-диод.
После отладки собрал всё в корпусе и спаял. Головную повязку сшил из эластичной ленты, закрепил на ней датчики. В качестве корпусов для датчиков использовал какие-то капсулы от игрушек, нашёл у детей :)
Принцип игры прост, включаем тагер, на старте у нас 9 жизней, 20 патронов в магазине и 5 магазинов. Бегаем, стреляем :) Доступно два режима стрельбы: одиночный — однократное нажатие на спусковой крючок и очередь — удержание спускового крючка. Выстрел сопровождается характерным звуком + подсветкой + вибрацией в рукоятке. Если патроны закончились, нажимаем перезарядку, если кончились и патроны и магазины — засчитывается поражение (смерть), наступает небольшая пауза и игра возобновляется. Перезарядка, осечка (когда нет патронов) и смерть также сопровождаются звуками. Попадания фиксируются датчиками повязки и сопровождаются характерным звуком + вибрацией и зажиганием светодиодов + убавляются жизни, если жизни закончились — засчитывается смерть. Ещё на тагере, сверху, есть кнопка выбора команды (за красных / за зелёных) — это на будущее, для каждой команды можно прописать свои коды выстрела, тем самым исключить огонь по своим и т.п. Сейчас в прошивке используются коды обеих команд, т.к. мы играем втроём и каждый сам за себя. Если удерживать кнопку выбора команды — будет показана статистика: кол-во выстрелов и смертей, статистика сбрасывается при выключении тагера. Также в скетче, на будущее, заложено пополнение боекомплекта и аптечка. Вот такой лазертаг у меня получился, дети в восторге:)
Дополнительные фото
Ссылка на скетч и библиотеки
P.S. Скетч конечно сыроват и требует доработки по части многозадачности, в момент выстрела не фиксируются попадания и наоборот, в связи с этим прошу не кидаться помидорами в комментах. Если у кого-то есть идеи и желание, пишите в личку, буду рад помощи.