怎样用NES控制器作为灯的开关

电子说

1.3w人已加入

描述

第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主题灯。..。..

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分