この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP.Hです!
USBデバイスを複数挿入すると/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2...と認識されますが、/dev/ttyUSB0に割り当てられていたデバイスが再起動後、/dev/ttyUSB1に割り当てられてしまうということがあります。 割り当てが変わってしまうと、pythonコードで指定していたデバイス名(/dev/ttyUSBx)と整合が取れなくなり、動かなくなる場合があります。今回は、この現象を回避する方法を紹介します。
それではUSBのデバイス名を固定する方法を説明してきます。
USBメモリのデバイス情報取得
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/ruled.d/90-usb.rulesファイルを新規に作成して、そこにUSBデバイス名を固定する設定を書き込んできます。sudo nano /etc/udev/rules.d/90-usb.rules
コマンドで90-usb.rulesファイルを開きます(はじめての場合は新規に作成します)。以下のように記載して、再起動します。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", SYMLINK+="ttyUSB_Test"
- ATTRS{idVendor}=="xxxx" ⇒ xxxxには上記で調べたidVenderを記載します。
- ATTRS{idProduct}=="xxxx" ⇒ xxxxには上記で調べたidProductを記載します。
- SYMLINK+="ttyUSB_Test" ⇒ 今回は例として"ttyUSB_Test"としましたが、任意の名前で構いません。どのデバイスかわかりやすい名前がよいと思います。
この記載をすることで、USBポートに挿入されているUSBデバイスを"ttyUSB_Test"という名前で制御できるようになります。
動作確認
設定後、Raspberry Piを再起動します。ls -al /devコマンドで確認すると、内部的にttyUSB_Test -> ttyUSB0とシンボリックリンクが張られていることがわかります。これで毎回、idVender、idProductで指定したデバイスが/dev/ttyUSB_Testというデバイス名で接続が可能になります。 pythonでUSBデバイスのパスを指定する時も"/dev/ttyUSB_Test"というパス名を使ってください。
USBデバイス名は、USBを挿入する場所によっても名前を固定することができます。こちらも便利ですので、下記ブログも参照していただければと思います。