我希望能够使用红外遥控器关闭无头 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
我尝试了遥控器。日志文件未被触及。
进一步的研究让我找到了https://stackoverflow.com/a/70304099,它解决了我的问题。
我希望完整的描述可以帮助其他人。
如何使用红外线关闭 Pi
使用红外遥控器向 Raspberry Pi 发出命令非常容易,甚至是无头的。下面是使用遥控器装备要关闭的 Pi 的逐步过程。该系统可以轻松扩展以执行其他命令。
如果存在红外线接收器,下面的过程也应该适用于其他 Linux 计算机。
所需技能水平
对 Pi 的基本熟悉:
网上有很多帮助。
致谢
重要部分来自:
硬件和 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/
要求
需要以下硬件:
五金组装
将红外接收器的腿朝下,头部的凸起朝前。连接器是:
请注意,识别 GPIO 引脚有不同的约定。上面的引脚编号是物理编号,通过计算实际引脚而获得 - 引脚 1 位于图中的左下角,引脚 2 位于其上方。还有一种命名方案,称为 GPIO 编号或 Broadcom 编号。
操作系统配置
从可启动的 Raspberry Pi 操作系统开始,在文件末尾添加以下行
/boot/config.txt
:如果您想对接收器信号使用不同的引脚,则需要
gpio_pin
使用 Broadcom 编号调整此语句中的值。网上有很多信息,这些信息可能会根据您的 Pi 型号而有所不同。更改启动参数后重新启动 Pi。
初步测试
本部分测试硬件安装,但不是最终解决方案的必需部分。
安装 ir-keytable
并用以下方法测试它:
它应该显示类似于以下内容的输出:
在这种情况下,我们可以忽略第一个条目 (
/sys/class/rc/rc1/
) 并关注第二个条目 (/sys/class/rc/rc0/
),因为它的名称为gpio_ir_recv
。我们将在后面的步骤中使用类 (rc0
) 和设备 (/dev/input/event0)
。使用以下命令测试遥控器:
(或者如果确定的话,该类的不同值)。
然后按遥控器上的按钮。每次按键应该产生如下行:
如果按住按钮,这些行可能会重复。不用担心这个。此外,我们不需要数据,我们只需要一些数据。
如果收到远程按钮按下信号,则表明红外系统正在运行。下一阶段是让它做一些有用的事情。如果遥控器没有反应,请检查以上所有工作。不要忘记检查遥控器的电池。
所需软件
网上有很多指南,但很多都是旧的且过时的。您不需要 LIRC 或 udev。只需一个简短的 Python 脚本(如下所示)即可。假设您已经拥有可用的 Python3。如果没有的话,有些命令需要调整,但我不是 Python 用户,无法真正提供帮助。
安装
pip
(Python 的标准包管理系统)并使用它来安装evdev
(它提供了对 Linux 中通用输入事件接口的绑定)。安装evdev
到系统目录中以便 root 可以访问非常重要。或者
如果您有不同版本的 Python,您可能需要调整路径。
创建一个名为 say 的 Python 脚本,
ir-test.py
其中包含这些行。根据从 获取的内容检查设备路径名(如有必要更正)
ir-keytable
。如果您绕过了该ir-keytable
阶段,请查看其中有哪些设备/dev/input/
并测试每个设备。运行此脚本并按遥控器上的按钮。
它应该打印如下行:
第一个数字是时间,最后一个数字(“
val
”或“value
”)是我们想要的。如果数字为零(如第二行),则仅表示按钮被按住 - 这些行可以忽略。记下
val
与您要操作的按钮对应的“ ”值。您现在已经为最后阶段提供了足够的信息。您可能希望保留上述 Python 脚本,以便进行可能的故障排除,或者以防万一您想要扩展系统。
我建议您创建另一个 Python 脚本,名为 Maybe
ir-read.py
。它包含了:再次调整系统的设备路径名。打印行只是为了显示正在发生的情况,您可以在测试后将其删除。将行中的数字调整
if
为所需按钮的值。最后一行中的“现在”表示立即关闭,如果您想要延迟,可以替换一个数字 - 这是等待的分钟数。测试
ir-read.py
并按下遥控器上的按钮。不要指望 shutdown 命令在这里起作用;因为它需要root权限。错误消息将显示脚本已到达此点。
if
如果您想监听更多远程按钮并对其做出反应,您可以按照相同的模式添加更多块。最后,将脚本添加到根目录
crontab,
,以便它在 Pi 启动时运行。在文件末尾添加这一行:
确保路径和名称对于您的系统来说是正确的。
故障排除
通常情况下,脚本会以用户“pi”(或您登录的任何身份)身份运行,但不能以 root 身份运行。这是因为 root 的环境不同。因此,到处都包含完整路径。
您可以通过将行更改为来调试脚本
crontab
:并可以在脚本中添加更多打印以查看发生了什么。记住每次
crontab
更改后都要重新启动。或者,以 root 身份从命令行尝试 Python 脚本:进一步的想法
很难短按远程按钮来接收单个事件。对于关闭来说,这并不重要,但是对于其他命令来说,这可能是个问题。
命令上有一些选项
ir-keytable
可以调整延迟和重复周期,有关详细信息,请参阅手册页。还应该可以扩展 Python 代码以忽略重复事件。