Не стану рассказывать для чего это нужно, перейдем сразу к делу.
Первое, что нужно сделать: обзавестись контроллером. 🙂 Подойдет любой. Будь то официальный NES, либо его клон Famicon, либо самый распространенный в России — Dendy. Выглядит он примерно так:
Перейдем к разъему. Внимание на картинку:
Можете конечно обойтись вообще без разъема, просто подключив проводками. Data подключаем ко 2-pin, Clock — к 3-pin, Latch — к 4-pin. Протокол довольно простой, поэтому я сразу написал библиотеку. NESInterface. Вот самый простой пример использования.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /**NES Data pin ----> 2pin Arduino**/ /**NES Clock pin ----> 3pin Arduino**/ /**NES Latch pin ----> 4pin Arduino**/ #include <nesinterface.h> #define latch 4 #define clock 3 #define data 2 NES NES; void setup() { NES.Init(clock, latch, data); Serial.begin(9600); } void loop() { NES.Update(); byte val = NES.Read(); Serial.println(val, BIN); delay(600); } |
Пример считывает данные с кнопок и отправляет их одним байтом в COM. Чтобы было понятнее какая кнопка относится к тому или иному биту — можете добавить эти константы:
1 2 3 4 5 6 7 8 | #define K_RIGHT boolean((val >> 7) & 0x01) #define K_LEFT boolean((val >> 6) & 0x01) #define K_UP boolean((val >> 4) & 0x01) #define K_DOWN boolean((val >> 5) & 0x01) #define K_A boolean((val >> 1) & 0x01) #define K_B boolean((val >> 0) & 0x01) #define K_START boolean((val >> 3) & 0x01) #define K_SELECT boolean((val >> 2) & 0x01) |
Условие можно будет построить в таком виде:
1 | if (K_UP) {....} |
Библиотека строилась без delay и прочих, поэтому она совсем не задержит основную программу.