Электронная мишень на Arduino Nano: режимы, схема, сборка

Проект мишени, которая считает попадания, сигналит светом и звуком и управляется с ИК-пульта. Три режима сложности, дисплей Nokia 5110 и датчик SW-520D.
Что умеет устройство
Электронная мишень фиксирует попадания пластиковых или металлических шариков, подтверждает их светом и звуком и выводит счёт на дисплей. Чтобы стрельба не сводилась к простому подсчёту очков, в проект заложены три режима сложности, так что мишенью можно проверять не только меткость, но и скорость реакции стрелка. Поскольку мишень стоит на удалении, меню управляется дистанционно, с любого пульта ДУ: используются клавиши «Вверх», «Вниз», «ОК», а для возврата на верхний уровень предусмотрен «Выход».
При подаче питания мигают красный и зелёный светодиоды, зуммер дважды подаёт сигнал, после чего на экране появляется главное меню с выбором режима.

Три режима стрельбы
EASY — самый простой вариант. После подтверждения старта зуммер пищит одну секунду и загорается красный светодиод: мишень начала опрашивать датчик вибрации. При попадании красный светодиод гаснет, зажигается зелёный, зуммер 4 секунды звучит на высокой ноте, а счётчик на экране увеличивается на единицу. Затем снова включается красный светодиод, и цикл повторяется.


MEDIUM добавляет параметр RANDOM TIME — время в секундах, в течение которого мишень активна. Его задают в пределах от 3 до 99 секунд. После нажатия «ОК» зуммер включается на секунду, оба светодиода погашены, и программа выбирает случайное число от 3 секунд до установленного значения. Красный светодиод показывает, что мишень ждёт выстрела. Успел попасть за выпавший интервал — плюс один балл, не успел — балл снимается, с соответствующим световым и звуковым сигналом. Интервал каждый раз новый, но всегда в заданных границах.

HARD начинается с экрана настроек. SHOOT TIME — общее время активности мишени, от 1 до 999 секунд. SHOOT INTERVAL — пять значений от 1 до 99 секунд, каждое задаёт промежуток, в течение которого мишень доступна для поражения. Клавиша «ОК» сохраняет параметр и переводит курсор к следующему. В игре слева показывается число попыток (TRY), справа — число удачных попаданий (HIT). Попадание засчитывается, если оно уложилось в текущий интервал; интервалы чередуются по кругу, а промах уменьшает счёт. Игра продолжается, пока не истечёт SHOOT TIME.
Комплектующие
- Плата Arduino Nano — компактная и программируется без дополнительных средств; с задачей справилась бы любая плата линейки.
- Графический ЖК-дисплей 84х48 от Nokia 5110 на контроллере Philips PCD8544.
- Красный и зелёный светодиоды; в исходном проекте использован готовый модуль KY-011.
- Пьезоэлектрический излучатель без встроенного генератора — это позволяет управлять частотой звука и не нагружает выход микроконтроллера.
- Модуль ИК-приёмника KY-022 на микросхеме TSOP1738.
- Датчик вибрации SW-520D: из нескольких опробованных вариантов он показал самую стабильную работу, без единого сбоя за время испытаний.
Схема подключения
Удар шарика даёт очень короткий импульс, поэтому датчик вибрации подключён к входу внешнего прерывания. У Arduino для этого подходят пины 2 и 3, в проекте выбран пин 2. Вывод D2 подтянут к плюсу питания резистором 10 кОм, чтобы исключить наводки и ложные срабатывания. Светодиоды включены через защитные резисторы 330 Ом. Дисплей Nokia 5110 рекомендуется питать от 3,3 В, иначе он может выйти из строя.
| Датчик вибрации SW-520D | D2 (внешнее прерывание, подтяжка 10 кОм) |
| Зелёный светодиод | D6 (через 330 Ом) |
| Красный светодиод | D7 (через 330 Ом) |
| ИК-приёмник | D8 |
| Зуммер | D9 |
| Дисплей: SCLK | D13 |
| Дисплей: DIN | D11 |
| Дисплей: D/C | D5 |
| Дисплей: CS | D4 |
| Дисплей: RST | D3 |
Чувствительная пластина
Стрельба ведётся по ударопрочной пластине из твёрдого материала, который не гасит удар, а распределяет вибрацию по всей поверхности. В исходном проекте это кусок фольгированного гетинакса. С тыльной стороны крепится датчик, с лицевой — распечатанное на бумаге изображение мишени. Датчик притягивают пластиковыми хомутами: двусторонний скотч и термоклей не годятся, крепление должно выдерживать сильные встряски.
Пластину можно вынести от схемы на четырёхжильной витой паре; если у кабеля есть экран, его лучше соединить с минусом питания. Сигнал SW-520D в покое зависит от угла наклона — такова его конструкция. Для мишени это неважно: программа запоминает последнее состояние как покой и любое его изменение считает выстрелом.
Программная часть
Сначала нужно один раз выяснить коды клавиш своего пульта. Для этого подключают библиотеку IRremote.h и загружают короткий скетч, который включает приёмник на пине 8 и печатает в монитор порта (9600 бод) шестнадцатеричный код каждой нажатой клавиши. Нажимают по очереди «Вверх», «Вниз», «Вправо», «Влево», «ОК», «Exit» и записывают результат. У разных пультов коды разные; в примере клавише «Вверх» соответствовал код 0x2FD9867, «ОК» — 0x2FD50AF. Полученные значения прописываются в основном скетче в директивах #define.
Для дисплея нужны ещё две библиотеки: Adafruit_PCD8544.h и Adafruit_GFX.h. Основная программа назначает обработчик внешнего прерывания на выводе D2 строкой attachInterrupt(0, shoot, CHANGE), настраивает выводы светодиодов и зуммера, запускает ИК-приёмник и дисплей с контрастом 45. Звук формируется программно: две функции выдают на зуммер пачки импульсов разной длительности, получая низкий и высокий тон. Отдельная функция отрисовывает экраны меню и режимов, а основной цикл разбирает команды пульта: перемещает курсор по меню и меняет параметры, причём значения идут по кругу — например, RANDOM TIME после 3 при уменьшении переходит к 99.