私はArduinoを持っていますが、時々Arduinoにバインドされ/dev/ttyUSB0
たり、にバインドされたりし/dev/ttyUSB1
て、スクリプトが失敗します。
私は自分のデバイスが存在する可能性のあるすべての可能性を列挙したくはありませんが、静的な場所にバインドしたい/dev/arduino
です。
どうすればそれを達成できますか?
私はArduinoを持っていますが、時々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で読むことができます。
udevam
?そしてmy_uart
、下にシンボリックリンクを作成することに注意することが重要/dev/my_uart
です。初めて書い/dev/arduino
たのですが、それでarduino
十分ですが失敗しました。
udevadm
完了したら自動的に終了します。
上記のルール構文は、一部のディストリビューションでは機能する可能性がありますが、私の(Raspbian)では機能しませんでした。すべての詳細を説明する単一のドキュメントを見つけたことがなかったので、ここにある独自のドキュメントを作成しました。これが結果の要約です。
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)
idVendor
とidProduct
がまったく同じ場合、解決策はありますか?(2つのセンサーが同一モデルUSBからUARTモジュールに接続)
udevadm info --name=/dev/ttyUSB1 --attribute-walk
、両方のデバイスについて行い、シリアル番号を探します。これらはデバイスごとに一意である必要があります。センサーにシリアル番号がない場合、センサーの種類を指定できますか?
4台のカメラを搭載したRasperry Piがあります。fswebcam
カメラを/dev/video0
.. として識別するpixを使用しますvideo3
。時にはカメラがあり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}
ポートに関連付けられているものは変更される場合があります。
そのため、ビデオ番号を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
から抽出KERNELS= line
しdd
ます。このプロセスから、カメラの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を実行していfind
ますが、「Arduino」を含むファイル名に対してを実行するだけで、偶然それらに遭遇しました。私のpythonプログラムは、これらのファイルをデバイスとして使用して、Arduinosとの間でデータを読み書きします(これまでのところ、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
cat /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)