Stap 3: Het maken van de knoppen werken
Op dit punt, ik had de laptop gemonteerd, Tetris geladen en het zou lopen door haar demo lus elke minuut of twee. Maar ik wilde knoppen! Sorry voor het ontbreken van foto's, ik was tot ongeveer 2 uur te gaan op dit punt...
Tijd om te zetten mijn Arduino te werken. Het pad van de knop naar gameboy ziet er zo uit:
- Knop wordt ingedrukt, sluiten het circuit van grond met een van de digitale ingang pinnen (ik gebruikte de interne pull-ups zodat de pinnen normaal gesproken HIGH lezen totdat de knop wordt ingedrukt).
- Arduino luidt ingangen elke paar msec, detecteert knop duw.
- Arduino debounces een druk op de knop.
- Arduino signaal via de ingebouwde seriële poort emulator voor elke knop duwen. (Wat je ziet in de Arduino seriële monitor.)
- Python-app leest de seriële poort, de ruwe gegevens worden toegewezen aan de correcte sleutel te worden geduwd.
- Python-app maakt gebruik van "xte" te emuleren een keypress, het vervoederen aan de huidige toepassing. Opmerking: dit is Linux-specifiek, moet de code totaal verschillend voor Windows.
- Gameboy emulator ziet de ToetsIndrukken (KeyPress) en voila(ish)!
Kan niet aanraden genoeg Arduino voor dit soort dingen. Ik had een LED knipperen in 1 min, vervolgens seriële communicatie omhoog in 5 minuten. Gelukkig had ik wat Python code voor het lezen van de seriële poort zodat de belangrijkste probleem dat ik had om te lossen kreeg de inbreng in de emulator rondslingeren.
Daarvoor gebruikte ik xte, die is een app die input gebeurtenissen rechtstreeks naar de venster server kan voeden. Ik was bezorgd op het eerste omdat de emulator niet lijken te halen van de persen; een vertraging tussen het omlaag en omhoog gebeurtenissen toe te voegen geholpen maar het was nog een beetje koel.
Ik denk dat het probleem was dat ik had alleen de Arduino uitstoten toets ingedrukt evenementen, wat betekende dat de Python app moest omlaag/omhoog gebeurtenis paren te simuleren. Vervolgens moet de emulator hebben gedaan een eigen debouncing. Zou beter geweest te toets omlaag en omhoog kaart rechtstreeks naar de zelfde gebeurtenissen via xte en laat de emulator omgaan.
Ik deelde de code op Github.