Подключение светового пистолета через Arduino



    Небольшой рассказ как забивать гвозди микроскопом.

    Купив ардуино, и традиционно помигав светодиодом (такой своеобразный «Hello World») было принято решение сделать что нибудь более полезное. Для тренировки и изучения возможностей arduino я решил через него подключить световой пистолет к компьютеру. Конечно нехилый такой переходник получается, но раньше с электроникой я дело никогда не имел, поэтому и эта задачка оказалась довольна интересна.
    Итак, были найдены схемы и описание работы светового пистолета:
    ftp.radio.ru/pub/arhiv/1997/10-97/29-10-1997.jpg
    ftp.radio.ru/pub/arhiv/1997/10-97/30-10-1997.jpg
    Оттуда меня в первую очередь интересовала распиновка контактов пистолета. Так же для надёжности пистолет был разобран и прозвонен мультиметром.



    Коричневый провод — земля
    Красный провод — фотодиод
    Синий провод — курок
    Жёлтый провод — питание

    Подключаем пистолет к ардуино. Курок был подключен к цифровому порту, а сигнал с фотодиода к аналоговому.



    Для ардуино написан скетч:

    const int DPIN7_SWITCH_GUN = 7; //курок пистолета
    const int APIN4_LIGHT_GUN = 4; //фотодиод
    
    int valSwitch = 0;
    int valLight = 0;
    byte data[5];
    
    void setup() 
    {
      Serial.begin(9600);
      pinMode(DPIN7_SWITCH_GUN, INPUT);
    }
    
    void loop() 
    {
      valSwitch = digitalRead(DPIN7_SWITCH_GUN);
      valLight = analogRead(APIN4_LIGHT_GUN);
      
      if (valSwitch == HIGH || valLight>3) {
        data[0] = 0x47; //G
        data[1] = 0x55; //U
        data[2] = 0x4e; //N
        data[3] = valSwitch;
        data[4] = valLight/4;
        Serial.write(data, 5);
      }
      
    }
    


    В ходе тестирования было выяснено, что сигнал с фотодиода поступает не постоянно, а только при резкой смене освещённости с темного на светлый. При этом, если в этот момент нажат курок — сигнал сильнее. С нажатым курком на порт приходит значение 100-120, без нажатия 10-30.

    Дело осталось за малым — написать принимающую программу на стороне компьютера.
    Здесь я вдоволь походил по граблям пытаясь правильно принять данные приходящие с COM порта. Данные ни в какую не хотели приходить ровным пакетом в 2 байта (изначально пересылалось только значения курка и фотодиода). Банальная задачка, но если кто нибудь пойдёт моим путём, нужно иметь ввиду. В итоге для надёжности был добавлен заголовок, а поток данных как ему и полагается копился в буфере и уже оттуда считывался по мере необходимости.

    Наконец, заработала тестовая программа.



    И вот уже можно вместо дротиков использовать высокотехнологичный световой пистолет. Либо реализовать Duck Hunt.



    Однако осталось ещё несколько подводных камней. Программа написана на Delphi\Lazarus (не ради холивара, и да, pascal ещё жив), где встроенный таймер и скорость отрисовки изображения на канве не дают тщательно синхронизировать цепочку — выстрел->заливка экрана черным->подсветка мишени белым->анализ тока с фотодиода. Ввиду чего были вставлены существенные задержки — подсветка мишени с «паспортных» 20 мс увеличена до полусекунды.



    Конечно можно перейти на более быстрые и производительные решения, но я сомневаюсь что они полностью помогут избавится от мигания экрана. Ведь железная приставка благодаря прерываниям всегда знала, что находится в конкретный момент времени на экране телевизора (благо ещё и частота обновления экрана была величиной постоянной).

    Спасибо за внимание. Буду рад любым замечаниям.
    Поделиться публикацией

    Похожие публикации

    Комментарии 41
      +23
      Так а хихикающую собаку замочить вышло?
        +3
        Гараздо интереснее можно ли уткой управлять с джостика :)
          –2
          Если автор покопается в коде и сделает, то для фанов такой мультиплеер порвет всякие танки и масс эффекты в клочья.
            +1
            Вообще-то уткой с джостика можно было управлять всегда! Всё своё детство я, пока брат стрелял из пистолета, уводил от него уток при помощи джостика №2.
              +2
              А я не знал, вот блин, все детство коту под хвост…
          • НЛО прилетело и опубликовало эту надпись здесь
              +2
              Ваше счастье здесь.
              –2
              Настало твоё время, Валера!
              • НЛО прилетело и опубликовало эту надпись здесь
                  +9
                  Валеру пихают всюду — согласен. Но тут — реально в тему :)
                    –7
                    Спасибо, есть люди которые оценили :) Я сам не очень люблю посты с фразами Павлика, но тут не выдержал :)
                      –4
                      Ну я Валера, чего надо?
                        0
                        Ваше время настало, выше написано же :)
                          –3
                          Я смотрю, собрались исключительно серьёзные люди…
                      +5
                      А я вот мат не переношу, например. Тоже мне, интеллигенция…
                    +5
                    Думаю, вам нужно изучить Direct 3D, чтобы это работало без лагов. Канва тормозит не только в Delphi, недаром игры ее не используют и для них придумано производительное решение ;)
                      +3
                      а как же GDI+? Намного улучшает вывод 2д графики
                        0
                        GDI+ не использует ускорение графическим адаптером (за исключением некоторых функций типа BitBlt и то только Win Vista и старше), а значит оно априори не может быть быстрым.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            +1
                            Для таких целей скорости прорисовки более чем достаточно. Для некоторых устройств игры только так и пишутся.
                          0
                          Дело даже не сколько в тормозах, сколько в том, как узнать когда картинка полностью сформирована и выведена на экран. Сейчас у меня прикручен довольно быстрый 2Д движок на OpenGL. Показатель FPS там может достигать нескольких сотен кадров в секунду, но частота монитора 60ГЦ => следовательно если я нечего не путаю, множество кадров просто не успеет отобразится на мониторе, и если этими кадрами окажутся контрольные, то программа не будет работать.
                            0
                            Можно просто установить задержку в 2 периода.
                              0
                              А как же V-Sync? Вроде бы тот же вызов SwapBuffers() по-умолчанию это делает.
                              0
                              WPF вроде бы тоже позволяет быстро рисовать
                              +14
                              Нет-нет! Никаких компьютеров. Генерируйте видеосигнал ардуиной и выводите на телевизор. Только теплый ламповый кинескоп! Только хардкор :)
                                +1
                                Можно не самой ардуиной генерить видеосигнал, есть Gameduino.
                                0
                                ооо, статьи Рюмика, ностальгия…
                                  +2
                                  Ещё можно прикрутить этот пистолет к геймдуино :-)
                                    +13
                                    image
                                    Мечта каждого Duck Hunt-era.
                                      +2
                                      В VS. Duck Hunt можно было убивать его.
                                        0
                                        К сожалению я в эту версию не играл. очень жаль. А оказывается можно было воплотить свои тайные желания по расстрелу этого пуделя :D
                                      0
                                      Интересно, автор Красавец!
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          +1
                                          Это как раз та проблема, которую я не смог решить до конца (проблема с миганием). Подробно проблема рассмотрена тут — www.emu-land.net
                                          +1
                                          Твой пистолет хорошо и денди.
                                          А какие еще были игры кроме уток, ковбоев и тарелочек?
                                          +7
                                          Теперь световой меч, пожалуйста.
                                            +11
                                            image
                                              +1
                                              Весело! Только не курок, а спусковой крючок :)
                                                0
                                                Я всегда думал — да как же эти пистолеты устроены то? Как игровая приставка «понимает» куда я стреляю? Но все руки не доходили поискать. Опять информация нашла меня сама. Как говорится: все гениальное — просто!

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое