Arduinoを使用していて、時々/dev/ttyUSB0
にバインドされ、他の場合は/dev/ttyUSB1
にバインドされるため、スクリプトが失敗します。
デバイスが存在する可能性のあるすべての可能性を列挙したくはありませんが、むしろどこかに静的にバインドさせたいです。 /dev/arduino
。
どうすればそれを達成できますか?
提案されているように、いくつかのudevルールを追加できます。私は/etc/udev/rules.d/10-local.rules
を編集して以下を含めました:
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
次のコマンドを実行すると、デバイスの変数を確認できます
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
あなたが読むことができるより深いガイドがあります http://www.reactivated.net/writing_udev_rules.html
上記のルール構文は、一部のディストリビューションでは機能する可能性がありますが、私(Raspbian)では機能しませんでした。すべてのインとアウトを説明する単一のドキュメントを見つけたことがないので、自分で作成しました here を見つけてください。これは結局のところです。
1。 ttyUSBの内容を確認します。
dmesg | grep ttyUSB
2.デバイスのすべての属性を一覧表示します。
udevadm info --name=/dev/ttyUSBx --attribute-walk
(もちろん、xの代わりにデバイス番号を使用)。一意の識別子セットを選択します(例:idVendor + idProduct)。 idVendorとidProductが同じデバイスが複数ある場合も、SerialNumberが必要になることがあります。 SerialNumbersは、デバイスごとに一意である必要があります。
3。ファイルを作成します/etc/udev/rules.d/99-usb-serial.rules
次のような行が含まれています。
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
(そこではシリアル番号は必要なく、もちろんステップ2で見つけたidVendorとidProductの番号が必要だと仮定します。
4。新しいルールをロードします。
Sudo udevadm trigger
5.何が起こったかを確認します。
ls -l /dev/your_device_name
シンボリックリンクが行ったttyUSB番号が表示されます。もし /dev/ttyUSB1
、次に、それを所有している人と、それが属するグループを確認します。
ls -l /dev/ttyUSB1
それからそれを楽しむためだけに:
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
4台のカメラを備えたRasperry Piを持っています。カメラを/dev/video0
.. video3
として識別するfswebcam
を使用してpixを取得します。カメラがvideo0
、vide02
、video4
、video6
の場合もありますが、今のところは忘れることができます。
カメラ番号を特定するために永続的なIDが必要です。 video0
は写真にキャプションを付けるため、常に同じカメラです。残念ながら、これは確実には起こりません。起動時に、カメラはvideo0
..video3
として列挙されますが、常に同じとは限りません。
すべてのカメラのIDとシリアル番号は同じです。
この問題の解決にはudevルールが関係しますが、そこにはたくさんの釣り針もあります。
コマンドを発行する場合
udevadm info –attribute-walk –path=/dev/video0
あなたは出力のスクリードを取得しますが、顕著なビットは
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
KERNELSビットはUSBハブポートです。 4台のカメラでは、4台のカメラがあります。これらは、再起動時に変更されませんが、ポートに関連付けられているvideo{x}
mayの変更です。
したがって、ビデオ番号をUSBハブポートに関連付けるためのudevルールが必要です。
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
シンプルに見える–でカメラにアクセス
fswebcam –d $realpath /dev/camera0
それが機能しないことを除いて、これをudevルールに入れ、システムがvideo0(起動時)を別のポートに割り当てた場合、udevルールは無視されます。 /dev/camera0
へのシンボリックリンクは、基本的にno such device
です。スクエアワン。
シンボリックリンクをvideo{x}
番号ではなくUSBハブアドレスにバインドする必要があります。 Pythonプログラムが必要です。
最初のステップは実行することでした
fswebcam –d /dev/video${x} tst.jpg
x
の場合は1から8の間。各呼び出しの後にtst.jpg
が存在すると、このビデオ番号にカメラが存在するかどうかが識別されます。これから、アクティブなビデオ番号のリストを作成します。私の経験では、これまで使用したカメラでは0,1,2,3
または0,2,4,6
のどちらかです。
もちろん、別のプロセスを使用してこのリストを作成することもできます。
次に、リストの各ビデオ番号について実行します
udevadm info –attribute-walk –path=/dev/videox > dd
dd
からKERNELS= line
を抽出します。このプロセスから、カメラのUSBポートアドレスのリストが作成されます。このリストを並べ替えて、次のステップで常に同じ順序で処理されるようにします。これを「アドレスリスト」と呼びます。
udevadm … > dd
をもう一度実行して、次のようなリストを作成します。
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
次に、アドレスリストをステップ実行します。各エントリについて、ビデオリストから対応するエントリを見つけます。次のような行のコレクションのように見える新しいリストを作成します
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
X(シンボリックリンク番号)は、アドレスリストのシーケンス番号に置き換えられます。
これで、機能するudevルールが作成されました。起動時にそのポートに割り当てられているビデオ番号に関係なく、USBハブアドレスに関連付けられているシンボリックリンク。
最終的なリストをファイル/etc/udev/rules.d/cam.rules
に書き込みます。 udevadm trigger
を実行してアクティブ化すると、ジョブが完了します。 /dev/camera2
は、ビデオ番号に関係なく、同じカメラ(USBポート)になります。
/dev/serial/by-id
でもユニークなデバイスを見つけることができました。私はまだ再起動を試みていませんが、そのディレクトリ内のファイルは適切なデバイスファイル(ttyACM[0-9]
)へのリンクでした。`
私はRaspberry PiでArch Linuxを実行していますが、「Arduino」を含むファイル名に対してfind
を実行するだけでそれらを偶然見つけました。私のpythonプログラムは、これらのファイルをデバイスとして使用して、Arduinoからデータを読み書きするために正常に動作します(これまでのところ、1つのPiで2つ)。
/ etc/fstabにエントリを配置した後、上記が機能し、デバイスを自動マウントしたことを言うだけです(また、スティックを取り外した後にumountを呼び出します)。
つまり.
/ etc/fstab
# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup /vol/backup ext4 defaults,errors=remount-ro 0 1
猫/etc/udev/rules.d/5-usb-stick.rules
#
# the next line creates a symlink to this disk drive called /dev/backup
# i.e.
# root:# ls -la /dev/backup
# lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0
# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade "
ACTION=="add", ATTRS{model}=="Cruzer Blade ", SYMLINK+="backup"
# Clean up after removal
ACTION=="remove", ATTRS{model}=="Cruzer Blade ", RUN+="/bin/umount /vol/backup"
USBスティックを挿入すると、次のようになります。
root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)