我希望能够使用红外遥控器关闭无头 Raspberry Pi。我按照这个教程https://blog.gordonturner.com/2020/05/31/raspberry-pi-ir-receiver/。一开始一切都很顺利。该命令ir-keytable -t -s rc0
可以工作并响应遥控器上的按键。
之后,我就无法再取得任何进展。这些udev
步骤不起作用,根据我之前的经验,这并不奇怪udev
。 (它与这个问题无关,但可以在如何以只读方式安装特定 USB 驱动器。
我试过triggerhappy
https://github.com/wertarbyte/triggerhappy,但该thd
命令也不起作用:
thd --dump /dev/input/event0 /dev/input/event1
按下按钮时没有输出。它甚至不通过 ssh 从键盘注册按键。thd
部分适用于我的 Linux 桌面,显示来自键盘和鼠标的事件,但不显示来自华硕 PN-51 内置红外传感器的事件。
这篇文章看起来很有前途https://hackernoon.com/shut-down-your-raspberry-pi-the-easy-way-9c7be0b4fff8。它描述了如何triggerhappy
通过单击 USB 鼠标来关闭无头 Raspberry Pi。但是,这对解决我的问题没有帮助。
我已尝试使用 运行所有命令sudo
,因为设备文件 ( /dev/input/event*
) 仅是根目录。这没有什么区别。
有谁知道如何设置或调试triggerhappy
红外接收器?另外,是否有一种现代方法来ir-keytable
监听事件并执行命令?
我决定不在 raspberrypi.stackexchange.com/ 上问这个问题,因为这更多是一个 Linux 问题。
编辑 - udev 详细信息
我/etc/udev/rules.d/90-ir.rules
用一行创建了一个文件:
ACTION=="add", SUBSYSTEM=="input", SUBSYSTEMS=="rc", KERNEL=="event*", ENV{.rc_sysdev}="$id", RUN+="/home/pi/test-udev.sh"
我并没有花太多的精力在这上面。在得知最新版本的udev
功能远不如以前的强大后,我没有信心。
我知道它不会测试哪个键被抓住。脚本 test-udev.sh 仅将一行写入日志文件,它在从 Bash 提示符运行时有效。
执行后sudo udevadm control --reload
我尝试了遥控器。日志文件未被触及。
答案1
进一步的研究使我发现https://stackoverflow.com/a/70304099这解决了我的问题。
我希望完整的描述可以帮助其他人。
如何使用红外线关闭 Pi
使用红外遥控器向 Raspberry Pi 发出命令非常容易,甚至是无头的。下面是使用遥控器装备要关闭的 Pi 的逐步过程。该系统可以轻松扩展以执行其他命令。
如果存在红外线接收器,下面的过程也应该适用于其他 Linux 计算机。
所需技能水平
对 Pi 的基本熟悉:
• setting-up the SD card,
• editting files, with your preferred editor,
• access to root, via `sudo`
• attaching a device to the GPIO.
网上有很多帮助。
致谢
重要部分来自:
硬件和 ir-keytable:
https://blog.gordonturner.com/2020/05/31/raspberry-pi-ir-receiver/
Python 和 evdev:
https://stackoverflow.com/a/70304099
https://pypi.org/project/evdev/
要求
需要以下硬件:
• A Raspberry Pi with an SD card, Raspberry Pi OS and wifi or an ethernet connection. The network is only required to install software. Other operating systems probably work, but Linux is assumed here.
• A TSOP38238 infra-red receiver. These are very cheap to buy in bulk, but small orders often attract a hefty handling and package charge.
• An infra-red remote control. You may be able to find a working device from a discarded television or similar. I used a Philips handset from a broken DVD player. There are many for sale through online suppliers – you may want a cheap, simple device, or something more complex if you envisage programming lots of commands.
• Breadboard and jumper wires, for prototyping.
五金组装
将红外接收器的腿朝下,头部的凸起朝前。连接器是:
• Left-most: Signal, connect to pin 8 of the Pi, named GPIO14.
• Centre: Ground, connect to one of the ground pins of the Pi, e.g. pin 6.
• Right-most: Power, connect to pin 1 of the Pi, 3.3 volts.
请注意,识别 GPIO 引脚有不同的约定。上面的引脚编号是物理编号,通过计算实际引脚而获得 - 引脚 1 位于图中的左下角,引脚 2 位于其上方。还有一种命名方案,称为 GPIO 编号或 Broadcom 编号。
操作系统配置
从可启动的 Raspberry Pi 操作系统开始,在文件末尾添加以下行/boot/config.txt
:
dtoverlay=gpio-ir,gpio_pin=14
如果您想对接收器信号使用不同的引脚,则需要gpio_pin
使用 Broadcom 编号调整此语句中的值。网上有很多信息,这些信息可能会根据您的 Pi 型号而有所不同。
更改启动参数后重新启动 Pi。
初步测试
本部分测试硬件安装,但不是最终解决方案的必需部分。
安装 ir-keytable
sudo apt install -y ir-keytable
并用以下方法测试它:
sudo ir-keytable
它应该显示类似于以下内容的输出:
Found /sys/class/rc/rc1/ with:
Name: vc4-hdmi
Driver: cec
Default keymap: rc-cec
Input device: /dev/input/event1
Supported kernel protocols: cec
Enabled kernel protocols: cec
bus: 30, vendor/product: 0000:0000, version: 0x0001
Repeat delay = 0 ms, repeat period = 125 ms
Found /sys/class/rc/rc0/ with:
Name: gpio_ir_recv
Driver: gpio_ir_recv
Default keymap: rc-rc6-mce
Input device: /dev/input/event0
LIRC device: /dev/lirc0
Attached BPF protocols: Operation not permitted
Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon
Enabled kernel protocols: lirc rc-6
bus: 25, vendor/product: 0001:0001, version: 0x0100
Repeat delay = 500 ms, repeat period = 125 ms
在这种情况下,我们可以忽略第一个条目 ( /sys/class/rc/rc1/
) 并关注第二个条目 ( /sys/class/rc/rc0/
),因为它的名称为gpio_ir_recv
。我们将在后面的步骤中使用类 ( rc0
) 和设备 ( 。/dev/input/event0)
使用以下命令测试遥控器:
sudo ir-keytable -t -s rc0
(或者如果确定的话,该类的不同值)。
然后按遥控器上的按钮。每次按键应该产生如下行:
211.610167: event type EV_MSC(0x04): scancode = 0x4601
211.610167: event type EV_SYN(0x00).
如果按住按钮,这些行可能会重复。不用担心这个。此外,我们不需要数据,我们只需要一些数据。
如果收到远程按钮按下信号,则表明红外系统正在运行。下一阶段是让它做一些有用的事情。如果遥控器没有反应,请检查以上所有工作。不要忘记检查遥控器的电池。
所需软件
网上有很多指南,但很多都是旧的且过时的。您不需要 LIRC 或 udev。只需一个简短的 Python 脚本(如下所示)即可。假设您已经拥有可用的 Python3。如果没有的话,有些命令需要调整,但我不是 Python 用户,无法真正提供帮助。
安装pip
(Python 的标准包管理系统)并使用它来安装evdev
(它提供了对 Linux 中通用输入事件接口的绑定)。安装evdev
到系统目录中以便 root 可以访问非常重要。
sudo apt install -y python3-pip
sudo pip install -y evdev --target /usr/lib/python3/dist-packages
或者
sudo pip3 install evdev --target /usr/lib/python3/dist-packages
如果您有不同版本的 Python,您可能需要调整路径。
创建一个名为 say 的 Python 脚本,ir-test.py
其中包含这些行。
from evdev import InputDevice
dev = InputDevice('/dev/input/event0')
for event in dev.read_loop():
print(event)
根据从 获取的内容检查设备路径名(如有必要更正)ir-keytable
。如果您绕过了该ir-keytable
阶段,请查看其中有哪些设备/dev/input/
并测试每个设备。
运行此脚本并按遥控器上的按钮。
python ir-test.py
它应该打印如下行:
event at 1691579255.159091, code 04, type 04, val 17921
event at 1691579255.159091, code 00, type 00, val 00
第一个数字是时间,最后一个数字(“ val
”或“ value
”)是我们想要的。如果数字为零(如第二行),则仅表示按钮被按住 - 这些行可以忽略。
记下与val
您要操作的按钮对应的“ ”值。
您现在已经为最后阶段提供了足够的信息。您可能希望保留上述 Python 脚本,以便进行可能的故障排除,或者以防万一您想要扩展系统。
我建议您创建另一个 Python 脚本,名为 Maybe ir-read.py
。它包含了:
# Production program to process IR input
import subprocess
from evdev import InputDevice
dev = InputDevice('/dev/input/event0')
for event in dev.read_loop():
print(event.value) # Debug only
if event.value == 18119:
subprocess.run(["/usr/sbin/shutdown", "now"])
再次调整系统的设备路径名。打印行只是为了显示正在发生的情况,您可以在测试后将其删除。将行中的数字调整if
为所需按钮的值。最后一行中的“现在”表示立即关闭,如果您想要延迟,可以替换一个数字 - 这是等待的分钟数。
测试ir-read.py
并按下遥控器上的按钮。
python ir-read.py
不要指望 shutdown 命令在这里起作用;因为它需要root权限。错误消息将显示脚本已到达此点。
if
如果您想监听更多远程按钮并对其做出反应,您可以按照相同的模式添加更多块。
最后,将脚本添加到根目录crontab,
,以便它在 Pi 启动时运行。
sudo crontab -e
在文件末尾添加这一行:
@reboot /usr/bin/python /home/pi/ir-read.py
确保路径和名称对于您的系统来说是正确的。
故障排除
通常情况下,脚本会以用户“pi”(或您登录的任何身份)身份运行,但不能以 root 身份运行。这是因为 root 的环境不同。因此,到处都包含完整路径。
您可以通过将行更改为来调试脚本crontab
:
@reboot /usr/bin/python /home/pi/ir-read.py >>/home/pi/irdebug.log
并可以在脚本中添加更多打印以查看发生了什么。记住每次crontab
更改后都要重新启动。或者,以 root 身份从命令行尝试 Python 脚本:
sudo /usr/bin/python /home/pi/ir-read.py
进一步的想法
很难短按远程按钮来接收单个事件。对于关闭来说,这并不重要,但是对于其他命令来说,这可能是个问题。
命令上有一些选项ir-keytable
可以调整延迟和重复周期,有关详细信息,请参阅手册页。还应该可以扩展 Python 代码以忽略重复事件。