硬件
树莓派 * 1(系统:Raspbian Buster, 内核:4.19.x)
红外接收器 * 1
红外发送器 * 1
红外遥控器 * 1
网上很多lirc文档都不适用于内核4.19.x的版本,尝试多天,终于结合多个文档,成功了·····(ㄒoㄒ)
方法一: 打补丁
buster 内核4.19.x 不包含lirc_dev,因此需要用gpio-ir
如果只使用 "irsend" 去发送IR信号,不需要打补丁
如果要使用 "irrecord" "mode2" "irw" "irexec"去接收IR信号,则需要按照此链接打补丁:https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=235256
但想要同时做到 接收和发送 IR信号,好像很吃力。还是建议转到方法二来解决
方法二: 回退内核版本
回退内核版本
哈希传递rpi-update 回滚:
sudo rpi-update 963a31330613a38e160dc98b708c662dd32631d5
重新启动后,用一下命令,查看内核是否回滚
uname -a
回滚之后可能会有无线网络连接不上的问题,rfkill list 查看射频是否被block,是的话使用
rfkill unblock all
解锁设备。然后 ifconfig wlan0 up 就可以工作了。
安装lirc
sudo apt-get install lirc
修改配置
编辑 /boot/config.txt
sudo nano /boot/config.txt
找到 #dtoverlay=lirc-rpi 内容修改为:
dtoverlay=lirc-rpi,gpio_in_pin=23,gpio_out_pin=22,gpio_in_pull=up
编辑 /etc/lirc/lirc_options.conf
修改driver 为default device为 /dev/lirc0,如下所示为默认设置与修改后的设置的异同;
[lircd]
nodaemon = False
-driver = devinput
-device = auto
+driver = default
+device = /dev/lirc0
output = /var/run/lirc/lircd
pidfile = /var/run/lirc/lircd.pid
plugindir = /usr/lib/arm-linux-gnueabihf/lirc/plugins
重启 测试
重启服务
sudo /etc/init.d/lircd stop
sudo /etc/init.d/lircd start
sudo /etc/init.d/lircd restart
测试红外输入
sudo /etc/init.d/lircd stop
sudo mode2 -d /dev/lirc0
此时,按下遥控器屏幕应该就会有数值了
遥控编码录制
红外接收器已经能够接收红外信号了,不能分辨按键,因此需要录制你的遥控命令
查看按键名称
irrecord -l
记住你要录制的按键名称
录制
irrecord ~/lircd.conf
按照指示,按 enter两次,再随机按遥控器任意键,直到 ........跑完。
跑完后,一直重复按刚刚的那个键, 直到 ........跑完。
接下来就是设定了,
输入你想要设定的键,并命名为提供的按键名称如:
KEY_UP
然后按住你设定为上的按键,enter
重复上面动作,直到你的设定完成最后enter离开
完成后,你将在 ~/xx.lirc.conf文件中看到刚才录制的红外信号
文件如下所示:
begin remote
name myir
flags RAW_CODES|CONST_LENGTH
eps 30
aeps 100
gap 108055
begin raw_codes
name KEY_1
9062 4462 621 531 627 532
626 531 626 532 629 531
601 556 627 531 628 530
628 1610 629 1611 603 1636
603 1636 629 1612 629 1609
631 1609 630 1610 627 1612
630 530 629 1608 629 532
626 534 625 532 628 1609
629 532 628 529 630 1609
629 530 626 1612 629 1610
629 1610 629 540 633 1596
629
name KEY_2
9067 4455 632 528 630 528
633 524 631 529 630 529
630 528 630 530 630 528
如果录制没有出现.....尝试 -f 来录制raw code
irrecord -f ~/lircd.conf
复制录制的文件
sudo cp ~/xx.lircd.conf /etc/lirc/lircd.d/xx.lircd.conf
sudo /etc/init.d/lircd restart
重启lirc服务并测试
sudo /etc/init.d/lirc restart
irw
输出类似:
0000000000ffa25d 00 KEY_UP /etc/lirc/lircd.conf
0000000000ffa25d 01 KEY_DOWN /etc/lirc/lircd.conf
编写触发事件:
新建文件 ~/.lircrc并写入以下内容:
begin
prog = myprogram
button = KEY_1
config = mode_1
end
begin
prog = myprogram
button = KEY_2
config = mode_2
end
测试红外输出
> irsend SEND_ONCE <device-name> KEY_1
> irsend SEND_ONCE <device-name> KEY_2
python 控制红外接收和发送
需要用到两个包,python-lirc 用来接收红外 py-irsend 用来发送红外模块
pip install python-lirc
py-irsend
ir_send.py:
from py_irsend import irsend
irsend.send_once('turnaround',['KEY_1'])
irsend.send_once('turnaround',['KEY_2'])
ir_receiver.py:
lirc.init("myprogram",blocking=False)
codes = lirc.nextcode()
codes就会识别到~/.lircrc中编写的触发事件:mode_1,mode_2
以上就是我踩很多坑,出来的结果,希望有帮助