Arduino 第十三章:红外接收
一、红外接收概述
红外接收在日常生活和电子制作中十分常见,像电视、空调等家电的遥控器就是利用红外信号来实现远程控制的。在 Arduino 项目里,借助红外接收模块能够让设备接收红外信号,进而实现诸如远程控制、数据传输等功能。红外接收的核心在于将接收到的红外光信号转化为电信号,再对其进行解码以获取其中的信息。
二、红外接收原理
(一)红外信号特性
红外信号本质上是一种不可见光,其波长范围通常在 760nm 至 1mm 之间。在红外通信里,常采用 38kHz 的载波信号对要传输的信息进行调制,这么做是为了增强信号的抗干扰能力。调制后的信号由一系列脉冲组成,这些脉冲的宽度和间隔包含了具体的信息。
(二)红外接收头工作原理
红外接收头一般由红外光电二极管、放大器、滤波器和解调器等部分构成。当接收到 38kHz 调制的红外信号时,红外光电二极管会将光信号转换为微弱的电信号,接着放大器对该电信号进行放大,滤波器滤除其他频率的干扰信号,最后解调器将 38kHz 的载波信号去除,还原出原始的编码信号。
(三)常见编码协议
不同的红外设备可能采用不同的编码协议,常见的有 NEC 协议、索尼 SIRC 协议等。以 NEC 协议为例,它是一种广泛应用的红外编码协议,一个完整的 NEC 信号包含引导码、用户码、用户反码、数据码和数据反码。引导码用于告知接收端一个新的信号开始传输,用户码用于区分不同的设备,数据码则是具体的控制信息,反码用于校验数据的准确性。
三、硬件连接
(一)所需材料
- Arduino 开发板(例如 Arduino Uno)
- 红外接收头(常见型号有 VS1838B 等)
- 杜邦线若干
(二)引脚说明
红外接收头通常有三个引脚:
- VCC:电源正极,一般接 5V。
- GND:电源负极,接地。
- OUT:信号输出引脚,连接到 Arduino 的数字引脚。
(三)连接方式
把红外接收头的 VCC 引脚连接到 Arduino 的 5V 引脚,GND 引脚连接到 Arduino 的 GND 引脚,OUT 引脚连接到 Arduino 的一个数字引脚,这里选用数字引脚 11。
(四)连接图
四、代码实现
(一)使用 IRremote 库
Arduino 有一个非常实用的 IRremote
库,它能帮助我们方便地实现红外信号的接收和解码。以下是一个简单的示例代码:
#include <IRremote.h>
// 定义红外接收引脚
const int RECV_PIN = 11;
// 创建红外接收对象
IRrecv irrecv(RECV_PIN);
// 用于存储解码结果的变量
decode_results results;
void setup() {
// 初始化串口通信,设置波特率为 9600
Serial.begin(9600);
// 启用红外接收功能
irrecv.enableIRIn();
}
void loop() {
// 检查是否接收到有效的红外信号
if (irrecv.decode(&results)) {
// 将解码结果以十六进制形式输出到串口监视器
Serial.println(results.value, HEX);
// 继续接收下一个红外信号
irrecv.resume();
}
// 短暂延迟,避免过于频繁地检查
delay(100);
}
(二)代码解释
- 库的引入:
#include <IRremote.h>
:引入IRremote
库,该库提供了红外接收和解码所需的函数和类。
- 变量和对象定义:
const int RECV_PIN = 11;
:定义红外接收引脚为数字引脚 11。IRrecv irrecv(RECV_PIN);
:创建一个IRrecv
对象irrecv
,并将其与指定的接收引脚关联起来。decode_results results;
:定义一个decode_results
类型的变量results
,用于存储解码后的红外信号结果。
setup()
函数:Serial.begin(9600);
:初始化串口通信,设置波特率为 9600,以便将解码结果输出到串口监视器。irrecv.enableIRIn();
:启用红外接收功能,让红外接收头开始工作。
loop()
函数:if (irrecv.decode(&results))
:检查是否接收到有效的红外信号并成功解码。如果解码成功,执行大括号内的代码。Serial.println(results.value, HEX);
:将解码结果以十六进制形式输出到串口监视器。irrecv.resume();
:继续接收下一个红外信号,准备处理新的信号。delay(100);
:短暂延迟 100 毫秒,避免过于频繁地检查是否有新的红外信号,减少资源消耗。
五、注意事项
(一)环境干扰
周围环境中的红外线(如太阳光、白炽灯等)可能会对红外接收产生干扰,导致解码错误或无法接收到信号。在实际应用中,可以采取以下措施来减少干扰:
- 避免红外接收头直接暴露在强光下,可使用遮光罩或将其安装在合适的位置。
- 选用抗干扰能力强的红外接收头。
(二)引脚连接
在连接红外接收头时,要确保引脚连接正确,特别是 VCC 和 GND 引脚不能接反,否则可能会损坏接收头。
(三)协议匹配
不同的红外设备可能采用不同的编码协议,在使用时要确保 IRremote
库支持所使用的协议,或者根据具体协议进行自定义解码。
六、应用拓展
(一)家电控制
可以结合红外发射模块,通过 Arduino 接收红外遥控器的信号,学习这些信号后再模拟发射,实现对家电的控制,打造一个万能遥控器。
(二)智能安防
利用红外接收模块检测人体发出的红外信号,当检测到异常信号时触发报警装置,实现简单的安防功能。
(三)数据传输
在一些简单的应用场景中,可以通过红外信号进行数据传输,例如在两个 Arduino 设备之间传输简单的指令或传感器数据。