第1步:設(shè)備
1 x原始NES控制器 - 我從當(dāng)?shù)氐亩稚痰晏暨x了一個(gè)
1 x Arduino UNO - 我使用了DuinoTECH經(jīng)典(UNO)
5 - 7 x公 - 公跳線 - 我建議使用各種顏色使故障排除更容易(我總是使用黑色表示GND,紅色表示+ 5V然后旋轉(zhuǎn)通過(guò)彩虹的顏色)
1 x LED(可選)
1 x 330歐姆電阻(可選)
1 x面包板(可選)
USB電纜
安裝了Arduino IDE的計(jì)算機(jī)
步驟2:連接
黑線從Arduino上的 GND 到 Pin 1 NES控制器插頭
紅線從 + 5V 到 Pin 7
橙色線從 D5 到 Pin 2
黃線從 D6 到 Pin 3
綠線從 D7 到第4針
藍(lán)色電線從 D13 到LED 陽(yáng)極
330歐姆電阻來(lái)自LED 陰極到 GND (使用另一根黑線) - 我認(rèn)為大多數(shù)Arduino UNO板都有一個(gè)小型表面貼裝LED,它連接到D13,因此連接另一個(gè)LED是可選的。
第一張圖顯示了NES控制器插頭 - 點(diǎn)擊每個(gè)插座/引腳以找出每個(gè)功能。男性 - 男性跳線完美地插入插座。
第3步:按鈕狀態(tài)和去抖動(dòng)
如果你打算使用兩個(gè)這個(gè)NES控制器燈開(kāi)關(guān)的按鈕(例如開(kāi)始用于開(kāi)啟和選擇用于關(guān)閉)這將非常容易從我之前的教練那里調(diào)整NES控制器鋼琴素描很容易:
標(biāo)簽D13為 led
刪除 nes = 255 行
刪除其他按鈕功能
更改 bitRead( nes,4)== 0 對(duì) digitalWrite(led,HIGH)的音調(diào)命令
更改 bitRead(nes,5) == 0音調(diào)命令到 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);
}
然而,我花了一些時(shí)間來(lái)鍛煉如何僅使用START按鈕。我修改了Arduino.cc去抖動(dòng)教程中的代碼 - 去抖動(dòng)在這個(gè)草圖中是必不可少的(刪除 debounceDelay 和 lastDebounceTime 會(huì)產(chǎn)生非常不可預(yù)測(cè)的效果(有時(shí)LED會(huì)亮,有時(shí)候它是關(guān)閉的,有時(shí)它是FLASHING并且草圖的連續(xù)監(jiān)視器部分正在加班以跟上)。
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;
不幸的是我曾用過(guò)的代碼比特爆炸在我的NES控制器中,鋼琴草圖在這種情況下不起作用 - 參見(jiàn)步驟4.
步驟4:位綁定
當(dāng)按下按鈕時(shí),NES控制器使用4021移位寄存器來(lái)創(chuàng)建數(shù)據(jù)脈沖 - 單擊圖片中的按鈕可查看按下每個(gè)按鈕時(shí)創(chuàng)建的數(shù)據(jù),或嘗試從 bradsprojects.com-運(yùn)行此草圖,Arduino捕獲脈沖并通過(guò)查找每個(gè)脈沖中的0來(lái)解釋它們。/p》
我用來(lái)捕獲NES控制器數(shù)據(jù)的代碼與我的其他NES控制器Instructables中使用的代碼不同。我無(wú)法調(diào)整Gordon McComb的*方法來(lái)執(zhí)行此任務(wù)(使用單個(gè) NES按鈕來(lái)點(diǎn)亮 ON 和 OFF ) - LED像經(jīng)典的Blink sketch 一樣連續(xù)閃爍。我使用了一個(gè)與 Loop()函數(shù)分開(kāi)的函數(shù),我將其稱為 nesRead() - 這個(gè)使用的位移方式略有不同 - 我先讀了一下它在 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撰寫(xiě)的“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步:開(kāi)啟和關(guān)閉燈光
如果您有經(jīng)驗(yàn),請(qǐng)通過(guò)兼容Arduino的繼電器連接Nintendo主題燈。..。..
-
開(kāi)關(guān)
+關(guān)注
關(guān)注
19文章
3282瀏覽量
95399 -
控制器
+關(guān)注
關(guān)注
114文章
17113瀏覽量
184332
發(fā)布評(píng)論請(qǐng)先 登錄
NB-IoT單燈控制器:智慧照明的“神經(jīng)末梢”
物聯(lián)網(wǎng)單燈控制器產(chǎn)品簡(jiǎn)介

評(píng)論