LoginSignup
7
7

ラズパイに USB 接続した同一デバイスを判別できるようにする【その1ーシリアル】

Last updated at Posted at 2021-03-22

はじめに

今回はラズベリーパイに USB 接続するデバイスの任意の表示名を設定して判別しやすくします。
通常だと ttyUSB* のみですが、SerialCable1 のような任意の名称が設定できます。

作業環境

・Raspberry Pi 3B
・Raspberry Pi OS Lite Legacy (buster)
・FT232RL × 2台(同一デバイス)

ラズベリーパイの基本的なセットアップは完了しているものとします。

[手順1] USB デバイスを接続した際の変化を確認する

まず未接続の状態で dev ディレクトリを見てみます。

ls /dev

FT232RL 未接続時
/dev.png

↓ 1台目の FT232RL を接続。ttyUSB0 を確認
USB0.png
↓ 2台目の FT232RL を接続。ttyUSB1 の追加を確認
USB1.png
デバイスを接続すると dev ディレクトリにデバイスファイルが追加されます。

[手順2] 接続デバイスの固有情報を確認する

デバイスの固有情報を確認するために以下コマンドを実行してください。

udevadm info -q all -n /dev/ttyUSB0

ttyUSB0 の部分は参照したいデバイスファイル名にしてください。

コマンドを実行すると以下のように表示されます。
実行例:Sandisk USB フラッシュメモリを接続した場合

pi@raspberrypi:~$ udevadm info -q all -n /dev/sda
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda
N: sda
L: 0
S: disk/by-path/platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0
S: disk/by-id/usb-SanDisk_Ultra_Fit_4C530000021118120214-0:0
S: disk/by-uuid/e1d2d53c-ba70-402f-820c-27162be4a94c
E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: MAJOR=8
E: MINOR=0
E: SUBSYSTEM=block
E: USEC_INITIALIZED=610442091
E: ID_VENDOR=SanDisk
E: ID_VENDOR_ENC=SanDisk\x20
E: ID_VENDOR_ID=0781
E: ID_MODEL=Ultra_Fit
E: ID_MODEL_ENC=Ultra\x20Fit\x20\x20\x20\x20\x20\x20\x20
E: ID_MODEL_ID=5583
E: ID_REVISION=1.00
E: ID_SERIAL=SanDisk_Ultra_Fit_4C530000021118120214-0:0
E: ID_SERIAL_SHORT=4C530000021118120214
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb-storage
E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0
E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0-scsi-0_0_0_0
E: ID_FS_UUID=e1d2d53c-ba70-402f-820c-27162be4a94c
E: ID_FS_UUID_ENC=e1d2d53c-ba70-402f-820c-27162be4a94c
E: ID_FS_VERSION=1.0
E: ID_FS_TYPE=ext4
E: ID_FS_USAGE=filesystem
E: DEVLINKS=/dev/disk/by-path/platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0 /dev/disk/by-id/usb-SanDisk_Ultra_Fit_4C530000021118120214-0:0 /dev/disk/by-uuid/e1d2d53c-ba70-402f-820c-27162be4a94c
E: TAGS=:systemd:
E: CURRENT_TAGS=:systemd:

pi@raspberrypi:~$

後ほど、SUBSYSTEM , ID_SERIAL_SHORT の値を使用するので値をメモしておいてください。
上の実行例だと " block "(SUBSYSTEM)、" 4C530000021118120214 "(ID_SERIAL_SHORT) となります。

[手順3] udev ルールファイルを作成する

任意の名称を設定するために udev のルールファイルを作成します。
udev の詳細は こちら

今回はデバイス固有情報の SUBSYSTEM , ID_SERIAL_SHORT の2つの値を使用します。
ルールファイルは /etc/udev/rules.d に格納します。

下記コマンドを実行して rules ファイルを作成します。

sudo nano /etc/udev/rules.d/99-usb-serial.rules

今回は既存のファイルと被らないように、" 99-" で作成しました。

ルールファイルはファイル名の辞書順に実行されるので処理順序が重要な場合はファイル命名に気をつけてください。

以下を 99-usb-serial.rules に記述して保存します。
SYMLINK : 任意の名称を記述する
MODE : パーミッション設定 ※MODE の詳細は こちら

SUBSYSTEM=="tty",ENV{ID_SERIAL_SHORT}=="先ほど調べた[ID_SERIAL_SHORT]の値",SYMLINK+="USB-test1",MODE="0666"

[手順4] ルールファイルが適用されているか確認する

以下コマンドでルールファイルを再読み込みします。

sudo udevadm trigger

または

sudo /etc/init.d/udev reload

再読み込み後、デバイスファイル名が SYMLINK で指定した値となります。
※表示されない場合はラズベリーパイを再起動してみてください
test1.png

同様にもう一方のデバイスのルールファイルも作成します。99-usb-serial.rules に追記します。
追記後に再読み込みすると以下のようになります。
test2.png
このように任意の名称を付けることができました。
作業中のデバイスが一目でわかります。

[まとめ]

・udevのルールファイルを作成することで作業中のデバイスが判別しやすくなります。
・今回はキーにシリアル番号(ID_SERIAL_SHORT)を使いましたが、作業環境によって使用するキーを変えるとより使い勝手がよくなります。
 例えば、ID_PATH_TAG をキーとして使うと、USB ポートで指定してデバイスを特定できます。(その2で紹介)
・そのほかにも、特定のデバイスを接続したときにスクリプトを実行する等の様々なルール設定が可能です。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7