적외선 리모컨을 사용하여 Linux를 종료하는 방법

적외선 리모컨을 사용하여 Linux를 종료하는 방법

적외선 리모콘을 사용하여 헤드리스 라즈베리 파이를 종료할 수 있기를 원합니다. 나는 이 튜토리얼을 따랐다.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 데스크탑에서 부분적으로 작동하면 키보드와 마우스의 이벤트가 표시되지만 Asus PN-51에 내장된 IR 센서의 이벤트는 표시되지 않습니다.

이 기사는 유망해 보입니다.https://hackernoon.com/shut-down-your-raspberry-pi-the-easy-way-9c7be0b4fff8. triggerhappyUSB 마우스 클릭으로 헤드리스 라즈베리 파이를 종료하는 방법을 설명합니다 . 그러나 이것은 내 문제를 해결하는 데 도움이 되지 않습니다.

sudo장치 파일( /dev/input/event*)은 루트 전용이므로 를 사용하여 모든 명령을 실행해 보았습니다 . 아무런 차이가 없습니다.

triggerhappyIR 수신기를 설정하거나 디버깅하는 방법을 아는 사람이 있습니까 ? 또한 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.

하드웨어 조립

다리가 아래로 향하고 머리의 돌출부가 앞을 향하도록 IR 수신기를 배치합니다. 커넥터는 다음과 같습니다.

• 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.

IR 수신기 어셈블리

GPIO 핀을 식별하는 데는 다양한 규칙이 있습니다. 위의 핀 번호는 실제 핀 수를 세어 얻은 물리적 번호입니다. 1번 핀은 다이어그램의 왼쪽 하단에 있고 2번 핀은 그 위에 있습니다. GPIO 번호 지정 또는 Broadcom 번호 지정이라는 명명 체계도 있습니다.

운영 체제 구성

부팅 가능한 Raspberry Pi 운영 체제로 시작하여 파일 끝에 다음 줄을 추가합니다 /boot/config.txt.

dtoverlay=gpio-ir,gpio_pin=14

수신기 신호에 다른 핀을 사용하려면 gpio_pinBroadcom 번호를 사용하여 이 명령문의 값을 조정해야 합니다. 온라인에는 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_recvrc0/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 사용자가 아니므로 실제로 도움을 드릴 수 없습니다.

(Python의 표준 패키지 관리 시스템) 을 설치 pip하고 이를 사용하여 설치합니다 evdev(Linux의 범용 입력 이벤트 인터페이스에 대한 바인딩 제공). evdev루트가 액세스할 수 있도록 시스템 디렉토리에 설치하는 것이 중요합니다.

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")는 우리가 원하는 것입니다. 숫자가 0인 경우(두 번째 행과 같이) 이는 단지 버튼을 누르고 있다는 의미입니다. 이 행은 무시할 수 있습니다.

val조작하려는 버튼에 해당하는 " " 값을 기록해 두십시오 .

이제 최종 단계에 대한 충분한 정보를 제공했습니다. 가능한 문제 해결을 위해 또는 시스템을 확장하려는 경우를 대비하여 위의 Python 스크립트를 보관할 수 있습니다.

Maybe라는 또 다른 Python 스크립트를 만드는 것이 좋습니다 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원하는 버튼의 값으로 조정합니다. 마지막 줄의 "now"는 즉시 종료를 의미합니다. 지연을 원할 경우 숫자로 대체할 수 있습니다. 이는 대기할 시간(분)입니다.

ir-read.py리모컨의 버튼을 테스트 하고 누릅니다.

python ir-read.py

여기서는 shutdown 명령이 작동할 것이라고 기대하지 마십시오. 루트 권한이 필요합니다. 오류 메시지는 스크립트가 이 지점에 도달했음을 나타냅니다.

if더 많은 원격 버튼을 듣고 반응하려면 동일한 패턴을 따르고 블록을 더 추가하면 됩니다.

crontab,마지막으로 Pi가 부팅될 때 실행되도록 스크립트를 루트 디렉터리에 추가합니다 .

sudo crontab -e

파일 끝에 다음 줄을 추가합니다.

@reboot /usr/bin/python /home/pi/ir-read.py

시스템의 경로와 이름이 올바른지 확인하십시오.

문제 해결

일반적으로 스크립트는 사용자 "pi"(또는 로그인한 계정)로 실행되지만 루트로는 실행되지 않습니다. 근본환경이 다르기 때문이다. 따라서 전체 경로가 모든 곳에 포함됩니다.

행을 다음으로 변경하여 스크립트를 디버깅할 수 있습니다 crontab.

@reboot /usr/bin/python /home/pi/ir-read.py >>/home/pi/irdebug.log

스크립트에 더 많은 인쇄물을 추가하여 무슨 일이 일어나고 있는지 확인할 수 있습니다. 변경할 crontab때마다 재부팅하는 것을 잊지 마세요. 또는 루트로 명령줄에서 Python 스크립트를 사용해 보세요.

sudo /usr/bin/python /home/pi/ir-read.py

더 많은 생각

단일 이벤트를 수신하기 위해 원격 버튼을 짧게 누르는 것은 어렵습니다. 종료의 경우 이는 중요하지 않지만 다른 명령의 경우 문제가 될 수 있습니다.

명령에는 ir-keytable지연 및 반복 기간을 조정하는 옵션이 있습니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오. 중복 이벤트를 무시하도록 Python 코드를 확장하는 것도 가능해야 합니다.

관련 정보