如何识别IR Remote(红外遥控)的协议?

如何识别IR Remote(红外遥控)的协议?

我已经安装了 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'"

现在我的遥控器重启后就可以工作了。

笔记

答案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。

相关内容