AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 753554
Accepted
Peter bill
Peter bill
Asked: 2023-08-08 23:40:07 +0800 CST2023-08-08 23:40:07 +0800 CST 2023-08-08 23:40:07 +0800 CST

如何使用红外遥控器关闭Linux

  • 772

我希望能够使用红外遥控器关闭无头 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我尝试了遥控器。日志文件未被触及。

linux
  • 1 1 个回答
  • 50 Views

1 个回答

  • Voted
  1. Best Answer
    Peter bill
    2023-08-11T19:23:47+08:002023-08-11T19:23:47+08:00

    进一步的研究让我找到了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 代码以忽略重复事件。

    • 2

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve