问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Arduino红外接收功能详解:从原理到实战

创作时间:
作者:
@小白创作中心

Arduino红外接收功能详解:从原理到实战

引用
CSDN
1.
https://m.blog.csdn.net/wangzhae/article/details/145581203

Arduino红外接收功能是实现远程控制和数据传输的重要技术。本文将从红外接收原理、硬件连接、代码实现等多个维度,深入讲解如何使用Arduino开发板实现红外信号的接收与解码,帮助读者掌握这一实用技能。

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);
}

(二)代码解释

  1. 库的引入

#include <IRremote.h>
:引入
IRremote
库,该库提供了红外接收和解码所需的函数和类。

  1. 变量和对象定义
  • const int RECV_PIN = 11;
    :定义红外接收引脚为数字引脚 11。
  • IRrecv irrecv(RECV_PIN);
    :创建一个
    IRrecv
    对象
    irrecv
    ,并将其与指定的接收引脚关联起来。
  • decode_results results;
    :定义一个
    decode_results
    类型的变量
    results
    ,用于存储解码后的红外信号结果。
  1. **
    setup()
    函数**:
  • Serial.begin(9600);
    :初始化串口通信,设置波特率为 9600,以便将解码结果输出到串口监视器。
  • irrecv.enableIRIn();
    :启用红外接收功能,让红外接收头开始工作。
  1. **
    loop()
    函数**:
  • if (irrecv.decode(&results))
    :检查是否接收到有效的红外信号并成功解码。如果解码成功,执行大括号内的代码。
  • Serial.println(results.value, HEX);
    :将解码结果以十六进制形式输出到串口监视器。
  • irrecv.resume();
    :继续接收下一个红外信号,准备处理新的信号。
  • delay(100);
    :短暂延迟 100 毫秒,避免过于频繁地检查是否有新的红外信号,减少资源消耗。

五、注意事项

(一)环境干扰

周围环境中的红外线(如太阳光、白炽灯等)可能会对红外接收产生干扰,导致解码错误或无法接收到信号。在实际应用中,可以采取以下措施来减少干扰:

  • 避免红外接收头直接暴露在强光下,可使用遮光罩或将其安装在合适的位置。
  • 选用抗干扰能力强的红外接收头。

(二)引脚连接

在连接红外接收头时,要确保引脚连接正确,特别是 VCC 和 GND 引脚不能接反,否则可能会损坏接收头。

(三)协议匹配

不同的红外设备可能采用不同的编码协议,在使用时要确保
IRremote
库支持所使用的协议,或者根据具体协议进行自定义解码。

六、应用拓展

(一)家电控制

可以结合红外发射模块,通过 Arduino 接收红外遥控器的信号,学习这些信号后再模拟发射,实现对家电的控制,打造一个万能遥控器。

(二)智能安防

利用红外接收模块检测人体发出的红外信号,当检测到异常信号时触发报警装置,实现简单的安防功能。

(三)数据传输

在一些简单的应用场景中,可以通过红外信号进行数据传输,例如在两个 Arduino 设备之间传输简单的指令或传感器数据。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号