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

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

Проект мишени, которая считает попадания, сигналит светом и звуком и управляется с ИК-пульта. Три режима сложности, дисплей Nokia 5110 и датчик SW-520D.

Что умеет устройство

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

При подаче питания мигают красный и зелёный светодиоды, зуммер дважды подаёт сигнал, после чего на экране появляется главное меню с выбором режима.

Главное меню электронной мишени на дисплее

Три режима стрельбы

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

Экран режима EASY перед началом игры
Основной экран режима EASY со счётом попаданий

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

Экран режима MEDIUM с параметром RANDOM TIME

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-520DD2 (внешнее прерывание, подтяжка 10 кОм)
Зелёный светодиодD6 (через 330 Ом)
Красный светодиодD7 (через 330 Ом)
ИК-приёмникD8
ЗуммерD9
Дисплей: SCLKD13
Дисплей: DIND11
Дисплей: D/CD5
Дисплей: CSD4
Дисплей: RSTD3

Чувствительная пластина

Стрельба ведётся по ударопрочной пластине из твёрдого материала, который не гасит удар, а распределяет вибрацию по всей поверхности. В исходном проекте это кусок фольгированного гетинакса. С тыльной стороны крепится датчик, с лицевой — распечатанное на бумаге изображение мишени. Датчик притягивают пластиковыми хомутами: двусторонний скотч и термоклей не годятся, крепление должно выдерживать сильные встряски.

Пластину можно вынести от схемы на четырёхжильной витой паре; если у кабеля есть экран, его лучше соединить с минусом питания. Сигнал 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.

← Все статьи