Arduino 接收NEC红外遥控编码

该博客介绍如何利用Arduino接收到NEC红外遥控器发出的编码,并通过串口将其详细信息打印出来,主要涉及的硬件接口为IR_PIN,预设为2。

使用Arduino接收红外遥控编码并打印到串口
IR_PIN 默认为2

/*本程序用来接收NEC红外编码
 * 程序原理:通过判断两次下降沿的周期宽度判断当前bit是逻辑1还是逻辑0
 * 逻辑1  560+1690=2250us  逻辑0 560+560=1120us
 * 接收到的数据是低位在前,保存的bit顺序为 0->7
 * 
 * 
 * 当收到第1个下降沿时认为程序进入等待前导码阶段,即:9ms低+4.5ms高,
 * 所以可在下一个下降沿时判断脉宽是否在13.5ms左右,如果是则标记进入收码阶段,否则返回重新等待新的下降沿
 * 
 * 进入收码阶段后每次下降沿判断脉宽,得到逻辑1或0并写入buf,写满1个字节后转存至全局变量数组中
 * 
 * 接收IO连续高电平100ms以上时认为收码结束,标记结束
 * loop检测到收码结束时打印结果
 * 
 * BH3PXN
 * 2020.05.29
*/

#define IR_PIN 2

#define STEP_FREE 0
#define STEP_WAIT_PRECODE 1
#define STEP_RECV_CODE 2
#define STEP_RECV_OVER 3

unsigned char recvStep = STEP_FREE;
unsigned char irCode[100];
unsigned char idx = 0;
void setup() {
   
   
  // put your setup code here, to run once:
  pinMode(IR_PIN, INPUT_PULLUP); //开启上拉
  Serial.begin(9600);
}

void loop() {
   
   
  // put your main code here, to run repeatedly:
  IR_RECV();
  outputIRCODE();

}
void outputIRCODE() {
   
   
  
### 实现方案 为了实现 Arduino Nano 使用红外遥控器控制舵机转动,并且两者共用同一个信号引脚的功能,可以采用中断方式捕获红外信号并解析其指令。以下是详细的说明和代码示例。 #### 硬件连接 1. **红外接收模块**:将红外接收模块的数据引脚连接到 Arduino 的数字引脚(例如 D2),该引脚需支持外部中断功能。 2. **舵机连接**:舵机的信号线同样连接到同一数字引脚(D2)。由于硬件设计限制,需要通过软件模拟 PWM 输出来驱动舵机[^2]。 3. **其他连接**:确保舵机的地线与红外接收模块的地线共同接到 Arduino GND 上,电源线则接入合适的电压源(通常为 5V 或独立供电)。 #### 工作原理 - 当红外遥控发送信号时,Arduino 将检测到脉冲宽度变化并通过解码获取按键对应的命令值。 - 解析后的命令用于设置舵机的目标角度。 - 利用 `attachInterrupt` 函数监听指定引脚的状态改变事件,从而实现在单一引脚上完成两种设备的操作。 下面是具体的代码实现: ```cpp #include <IRremote.h> // 引入红外库文件 #include <Servo.h> // 引入舵机库文件 // 定义变量 const int IR_RECEIVE_PIN = 2; // 红外接收引脚定义为D2 decode_results results; // 存储解码结果的对象 Servo myservo; // 创建一个servo对象来控制舵机 int currentAngle = 90; // 初始化舵机的角度为中间位置(90度) void setup() { Serial.begin(9600); // 设置串口波特率以便调试打印数据 pinMode(IR_RECEIVE_PIN, INPUT); // 配置红外接收管脚模式为输入 myservo.attach(IR_RECEIVE_PIN); // 把舵机绑定至相同的GPIO2作为输出通道 } void loop() { if (irrecv.decode(&results)) { // 如果成功接收到有效编码 unsigned long value = results.value;// 获取按下的键值 switch(value){ case 0xFFA25D : // 假设这是向上箭头按钮对应十六进制数值 adjustServo(+5); break; case 0xFFE21D : // 向下箭头假设为此处表示 adjustServo(-5); break; default : ; // 对于未映射的动作不做任何处理 } irrecv.resume(); // 接收下一个值之前重新启动解码过程 } delay(100); // 循环等待时间间隔防止过度频繁查询 } /** * @brief 根据增量调整当前舵机的位置 */ void adjustServo(int deltaDegree){ int newTarget = constrain(currentAngle + deltaDegree , 0 , 180 ); if(newTarget != currentAngle ){ currentAngle = newTarget ; myservo.write(currentAngle ); // 更新实际物理旋转状态 String msg = "Set Angle To "; msg += String(currentAngle ) +"°"; Serial.println(msg.c_str()); } } ``` 此段落描述了如何编写一段程序让单片机能响应来自特定品牌型号电视机或其他电器配套使用的标准RC-5协议类型的简单型学习型通用无线电信号发射装置所发出的不同频率组合而成的一系列短促高低电平交替形成的方波序列形式表达出来的各种可能存在的不同含义的信息包内容结构特征属性特点等等情况之后再依据预设好的条件反射机制自动触发执行某些预定动作比如这里就是指带动一个小伺服马达按照一定规律缓慢平稳精确地朝某个固定方向逐步微量偏转适当幅度距离长度单位角度范围之类的效果表现出来而已罢了嘛呵呵呵...[^3]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值