Лазертаг на Arduino

в 19:22, , рубрики: arduino nano, diy или сделай сам, лазертаг, лазертаг на arduino, Разработка под Arduino

Пригласили нас как-то с сыном на аренный лазертаг, очень нам понравилось! Т.к. готовые комплекты стоят не мало, пришла идея собрать что-то подобное на Arduino для игры дома и на улице. Что у меня получилось, читайте ниже.

Лазертаг на Arduino - 1

В качестве корпуса для тагера было решено использовать готовый комплект для интеграции «LSD RAVEN», в комплект входит сам корпус, излучатель с линзой, кнопка перезарядки, замок включения и спусковой крючок с микриком. Это оказалось выгоднее, чем печать корпуса на 3D-принтере и покупка излучателя.

В роли платы управления использовал Arduino Nano, для удобства её монтажа в корпусе и пайки разработал в EasyEDA печатную плату, также сделал платы для датчиков головной повязки.

Лазертаг на Arduino - 2

Комплектующие:

Тагер

Повязка

Arduino Nano

ИК-приёмник TL1838 - 6 шт.

Усилитель звука PAM8403

Светодиод индикации попадания - 6 шт.

Buzzer

Вибромотор

Дисплей OLED 128x64

ИК-светодиод TSAL6100

Светодиод подсветки выстрела

Вибромотор

Микропереключатель

Кнопка без фиксации - 2 шт.

Ключ-выключатель

Батарейный отсек 4xAAA

Схема подключения
Лазертаг на Arduino - 3

Собрал всё на макетной плате для отладки, набросал скетч и при компиляции столкнулся с проблемой:

librariesIRremote-2.0.1IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)':
(.text+0x0): multiple definition of `__vector_7'
sketchPlaySound.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

Также не всё было гладко с комплектным излучателем:

Лазертаг на Arduino - 4

Я его разделил - отдельно плата подсветки выстрела и плата с ИК-диодом + заменил ИК-диод.

После отладки собрал всё в корпусе и спаял. Головную повязку сшил из эластичной ленты, закрепил на ней датчики. В качестве корпусов для датчиков использовал какие-то капсулы от игрушек, нашёл у детей :)

Лазертаг на Arduino - 5

Принцип игры прост, включаем тагер, на старте у нас 9 жизней, 20 патронов в магазине и 5 магазинов. Бегаем, стреляем :) Доступно два режима стрельбы: одиночный - однократное нажатие на спусковой крючок и очередь - удержание спускового крючка. Выстрел сопровождается характерным звуком + подсветкой + вибрацией в рукоятке. Если патроны закончились, нажимаем перезарядку, если кончились и патроны и магазины - засчитывается поражение (смерть), наступает небольшая пауза и игра возобновляется. Перезарядка, осечка (когда нет патронов) и смерть также сопровождаются звуками. Попадания фиксируются датчиками повязки и сопровождаются характерным звуком + вибрацией и зажиганием светодиодов + убавляются жизни, если жизни закончились - засчитывается смерть. Ещё на тагере, сверху, есть кнопка выбора команды (за красных / за зелёных) - это на будущее, для каждой команды можно прописать свои коды выстрела, тем самым исключить огонь по своим и т.п. Сейчас в прошивке используются коды обеих команд, т.к. мы играем втроём и каждый сам за себя. Если удерживать кнопку выбора команды - будет показана статистика: кол-во выстрелов и смертей, статистика сбрасывается при выключении тагера. Также в скетче, на будущее, заложено пополнение боекомплекта и аптечка. Вот такой лазертаг у меня получился, дети в восторге :)

Дополнительные фото
Лазертаг на Arduino - 6
Лазертаг на Arduino - 7
Лазертаг на Arduino - 8
Лазертаг на Arduino - 9
Лазертаг на Arduino - 10
Лазертаг на Arduino - 11
Лазертаг на Arduino - 12
Лазертаг на Arduino - 13
Лазертаг на Arduino - 14

Ссылка на скетч и библиотеки

P.S. Скетч конечно сыроват и требует доработки по части многозадачности, в момент выстрела не фиксируются попадания и наоборот, в связи с этим прошу не кидаться помидорами в комментах. Если у кого-то есть идеи и желание, пишите в личку, буду рад помощи.

Автор: Александр

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js