Arduino låter dig spela Atari 2600 och ZX Spectrum handkontroll NES (3 / 4 steg)
Steg 3: Programmera Arduino och gör några tester
// /* ANSLUTNINGAR PÅ ATARI JOYSTICK Funktionen DB-9 Arduino AVR */ /* NES controller drivs av Arduino. Funktionen DB-9 Arduino AVR anpassa sig till din hårdvara config #undef int / * Atari Joystick port anslutningar * / / * NES Controller anslutningar * / Ogiltiga inställningar) Initiera spärren utgångar som noll, alltså att aktivera en pin riktning / * Initiera Pins ansluten till NES controller. */
Spela på ATARI 2600 med NES Controller av Danjovic, 2012
Sammanställts på Arduino 0.22
//
ATARI 2600 Joystick
Sekventiellt aktiverar följande anvisningarna från en Atari 2600 Joystick
UPP, NER, VÄNSTER, HÖGER, UTLÖSA
UPP 1 stift 2 (PD2)
NER 2 stift 3 (PD3)
LÄMNADE 3 stift 4 (PD4)
RÄTT 4 Pin 5 (PD5)
+ 5VCC 5 + 5V + Vcc
UTLÖSA 6 stift 6 (PD6)
GND 9 GND GND
NES Controller
Innehåller en CMOS skiftregister (CD4021). Data förändring på höja gränsen för Clock
knapp sekvens enligt nedan.
latch ___---_______________________
Clock _______-__-__-__-__-__-__-__
Data xxxA B SM upp DW LF RG
DATA 2 Pin 8 (PB0)
SPÄRREN 3 stift 9 (PB1)
KLOCKAN 4-Pin 10 (PB2)
+ 5VCC 7 stift 11 (PB3)
GND 8 Pin 12 (PB4)
*/
#define POWER_VIA_PORT_B3_B4 1 / / använda port stift B3 och B4 som strömförsörjning
#include < stdio.h >
int Up_Pin = 2;
int Down_Pin = 3;
int Left_Pin = 4;
int Right_Pin = 5;
int Trigger_Pin = 6;
int Data_Pin = 8;
int Latch_Pin = 9;
int Clock_Pin = 10;
int PWR5V_Pin = 11; Power
int PWRGND_Pin = 12;
{
/ * Initiera Pins ansluten till Atari 2600. */
Stiften är inställda som insatsvaror till tävla med öppen kollektor utgångar
pinMode (Up_Pin, indata);
pinMode (Down_Pin, indata);
pinMode (Left_Pin, indata);
pinMode (Right_Pin, indata);
pinMode (Trigger_Pin, indata);
skall ändras till utgång
digitalWrite (Up_Pin, låg);
digitalWrite (Down_Pin, låg);
digitalWrite (Left_Pin, låg);
digitalWrite (Right_Pin, låg);
digitalWrite (Trigger_Pin, låg);
PIN-kod som in-/ utgångar som krävs
pinMode (Data_Pin, indata);
pinMode (Latch_Pin, OUTPUT);
pinMode (Clock_Pin, OUTPUT);
Initiera NES controller signaler
digitalWrite (Data_Pin, hög); Aktivera pullup resitor
digitalWrite (Latch_Pin, låg);
digitalWrite (Clock_Pin, låg);
Kolla vädret för att driva NES joysticken eller inte
#ifdef POWER_VIA_PORT_B3_B4 / / strömförsörjning för NES controller via port B3 och B4
PORTB & = ~ _BV(PORTB4); Marken
PORTB | = _BV(PORTB3); VCC
DDRB | = _BV(PORTB3) | _BV(PORTB4); göra utgångar
Delay(100); vänta på saker att stabilisera
#endif
}
Utföra en klockcykel på NES controller klocka linje
void do_clock (void) {
digitalWrite (Clock_Pin, hög); Höja klocka pin
delayMicroseconds(10); pauser för 10 mikrosekunder
digitalWrite (Clock_Pin, låg); framhäver den PIN-kod
delayMicroseconds(50); pauser för en annan 10 mikrosekunder
}
/*
Här är våra viktigaste loop. Det utfärdar en spärr puls då börjar reat tillståndet för knapparna.
Atari joystick port stiften sätts i enlighet med tillståndet för de bitarna läsa från SKIFT
registrera i NES controller.
*/
Ogiltig loop)
{
digitalWrite (Latch_Pin, hög); Höja spärren signalen
delayMicroseconds(30); Håll den för 30 mikrosekunder
digitalWrite (Latch_Pin, låg); Tillbaka spärren signal till låg nivå
delayMicroseconds(10); hålla det för mer 10 mikrosekunder
Bearbeta knappen A (kom ihåg: en nolla betyder knappen nedtryckt)
om (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, indata); Unassert pin (noll betyder knappen nedtryckt)
}
annat
{
pinMode (Trigger_Pin, OUTPUT); Hävda pin
}
do_clock(); En klocka puls genereras i slutet av varje bit
Bearbeta knappen B / / både NES knappen genererar en utlösare till Atari
om (digitalRead(Data_Pin))
{
pinMode (Trigger_Pin, indata); Unassert stift
}
annat
{
pinMode (Trigger_Pin, OUTPUT); Hävda pin
}
do_clock();
Hoppa Välj knappen
do_clock();
Hoppa över Start-knappen
do_clock();
UPP riktning
om (digitalRead(Data_Pin))
{
pinMode (Up_Pin, indata); Unassert stift
}
annat
{
pinMode (Up_Pin, OUTPUT); Hävda pin
}
do_clock();
Processen ner riktning
om (digitalRead(Data_Pin))
{
pinMode (Down_Pin, indata); Unassert stift
}
annat
{
pinMode (Down_Pin, OUTPUT); Hävda pin
}
do_clock();
Processen vänster riktning
om (digitalRead(Data_Pin))
{
pinMode (Left_Pin, indata); Unassert stift
}
annat
{
pinMode (Left_Pin, OUTPUT); Hävda pin
}
do_clock();
Processen rätt riktning
om (digitalRead(Data_Pin))
{
pinMode (Right_Pin, indata); Unassert stift
}
annat
{
pinMode (Right_Pin, OUTPUT); Hävda pin
}
do_clock(); Ganska meningslöst, men bevarade att upprätthålla mönstret
Efter läst alla knappar, vänta 10 milisseconds före nästa behandling
Delay(10);
}