Étape 3: Programmation de l’Arduino et faire quelques tests
// /* CONNEXIONS SUR JOYSTICK ATARI Function DB-9 Arduino AVR */ /* La manette NES est alimenté par l’Arduino. Function DB-9 Arduino AVR s’adapter à votre config matériel #undef int
Jouer sur ATARI 2600 avec manette NES de Danjovic, 2012
Mise à jour sur Arduino 0,22
//
Manette de jeu ATARI 2600
Active dans l’ordre suivant les indications d’un Joystick Atari 2600
VERS LE HAUT, BAS, GAUCHE, DROITE, DÉCLENCHER
1 broche 2 (PD2)
Vers le bas 2 broche 3 (PD3)
LAISSÉ à 3 broches 4 (PD4)
DROITE 4 broches 5 (PD5)
+ 5VCC 5 + 5V + Vcc
DÉCLENCHER la broche 6 6 (PD6)
GND GND GND 9
Manette NES
Contient un registre à décalage CMOS (CD4021). Modification de données sur la frontière de relance de l’horloge
combinaison de touches comme ci-dessous.
latch ___---_______________________
Clock _______-__-__-__-__-__-__-__
Données xxxA B MC UP DW LF RG
DONNÉES 2 broches 8 (PB0)
VERROU 3 broche 9 (PB1)
HORLOGE 4 broches 10 (PB2)
+ 5VCC 7 broche 11 (PB3)
GND 8 Pin 12 (PB4)
*/
#define POWER_VIA_PORT_B3_B4 1 / / utilisation de broches de port B3 et B4 comme alimentation
#include < stdio.h >
/ * Connexions port Atari Joystick * /
int Up_Pin = 2 ;
int Down_Pin = 3 ;
int Left_Pin = 4 ;
int Right_Pin = 5 ;
int Trigger_Pin = 6 ;
/ * Connexion de manette NES * /
int Data_Pin = 8 ;
int Latch_Pin = 9 ;
int Clock_Pin = 10 ;
int PWR5V_Pin = 11 ; puissance
int PWRGND_Pin = 12 ;
installation Sub ()
{
/ * Initialize Pins reliés à l’Atari 2600. */
Goupilles sont définies comme entrées pour émuler des sorties à collecteur ouvert
pinMode (entrée, Up_Pin) ;
pinMode (entrée, Down_Pin) ;
pinMode (entrée, Left_Pin) ;
pinMode (entrée, Right_Pin) ;
pinMode (entrée, Trigger_Pin) ;
Initialiser des sorties de verrouillage comme nulle, donc pour activer un code pin de la direction
doit être changé à la sortie
digitalWrite (Up_Pin, basse) ;
digitalWrite (Down_Pin, basse) ;
digitalWrite (Left_Pin, basse) ;
digitalWrite (Right_Pin, basse) ;
digitalWrite (Trigger_Pin, basse) ;
/ * Initialize Pins reliés à la manette NES. */
Goupille de définir comme entrées/sorties selon les besoins
pinMode (entrée, Data_Pin) ;
pinMode (Latch_Pin, sortie) ;
pinMode (Clock_Pin, sortie) ;
Initialiser le NDA contrôleur signaux
digitalWrite (Data_Pin, élevé) ; activez pullup Resistance
digitalWrite (Latch_Pin, basse) ;
digitalWrite (Clock_Pin, basse) ;
Vérifiez la météo pour actionner la manette NES ou pas
#ifdef POWER_VIA_PORT_B3_B4 / / alimentation pour manette NES via port B3 et B4
PORTB & = ~ _BV(PORTB4) ; Au sol
PORTB | = _BV(PORTB3) ; SCR
DDRB | = _BV(PORTB3) | _BV(PORTB4) ; faire des sorties
Delay(100) ; Attendez que des choses à se stabiliser
#endif
}
Effectuer un cycle d’horloge sur manette NES ligne horloge
void do_clock (void) {}
digitalWrite (Clock_Pin, élevé) ; Soulever la broche horloge
delayMicroseconds(10) ; pauses de 10 microsecondes
digitalWrite (Clock_Pin, basse) ; la tige se met
delayMicroseconds(50) ; pauses pour un autre 10 microsecondes
}
/*
Voici notre boucle principale. Il émet une impulsion loquet puis commence à reat l’état des boutons.
Les broches de port joystick Atari sont définies selon l’état des bits lu de Maj
s’inscrire à l’intérieur de la manette de la NES.
*/
void loop ()
{
digitalWrite (Latch_Pin, élevé) ; Augmenter le signal de verrouillage
delayMicroseconds(30) ; Maintenez-le enfoncé pendant 30 microsecondes
digitalWrite (Latch_Pin, basse) ; Signal de retour latch à faible niveau
delayMicroseconds(10) ; Maintenez-le enfoncé pendant plus de 10 microsecondes
Traiter le bouton A (n’oubliez pas : un zéro signifie bouton enfoncé)
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Trigger_Pin) ; Unassert broche (zéro signifie bouton enfoncé)
}
d’autre
{
pinMode (Trigger_Pin, sortie) ; Affirmer la broche
}
do_clock() ; Un signal de synchronisation est généré à la fin de chaque bit
Traiter le bouton B / / NES Both bouton génère un déclencheur à Atari
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Trigger_Pin) ; Unassert goupille
}
d’autre
{
pinMode (Trigger_Pin, sortie) ; Affirmer la broche
}
do_clock() ;
Bouton Sélectionner Skip
do_clock() ;
Bouton Démarrer Skip
do_clock() ;
Direction
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Up_Pin) ; Unassert goupille
}
d’autre
{
pinMode (Up_Pin, sortie) ; Affirmer la broche
}
do_clock() ;
Direction de processus vers le bas
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Down_Pin) ; Unassert goupille
}
d’autre
{
pinMode (Down_Pin, sortie) ; Affirmer la broche
}
do_clock() ;
Processus de direction gauche
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Left_Pin) ; Unassert goupille
}
d’autre
{
pinMode (Left_Pin, sortie) ; Affirmer la broche
}
do_clock() ;
Processus de direction droite
Si (digitalRead(Data_Pin))
{
pinMode (entrée, Right_Pin) ; Unassert goupille
}
d’autre
{
pinMode (Right_Pin, sortie) ; Affirmer la broche
}
do_clock() ; Un peu inutile, mais gardé pour maintenir le modèle
Après avoir lu tous les boutons, attendez 10 milisseconds avant la prochaine lecture
Delay(10) ;
}