Rörelsekontroll till NES

Från Uppsala Makerspace
Hoppa till: navigering, sök

Introduktion

Makers: Christoffer Ramqvist
Status: Pågående

Målet med detta projekt är att kunna spela Super Mario Bros till NES genom att luta skärmen/handkontrollen. I Super Mario Bros så styrs Mario genom att trycka höger eller vänster på ett styrkors. Och hastigheten beror på om man "duttar" styrriktningen, håller ner den konstant och/eller om man håller in B-knappen. Vi kommer att programmera en Arduino för att översätta lutningen till motsvarande "duttande" eller B-springande. Om möjligt ska vi även försöka få mario att hoppa om man skakar till skärmen/kontrollen (hur högt man hoppar bestäms av hur snabbt man skakar till).

Spelet kommer att köras emulerat på en Raspberry Pi (RetroPie), och all handkontrollsprogrammering kommer att göras på en Arduino, som kommer ha en Accelerometer inkopplad i sig:

Nes motion controller 1.jpg

Plocklista

  • Raspberry Pi
  • Arduino Mega 2560 Rev. 3
  • SparkFun Triple Axis Accelerometer Breakout - ADXL335
  • Blandade elektronikkomponenter

Genomförande

Steg 1: Installera RetroPie

Ladda ner den senaste releasen av retropie på följande länk, och testa att Super Mario Bros går att spela med ett tangentbord. En ROM-fil för Super Mario Bros behöver kopieras till Raspberry Pin för att det ska fungera (spelkassetten måste även ägas för att det ska vara tillåtet).

Steg 2: Installera GPIO Joystick-drivrutin

En drivrutin behöver installeras på Rasperry Pin för att spelet ska kunna styras genom GPIO-portarna. Dessa kan testas genom att koppla motsvarande GPIO-port direkt till Jord (någon pull-up resistor behövs inte, då Rasperry Pin har det inbyggt och påslaget i detta fallet).

Mk joystick arcade GPIOsb+.png

Steg 3: Konstruera en Test-handkontroll för indikation och manuell input

Under testning kommer vi behöva trycka knappar direkt för att kunna styra RetroPie-menyer, och felsöka spelet. Vi bygger en enkel handkontroll med 8st tryckknappar (4st styrriktningar, Start, Select, A, B). Bredvid varje knapp sätter vi en lysdiod, för att indikera när knappen trycks i spelet (antingen av att man trycker på tryckknappen manuellt eller att Arduinon utlöser knappen automatiskt på grund av lutning etc.).

Nes motion controller 2.jpg

Nes motion controller 3.jpg

Nes motion controller 4.jpg

Steg 4: Koppla in Test-handkontrollen i Arduinon

Alla tryckknappar och lysdioder på handkontrollen behöver kopplas in i Arduinon. Målet blir att trigga varje LED på handkontrollen när motsvarande tryckknapp trycks in manuellt, detta blir en enkel övning för hur man läser och skriver digitalt mot Arduinons portar. När detta är gjort är det bara att skicka motsvarande signal till Raspberry Pi för att kontrollera spelet direkt (dock blir det lite omvänt, eftersom 5V ska ligga på knapparnas GPIO-portarna normalt, och det får bytas till Jord för att trigga motsvarande knapp). För att inte det ska bli problem med att spänningen skiljer mellan Raspberry Pi och Arduino behöver vi förmodligen köra dessa på en och samma nätadapter och koppla ihop 5V/GND-pinnarna.

Steg 5: Koppla in Accelerometer i Arduinon

När vi börjat läsa av accelerometerns värden så kan vi skriva logik för hur spelet ska styras. Här behöver vi läsa på hur en accelerometer fungerar och hur vi beräknar på lutning o.s.v. Vi behöver också skriva ut accelerometerns nuvarande värden direkt för felsökning, det kanske vi kan använda en LCD till.

Nes motion controller 5.jpg

Steg 6 (Eventuellt): Kommunikation med NES kontrollerport

Riktiga handkontroller kommunicerar med NES via ett seriellt protokoll. Detta skulle kunna implementeras på Arduinon, för att kontrollera Super Mario Bros på ett riktigt NES. Här följer lite information om protokollet: