在没有 LIRC 的情况下将 IR Remote 与 Raspberry Pi 一起使用
我想获得 Raspberry Pi 的 IR 远程输入。我设法安装并测试了 LIRC。一切都好,除了最后一步。当我想将 IR 远程 Key 值传递给 Python 程序时,它没有正确传递。它为 anykey 传递空值。我无法弄清楚出了什么问题。我放弃了,然后我尝试编写一个python代码来在不使用LIRC的情况下捕获IR遥控器。
在阅读了一些关于 IR 远程通信的信息后,发现使用 UART 串行通信的信息。我使用了红外遥控 DIY 套件 HX1838。红外传感器解码红外波并串行传递数据。我所做的是串行读取来自红外传感器的数据值。对于可在 Raspberry Pi 中使用的简单应用程序,这是一种粗略但简单的读取 IR 遥控器的方法。
为 UART 串行通信准备 Raspberry Pi。
1.需要删除 cmdline.txt 中的 ttyAMA0 条目 .
- 首先将包含内核参数 cmdline.txt 的文件备份为 cmdline_bp.txt
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
- 通过删除包含“ttyAMA0”的参数来编辑文件 cmdline.txt。 IE。 ‘控制台=ttyAMA0,115200’和‘kgdboc=ttyAMA0,115200’。
sudo nano /boot/cmdline.txt
剩下的文件看起来像,
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 lift=deadline rootwait
然后保存并关闭编辑器。保存文件,Ctrl + O。关闭编辑器,Ctrl + X
2.更新 inittab 文件来屏蔽 ttyAMA0
sudo nano /etc/inittab
注释掉这行
‘X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100′
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
然后保存并关闭编辑器。保存文件,Ctrl + O。关闭编辑器,Ctrl + X
第 1 步:入门
安装pySerial
- 要使串行 (UART) 通信正常工作,需要安装串行模块。
sudo apt-get install python-serial
安装后,Python 代码可以通过执行 import serial 来使用它 .
- 接下来,需要连接 GPIO 14 (TX) 和 GPIO 15 (RX)。由于我的目标是接收 IR 信号,因此我只连接了 GPIO 15 (RX)。
- 红外传感器需要 5V 和 GND 连接。然后IR传感器的输出信号连接到GPIO 15。
发现读取 IR 信号的 Python 代码非常简单。如下。
import serialser =serial.Serial ("/dev/ttyAMA0")ser.baudrate =2400for i in range (0,15):# 通常一个键的 IR 信号大约为 12-16 字节 data =ser.read( 1) # 一次读取 1 个字节 print ord(data) # 以字符读取的数据,ord 将转换为 ASCII 值
现在这段代码将一次读取 1 个字节的 IR 信号并打印出值。
我通过反复试验尝试了波特率,最终确定为 2400 BPS。虽然串行通信支持高达 115KBPS,但有趣的是为什么 IR 使用较低的速度。我的猜测是使用较低的速度会更可靠,因为 IR 信号在空中丢失 1 或 2 位的可能性较小。
解码红外遥控按键
现在下一步是解码键值。为此,我使用了标准的三星电视红外遥控器。
第一个重点是弄清楚每个键有多少字节的数据。它可以变化 12-16 个字节。 (我试过的那些)。通常所有密钥的字节长度都相同。这些字节有头字节、数据字节(用于识别密钥)和尾字节。标头字节将具有红外遥控器型号的签名。我使用 Excel 表格收集了 Antzy Carmasaic 页面之后的关键数据值
http://www.instructables.com/id/How-To-Useemulate-...
深入研究捕获的键值,它显示字节 0-5 由标题组成,对所有键重复。字节 6 到 11 数据值代表 Key 值。可能有一些尾值。字节12是三星遥控器的尾部。
映射键
此遥控器的确切方法是将字节 6-11 存储在数组中,并将其与新传入的密钥进行比较。相反,我做了一个简单的算法如下。
keyidentity =byte[6]+2*byte[7]+3*byte[8]+4*byte[9]+5*byte[10]+6*byte[11]
它为每个键提供了几乎唯一的值。你可以想出比这更好的算法。
我扩展了 Python 代码以捕获三星远程密钥信息。一旦我计算出映射的键值,然后我将它存储在 python 程序本身中。
附上文件。名称 – ir_serial3samsung.py。三星遥控器发送 2 组数据。所以我捕获 24 个字节以刷新 Raspberry Pi 串行数据捕获缓冲区。但我只使用第一组解码。
当您运行此代码时,它会正确识别按下的键。您可以通过查看程序打印出的值“keyidentity”来解码遥控器中的其余键。然后附加程序以包含它们。
结论
这是在 Raspberry Pi 和 Python 中使用遥控器的一种非常简单有效的方法。您需要计算密钥的总字节数、头字节、数据字节和尾字节的长度。由于您将从 A 到 Z 了解此过程,因此您可以轻松修改它以适合您的应用程序。由于这些是小的 python 代码,如果遇到任何问题,很容易调试。
欲了解更多详细信息:在没有 LIRC 的情况下将 IR Remote 与 Raspberry Pi 一起使用
制造工艺