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

开发板购买链接

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

开发板简介
开发环境搭建 windows

ESP32例程为C语言开发,并非Python/Arduino/AT指令开发,基于ESP-IDF_V4.2框架库,采用纯C语言开发,开发工具为Visual Studio Code

Android(安卓)例程全部为原生Android开发,例程全部支持到SDK版本29  Android 10.0(Q) 开发工具为Andirod Studio 4.0

PC源码例程为Visual Studio 2013开发,C++语言,基于MFC

送的MQTT账号,仅用于同学们开发测试,大家不要用到实际产品上,不定期更换密码,会在QQ群公布


以下列出的例程源码均编写完成(不断增加中),开发教程正在编写
基础例程:
    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_LCD_Test                                      LCD液晶触摸屏显示测试
    24_XPT2046_Touch_Test                   电阻触摸XPT2046驱动测试触摸校正
ESP32应用例程
    Bluetooth_RGBLight                          Android手机通过蓝牙控制RGB灯变色
    Bluetooth_Sensor                              Android手机通过蓝牙读取开发板姿态和温度湿度参数
    Bluetooth_Test                                   Android手机通过蓝牙与开发板通讯
    Encryption_MD5                                MD5加密
    Encryption_SHA1                              SHA1加密
    Encryption_SHA256                          SHA256加密
    EncryptionDecrypt_AES_CBC          AES_CBC加密
    EncryptionDecrypt_AES_ECB          AES_ECB加密
    ESP32_SmartConfig                         通过Android手机配置WIFI连网
    HTTP_GET_Request_Weather        HTTP Get请求天气预报
    JSON_Package                                创建JSON数据包
    JSON_Parsing                                  解析JSON数据包
    LCD JPEG_Effect                             解码JGEG图片特效显示
    MQTT                                                MQTT通讯测试
Android(安卓)工具源码
 
  ESP32_Bluetooth_Chat                   Android通过蓝牙与开发板通讯测试
    ESP32_Bluetooth_RGBLight           Android通过蓝牙控制开发板RGB灯
    ESP32_Bluetooth_Sensor               Android通过蓝牙读取开发板3D姿态和温度湿度数据
    ESP32_SmartConfig                       Android手机配置WIFI配网
    MQTT_Test                                     Android与开发板通过MQTT协议通讯
    TCP_Client                                     Android作为TCP客户端与开发板通讯 
    UDP_Client                                     Android通过UDP协议与开发板通讯
PC(Visual Studio 2013 C++ MFC)工具源码
    MQTT_调试助手                                 PC通过MQTT与开发板通讯
    TCP 调试助手                                     PC通过TCP服务器/客户端与开发板通讯
    UDP 调试助手                                     PC通过UDP与开发板通讯
LVGL源码   
    LVGL_Full_Test                                  LVGL官方例程(使用到了大分部控件)
    LVGL_Arc_Test                                  圆弧指示器通过触摸动态改变值
    LVGL_Bar_Test                                  通过动画方式动态演示Bar进度条的使用方法
    LVGL_Button_Test                             通过5种不同动态效果的按钮学习按钮的创建与使用
    LVGL_ButtonMatrix_Test                   创建一个计算器布局来演示矩阵按钮控件的使用
    LVGL_Calendar_Test                         日历控件的创建和使用
    LVGL_Canvas_Test                           透明画布和画一个圆角过渡色矩形并旋转角度学习画布的使用
    LVGL_Chart_Test                               通过创建三个不同风格的图表来学习图表控件的使用
    LVGL_Checkbox_Test                        学习复选框控件的创建和使用
    LVGL_ColorPicker_Test                     创建一个颜色选择器并动态显示当前颜色的RGB值
    LVGL_Container_Test                        在内容控件上动态创建三个文本标签学习内容控件的自适应布局
    LVGL_Drop_down_List_Test              创建三个不同类型的下拉选择控件
    LVGL_Gauge_Test                             创建一个动态仪表和静态多指针仪表
    LVGL_Image_Test                              通过四个滑动条控件控制图片颜色的变化来学习图像控件的使用
    LVGL_ImageButton_Test                  创建一个图片背景的图像按钮
    LVGL_Keyboard_Test                       通过一个文本输入框控件还学习键盘控件的调用关闭设置
    LVGL_Label_Test                              创建内容颜色可变,长文本滚动展示,带阴影3D效果三个标签控件
    LVGL_LED_Test                                创建三个LED,学习LED控件的调光,颜色,开关的设置
    LVGL_Line_Test                                通过二维数组创建一段折线来演示线控件的使用
    LVGL_LineMeter_Test                      创建两个不同的线段弧形指示器动态展示数据
    LVGL_List_Test                                 创建一个带图标的列表控件
    LVGL_MessageBox_Test                  创建一个带按钮的消息框控件
    LVGL_ObjectMask_Test                    创建一个变幻色的文本学习蒙版遮罩效果
    LVGL_Page_Test                            学习页面控件的使用
    LVGL_Roller_Test                           通过示例学习滑动列表选择器控件
    LVGL_Slider_Test                           创建一个单向和一个双向滑动条控件
    LVGL_Spinbox_Test                        学习微调控件的使用
    LVGL_Spinner_Test                        创建三个不同的环形加载器
    LVGL_Switch_Test                          创建两个不同的开关控件
    LVGL_Table_Test                            创建一个简单的表格
    LVGL_Tabview_Test                       实现三页的页面切换学习Tabview控件
    LVGL_Textarea_Test                       长按实现打字机效果的Textarea控件
    LVGL_Tileview_Test                        实现四面环形触摸切换的Tileview控件
    LVGL_Window_Test                        创建一个窗口,带设置子窗口学习窗口控件的使用

 

红外简介

远程遥控技术又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。

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

        红外线又称红外光波,在电磁波谱中,光波的波长范围为0.01um~1000um。根据波长的不同可分为可见光和不可见光,波长为0.38um~0.76um的光波可为可见光,依次为红、橙、黄、绿、青、蓝、紫七种颜色。光波为0.01um~0.38um的光波为紫外光(线),波长为0.76um~1000um的光波为红外光(线)。红外光按波长范围分为近红外、中红外、远红外、极红外4类。红外线遥控是利用近红外光传送遥控指令的,波长为0.76um~1.5um。用近红外作为遥控光源,是因为红外发射器件(红外发光管)与红外接收器件(光敏二极管、三极管及光电池)的发光与受光峰值波长一般为0.8um~0.94um,在近红外光波段内,二者的光谱正好重合,能够很好地匹配,可以获得较高的传输效率及较高的可靠性

在实际的通信领域,发出来的信号一般有较宽的频谱,而且都是在比较低的频率段分布大量的能量,所以称之为基带信号,这种信号是不适合直接在信道中传输的。为便于传输、提高抗干扰能力和有效的利用带宽,通常需要将信号调制到适合信道和噪声特性的频率范围内进行传输,这就叫做信号调制。在通信系统的接收端要对接收到的信号进行解调,恢复出原来的基带信号。这部分通信原理的内容,大家了解一下即可。

  我们平时用到的红外遥控器里的红外通信,通常是使用38K左右的载波进行调制的,下面我把原理大概给大家介绍一下,了解一下,先看发送部分原理。

  调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。比如我们的红外遥控信号要发送的时候,先经过38K调制,如图

原始信号就是我们要发送的一个数据“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 <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "IR_Send.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include <esp_log.h>
#include "driver/rmt.h"

主函数与引脚定义

const static char *TAG = "IR_Send Demo";

#define RECV_PIN		17		// 红外发射引脚

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:%04X	data:%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退出运行,修改主函数中的发送编码进行红外发射,观察串口打印,可以用手机摄像头对准红外发射头可以看到红外光闪烁。

  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值