电子说
第1步:设备
1 x原始NES控制器 - 我从当地的二手商店挑选了一个
1 x Arduino UNO - 我使用了DuinoTECH经典(UNO)
5 - 7 x公 - 公跳线 - 我建议使用各种颜色使故障排除更容易(我总是使用黑色表示GND,红色表示+ 5V然后旋转通过彩虹的颜色)
1 x LED(可选)
1 x 330欧姆电阻(可选)
1 x面包板(可选)
USB电缆
安装了Arduino IDE的计算机
步骤2:连接
黑线从Arduino上的 GND 到 Pin 1 NES控制器插头
红线从 + 5V 到 Pin 7
橙色线从 D5 到 Pin 2
黄线从 D6 到 Pin 3
绿线从 D7 到第4针
蓝色电线从 D13 到LED 阳极
330欧姆电阻来自LED 阴极到 GND (使用另一根黑线) - 我认为大多数Arduino UNO板都有一个小型表面贴装LED,它连接到D13,因此连接另一个LED是可选的。
第一张图显示了NES控制器插头 - 点击每个插座/引脚以找出每个功能。男性 - 男性跳线完美地插入插座。
第3步:按钮状态和去抖动
如果你打算使用两个这个NES控制器灯开关的按钮(例如开始用于开启和选择用于关闭)这将非常容易从我之前的教练那里调整NES控制器钢琴素描很容易:
标签D13为 led
删除 nes = 255 行
删除其他按钮功能
更改 bitRead( nes,4)== 0 对 digitalWrite(led,HIGH)的音调命令
更改 bitRead(nes,5) == 0音调命令到 digitalWrite(led,LOW)
#define nesClock 5 // label pinout
#define nesLatch 6
#define nesData 7
#define led 13
byte nes = 0; // global variable
void setup() {
// put your setup code here, to run once:
Serial.begin (9600); // serial terminal speed
pinMode (nesData, INPUT); // set up pins
pinMode (nesClock, OUTPUT);
pinMode (nesLatch, OUTPUT);
pinMode (led, OUTPUT);
digitalWrite (led, LOW);
}
void loop() {
// put your main code here, to run repeatedly:
nes = nesRead ();
if (bitRead (nes, 4) == 0){
digitalWrite (led, HIGH);
}
if (bitRead (nes, 5) == 0){
digitalWrite (led, LOW);
}
delay (180);
}
byte nesRead (){ // “bit banging”
byte value = 0;
digitalWrite (nesLatch, HIGH);
delayMicroseconds(5);
digitalWrite (nesLatch, LOW);
for (int i=0; i《8; i++) {
digitalWrite (nesClock, LOW);
value |= digitalRead (nesData) 《《 (7 - i);
digitalWrite (nesClock, HIGH);
}
return (value);
}
然而,我花了一些时间来锻炼如何仅使用START按钮。我修改了Arduino.cc去抖动教程中的代码 - 去抖动在这个草图中是必不可少的(删除 debounceDelay 和 lastDebounceTime 会产生非常不可预测的效果(有时LED会亮,有时候它是关闭的,有时它是FLASHING并且草图的连续监视器部分正在加班以跟上)。
int ledState = HIGH; // current state of LED pin
int buttonState; // see below in loop()
int lastButtonState = LOW; // last time START was pressed
long lastDebounceTime = 0; // for debouncing switch
long debounceDelay = 200; // for debouncing switch void loop() { // put your main code here, to run repeatedly:
buttonState = bitRead (nes, 4); // START pressed
nesRead ();
if (buttonState == 0 && lastButtonState == LOW && millis() - lastDebounceTime 》 debounceDelay){
if (ledState == HIGH){
ledState = LOW; // LED is OFF
//Serial.println (“OFF”);
}
else {
ledState = HIGH; // LED is ON
//Serial.println (“ON”);
}
lastDebounceTime = millis ();
}
digitalWrite (led, ledState );
lastButtonState = buttonState;
不幸的是我曾用过的代码比特爆炸在我的NES控制器中,钢琴草图在这种情况下不起作用 - 参见步骤4.
步骤4:位绑定
当按下按钮时,NES控制器使用4021移位寄存器来创建数据脉冲 - 单击图片中的按钮可查看按下每个按钮时创建的数据,或尝试从 bradsprojects.com-运行此草图,Arduino捕获脉冲并通过查找每个脉冲中的0来解释它们。/p》
我用来捕获NES控制器数据的代码与我的其他NES控制器Instructables中使用的代码不同。我无法调整Gordon McComb的*方法来执行此任务(使用单个 NES按钮来点亮 ON 和 OFF ) - LED像经典的Blink sketch 一样连续闪烁。我使用了一个与 Loop()函数分开的函数,我将其称为 nesRead() - 这个使用的位移方式略有不同 - 我先读了一下它在 arduino.cc。
void nesRead (){ //function to read data from NES controller nes = 0;
digitalWrite (nesLatch, LOW);
digitalWrite (nesClock, LOW);
digitalWrite (nesLatch, HIGH);
delayMicroseconds (2);
digitalWrite (nesLatch, LOW);
nes = digitalRead (nesData);
for (int i = 1; i 《=7; i ++){
digitalWrite (nesClock, HIGH);
delayMicroseconds (2);
nes = nes 《《1; // bitshift
nes = nes + digitalRead (nesData);
delayMicroseconds (4);
digitalWrite (nesClock, LOW);
}
}
*由Gordon McComb McGraw Hill 2013撰写的“Arduino Robot Bonanza”中的Teachbot游戏手柄控制器草图。
第5步:完整草图
#define nesClock 5 // label pinout
#define nesLatch 6
#define nesData 7
#define led 13
int ledState = HIGH; // current state of LED pin
int buttonState; // see below in loop()
int lastButtonState = LOW; // last time START was pressed
long lastDebounceTime = 0; // for debouncing switch
long debounceDelay = 200; // for debouncing switch
byte nes = 0; // label 8 bit data from controller
/* Setup */
void setup() {
// put your setup code here, to run once:
delay (1000);
// Serial.begin (9600);
pinMode (nesLatch, OUTPUT); // set up pins
pinMode (nesClock, OUTPUT);
pinMode (nesData, INPUT);
pinMode (led, OUTPUT);
}
void nesRead (){ //function to read data from NES controller
nes = 0;
digitalWrite (nesLatch, LOW);
digitalWrite (nesClock, LOW);
digitalWrite (nesLatch, HIGH);
delayMicroseconds (2);
digitalWrite (nesLatch, LOW);
nes = digitalRead (nesData);
for (int i = 1; i 《=7; i ++){
digitalWrite (nesClock, HIGH);
delayMicroseconds (2);
nes = nes 《《1; // bitshift
nes = nes + digitalRead (nesData);
delayMicroseconds (4);
digitalWrite (nesClock, LOW);
}
}
void loop() {
// put your main code here, to run repeatedly:
buttonState = bitRead (nes, 4); // START pressed
nesRead ();
if (buttonState == 0 && lastButtonState == LOW && millis() - lastDebounceTime 》 debounceDelay){
if (ledState == HIGH){
ledState = LOW; // LED is OFF
//Serial.println (“OFF”);
}
else {
ledState = HIGH; // LED is ON
//Serial.println (“ON”);
}
lastDebounceTime = millis ();
}
digitalWrite (led, ledState );
lastButtonState = buttonState; // Current state (i.e. ON or OFF) of START is now lastButtonState
}
第6步:开启和关闭灯光
如果您有经验,请通过兼容Arduino的继电器连接Nintendo主题灯。..。..
全部0条评论
快来发表一下你的评论吧 !