Python & Raspberry Pi 開発ブログ ☆彡

PythonとRaspberry Piの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

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/10-usbmem.rules

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

ACTION=="add", \
SUBSYSTEMS=="usb", \
ATTRS{idVendor}=="AAAA", \
ATTRS{idProduct}=="BBBB", \
RUN+="/bin/bash /home/pi/test/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コマンドで実行権限(744)を付与しておいてください。

sudo nano /home/pi/test/test.sh

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

#!/bin/bash
sudo shutdown -h now

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

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

USB挿入時にpythonコードを実行するスクリプト

下記のようにtest.shを作成します。

#!/bin/bash

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

python3 test.py
exit 0

pythonコードはabcフォルダを作成する下記プログラムを使用します。
test.pyを同じフォルダ(/home/pi/test/)に保存します。

import subprocess, shlex

args = shlex.split("mkdir ./abc")
proc = subprocess.call(args)

USBを挿入すると、test.pyと同じパスにabcというフォルダが作成されます。

USB挿入時にpipenv仮想環境のpythonコードを実行するスクリプト

#!/bin/bash

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

. ./.venv/bin/activate
python test.py

exit 0

test.pyは上記と同じです。


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

ラズパイ ソフトウェアに戻る
トップ設定に戻る