Много-много лет назад делал я простенький лазерный тир с 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)


  1. Viktor-T
    03.01.2026 19:19

    Здорово получилось!

    Пекаш самодельный из указки? А откуда звуки выстрела?


    1. DIMOSUS Автор
      03.01.2026 19:19

      Спасибо) Сделал из страйкбольного. Звук из планшета - веб страничка воспроизводит, когда узнает про новое попадание.


      1. Spalexy
        03.01.2026 19:19

        Круто! Не задумывались о добавлении вибромоторчика для "отдачи"?


        1. DIMOSUS Автор
          03.01.2026 19:19

          При желании можно, да и не сложно.


  1. Heavenanvil
    03.01.2026 19:19

    Сразу вспомнилось это видео:
    https://www.youtube.com/watch?v=OhyvKTrgzp4


  1. 413x
    03.01.2026 19:19

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


  1. pbw
    03.01.2026 19:19

    А можно в статью добавить список плат esp32, которые гарантированно будут работать с данным проектом? На гитхабе список есть, но по нему на Али ничего нормально не ищется почему-то.
    Скажите, а какая линза у вас на камере, сколько градусов обзор? Ну или, насколько близко к мишени надо ставить камеру?

    Не задумывались о добавлении вибромоторчика для "отдачи"?

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


    1. DIMOSUS Автор
      03.01.2026 19:19

      Промазал с формой. Ответ ниже.


  1. 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 градусов, но точно сказать не берусь - хз что там китайцы мне положили.


    1. pbw
      03.01.2026 19:19

      Судя по ютубу так и есть, у вас камера на 66 градусов, с ИК-фильтром. Без фильтра будет ли хуже с засветкой камеры?
      Как я понял, с лазером вы остались на том же конструктиве, конденсатор и никакого ардуино?
      А звук выстрела можно будет отключать в последующих версиях?

      На глобальном али ничего другого, кроме вот этой платы не нашлось:

      Вернее, есть много чего в продаже, но распиновку продавцы не предоставляют.
      Судя по camera_pins.h это будет: CAMERA_MODEL_ESP32S3_EYE.
      Можно ли попросить выложить на гитхабе готовую прошивку под эту плату, с примитивным паролем? IDE только для сборки этого проекта ставить наверное смысла нет.


      1. DIMOSUS Автор
        03.01.2026 19:19

        Теоритически лучше с ИК фильтром. Лазер же в видимом диапазоне и лишьний шум нам не нужен. Нашел в ящике старый пистолет и лень было что-то переделывать, так что да = конденсатор. Звук выстрела можете отключить закоментив строчки яваскрипта. Так как считаю проект законченым и новых версий не планирую.
        if (count > 0) playAudio();
        if (count == 10) playMixedTones();


        Вам в люмоб случае нужно править код, что бы прописать свой вайфай. Так что не ленитесь и добавте плату самостоятельно)