
Много-много лет назад делал я простенький лазерный тир с raspberry и камерой.
Технологии с тех пор сильно шагнули вперёд, и захотелось сделать новую, максимально дешёвую версию. В качестве основы взял ESP32 с камерой OV2640 — стоит около 5 евро на AliExpress. Серьёзно переживал за производительность, но её у этого малыша оказалось более чем достаточно. В нём два ядра: одно полностью отдано под обработку изображения, второе — под веб-сервер.
Идея следующая: 60 раз в секунду делаем снимок и ищем на нём пятно от лазера. Параллельно крутится веб-страничка, где на canvas рисуются мишень, попадания и очки. Поскольку полноценный OpenCV на ESP32 не запустить, всё сделано максимально просто. Камера выдаёт чёрно-белые JPEG-кадры, которые я распаковываю в пиксели и ищу те, что превышают порог яркости. Да, камера умеет работать и с RAW-форматами, но там есть нюанс — частота кадров в таком режиме ограничена примерно 15 FPS. А вот распаковывать JPEG «на лету» для ESP32 оказалось посильной задачей, и благодаря этому удалось выжать почти 60 FPS при разрешении 240×240. Для надёжности детектирования у камеры дополнительно задаётся смещение экспозиции.
Но просто найти пятно на картинке недостаточно — нужно сопоставить его с координатами мишени. И вместо того чтобы нагружать микроконтроллер сложной математикой, это можно переложить на пользователя. Поэтому предусмотрена разовая ручная калибровка: на отдельной странице в браузере нужно выбрать четыре маркера на изображении по часовой стрелке. По ним строится матрица обратного перспективного преобразования. Благодаря этому камера может смотреть на мишень под любым углом — математика всё компенсирует.
Но меньше слов, больше действа: https://youtu.be/UJaGSOkALsU
Исходники доступны на github
Комментарии (11)

413x
03.01.2026 19:19Есть еще интересный вариант по теме: переделка светового пистолета денди под эмулятор ПК Fceux. В таком варианте можно любой квадрат показывать на какое-то время в области и отлавливать смену состояния кнопки джойстика и если вторая кнопка курка нажата, то регистрировать выстрел.

pbw
03.01.2026 19:19А можно в статью добавить список плат esp32, которые гарантированно будут работать с данным проектом? На гитхабе список есть, но по нему на Али ничего нормально не ищется почему-то.
Скажите, а какая линза у вас на камере, сколько градусов обзор? Ну или, насколько близко к мишени надо ставить камеру?
Не задумывались о добавлении вибромоторчика для "отдачи"?
Для имитации легкой отдачи нужен линейный привод. Маленький привод не даст никакого эффекта, большой не влезет, и в любом случае питание на быстрый привод придется подавать по кабелю.

DIMOSUS Автор
03.01.2026 19:19Список плат дать не могу, так как у самого была одна, на которой все проверял. По идее пойдет любой esp32 с PSRAM и разъёмом камеры. Главное что бы была известна распиновка. Но лучше взять самый мощный esp32-s3 n16r8 + ev2640. На глобальном али стоит около 7 евро.
Свою распиновку (если китайцы придумали новую разводку платы) можно добавить в конфиг https://github.com/DIMOSUS/ESP32LaserRange/blob/main/src/camera_pins.h и потом выбрать дефайном в camera.h
Про камеру - ставить как можно ближе к мишени, но что бы в кадре были все четыре маркера (картинка с камеры на страничке калибровки обновляется). Широкоугольные камеры дают сильные искажения вида "рыбий глаз" и не подходят. Моя похожа на миниглазок на 66 градусов, но точно сказать не берусь - хз что там китайцы мне положили.

pbw
03.01.2026 19:19Судя по ютубу так и есть, у вас камера на 66 градусов, с ИК-фильтром. Без фильтра будет ли хуже с засветкой камеры?
Как я понял, с лазером вы остались на том же конструктиве, конденсатор и никакого ардуино?
А звук выстрела можно будет отключать в последующих версиях?
На глобальном али ничего другого, кроме вот этой платы не нашлось:
Вернее, есть много чего в продаже, но распиновку продавцы не предоставляют.
Судя по camera_pins.h это будет: CAMERA_MODEL_ESP32S3_EYE.
Можно ли попросить выложить на гитхабе готовую прошивку под эту плату, с примитивным паролем? IDE только для сборки этого проекта ставить наверное смысла нет.
DIMOSUS Автор
03.01.2026 19:19Теоритически лучше с ИК фильтром. Лазер же в видимом диапазоне и лишьний шум нам не нужен. Нашел в ящике старый пистолет и лень было что-то переделывать, так что да = конденсатор. Звук выстрела можете отключить закоментив строчки яваскрипта. Так как считаю проект законченым и новых версий не планирую.
if (count > 0) playAudio();
if (count == 10) playMixedTones();
Вам в люмоб случае нужно править код, что бы прописать свой вайфай. Так что не ленитесь и добавте плату самостоятельно)
Viktor-T
Здорово получилось!
Пекаш самодельный из указки? А откуда звуки выстрела?
DIMOSUS Автор
Спасибо) Сделал из страйкбольного. Звук из планшета - веб страничка воспроизводит, когда узнает про новое попадание.
Spalexy
Круто! Не задумывались о добавлении вибромоторчика для "отдачи"?
DIMOSUS Автор
При желании можно, да и не сложно.