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

    文章

    3128

    浏览量

    93501
  • 控制器
    +关注

    关注

    112

    文章

    16206

    浏览量

    177427
收藏 人收藏

    评论

    相关推荐

    采用AT89C52单片机作为路灯控制系统的支路控制器

    本系统采用AT89C52单片机作为路灯控制系统的支路控制器,采用光敏二极管 检测光强度、红外对管检测移动物体经过的位置等方法控制路灯按预定要求自动
    发表于 11-24 14:37 0次下载

    创新型智慧杆综合应用解决方案 路灯单控制器

    创新型智慧杆综合应用解决方案 路灯单控制器
    的头像 发表于 11-13 08:31 187次阅读
    创新型智慧<b class='flag-5'>灯</b>杆综合应用解决方案 路灯单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b>

    一文读懂单控制器工作原理

    一文读懂单控制器工作原理
    的头像 发表于 11-11 13:13 117次阅读
    一文读懂单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b>工作原理

    智慧城市路灯——联网单控制系统,单控制器

    智慧城市路灯——联网单控制系统,单控制器
    的头像 发表于 11-11 12:52 175次阅读
    智慧城市路灯——<b class='flag-5'>灯</b>联网单<b class='flag-5'>灯</b><b class='flag-5'>控制</b>系统,单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b>

    智慧照明 智慧控之核心硬件——单控制器

    智慧照明 | 智慧控之核心硬件——单控制器
    的头像 发表于 11-11 12:44 156次阅读
    智慧照明   智慧<b class='flag-5'>灯</b>控之核心硬件——单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b>

    怎样用THS3201实现输出功率可调?

    怎样用THS3201实现输出功率可调?
    发表于 08-26 08:28

    什么是开关控制器?有哪些特点?

    开关控制器作为一种电子设备,在现代自动化控制技术中扮演着至关重要的角色。其主要功能在于控制电路的通断,进而实现对各种设备的
    的头像 发表于 06-05 15:55 1342次阅读

    PID控制器开关控制器的区别

    在工业自动化控制系统中,PID控制器开关控制器是两种常见的控制策略。它们各自具有独特的工作原理、应用场景和优缺点。本文旨在详细探讨PID
    的头像 发表于 06-05 15:50 723次阅读

    stm32f100怎样用重映射功能?

    的是stm32f100c8t6b芯片,现在想用将PB1映射为TIM1_CH3N,在调用GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM1)时, GPIO_PinAFConfig和GPIO_AF_TIM1都没定义,stm32f100
    发表于 05-07 06:06

    智慧杆灵魂人物-单控制器

    熙枚物联在采用HPLC单控制器智慧路灯系统中,根据HPLC通讯的优势,对功能进行了优化。
    的头像 发表于 04-24 11:34 422次阅读
    智慧<b class='flag-5'>灯</b>杆灵魂人物-单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b>

    智能单控制器 计讯物联TL112

    智能单控制器集成了先进技术的照明控制设备,它极大地改变了传统照明方式,并使之更加智能化。计讯物联智能单控制器TL112广泛应用于道路、景
    的头像 发表于 04-07 10:58 318次阅读
    智能单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b> 计讯物联TL112

    4G CAT.1单控制器 计讯物联TL112

    传统的照明控制方式往往需要通过开关进行操作,而单控制器的出现改变了这一局面。计讯物联单控制器
    的头像 发表于 03-28 15:10 368次阅读
    4G CAT.1单<b class='flag-5'>灯</b><b class='flag-5'>控制器</b> 计讯物联TL112

    物联网单控制器如何安装接线?

    物联网单控制器如何安装接线? 物联网单控制器是一种智能化的设备,用于实现对单个灯具的远程控制和管理。安装接线是使用该
    的头像 发表于 02-03 14:01 2035次阅读

    控制器工作原理是什么?单控制器是如何控制灯具的?

    控制器工作原理是什么?单控制器是如何控制灯具的? 单
    的头像 发表于 02-03 11:38 2101次阅读

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

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