Пригласили нас как-то с сыном на аренный лазертаг, очень нам понравилось! Т.к. готовые комплекты стоят не мало, пришла идея собрать что-то подобное на Arduino для игры дома и на улице. Что у меня получилось, читайте ниже.
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/eb8/747/cc0/eb8747cc0429c2183aa159c56dd73aee.jpg)
В качестве корпуса для тагера было решено использовать готовый комплект для интеграции «LSD RAVEN», в комплект входит сам корпус, излучатель с линзой, кнопка перезарядки, замок включения и спусковой крючок с микриком. Это оказалось выгоднее, чем печать корпуса на 3D-принтере и покупка излучателя.
В роли платы управления использовал Arduino Nano, для удобства её монтажа в корпусе и пайки разработал в EasyEDA печатную плату, также сделал платы для датчиков головной повязки.
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/afc/696/92c/afc69692c7625a2ed0176f0d20b104aa.jpg)
Комплектующие:
Тагер | Повязка |
Arduino Nano | ИК-приёмник TL1838 - 6 шт. |
Усилитель звука PAM8403 | Светодиод индикации попадания - 6 шт. |
Buzzer | Вибромотор |
Дисплей OLED 128x64 | |
ИК-светодиод TSAL6100 | |
Светодиод подсветки выстрела | |
Вибромотор | |
Микропереключатель | |
Кнопка без фиксации - 2 шт. | |
Ключ-выключатель | |
Батарейный отсек 4xAAA |
Схема подключения
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/593/3c3/602/5933c3602fe00a3ee85ba3853ceafa95.jpg)
Собрал всё на макетной плате для отладки, набросал скетч и при компиляции столкнулся с проблемой:
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
Также не всё было гладко с комплектным излучателем:
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/266/5fa/068/2665fa0686ac18be73a040ee73d439c0.jpg)
Я его разделил - отдельно плата подсветки выстрела и плата с ИК-диодом + заменил ИК-диод.
После отладки собрал всё в корпусе и спаял. Головную повязку сшил из эластичной ленты, закрепил на ней датчики. В качестве корпусов для датчиков использовал какие-то капсулы от игрушек, нашёл у детей :)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/23e/b6f/9e3/23eb6f9e311327e839fe02f9a6f54eec.jpg)
Принцип игры прост, включаем тагер, на старте у нас 9 жизней, 20 патронов в магазине и 5 магазинов. Бегаем, стреляем :) Доступно два режима стрельбы: одиночный - однократное нажатие на спусковой крючок и очередь - удержание спускового крючка. Выстрел сопровождается характерным звуком + подсветкой + вибрацией в рукоятке. Если патроны закончились, нажимаем перезарядку, если кончились и патроны и магазины - засчитывается поражение (смерть), наступает небольшая пауза и игра возобновляется. Перезарядка, осечка (когда нет патронов) и смерть также сопровождаются звуками. Попадания фиксируются датчиками повязки и сопровождаются характерным звуком + вибрацией и зажиганием светодиодов + убавляются жизни, если жизни закончились - засчитывается смерть. Ещё на тагере, сверху, есть кнопка выбора команды (за красных / за зелёных) - это на будущее, для каждой команды можно прописать свои коды выстрела, тем самым исключить огонь по своим и т.п. Сейчас в прошивке используются коды обеих команд, т.к. мы играем втроём и каждый сам за себя. Если удерживать кнопку выбора команды - будет показана статистика: кол-во выстрелов и смертей, статистика сбрасывается при выключении тагера. Также в скетче, на будущее, заложено пополнение боекомплекта и аптечка. Вот такой лазертаг у меня получился, дети в восторге :)
Дополнительные фото
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/be4/442/ee8/be4442ee858ecd45f8ad39f35781c206.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/8db/f59/a89/8dbf59a89c5a9e14fea44b739d7d2470.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/8bc/dfa/930/8bcdfa930c32f92c404b1fa0b6b40347.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/a2b/18c/5c1/a2b18c5c1718caf42567f7301ed38aa7.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/d7f/40b/a0c/d7f40ba0c576b0d8677205bfc6be981b.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/9dc/5d0/40b/9dc5d040b1134b3b016f003afa5f7f2a.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/6ec/31c/b79/6ec31cb7917d29403fff22a6e56bea8e.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/3d9/410/846/3d9410846827e3f322119e122d51a417.jpg)
![](https://webcf.waybackmachine.org/web/20220930163424/https://habrastorage.org/getpro/habr/upload_files/214/a99/93d/214a9993dcd8bb5b6a3c8b31dc6a2e93.jpg)
Ссылка на скетч и библиотеки
P.S. Скетч конечно сыроват и требует доработки по части многозадачности, в момент выстрела не фиксируются попадания и наоборот, в связи с этим прошу не кидаться помидорами в комментах. Если у кого-то есть идеи и желание, пишите в личку, буду рад помощи.