赤外線リモコンを使用して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-9c7be0b4fff8triggerhappyUSBマウスクリックでヘッドレスラズベリーパイをシャットダウンする方法について説明します。しかし、これは私の問題を解決するのに役立ちません。

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 スクリプトはログファイルに 1 行だけ記録し、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/2番目の項目()に集中できます。クラス()とデバイス(。/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")は私たちが望むものです。数字がゼロの場合(2行目のように)、これは単にボタンを押し続けていることを意味します。この行は無視できます。

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コマンドが機能することを期待しないでください。 root権限が必要です。エラーメッセージは、スクリプトがこの時点に達したことを示します。

ifより多くのリモートボタンを聞いて反応するには、同じパターンに従い、さらにブロックを追加します。

crontab,最後に、Piが起動したときに実行されるようにスクリプトをルートディレクトリに追加します。

sudo crontab -e

ファイルの末尾に次の行を追加します。

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

システムのパスと名前が正しいことを確認してください。

トラブルシューティング

通常、スクリプトはユーザー「pi」(またはログインしたアカウント)で実行されますが、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コードを拡張することも可能でなければなりません。

関連情報