Raspberry Pi 3 & Python 開発ブログ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbian 8.0(NOOBS Ver1.9.2)を使用して開発中。

【スポンサーリンク】

USB挿入でプログラムを実行する方法

【スポンサーリンク】

今回はUSBメモリ挿入でプログラムを実行する方法を紹介したいと思います。udevという仕組みを使用するとUSBメモリが挿入された時にシェルスクリプトPythonコードを実行させることができます。

USBメモリの挿入をプログラム実行のスイッチとして使用できるので、電気回路でスイッチを作らなくてもよいため、回路が苦手な人にとっては重宝します。また、コンソールが開けない状態でも、USBメモリを持って入れば、スクリプトを実行することができます。

USBメモリのデバイス情報取得

udevの仕組みを使用するには、USBメモリのidVendor、idProductの情報が必要になりますので、lsusbコマンドで調べます。まず、USBメモリを外した状態でターミナルからlsusbコマンドを実行します。そのあと、USBメモリを挿入した状態でlsusbコマンドを実行します。コマンドの結果を比較すると挿入前と後で、デバイスが1つ追加されて
いると思います。これがUSBメモリのデバイス情報で、下記のように表示されます。

Bus 001 Device 005: ID AAAA:BBBB XXXX
...
...

・AAAA ⇒ idVendor
・BBBB ⇒ idProduct
・XXXX ⇒ USBメモリの製造メーカー

これでidVendor、idProductがわかりました。

rulesファイルの作成

/etc/udev/rules.dフォルダの中に、USBメモリを挿入した時の動作を定義したファイル(rulesファイル)を作成し、コードを追加します。ファイル名は "連番 + 任意の名前 + .rules" で作成します。
(今回は 10-usbmem.rules としました。このrulesファイルはいくつでも作ることができ連番の数字の若い順に実行されます。)

下記コマンドでファイルを新規で開きます。

sudo nano /etc/udev/rules.d/1-usbmem.rules


下記のコードを追加して、ファイルを保存します。

ACTION=="add", \
SUBSYSTEMS=="usb", \
ATTRS{idVendor}=="AAAA", \
ATTRS{idProduct}=="BBBB", \
RUN+="/bin/bash /home/pi/test.sh"

1つの定義は1行で書かなければいけません。見ずらい場合は、文字列の最後に"\"を付けて改行してください。

パラメータの説明をします。

・ACTION ⇒ 動作を表します。挿入時は"add"、取り外し時は"remove"
・SUBSYSTEMS ⇒ USBを使う場合は"usb"
・ATTRS{idVendor} ⇒ idVendorの値
・ATTRS{idProduct} ⇒ idProductの値
・RUN ⇒ 実行するスクリプト

これでUSBメモリを挿入すると/home/pi/test.shのシェルスクリプトが実行されます。

シェルスクリプトの作成

今回はUSB挿入時にRaspberry Piがシャットダウンするようにしたいと思います。

※test.shにはchmodコマンドで実行権限を付与しておいてください。

sudo nano /home/pi/test.sh

下記のようにtest.shにコードを記載します。

#!/bin/bash
sudo shutdown -h now

動作確認

準備が整ったら、USBメモリを外し再起動します。rulesファイルを修正後、再起動しないと反映されません。また、rulesファイルは起動時にも実行されるので、USBを挿入していると起動しないので注意してください。
(起動 ⇒ 起動シーケンスでrules実行 ⇒ test.sh実行 ⇒ シャットダウン)

それではRaspberry Piが起動したら、USBメモリを挿入してみてください。シャットダウンすれば成功です。

また、pythonコードを実行したい時は、シェルスクリプトを下記のように変えるだけで実行できます。引数を使っていなくてもひとつ引数を付けないとエラーになるようです。

#!/bin/bash
python3 /home/pi/main.py "$@"


コンソールが使えない環境等で、USBメモリの挿抜をトリガーに、スクリプトを実行したり、シャットダウンしたりすることができるようになりました。意外と便利ですね。