资讯详情

ESP32 开发笔记(三)源码示例 13_IR_Send_RMT 使用RMT实现红外数据发送(NEC编码)

开发板购买链接

https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=626366733674

开发板简介

开发环境建设 windows

源码示例:

0_Hello Bug (ESP_LOGX与printf) 工程模板/打印调试输出

1_LED LED亮灭控制

2_LED_Task 使用任务控制LED

3_LEDC_PWM 使用LEDC来控制LED实现呼吸灯效果

4_ADC_LightR 使用ADC读取光敏电阻实现光传感

5_KEY_Short_Long 按钮长按短按

6_TouchPad_Interrupt 中断电容触摸

7_WS2812_RMT 使用RMT实现RGB_LED彩虹变色示例

8_DHT11_RMT 使用RMT实现读取DHT11温湿度传感器

9_SPI_SDCard 使用SPI总线实现TF卡文件系统示例

10_IIC_ADXL345 使用IIC读取总线ADXL345角度加速度传感器

11_IIC_AT24C02 使用IIC总线实现小容量数据存储测试

12_IR_Rev_RMT 使用RMT实现红外遥控接收解码(NEC编码)

13_IR_Send_RMT 使用RMT实现红外数据发送(NEC编码)

14_WIFI_Scan 附近WIFI信号扫描示例

15_WIFI_AP 创建软AP示例

16_WIFI_AP_TCP_Server 在软AP模式下实现TCP服务端

17_WIFI_AP_TCP_Client 在软AP模式下实现TCP客户端

18_WIFI_AP_UDP 在软AP模式下实现UDP通讯

19_WIFI_STA 创建STA站模

20_WIFI_STA_TCP_Server 在站模式STA下实现TCP服务端

21_WIFI_STA_TCP_Client 在站模式STA下实现TCP客户端

22_WIFI_STA_UDP 在站模式STA下实现UDP通讯

23_LVGL_Test LVGL图形库简单示例

红外简介

遥控技术又称遥控技术,是指在工业控制、航空航天、家电等领域实现被控目标的遥控。

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强、信息传输可靠、功耗低、成本低、易于实现等显著优点。广泛应用于许多电子设备,特别是家用电器,并越来越多地应用于计算机和手机系统。

红外线又称红外光波,在电磁波谱中,光波的波长范围为0.01um~1000um。可见光和不可见光可根据波长的不同分为0.38um~0.76um可见光的光波是红、橙、黄、绿、青、蓝、紫七种颜色。光波为0.01um~0.38um紫外光(线)的光波为0.76um~1000um红外光(线)是光波。根据波长范围,红外光分为近红外、中红外、远红外和极红外。红外遥控器采用近红外光传输遥控指令,波长为0.76um~1.5um。由于红外发射器(红外发光管)和红外接收器(光敏二极管、三极管和光电池)的发光和峰值波长一般为0.8um~0.94um,在近红外光波段中,两者的光谱刚刚重叠,可以很好地匹配,传输效率高,可靠性高

在实际通信领域,发出的信号通常有较宽的频谱,大量的能量分布在较低的频率段,因此称为基带信号,不适合直接在信道中传输。为了便于传输,提高抗干扰能力,有效利用带宽,通常需要将信号调制到适合通道和噪声特性的频率范围内,称为信号调制。在通信系统的接收端,解调接收到的信号,恢复原始基带信号。了解这部分通信原理。

红外遥控器中的红外通信通常用于38K左右载波调制,下面我给大家介绍一下原理,了解一下,先看发送的原理。

调制:用待传输信号控制高频信号的范围、相位、频率等参数变化的过程,即用一个信号装载另一个信号。例如,当我们的红外遥控信号需要发送时,它首先是38K调制,如图

9a0ab44f1b7b43d3d807e273bf445c5.png

原始信号就是我们要发送的一个数据“0”位或者一位数据“1”位,而所谓38K载波就是频率为38K的方波信号,调制后信号就是最终我们发射出去的波形。我们使用原始信号来控制38K载波,当信号是数据“0”的时候,38K载波毫无保留的全部发送出去,当信号是数据“1”的时候,不发送任何载波信号。如上图中的调制后信号波形。

下图为波形中NEC编码中的波形时序

完整的一段NEC编码波形

红外接收头有很多型号,开发板所用的红外线接收器为KMS183,一体化红外接收头可以将载波红外信号解码为高低电平信号,方便单片机解析红外命令,如下图:

RMT简介

RMT(Remote Control)模块驱动程序可用于发送和接收红外遥控信号。 由于RMT模块的灵活性,该驱动程序还可用于生成或接收许多其他类型的信号。

信号由一系列脉冲组成,由RMT的发射器根据值列表生成。 这些值定义了脉冲持续时间和二进制电平,请参见下文。 发射器还可以提供载波,并使用提供的脉冲对其进行调制。

发送调制图示:

在接收器中,一系列脉冲被解码为包含脉冲持续时间和二进制电平的值列表。 可以应用滤波器以从输入信号中去除高频噪声。

接收调制图示:

一、硬件设计/原理

查看开发板原理图,KMS183一体化红外接收头信号引脚连接在主控的GPIO35引脚上,红外发射脚接到主控的GPIO7引脚上,根据上文RMT和红外的介绍了解就可以进行代码的编写了。

二、程序设计

先引用必要头文件

// IR_Send Example

#include

#include

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "IR_Send.h"

#include "driver/gpio.h"

#include "esp_system.h"

#include

#include "driver/rmt.h"

主函数与引脚定义

const static char *TAG = "IR_Send Demo";

#define RECV_PIN17// 红外发射引脚

void app_main()

{

ESP_LOGI(TAG, "APP Start......");

IRSendInit(RECV_PIN, 1);// 初始化红外发射

while(1){

IRSendIR(69);// 发射红外指令69

vTaskDelay(2000 / portTICK_RATE_MS);

}

}

红外发射的RMT初始化

void IRSendInit(uint8_t pin, uint8_t port)

{

IRSend_Pin = pin;

IRSend_Chanel = port;

rmt_config_t IRSend;

IRSend.rmt_mode = RMT_MODE_TX;

IRSend.channel = IRSend_Chanel;

IRSend.clk_div = CLK_DIV;

IRSend.gpio_num = IRSend_Pin;

IRSend.mem_block_num = 1;

IRSend.tx_config.loop_en = false;

IRSend.tx_config.carrier_freq_hz = 38000; //NEC 38kHz

IRSend.tx_config.carrier_duty_percent = 50;

IRSend.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;

IRSend.tx_config.carrier_en = true;

IRSend.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;

IRSend.tx_config.idle_output_en = true;

ESP_ERROR_CHECK(rmt_config(&IRSend));

ESP_ERROR_CHECK(rmt_driver_install(IRSend_Chanel, 0, 0));

}

发射红外编码函数

void IRSendIR(uint8_t data)

{

uint16_t addressSend = 65280;

uint8_t reverseData = ~data;

uint16_t dataSend;

dataSend = reverseData;

dataSend = dataSend << 8;

dataSend |= data;

size_t size = sizeof(rmt_item32_t) * 34;

rmt_item32_t* item = (rmt_item32_t*) malloc(size);

IRSendBuildItem(IRSend_Chanel, (rmt_item32_t*) item, addressSend, dataSend);

printf("address:%04Xdata:%04X\n", addressSend, dataSend);

rmt_write_items(IRSend_Chanel, item, 34, true);

rmt_wait_tx_done(IRSend_Chanel,0);

free(item);

}

创建填充红外数据

static void IRSendBuildItem(int channel, rmt_item32_t* item, uint16_t addr, uint16_t cmd_data)

{

IRSendHeader(item);

item++;

for(uint8_t j = 0; j < 16; j++){

if(addr & 0x1){

IRSendBitOne(item);

}else{

IRSendBitZero(item);

}

item++;

addr = addr >> 1;

}

for(uint8_t j = 0; j < 16; j++){

if(cmd_data & 0x1){

IRSendBitOne(item);

}else{

IRSendBitZero(item);

}

item++;

cmd_data = cmd_data >> 1;

}

nec_fill_item_end(item);

}

创建红外时序开始停止逻辑0逻辑1的时序

static void IRSendHeader(rmt_item32_t* item)

{

IRSendItem(item, NEC_HDR_MARK, NEC_HDR_SPACE);

}

static void IRSendBitOne(rmt_item32_t* item)

{

IRSendItem(item, NEC_BIT_MARK, NEC_ONE_SPACE);

}

static void IRSendBitZero(rmt_item32_t* item)

{

IRSendItem(item, NEC_BIT_MARK, NEC_ZERO_SPACE);

}

static void nec_fill_item_end(rmt_item32_t* item)

{

IRSendItem(item, NEC_BIT_MARK, 0);

}

三、下载测试

打开ESP-IDF Command Prompt

cd命令进入此工程目录

cd F:\ESP32_DevBoard_File\13_IR_Send_RMT

查看电脑设备管理器中开发板的串口号

执行idf.py -p COM9 flash monitor从串口9下载并运行打开口显示设备调试信息   Ctrl+c退出运行,修改主函数中的发送编码进行红外发射,观察串口打印,可以用手机摄像头对准红外发射头可以看到红外光闪烁。

标签: 二极管彩虹灯

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台