红外接口,Raspberry和LIRC

我现在的任务是学习如何向房屋中的空调和其他设备发送命令。 最初,这些设备仅具有IR遥控器。 为了解决这个问题,我有一个Raspberry Pi和IR收发器护罩。 在本文中,您可以找到配置,团队,技巧和一些理论。 从该软件将是LIRC(Linux红外远程控制)和Python。


我在Google的帮助下找到了LIRC 。 在研究过程中,我发现LIRC可与IR信号的发送器和接收器一起使用,可以对接收到的信号进行解码并在这方面执行一些操作。 现在,我不需要信号接收,但是将来可能会有用。 如果您自己弄乱LIRC,强烈建议您阅读《 LIRC配置指南》


构型


apt-get update apt-get install lirc 

 # /etc/modules (  ) lirc_dev lirc_rpi gpio_in_pin=18 gpio_out_pin=17 

 # /etc/lirc/hardware.conf (   ,  ) LIRCD_ARGS="--uinput --listen" LOAD_MODULES=true DRIVER="default" DEVICE="/dev/lirc0" MODULES="lirc_rpi" 

 # /boot/config.txt (       lirc,  ) dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17 

 # /etc/lirc/lirc_options.conf (    ) driver = default device = /dev/lirc0 

 reboot sudo /etc/init.d/lircd status 

记录


首先,您需要使用所有必需命令的数据序列创建一个配置文件。 我继续将此文件lircd.conf ,但是在每个设备本身上,它都在/etc/lirc/lircd.conf.d目录中创建了自己的文件my_device_name.lircd.conf


文件格式在这里描述。 如果您有遥控器,则可以使用irrecord实用程序将其传输的信号写入文件。


 /etc/init.d/lircd stop irrecord -d /dev/lirc0 ~/my_device.lircd.conf mv ~/my_device.lircd.conf /etc/lirc/lircd.conf.d/ 

irrecord分析序列并尝试确定协议和时间参数。 在某些情况下, irrecord分析失败,因此可以保存原始格式的序列,为此有一个--force开关。


但是,即使使用--force irrecord尝试分析某些内容,并且可能也会失败。 然后,您可以使用mode2记录序列并自己创建文件。


mode2顺序打印存在和不存在信号的持续时间,由此构成发送的数据。 持续时间以微秒(1e-6秒)为单位。 在原始格式中,lircd.conf中指示了相同的持续时间,以“ pulse”开头(不需要前导“ space”)。 因此,应始终有奇数个数字(它的开始和结束均以信号“脉冲”的存在为准)。


为了自动化,我制作了一个脚本记录脚本,要求输入命令名称,运行mode2 5秒钟,记住并最终以准备用于lircd.conf的格式打印结果(请参见破坏器下方)。


剧本
 #!/usr/bin/env python3 import io import sys import os r = """begin remote name DEVICE_NAME_CHANGE_ME flags RAW_CODES eps 30 aeps 100 gap 19037 begin raw_codes """ while True: print() print("enter the command name, or just press Enter to finish") a = sys.stdin.readline().rstrip("\n\r") if not a: break first_space = True n = 0 r += " name " + a + "\n" for line in os.popen('timeout 5s mode2 -d /dev/lirc0 2> /dev/null').read().split('\n'): words = line.split() if len(words) < 2: continue if words[0] != 'space' and words[0] != 'pulse': continue if first_space and words[0] == 'space': first_space = False continue if n % 4 == 0: r += "\n " r += words[1] + " " n = n+1 if n > 5: print ("got", n, "values, looks good") else: print ("no signal, something went wrong") r += "\n\n" r += """ end raw_codes end remote """ print() print(r) print() 

irrecord --analyse文件后,您可以尝试使用irrecord --analyse再次“识别”它。 这并不总是成功的,不要急于扔掉旧文件。 我的统计数据是这样的:LG电视的遥控器很容易理解,所有空调和吸尘器都需要手动创建,然后由--analyse处理--analyse


仅作为示例: 这是我的吸尘器的文件外观


标准团队名称


为了达到预期的目的,LIRC应该将接收和识别的IR信号转换为Linux输入事件。 因此,默认情况下,要求我们在标准列表中的lircd.conf中具有命令名称。 您可以看到有效名称的列表:


 irrecord --list-namespace 

空调不属于这种模式。 可以通过在写入时添加参数来关闭名称要求:


 irrecord --disable-namespace .... 

侦错


检查接收器帮助mode2实用程序,该实用程序将打印所有可见信号。


 /etc/init.d/lircd stop mode2 -d /dev/lirc0 

检查传输是否最简单,如果有另一个接收器和mode2正在运行。 在特别无望的情况下,您可以更改GPIO输出上的值,并用测试仪或示波器检查信号的去向。 gpio团队是connectionpi软件包的一部分。


 while sleep 1; do gpio -g toggle 17 done 

您可以使用journalctl查看日志,特别是,这可以让您查看配置文件中的错误:


 journalctl -b 0 /usr/sbin/lircd 

发送命令


有一个irsend实用程序,用于传输记录的命令。 她可以显示已知设备的列表,以及每个设备的已知命令的列表。 请注意以下示例中的“空参数”,在此处需要它们。


irsendirsend的客户端,因此如果出现问题,请查看日志(请参见上文)。


 #   irsend LIST "" "" #     LG_TV irsend LIST LG_TV "" #   ON irsend SEND_ONCE LG_TV ON 

从理论上讲,还有另一种可能性-通过其套接字发送命令以Lircd 。 我不明白


从Python呼叫


几乎所有库都只是irsend的工具包。 我发现的唯一一个通过套接字为API编译客户端的库在Raspberry上不起作用(需要另一个版本的lircd)。 因此,它们没有什么意义;我可以自己调用该命令:


 import subprocess subprocess.call(["irsend", "send_once", "BEDROOM_AC", "OFF"]) 

硬体


红外帽

我使用现成的板, 亚马逊AliExpress上有很多。 您可以像“ Raspberry IR Shedd”一样搜索它。 从上面的配置可以看出,它使用GPIO 17进行输出,并使用GPIO 18进行输入。


板上有一个用于放置第二个(附加)LED D2的位置,默认情况下未安装该位置。 当使用两个LED时,它们串联连接。 因此,在没有LED D2的情况下,必须关闭跳线SJ1。 我很惊讶地发现跳线最初在我的所有板上都是打开的。 我不得不修改烙铁。


给希望看的人放大的照片

IRDA帽子


总结


它的工作原理是:信号已发送,设备可以看到并对其做出正确反应。


在很大程度上取决于二极管发射器的位置,它必须准确地对准接收器。 一台固定的发射器无法控制房间中的所有设备。 为每个小工具克隆基于Raspberry Pi的解决方案非常昂贵,您需要修改发射器以“覆盖更大的区域”,或者找到更便宜的平台。


LIRC最初是为了将IR信号转换为输入设备的标准Linux事件而创建的。 因此,对他而言,一个按钮就是一个代码是很自然的。 对于某些设备(大多数空调)不是这样:单击任何按钮时,遥控器都会传输一个数据包,其中包含设备的完整状态(开机,运行模式,温度,风扇运行模式,时间,计时器等)。 无法基于LIRC中的多个参数构建多组件程序包,因此,它作为开箱即用的快速工具很有用,但是您将不得不寻找其他东西。 尽管在大多数情况下,使用常规风扇设置且没有奇异模式的录制数据已足够。

Source: https://habr.com/ru/post/zh-CN461195/


All Articles