Небольшой рассказ как забивать гвозди микроскопом.
Купив ардуино, и традиционно помигав светодиодом (такой своеобразный «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.
Однако осталось ещё несколько подводных камней. Программа написана на DelphiLazarus (не ради холивара, и да, pascal ещё жив), где встроенный таймер и скорость отрисовки изображения на канве не дают тщательно синхронизировать цепочку — выстрел->заливка экрана черным->подсветка мишени белым->анализ тока с фотодиода. Ввиду чего были вставлены существенные задержки — подсветка мишени с «паспортных» 20 мс увеличена до полусекунды.
Конечно можно перейти на более быстрые и производительные решения, но я сомневаюсь что они полностью помогут избавится от мигания экрана. Ведь железная приставка благодаря прерываниям всегда знала, что находится в конкретный момент времени на экране телевизора (благо ещё и частота обновления экрана была величиной постоянной).
Спасибо за внимание. Буду рад любым замечаниям.
Автор: ZurgInq