红外遥控器

--基于RP2040游戏机的综合应用

一、项目介绍

此项目是基于电子森林的RP2040 Game Kit平台的一个红外遥控器,具体功能如下:

1、调用板载IRM-H638T红外接收头接收红外信号

2、对红外信号进行解析,得到其协议、地址、命令等信息,并显示

3、对接收的红外信号进行存储,实现红外指令的学习功能。

4、调用VSMB20940红外发射二极管发送已存储信号。

5、学习的红外信号在FLASH中存储,掉线不丢失。

二、板卡介绍

image.png

图 1 RP2040 Game Kit

本次使用的平台是RP2040 Game Kit,其核心为RP2040芯片,双核ARM Cortex M0+,不超频下[敏感词]时钟可达133MHz,可通过Mpy、Arduino等多种方式编程。平台外观采用仿游戏机设计。板载多种资源,可以满足大部分设计需求。

image.png

图 2 RP2040 Game Kit 板载资源框图

三、项目设计

结合题目要求与硬件平台,本项目设计思路如下。

image.png

图 3 项目系统设计图

四、硬件分析

在本项目中,主要是用到的是红外接收头、红外发射头、IPS屏幕,四向摇杆和按键。

1、红外接收/发送

平台搭载了一个IRM-M638MT作为红外线信号接收元件,一个VSMB10940作为红外线发射元件。

image.png

图 4红外电路

2、IPS屏幕

平台搭载了一个240x240的IPS彩屏,采用st7789驱动,SPI信号协议。

image.png

图 5 屏幕电路

3、四向摇杆

使用RP2040的ADC读取摇杆输出信号电压值获取摇杆位置。

image.png

图 6摇杆电路

4、按键

根据项目需求,本次仅使用A和B两个按键,低电平有效,使用时开启内部上拉。

image.png

图 7 按键电路

5、引脚使用情况

表格 1 本项目引脚列表

image.png

 

五、红外编码传输介绍

红外编码传输的本质是将已知信号进行数字编码、调制到红外光波段,再进行发送的信号传输方式。在接收端以同频进行解调,即可得到传输结果。常见的传输载波频率如38kHz。

被调制的已知信号可根据不同红外传输协议进行不同的定义和编码。如常见的NEC编码,其标准编码为4字节(32位),为1byte地址+1byte地址反码+1byte数据+1byte数据反码。

红外传输具有很多优势。首先,红外光为肉眼不可见光段,在使用时可以避免产生不必要的光束,不会影响人类正常生活。其本质与可见光LED相同,正常使用下也不会对人眼造成损伤。其次红外发光二极管制造简单,价格便宜,功耗极低。因此基于红外编码传输的遥控手段被广泛应用于许多消费电子产品中。

红外传输也具有劣势。由于太阳等因素,环境中本身存在一定红外光,若频率相近,会干扰红外遥控信号。且红外光穿透性差,几乎无穿墙能力。

红外传输的编码方式简单,易于实现“学习”功能。这同时也代表其安全性差,易被劫持。

FrfUOIHFWujpiqL3PodsHBRq64tD

图 8 红外传输示意图(来自电子森林)

六、函数库介绍

1、RP2040的开发板库:

想在Arduino中正确的编译RP2040并使用,加载RP2040的Arduino库。他并不是Arduino官方提供的库,因此需要手动安装。

GitHub - earlephilhower/arduino-pico: Raspberry Pi Pico Arduino core, for all RP2040 boards

2、红外:

IRremote库是一个在Arduino中被广泛使用的红外库,它可以兼容数十种被普遍使用的红外协议。其库函数丰富,包含了接收、发送、解码、编码等功能。且对于AVR单片机、ESP系列、RP2040都有很好的支持。

更详细的库介绍可以看我的博客:IRremote 红外线接收模块使用 会伏丘的CSDN

3、文件管理:

LittleFS是一个为微控制器设计的小型且安全的文件系统,已被集成在Arduino的RP2040库中,十分的轻量化。它具有断电回弹、动态均衡以及缓冲限制等功能。使用该库可以方便的在flash中读写文件,以实现参数掉电不丢失的效果。

4、屏幕显示:

整个系统的交互层级逻辑按图三进行设计,使用TFT_eSPI库来对IPS屏幕进行控制。具体的绘图函数比较简单,不再详细介绍。

中文字库制作参考: Arduino库<TFT_eSPI>中文字库的制作与使用 会伏丘的CSDN

七、界面演示

image.pngimage.pngimage.pngimage.pngimage.png

八、为什么采用Arduino而不是Micropython

对于RP2040,常用的编程方式为c、micropython和arduino。C语言过于底层,本人能力有限,暂未考虑。对于后两者,本人在项目中尝试了这两种方式,得出结论如下:

1、 Micropython是解释型语言,而Arduino是编译型语言,底层为C。因此Arduino在运行速度上更具有优势。以刷屏为例,在mpy中,即使启用dma缓冲区,也会存在肉眼可见的刷屏过渡。而使用Arduino的<TFT_eSPI>库进行刷屏,几乎不会出现刷屏过渡。

2、 Micropython作为新兴语言,虽然发展迅速,但其整体语言生态还是较弱于Arduino。相比之下Arduino具有更良好的开源环境和丰富库支持。如红外,mpy的micropython_ir库仅支持8种红外编码协议,而Arduino的IRremote库支持近二十种协议。且Arduino有“库管理器”这样的官方库资源整合系统,而据我所知mpy并没有。

3、 Micropython在提高编程简便性的同时牺牲了深度,许多常用功能目前尚未支持。例如I2C作为从机模式并执行接收中断,此功能目前至今也未被提供(官方文档中未给出)。

image.png

图 9 来自树莓派社区的讨论截图

因此,针对于本项目,最终选择了使用Arduino进行开发,而不是mpy。

九、小结

这是我首次在RP2040这款芯片上完成项目,分别测试了micropython和arduino这两种主流的编程方式,了解了各自的优缺点。同时也了学会了红外遥控命令的原理和编码特点。




免责声明:本文转载自“电子森林”,本文仅代表作者个人观点,不代表萨科微及行业观点,只为转载与分享,支持保护知识产权,转载请注明原出处及作者,如有侵权请联系我们删除。