我现在的任务是学习如何向房屋中的空调和其他设备发送命令。 最初,这些设备仅具有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的格式打印结果(请参见破坏器下方)。
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
实用程序,用于传输记录的命令。 她可以显示已知设备的列表,以及每个设备的已知命令的列表。 请注意以下示例中的“空参数”,在此处需要它们。
irsend
是irsend
的客户端,因此如果出现问题,请查看日志(请参见上文)。
从理论上讲,还有另一种可能性-通过其套接字发送命令以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。 我很惊讶地发现跳线最初在我的所有板上都是打开的。 我不得不修改烙铁。
总结
它的工作原理是:信号已发送,设备可以看到并对其做出正确反应。
在很大程度上取决于二极管发射器的位置,它必须准确地对准接收器。 一台固定的发射器无法控制房间中的所有设备。 为每个小工具克隆基于Raspberry Pi的解决方案非常昂贵,您需要修改发射器以“覆盖更大的区域”,或者找到更便宜的平台。
LIRC最初是为了将IR信号转换为输入设备的标准Linux事件而创建的。 因此,对他而言,一个按钮就是一个代码是很自然的。 对于某些设备(大多数空调)不是这样:单击任何按钮时,遥控器都会传输一个数据包,其中包含设备的完整状态(开机,运行模式,温度,风扇运行模式,时间,计时器等)。 无法基于LIRC中的多个参数构建多组件程序包,因此,它作为开箱即用的快速工具很有用,但是您将不得不寻找其他东西。 尽管在大多数情况下,使用常规风扇设置且没有奇异模式的录制数据已足够。