0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:工程师吴畏 2019-08-26 09:46 次阅读

第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:连接

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

黑线从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主题灯。..。..

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

    关注

    19

    文章

    2995

    浏览量

    92678
  • 控制器
    +关注

    关注

    112

    文章

    15154

    浏览量

    170952
收藏 人收藏

    评论

    相关推荐

    STM32F412G-DISCO怎样用MX生成fatfs的代码?

    STM32F412G-DISCO怎样用MX生成fatfs的代码? SD卡例程能跑,但mx生成的代码不能正常运行,我生成代码后是不是还要配置一些东西?(我生成后只写了测试代码) 问题解决了,虽然我不知道我为什么不能直接使用mx生成的代码去操作sd卡,但我通过复制粘贴例程的代码完成了测试。
    发表于 03-12 08:15

    求购两个LED呼吸控制器

    某宝某多买了几个控制器发现LED的亮度变化在低占空比的时候,变化很明显,而在高占空比的时候反而变化很小,导致呼吸表现呼吸不均匀的现象,我想要的是控制器能做到LED亮度的线性变化。有能做的大神联系我: 壹捌捌柒柒捌捌陆叁贰叁
    发表于 01-31 21:54

    无线通信:怎样用电磁波表示1和0

    为什么频率越高,能携带的信息就越多?以数字信号为例,信息就是一串串的1和0,所以先搞清楚怎样用电磁波表示1和0。
    发表于 12-05 14:44 595次阅读
    无线通信:<b class='flag-5'>怎样用</b>电磁波表示1和0

    怎样用ADAU1761设计DRC的压缩/扩展?

    请问怎样用ADAU1761设计DRC的压缩/扩展。我在SigmaStudio 4.5的模块中只找到RMS。如果ADAU1761设计DRC要怎样
    发表于 11-28 06:41

    5个步骤,让你的核桃派玩回当年火爆全球NES游戏

    1.准备好你的nes游戏: nes游戏链接:链接:百度网盘 请输入提取码 提取码:k6sh 2.安装nes游戏模拟: sudo apt-get install nestopia 3
    发表于 11-22 10:50

    【开源项目】ESP32复刻Nokia 1110,可运行NES游戏,播放音乐,也能连Wi-Fi!

    Ω 0.5W 扬声20MM TF 卡座 翻盖式 WS2812珠 5050 USB转串口芯片:CH340N 锂电池充电芯片:TP4055 3.3V稳压芯片: RT9013-33G 长按开关
    发表于 11-16 14:52

    怎样用32单片机测电压?

    怎样用32单片机测电压
    发表于 10-31 07:09

    怎样用现成的Eclipse插件来调试AT32系列芯片以及SLIB的配置范例

    本篇应用指南主要描述怎样用现成的Eclipse插件来调试AT32系列芯片以及SLIB的配置范例。本文档仅以AT32F403A为例进行说明,关于AT32F403A SLIB的详细说明,请详阅《AT32F403ASecurity Library Application Note》。
    发表于 10-24 07:41

    怎样用现成的Eclipse插件来调试AT32系列芯片

    拥有很高的灵活性,软件可以以Eclipse为架构开发自己的IDE。这边文档主要描述怎样用现成的Eclipse插件来调试AT32系列芯片。
    发表于 10-24 07:12

    怎样用单片机IO口来控制三极管的开关特性使共阳极的LED点亮?

    怎样用单片机IO口来控制三极管的开关特性使共阳极的LED点亮
    发表于 10-15 06:02

    PLC中怎样用X和Y两个轴走出直线轨迹?

    PLC中怎样用X和Y两个轴走出直线轨迹呢?那么这两个轴需要配合成速度成线性比例,位置和速度应该如何云运算呢?
    发表于 09-12 09:58 353次阅读
    PLC中<b class='flag-5'>怎样用</b>X和Y两个轴走出直线轨迹?

    怎样用示波器测试lin总线的波特率呢?

    怎样用示波器测试lin总线的波特率呢?有什么方法吗?
    发表于 05-09 11:22

    怎样用FPGA实现FSK调制解调呢?

    最近想做这方面的,怎样用FPGA实现FSK调制解调?但是我一点头绪都没有,哪位高手帮帮忙,讲解一下什么的
    发表于 05-08 17:34

    请问Proteus仿真软件中怎样用探针测电压呢?

    请问Proteus仿真软件中怎样用探针测电压呢?
    发表于 04-26 15:55

    怎样用74LS00实现两位数据输入的奇偶校验电路?

    怎样用74LS00实现两位数据输入的奇偶校验电路?
    发表于 04-26 11:25