《ESP32-S3使用指南—MicroPython版 V1.0》第二十二章 红外发送实验

第二十二章 红外发送实验


       前上一章中,我们通过红外接收头来接收遥控器发过来的红外信号,在本章,我们将向大家介绍如何通过红外发射头来发送红外信号,同时来模拟我们的红外遥控器。正点原子ESP32-S3开发板板载了一个红外发射头,我们可以通过软件编程来直接实现红外信号的发送,同时我们利用上一章红外接收实验来实现开发板的红外信号自发自收功能。

       本章分为如下几个小节:

       22.1 红外发射简介

       22.2 emission类

       22.3 硬件设计

       22.4 程序设计

       22.5 下载验证


        22.1 红外发射简介

       在上一章中,我们已经讲解了红外遥控器的原理,这里请大家参考上一章的内容进行学习。我们将使用正点原子ESP32-S3开发板上的板载红外发射头来模拟红外遥控器的功能,从而实现开发板上的红外信号自发自收功能。


        22.2 NEC类

       在工程中,名为emission.py的脚本是由一位博主编写的用于发送红外编码数据的Python脚本。该脚本包含用于发送红外编码数据的函数和程序代码。请注意,该脚本的相关原理和实现细节可能需要一定的背景知识和理解才能完全理解。因此,建议读者在阅读和理解该脚本之前,先自行了解有关红外编码协议的相关原理和基础知识。


       1,NEC类的构造方法

       remote的构造对象方法如下:

class NEC(pin, cfreq)
使用示例:nec = NEC(Pin(8, Pin.OUT, value = 0), 38000)

        该构造方法的参数描述,如下表所示。


表22.2.1 NEC构造方法参数描述


       返回值:NEC对象。


       2,NEC类的方法


       ①:发送红外编码

       其函数原型如下:

nec.transmit()

        返回值:无。


        22.3 硬件设计


       1. 例程功能

       本章实验功能简介:开机后在 LCD 上显示一些信息,然后等待红外接收触发解码,在死循环里面,我们利用红外发射头发送键值(每 1000ms 加 1),同时在 LCD 上显示当前发送键值与接收到的键值,来观察自发自收情况。其中 LED用来指示程序运行状态。


       2. 硬件资源


       1)XL9555

              IIC_INT-IO0(需在P5连接IO0)

              IIC_SDA-IO41

              IIC_SCL-IO42


       2)SPILCD

              CS-IO21

              SCK-IO12

              SDA-IO11

              DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)

              PWR- IO1_3(XL9555)

              RST- IO1_2(XL9555)


       3)红外接收头

              REMOTE_IN-IO2


       4)红外发送头

              REMOTE_OUT-IO8


       3. 原理图

       红外发射头已经在ESP32-S3开发板上板载不需要外接,它与ESP32-S3的IO8连接,原理图如 下图所示。


图22.3.1 红外发射头与ESP32-S3连接的原理图


       需要注意:REMOTE_OUT并没有直接与ESP32-S3芯片的引脚相连,而是需要在P3端口处使用跳线帽将REMOTE_OUT和ADC_IN连接起来,P3端口的原理图以及实物连接方式如下所示:


图22.3.2 P3端口原理图


图22.3.3 P3实物连接方式


       开发板上接收红外遥控器信号的红外管外观如图27.2.3所示。使用时需要遥控器有红外管的一端对准开发板上的红外管才能正确收到信号。


图22.3.4 开发板上的红外发送管位置


        22.4 程序设计


       22.4.1 程序流程图

       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。


图22.4.1.1 程序流程图


       22.4.2 程序解析

       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。红外发送实验main.py源码如下:

from machine import Pin,SPI,I2C
import atk_xl9555 as io_ex
import atk_lcd as lcd
from emission import NEC
import remote
import time
 
 
"""
 * @brief       程序入口
 * @param       无
 * @retval      无
"""
if __name__ == "__main__":
    
    t = 0
    # 初始化LED
    led = Pin(1,Pin.OUT, value = 1)
    # IIC初始化
    i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000)
    # XL9555初始化
    xl9555 = io_ex.init(i2c0)
    
    # 复位LCD
    xl9555.write_bit(io_ex.SLCD_RST,0)
    time.sleep_ms(100)
    xl9555.write_bit(io_ex.SLCD_RST,1)
    time.sleep_ms(100)
    # 初始化SPI
    spi = SPI(2,baudrate = 80000000, sck = Pin(12), mosi=Pin(11), miso=Pin(13))
    # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕;
display = lcd.init(spi,dc = Pin(40,Pin.OUT,Pin.PULL_UP,value = 1),
cs = Pin(21,Pin.OUT,Pin.PULL_UP,value = 1),dir = 1,lcd = 0)
    # 开启背光
    xl9555.write_bit(io_ex.SLCD_PWR,1)
    time.sleep_ms(100)
    # 实验信息
    display.string(30, 50, 240, 16, 16, "ESP32-S3",lcd.RED)
    display.string(30, 70, 240, 16, 16, "REMOTE RX/TX TEST",lcd.RED)
    display.string(30, 90, 240, 16, 16, "ATOM@ALIENTEK",lcd.RED)
    display.string(30, 120, 200, 16, 16, "RX CMD:", lcd.RED)
    display.string(30, 140, 200, 16, 16, "TX CMD:", lcd.RED)
    display.string(30, 160, 200, 16, 16, "DECODE:", lcd.RED)
    # 初始化红外接收
    ir = remote.REMOTE_IR(2)
    # 初始化红外发射
    irb = NEC(Pin(8, Pin.OUT, value = 0), 38000)
    
    while True :
 
        t += 1
        
        if t == 0:
            t = 1
        
        irb.transmit(0,t)
        cmd,s = ir.remote_scan()
        time.sleep_ms(200)         # 延时100ms
        display.fill(30 + 11 * 8 - 2,120,30 + 11 * 8 + 100,200,lcd.WHITE)
        display.string(30 + 11 * 8, 120, 200, 16, 16, str(t - 1), lcd.BLUE)
        display.string(30 + 11 * 8, 140, 200, 16, 16, str(cmd), lcd.BLUE)
        display.string(30 + 11 * 8, 160, 200, 16, 16, str(s), lcd.BLUE)
        led_state = led.value()
        led.value(not led_state)
        time.sleep_ms(1000)         # 延时1000ms

       main函数代码比较简单,主要是通过irb.transmit 函数发送红外编码数据,然后利用ir.remote_scan函数获得红外遥控输入的数据(控制码),最后显示在LCD上面,且翻转LED状态。


        22.5 下载验证

       程序下载成功,我们就可以看到LCD上显示如下图所示内容:


图22.5.1 程序运行结果


       我们可以看到我们开发板发送的红外信号全部红外接收头接收到,说明我们已经实现了红外接收头的自发自收功能。同时LED会闪烁,指示程序正在运行。温馨提示:由于开发板的红外接收头和红外发射头没有正对,有可能会造成接收不到数据情况,这样我们需要一个提供一个反射面,最简单的做法就是将手放在传感器正前方大约10cm左右的位置。


请使用浏览器的分享功能分享到微信等