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

в 18:26, , рубрики: arduino, dendy, микроконтроллеры, Электроника для начинающих, метки: , ,

Подключение светового пистолета через 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
Оттуда меня в первую очередь интересовала распиновка контактов пистолета. Так же для надёжности пистолет был разобран и прозвонен тестером.

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

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

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

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

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

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 байта (изначально пересылалось только значения курка и фотодиода). Банальная задачка, но если кто нибудь пойдёт моим путём, нужно иметь ввиду. В итоге для надёжности был добавлен заголовок, а поток данных как ему и полагается копился в буфере и уже оттуда считывался по мере необходимости.

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

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

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

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

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

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

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

Спасибо за внимание. Буду рад любым замечаниям.

Автор: ZurgInq

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js