Как стать автором
Обновить

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

DIY или Сделай сам


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

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



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

Спасибо за внимание. Буду рад любым замечаниям.
Теги:
Хабы:
Всего голосов 56: ↑50 и ↓6 +44
Просмотры 11K
Комментарии Комментарии 41