Verwenden Sie einen alten Nintendo NES-Controller als Eingabegerät


7

Hat jemand ein Pinbelegungsdiagramm für den Nintendo NES Controller? Ich möchte den NES-Controller mit einem Arduino verbinden.


3
Warum sollten Sie sich über die Pinbelegung Gedanken machen, es sei denn, Sie möchten versuchen, den Gegenstecker für diesen ungewöhnlichen NES-Stecker zu finden? Ich würde wahrscheinlich den Originalstecker abschneiden und durch einen DB-9 ersetzen und ihn entsprechend verkabeln.
JustJeff

Antworten:




6

Hier ist eine weitere Seite mit hilfreichen Informationen , einschließlich eines Signaldiagramms.

          +----> Power  (white)
          |
5 +---------+  7    
  | x  x  o   \     
  | o  o  o  o |    
4 +------------+ 1  
    |  |  |  |
    |  |  |  +-> Ground (brown)
    |  |  +----> Pulse  (red)
    |  +-------> Latch  (orange)
    +----------> Data   (yellow)

6

Ich habe einen großartigen Artikel über Hack-A-Day gefunden, in dem es um Ihre Suche geht. Dieser Artikel befasst sich mit der Verbindung des SNES-Controllers mit einem Android unter Verwendung eines Arduino. Um Ihnen die Mühe zu ersparen, den Artikel zu sichten, habe ich den verknüpften Code gefunden, den sie zitiert haben:

Dieser Code verwendet einen NES-Controller der 1980er Jahre, um ein Servo und eine LED mit dem Arduino zu steuern. Mit diesem Code dreht das 'up'-Pad ein Servo um 180 Grad,' right 'dreht es auf 90 und' down 'dreht es auf 0 Grad. Außerdem schalten die Tasten A und B eine LED ein und aus. Sie können einen NES-Controller bei ebay für weniger als 10,00 USD erwerben. Hier ist eine grobe Zeichnung des Controller-Steckers, vier Löcher auf der einen Seite, drei Löcher auf der anderen.


                       0 - 0 V (Masse)
      + 5V --- 0 0 --UHR   
  nichts --- 0 0 --LATCH  
  nichts --- 0 0 --SERIAL OUT 

Sie können für das Prototyping einfach Drähte in die Steckerlöcher des Controllers stecken. Die +5 ist mit der Arduino +5 Masse verbunden. Die Arduino-Erdungsverriegelung geht an Pin 2 (mit diesem Code). Takt an Pin 3 Serial Out an Pin 4

Die Servodatenleitung ist an Pin 10 angeschlossen und die LED leuchtet an Pin 11.

Wenn Sie den Controller-Eingang auf dem seriellen Monitor sehen möchten, öffnen Sie einfach den seriellen Monitor. Es zeigt Ihnen die Binärzahlen, die vom Controller eingehen. Jede Taste hat eine eigene Binärzahl. 'Up' ist zum Beispiel 11110111. Ich habe einen // versteckten Serial.println-Code eingefügt, der "Taste wurde gedrückt" anzeigt, wenn Sie die Starttaste drücken. Löschen Sie einfach das '//', wenn Sie das verwenden möchten. Der SNES-Stecker ist anders. Sie sind daran interessiert, dass Sie an anderer Stelle nach Informationen zu Uhr, Verriegelung und seriellem Ausgang suchen müssen.

Zitat:

/* INITIALIZATION */
#include <ServoTimer1.h>
ServoTimer1 servo1;

int latch = 2; // set the latch pin
int clock = 3; // set the clock pin
int datin = 4;// set the data in pin
byte controller_data = 0;
int ledpin = 11;


/* SETUP */
void setup() {
Serial.begin(57600);
pinMode(latch,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(datin,INPUT);
pinMode(ledpin, OUTPUT);

digitalWrite(latch,HIGH);
digitalWrite(clock,HIGH);

servo1.attach(10);

}

/* THIS READS DATA FROM THE CONTROLLER */
void controllerRead() {
controller_data = 0;
digitalWrite(latch,LOW);
digitalWrite(clock,LOW);

digitalWrite(latch,HIGH);
delayMicroseconds(2);
digitalWrite(latch,LOW);

controller_data = digitalRead(datin);

for (int i = 1; i <= 7; i ++) {
digitalWrite(clock,HIGH);
delayMicroseconds(2);
controller_data = controller_data << 1;
controller_data = controller_data + digitalRead(datin) ;
delayMicroseconds(4);
digitalWrite(clock,LOW);
}

}

/* THE LED, SERVO, AND SERIAL MONITOR PROGRAM */
void loop() {
controllerRead();
Serial.println(controller_data, BIN);

// if (controller_data==B11101111){
  // Serial.println("Button has been Pressed");   
   //}  else {
   //Serial.println("Button not pressed");
   //}

//for REFERENCE:  
//UP = 11110111
//DOWN=11111011
//LEFT=11111101
//RIGHT=11111110
//SELECT=11011111
//START=11101111
//A=01111111
//B=10111111

if (controller_data==B01111111){
 digitalWrite(ledpin, HIGH);   
 }

if (controller_data==B10111111){
 digitalWrite(ledpin, LOW);
}

if (controller_data==B11110111){
 servo1.write(180);
}  

if (controller_data==B11111011){
 servo1.write(0);
}

if (controller_data==B11111110){
 servo1.write(90);
}

delay(100);
}

Arduino SNES Instructable

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.