潘多拉 RT-Thread 红外遥控

潘多拉 IoT Board RT-Thread 红外遥控

实验概述

本实验的主要功能是通过潘多拉 IoT Board 板载的红外接收头接收红外遥控器信号,以及通过板载的红外发射头发送红外信号。

提示:请使用 38kHz 载波的红外遥控器进行实验。

硬件连接

潘多拉 IoT Board 板载一个红外发射头(IR1)和一个红外接收头(IR2),其中红外发射脚 EMISSION 接单片机引脚 PB0,红外接收头引脚 RECEPTION 接单片机引脚 PB1(TIM3_CH4 通道)。

示例代码

参考《潘多拉 IoT Board 开发环境》创建工程,在 applications/main.c 中输入如下代码。

程序主要流程:选择 NEC 解码器(依赖 infrared 软件包),初始化 GPIO 引脚。然后在 while 循环中扫描按键、打印输出接收到的红外数据,当 KEY0 按下后将会把最近一次接收到的红外数据通过红外发射头发送出去。

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "infrared.h"

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

rt_int16_t key_scan(void)
{
    if (rt_pin_read(PIN_KEY0) == PIN_LOW)
    {
        rt_thread_mdelay(50);
        if (rt_pin_read(PIN_KEY0) == PIN_LOW)
        {
            return PIN_KEY0;
        }
    }
    return -RT_ERROR;
}

int main(void)
{
    unsigned int count = 1;
    rt_int16_t key;
    struct infrared_decoder_data infrared_data;

    /* 选择 NEC 解码器 */
    ir_select_decoder("nec");

    /* 设置按键引脚为输入模式 */
    rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);

    /* 设置 RGB 引脚为输出模式*/
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
    rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);

    rt_pin_write(PIN_LED_R, PIN_HIGH);
    rt_pin_write(PIN_LED_B, PIN_HIGH);

    while (count > 0)
    {
        /* 按键扫描 */
        key = key_scan();
        if(key == PIN_KEY0)
        {
            /* 有按键按下,蓝灯亮起 */
            rt_pin_write(PIN_LED_B, PIN_LOW);
            infrared_data.data.nec.repeat = 0;
            /* 发送红外数据 */
            infrared_write("nec",&infrared_data);
            rt_thread_mdelay(200);
            LOG_I("SEND    OK: addr:0x%02X key:0x%02X repeat:%d",
                infrared_data.data.nec.addr, infrared_data.data.nec.key, infrared_data.data.nec.repeat);
        }
        else if(infrared_read("nec",&infrared_data) == RT_EOK)  
        {
            /* 读取到红外数据,红灯亮起 */
            rt_pin_write(PIN_LED_R, PIN_LOW);
            LOG_I("RECEIVE OK: addr:0x%02X key:0x%02X repeat:%d",
                infrared_data.data.nec.addr, infrared_data.data.nec.key, infrared_data.data.nec.repeat);
        }
        rt_thread_mdelay(10);

        /* 熄灭蓝灯 */
        rt_pin_write(PIN_LED_B, PIN_HIGH);
        /* 熄灭红灯 */
        rt_pin_write(PIN_LED_R, PIN_HIGH);
        count++;
    }
    return 0;
}

完整代码:05_basic_ir

编译运行

本实验依赖 infrared 红外框架软件包,所以在编译之前需要确保已添加该软件包,menuconfig 配置路径如下:

RT-Thread online packages  --->
  peripheral libraries and drivers  ---> 
  [*] infrared : infrared is base on rt-thread pin,hwtimer and pwm.  ---> 

infrared 软件包具体配置如下:

保存配置,执行下面命令下载软件包

pkgs --update

编译工程

$ scons
...
LINK rtthread-stm32l4xx.elf
arm-none-eabi-objcopy -O binary rtthread-stm32l4xx.elf rt-thread.bin
arm-none-eabi-size rtthread-stm32l4xx.elf
   text    data     bss     dec     hex filename
  79012    1124    6124   86260   150f4 rtthread-stm32l4xx.elf
scons: done building targets.

将 bin 文件上传到 STM32

st-flash write rt-thread.bin 0x8000000

打开串口终端,按下红外遥控器的任意按键,输出如下内容

 \ | /
- RT -     Thread Operating System
 / | \     4.0.1 build Jan  4 2022
 2006 - 2019 Copyright by rt-thread team
msh >[I/main] RECEIVE OK: addr:0x00 key:0xA2 repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0x68 repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0x98 repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0xB0 repeat:0
...
[I/main] RECEIVE OK: addr:0x00 key:0x38 repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0x5A repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0x42 repeat:0
[I/main] SEND    OK: addr:0x00 key:0x42 repeat:0
[I/main] RECEIVE OK: addr:0x00 key:0x42 repeat:0

按下 KEY0 按键将最近一次接收到的红外数据通过红外发射头发送出去,同时红外接收头立即收到该信号。

思考总结

本实验融合了按键、LED 和红外发送、接收器等多个部件,其中红外的功能由 infrared 红外框架软件包提供。可以看到,使用 RT-Thread 的软件包真的非常的方便,大大加快了我们的开发速度。

Leave a Reply