我已经安装了 Raspberry pi 3 Model B v1.2,并且安装了 LIRC(Linux 红外遥控器)来从 Raspberry pi 发送和接收红外信号(使用红外接收器和发射器)。
现在我的问题是,如何识别红外遥控器的协议?例如:NEC/RC5/RC6/SIRC。
非常感谢您的帮助。如果需要任何其他信息,请在下面评论。
答案1
我刚刚按照以下步骤找到了我的遥控器的协议。您不需要 LIRC,只需要内核的 rc_core 支持。
我通过在 config.txt 中添加覆盖来启用 Raspberry Pi 上的 IR 接收器:
dtoverlay=gpio-ir,gpio_pin=17 # substitute with your pin number
重新启动然后确认您的接收器已添加:
# dmesg | grep 'rc '
[ 7.985963] rc rc0: gpio_ir_recv as /devices/platform/ir-receiver@11/rc/rc0
[ 7.994038] rc rc0: lirc_dev: driver gpio_ir_recv registered at minor = 0, raw IR receiver, no transmitter
我的接收器是rc0
。记住这一点,以备后用!
在 /dev/inputs 中找到接收器的输入
# ls -l /dev/input/by-path/
total 0
lrwxrwxrwx 1 root root 9 Apr 28 2022 platform-fe9c0000.xhci-usb-0:1.1:1.0-event-kbd -> ../event0
lrwxrwxrwx 1 root root 9 Apr 28 2022 platform-ir-receiver@11-event -> ../event1
您需要一个程序来检查输入是否有效。我用这个简单的 perl 脚本测试了输入,但该原理适用于任何语言:
#!/usr/bin/perl
use strict; use warnings;
use Fcntl 'O_RDONLY';
my $file = '/dev/input/event1'; # YOUR IR INPUT HERE
sysopen(my $fh, $file, O_RDONLY) or die "no file: $!";
binmode($fh);
while (1) {
my $count = sysread($fh, my $data, 24);
my ($sec, $usec, $type, $code, $value) = unpack('L<L<S<S<l<', $data);
print "$sec.$usec\n";
printf " type: %02x\n", $type;
printf " code: %02x\n", $code;
printf " value: %08x\n", $value;
}
现在我们可以开始测试协议了。你可以通过向 IR 输入的 sysfs 节点写入内容来更改设置的协议(我的是rc0
):
# cd /sys/class/rc/rc0
# cat protocols
rc-5 nec [rc-6] jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
现在我们只需逐一操作并按下遥控器上的按钮,直到看到一些动作:
# echo 'rc-5' > protocols
# cat protocols
[rc-5] nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
# ~/read-input.pl
(no output)
没有办法,我们继续尝试。
# echo 'nec' > protocols
# cat protocols
rc-5 [nec] rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon [lirc]
# ~/read-input.pl
1689373948.890804
type: 04
code: 04
value: 00860514
1689373948.890804
type: 00
code: 00
value: 00000000
看起来我的遥控器使用的是 NEC 协议!
现在让我们使用 udev 规则确保它在启动时始终设置正确的协议(我的是rc0
):
# cat /etc/udev/rules.d/ir-input.rules
ACTION=="add", KERNEL=="rc0", SUBSYSTEM=="rc", RUN+="/bin/sh -c 'echo nec > /sys/class/rc/rc0/protocols'"
现在我的遥控器重启后就可以工作了。
笔记
- 我不知道为什么
lirc
在协议列表中总是启用,但它似乎不会干扰。 - 输入结构格式来自Linux 输入文档通过这个出色的 Go 演示。
答案2
您还可以尝试以下操作;
列出所有远程控制器:
ir-keytable
找到哪个 /sys/class/rc/rc 包含 lirc 或协议 rc-6 等。
启用此远程控制的所有协议,在我的情况下为 rc3:
ir-keytable -s rc3 -p rc-5 -p nec -p rc-6 -p jvc -p sony -p rc-5-sz -p sanyo -p sharp -p mce_kbd -p xmp -p imon -p lirc
然后您测试它并尝试检测协议和扫描码:
ir-keytable -s rc3 -t
我使用飞利浦遥控器的输出:
107216.468048: lirc protocol(rc6_0): scancode = 0x9f toggle=1
107216.468072: event type EV_MSC(0x04): scancode = 0x9f
107216.468072: event type EV_SYN(0x00).
我使用夏普遥控器的输出:
107276.144048: lirc protocol(sharp): scancode = 0xd35
107276.144087: event type EV_MSC(0x04): scancode = 0xd35
107276.144087: event type EV_SYN(0x00).
我使用 Pioneer 遥控器的输出:
107361.628075: lirc protocol(nec): scancode = 0xa51c
107361.628098: event type EV_MSC(0x04): scancode = 0xa51c
107361.628098: event type EV_SYN(0x00).
我使用 Yamaha 遥控器的输出:
107411.440100: lirc protocol(nec): scancode = 0x7c9b repeat
107411.440136: event type EV_MSC(0x04): scancode = 0x7c9b
107411.440136: event type EV_SYN(0x00).
ETC。