ubuntuでは,USBをつなげるとデバイスファイル名がその都度決まる.
そのため,挿した順番などで,デバイス名が変わってしまう.
ArduinoやF9Pでシリアル通信をするとき,毎回変わることは避けたいので,固定する方法を紹介する.
デバイスが異なるUSB場合
USBポートに接続すると、以下のIDを取得することができる。
これはデバイスごとに異なるので、このIDを元にデバイス名を固定する。
- ID_VENDOR_ID
- ID_MODEL_ID
- ID_SERIAL_SHORT
1. 接続したいデバイスを接続
ここでは,ArduinoをUSBで挿す.
このとき,割り振られたデバイス名を調べておく
ls /dev/tty*
Arduinoは,ttyACM0とかに割り振られる.
2. デバイスの3つの情報を調べる.
3つの情報を調べる.
- ID_VENDOR_ID
- ID_MODEL_ID
- ID_SERIAL_SHORT
割り振られたデバイス名さえ知っていれば,以下のコマンドで調べられる.
udevadm info -q property -n {割り振られたデバイス名} | grep -E "ID_SERIAL_SHORT=|ID_VENDOR_ID=|ID_MODEL_ID="
3. デバイスをudevルールに登録する
ルールファイルを新規・追加作成する
ここではファイル名を/etc/udev/rules.d/100-usb-serial-devices.rulesとする
*-usb-serial-devices.rules(*が大きいほどルールの優先度が高くなる)
sudo gedit /etc/udev/rules.d/100-usb-serial-devices.rules
以下のように追加する
SUBSYSTEM=="tty", ATTRS{idVendor}=="調べたID_VENDOR_ID", ATTRS{idProduct}=="調べたID_MODEL_ID", ATTRS{serial}=="調べたID_SERIAL_SHORT",SYMLINK+="表示させたい名前", MODE="0666"
認識後は,[/dev/表示させたい名前]でデバイスが認識されるようになるし,
権限も666で自動付与される.
4. 最後にリロードする
sudo service udev reload
sudo reboot
デバイスが同じ場合
同じデバイスの場合、上記の方法は使えない。
(RTK-GNSSモジュールのF9Pなどがそれ)
なので、接続したUSBのポート番号で識別する。
1. 接続したいデバイスを接続
ここでは,F9PをUSBで挿す.
このとき,割り振られたデバイス名を調べておく
ls /dev/tty*
F9Pは,ttyACM0とかに割り振られる.
2. デバイスの接続ポートを確認する。
udevadm info -q property -n /dev/ttyACM0
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3.3/1-3.3:1.0/tty/ttyACM0
/tty/tty*の一つ前の「1-3.3:1.0」が必要な情報。
この部分は、USBハブを使っているかどうかにもよるので、とりあえず一つ前とおぼえておけば良し。
3. デバイスをudevルールに登録する
ルールファイルを新規・追加作成する
ここではファイル名を/etc/udev/rules.d/100-usb-serial-devices.rulesとする
*-usb-serial-devices.rules(*が大きいほどルールの優先度が高くなる)
sudo gedit /etc/udev/rules.d/100-usb-serial-devices.rules
以下のように追加する
KERNELS=="1-3.3:1.0", SYMLINK+="{表示させたい名前}", MODE="0666""
認識後は,[/dev/表示させたい名前]でデバイスが認識されるようになるし,
権限も666で自動付与される.
ただし、この方法はUSBの接続ポートを変える事はできないので注意。同じポートにUSBを挿せば、どんなUSBデバイスも同じ名前で表示されることになる
4. 最後にリロードする
sudo service udev reload
sudo reboot
おわり。