Linuxでは、USBで接続された複数のArduinoを識別する方法は?


17

複数のArduinoをUSB経由でLinuxコンピューターに接続している場合、次のように表示されます

  • / tty / ACM0
  • / tty / ACM1
  • / tty / ACM2

シリアル接続を介してそれらに接続せずに、どのArduinoがどれであるかをどのように識別することができますか?Arduinoにシリアル番号または一意のIDはありますか?

お時間をいただきありがとうございます。

状況:Uno R3、Mega、Leonardo with / ttyACM [1,2,3]

上記の順序のデバイスでのlsusb出力:

...
バス001デバイス011:ID 2341:0043
バス001デバイス013:ID 2341:8036
...
バス001デバイス014:ID 2341:0042

lsusb -d vendor:device -vvvはそれぞれについて表示します

ウノ

バス001デバイス014:ID 2341:0042
デバイス記述子:
  長さ18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2通信
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0.01
  iManufacturer 1 Arduino(www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNumConfigurations 1
  構成記述子:
    長さ9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0xc0
      セルフパワード
    MaxPower 100mA
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2通信
      bInterfaceSubClass 2 Abstract(モデム)
      bInterfaceProtocol 1 ATコマンド(v.25ter)
      iInterface 0
      CDCヘッダー:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          休憩を送ります
          ラインコーディングとシリアル状態
      CDCユニオン:
        bMasterInterface 0
        bSlaveInterface 1
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          転送タイプ割り込み
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0008 1x 8バイト
        bInterval 255
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDCデータ
      bInterfaceSubClass 0未使用
      bInterfaceProtocol 0
      iInterface 0
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          転送タイプバルク
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 1
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          転送タイプバルク
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 1
デバイスステータス:0x0000
  (バスパワー)

レオナルド:

バス001デバイス013:ID 2341:8036
デバイス記述子:
  長さ18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0(インターフェイスレベルで定義)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0x2341
  idProduct 0x8036
  bcdDevice 1.00
  iManufacturer 1 Arduino LLC
  iProduct 2 Arduino Leonardo
  iSerial 0
  bNumConfigurations 1
  構成記述子:
    長さ9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0x80
      (バスパワー)
    MaxPower 500mA
    インターフェイスの関連付け:
      長さ8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2通信
      bFunctionSubClass 2 Abstract(モデム)
      bFunctionProtocol 1 ATコマンド(v.25ter)
      iFunction 0
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2通信
      bInterfaceSubClass 2 Abstract(モデム)
      bInterfaceProtocol 0なし
      iInterface 0
      CDCヘッダー:
        bcdCDC 1.10
      CDCコール管理:
        bmCapabilities 0x01
          通話管理
        bDataInterface 1
      CDC ACM:
        bmCapabilities 0x06
          休憩を送ります
          ラインコーディングとシリアル状態
      CDCユニオン:
        bMasterInterface 0
        bSlaveInterface 1
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributes 3
          転送タイプ割り込み
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 0
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          転送タイプバルク
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 0
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 3ヒューマンインターフェイスデバイス
      bInterfaceSubClass 0サブクラスなし
      bInterfaceProtocol 0なし
      iInterface 0
        HIDデバイス記述子:
          長さ9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0サポートされていません
          bNumDescriptors 1
          bDescriptorType 34レポート
          wDescriptorLength 101
          レポート記述子:(長さは101)
            アイテム(グローバル):使用状況ページ、データ= [0x01] 1
                            汎用デスクトップコントロール
            アイテム(ローカル):使用法、データ= [0x02] 2
                            マウス
            アイテム(メイン):コレクション、データ= [0x01] 1
                            応用
            アイテム(ローカル):使用法、データ= [0x01] 1
                            ポインタ
            アイテム(メイン):コレクション、データ= [0x00] 0
                            物理的
            アイテム(グローバル):レポートID、データ= [0x01] 1
            アイテム(グローバル):使用状況ページ、データ= [0x09] 9
                            ボタン
            アイテム(ローカル):最小使用量、データ= [0x01] 1
                            ボタン1(プライマリ)
            アイテム(ローカル):最大使用量、データ= [0x03] 3
                            ボタン3(三次)
            アイテム(グローバル):論理最小値、データ= [0x00] 0
            アイテム(グローバル):論理最大値、データ= [0x01] 1
            アイテム(グローバル):レポート数、データ= [0x03] 3
            アイテム(グローバル):レポートサイズ、データ= [0x01] 1
            アイテム(メイン):入力、データ= [0x02] 2
                            データ変数Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatileビットフィールド
            アイテム(グローバル):レポート数、データ= [0x01] 1
            アイテム(グローバル):レポートサイズ、データ= [0x05] 5
            アイテム(メイン):入力、データ= [0x03] 3
                            定数変数絶対No_Wrap線形
                            Preferred_State No_Null_Position Non_Volatileビットフィールド
            アイテム(グローバル):使用状況ページ、データ= [0x01] 1
                            汎用デスクトップコントロール
            アイテム(ローカル):使用法、データ= [0x30] 48
                            方向X
            アイテム(ローカル):使用法、データ= [0x31] 49
                            方向-Y
            アイテム(ローカル):使用法、データ= [0x38] 56
                            ホイール
            アイテム(グローバル):論理最小値、データ= [0x81] 129
            アイテム(グローバル):論理最大値、データ= [0x7f] 127
            アイテム(グローバル):レポートサイズ、データ= [0x08] 8
            アイテム(グローバル):レポート数、データ= [0x03] 3
            アイテム(メイン):入力、データ= [0x06] 6
                            データ変数相対No_Wrap線形
                            Preferred_State No_Null_Position Non_Volatileビットフィールド
            アイテム(メイン):コレクションの終了、データ=なし
            アイテム(メイン):コレクションの終了、データ=なし

            ......

      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmAttributes 3
          転送タイプ割り込み
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 1
デバイスステータス:0x0000
  (バスパワー)

Mega256:

バス001デバイス014:ID 2341:0042
デバイス記述子:
  長さ18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2通信
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0.01
  iManufacturer 1 Arduino(www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNumConfigurations 1
  構成記述子:
    長さ9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfigurationValue 1
    iConfiguration 0
    bmAttributes 0xc0
      セルフパワード
    MaxPower 100mA
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2通信
      bInterfaceSubClass 2 Abstract(モデム)
      bInterfaceProtocol 1 ATコマンド(v.25ter)
      iInterface 0
      CDCヘッダー:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          休憩を送ります
          ラインコーディングとシリアル状態
      CDCユニオン:
        bMasterInterface 0
        bSlaveInterface 1
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          転送タイプ割り込み
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0008 1x 8バイト
        bInterval 255
    インターフェイス記述子:
      長さ9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDCデータ
      bInterfaceSubClass 0未使用
      bInterfaceProtocol 0
      iInterface 0
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          転送タイプバルク
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 1
      エンドポイント記述子:
        長さ7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          転送タイプバルク
          同期タイプなし
          使用タイプデータ
        wMaxPacketSize 0x0040 1x 64バイト
        bInterval 1
デバイスステータス:0x0000
  (バスパワー)


あなたは1つを抜いて、どれが消えるかを見ることができますか?
匿名のペンギン14

1
本当にそうではありませんが、再起動時に誰かがそれを行うために非常に遠くにあるリモートの太陽電池式センサーアレイに対してこれを行いたいです。
vlad b。

Ignacio Vasquez-Abrams-lsusb -vvvの情報を/ dev / ttyACM <x>にマップするにはどうすればよいですか?lsusbの出力に解析できるものがありますか?アイデアをありがとう!
vlad b。

出力を比較できる別のArduinoがありますか?
イグナシオバスケス-エイブラムス14

回答:


6

あなたのディストリビューションが使用していると仮定しますudev

udevadm info --query=all --name=/dev/ttyACM0

これを実行するにはroot権限が必要になる場合があります(sudo / su)。次のような情報のリストが出力されます。

P: /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
N: ttyACM0
S: serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00
S: serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVLINKS=/dev/serial/by-id/usb-Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012-if00 /dev/serial/by-path/pci-0000:00:1d.2-usb-0:2:1.0
E: DEVNAME=/dev/ttyACM0
E: DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/tty/ttyACM0
E: ID_BUS=usb
E: ID_MM_CANDIDATE=1
E: ID_MODEL=LUFA_USB-RS232_Adapter
E: ID_MODEL_ENC=LUFA\x20USB-RS232\x20Adapter
E: ID_MODEL_FROM_DATABASE=Uno R3 (CDC ACM)
E: ID_MODEL_ID=0043
E: ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
E: ID_REVISION=0001
E: ID_SERIAL=Dean_Camera_LUFA_USB-RS232_Adapter_74133353537351403012
E: ID_SERIAL_SHORT=74133353537351403012
E: ID_TYPE=generic
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Dean_Camera
E: ID_VENDOR_ENC=Dean\x20Camera
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_VENDOR_ID=2341
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: UDEV_LOG=3
E: USEC_INITIALIZED=751387324986

これは、atmega16u2(usbからシリアルへ)のファームウェアが変更されたUno用です。関心のある行は、おそらくID_MODEL_IDおよびID_MODEL_FROM_DATABASEです。


ありがとうございました。この場合、デフォルトではhotplug2でOpenWrtを使用していますが、udevに切り替えてテストします。
vlad b。

5

それぞれにエイリアスを追加できます。その後、どちらがどれであるかがわかります。これを設定する方法についての素晴らしいチュートリアルがあります。

これは、チュートリアルに基づいて作成したスニペットです。以下の例では、FTDI RS232RL USB-シリアルアダプターを使用していますが、これはArduinoも使用していると考えています。

  1. USB-Serialデバイスにエイリアスを割り当てるには、デバイスの情報を見つける必要があります
  2. USBを差し込みます。これは、このデバイス用のドライバーが既にインストールされており、入力時にデバイスが表示されていることを前提としています。

lsusb

  1. 次のものが必要です。ベンダーID b。製品ID c。デバイスのシリアル番号
  2. これを行うには、少し狩りが必要です。すべてのデバイスは、「/ var / log / messages」にエントリを記録します。

したがって、このファイルを読み取って正しいUSBを見つけることができます。

grep "ftdi" /var/log/messages

「usb」を使用することもできます

  1. これは、ftdiでタグ付けされたすべてのメッセージの検索です。

  2. ftdi_sioの横に、1-1.2のような番号があります。これはUSBデバイスです

grep "usb 1-1.2" /var/log/messages

または、次を使用できます。

dmesg | grep "usb 1-1.3"
  1. これにより、必要なすべての情報が得られます。

USBエイリアス

  1. 次に、シリアル番号のリストを手に入れて、これらの各デバイスの素晴らしいシンボリックリンクを作成するUDEVルールセットを作成しましょう。UDEVルールは通常、/ etc / udev / rules.dの多くのファイルに散在しています。99-usb-serial.rulesという名前の新しいファイルを作成し、次の行をそこに配置します。

この例では、エイリアスは「lcdbox」と呼ばれます

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINKはエイリアスの名前です。この場合、私のエイリアスはlcdboxです。
  2. ファイルを保存して入力

    sudo udevadm control --reload-rules

  3. タイプ

    ls –l / dev / lcdbox

lrwxrwxrwx 1ルートルート1970年1月7日/ dev / lcdbox-> ttyUSB0

  1. これは、lcdboxエイリアスがttyUSB0にマッピングされていることを示しています

4

これは非常に簡単です!ftdiチップファームウェアをカスタマイズし、udevルールを追加する必要があります。

まず、ソースftdi_eepromを介して、apt-getまたはソースから取得します。lsusbを介してデバイスを識別し、IDを取得します。

lsusb

バス001デバイス005:ID 0403:6001 Future Technology Devices International、Ltd FT232シリアル(UART)IC
....

構成を準備し、それを確認しvendor_idproduct_id一致します。Stringsセクションの文字列をカスタマイズして、デバイスの一意のIDを取得します。

vendor_id = 0x0403#ベンダーID
product_id = 0x6001#製品ID

max_power = 50#最大 消費電力:値* 2 mA。self_powered = trueの場合は0を使用します。

###########
#文字列#
########### 
manufacturer = "FTDI"#メーカー
product = "Arduino Nano"#製品
serial = "arduino1"#シリアル

###########
#オプション#
###########
self_powered = false#バスパワーでこれをオフにする
remote_wakeup = false#リモートウェイクアップ機能でこれをオンにします
use_serial = true#シリアル番号文字列を使用

#通常、これらのフラグのいずれかを変更する必要はありません
#BM_type_chip = true#新しいチップはすべてBMタイプです
in_is_isochronous = false#In Endpoint is Isochronous
out_is_isochronous = false#アウトエンドポイントはアイソクロナスです
suspend_pull_downs = false#低電力のサスペンドプルダウンを有効にする
change_usb_version = false#USBバージョンの変更
usb_version = 0x0200#change_usb_versionが有効な場合にのみ使用

########
#その他#
########

filename = "eeprom.old"#ファイル名、空のままにしてファイルの書き込みをスキップ
cbus0 = RXLED#
cbus1 = TXLED#

現在のftdi-firmwareをダンプします。

ftdi_eeprom --read-eprom

このコマンドは${pwd}/eeprom.old、ftdi上の現在のファームウェアを含むを作成します。続行する前にこのファイルをバックアップしてください。ファイル中に書き換えられるためです。バックアップ後、ftdiをフラッシュします。flash-eeprom

ftdi_eeprom --flash-eeprom myconfig.conf

次に、次のようにudevルールを作成します

SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="$attr{serial}", OWNER="bananapi", GROUP="pi", MODE="0777"

/etc/udev/rules.d/90-arduino-usb.rules、再起動のudev。

service udev restart

デバイスを取り外して再度接続し、試してください

ls -lah /dev/arduino1

上記でarduino1定義された文字列はどこですか。serial.conf

参照:ftdi_eepromのリスク?-点滅後、TXは常に高


3

スクリプトを使用してエイリアスを作成し、他の回答/dev/udev同様にグループと権限を設定します。

しかし、私は持っていなかった場合udev、私はパイプだろうlsusbgrepawkのようにlsusb|grep -e "idProduct"

とにかく、とのudevルールやとlsusbしてgrepUSBデバイスを識別するために、使用idVendoridProductおよびiSerialDevice descriptorの一部lsusbの適切idenificationを作ること。idVendorあなたのmanufaturerを伝え、idProductメーカーから製品をindentifyが、時には彼らは、複数の製品のために同じ製品IDを使用する必要があります。最後に、必要に応じて、iSerialその製品の例ごとに一意のIDを指定する必要があります。


3

Ubuntu 16.04(およびおそらく以前のバージョンやその他のディストリビューションでも)では、次のことができます。

> ls /dev/serial/by-id

(Arduino UNOが接続されている私のボックスに)表示されます:

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

ここで、デバイスID 0043(UNO)を簡単に見つけることができます。

このファイルは、実際に/dev/ttyACM0は私のボックスへのリンクです。


2

void setup()でシリアル経由でいつでも何らかのIDを印刷できます。特定のボードを接続すると、このIDがUSBインターフェイス(Linuxボックスで何らかのデーモンアプリでリッスンしている)に送信されます。idを受け取ったら、パスにマッピングできます 'Arduino1': '/ dev / ttyACM0'、 'Arduino2': '/ dev / ttyACM1'、 'Arduino3': '/dev/ttyACM2'...etc

何らかの理由でデバイスが切断された場合、物理パスが変更される可能性があるため、すべてのデバイスを再マップする必要がある場合があることに注意してください。この場合、別個の関数ex:get_id()を作成するとよいかもしれません。これはいつでも呼び出すことができます(起動時だけでなく)。


1

USBのデバイスを識別する奇妙な方法を避けるために、スケッチ自体を特別な識別コマンドに応答させるなど、他の方法を識別したいと強く思われます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.