Di Linux, bagaimana cara mengidentifikasi beberapa Arduino yang terhubung melalui USB?

17

Jika saya memiliki beberapa Arduino yang terhubung melalui USB ke komputer Linux, dan mereka muncul sebagai

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

Bagaimana saya bisa mengidentifikasi Arduino mana yang tanpa menghubungkan ke mereka melalui koneksi serial ? Apakah ada nomor seri atau id unik di Arduino?

Terima kasih atas waktu Anda.

Situasi: Uno R3, Mega, Leonardo with / ttyACM [1,2,3]

lsusb output dengan perangkat dalam urutan yang disebutkan di atas:

...
Bus 001 Perangkat 011: ID 2341: 0043
Perangkat Bus 001 013: ID 2341: 8036
...
Perangkat Bus 001 014: ID 2341: 0042

lsusb -d vendor: perangkat -vvv menunjukkan untuk masing-masing

Uno

Perangkat Bus 001 014: ID 2341: 0042
Penjelasan Perangkat:
  b Panjang 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Komunikasi
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0,01
  iManufacturer 1 Arduino (www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNum Konfigurasi 1
  Penjelasan Konfigurasi:
    b Panjang 9
    bDescriptorType 2
    Panjang Total 62
    bNumInterfaces 2
    bKonfigurasi Nilai 1
    Konfigurasi i 0
    bmAtribut 0xc0
      Mandiri
    MaxPower 100mA
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Komunikasi
      bInterfaceSubClass 2 Abstrak (modem)
      bInterfaceProtocol 1 AT-commands (v.25ter)
      iInterface 0
      Header CDC:
        bcdCDC 10.01
      CDC ACM:
        kapasitas bm 0x06
          mengirimkan istirahat
          pengkodean baris dan status serial
      Serikat CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAtribut 3
          Jenis Transfer Interupsi
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0008 1x8 byte
        bInterval 255
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Data CDC
      bInterfaceSubClass 0 Tidak digunakan
      bInterfaceProtocol 0
      iInterface 0
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAtribut 2
          Jenis Transfer Massal
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 1
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAtribut 2
          Jenis Transfer Massal
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 1
Status Perangkat: 0x0000
  (Didukung Bus)

Leonardo:

Perangkat Bus 001 013: ID 2341: 8036
Penjelasan Perangkat:
  b Panjang 18
  bDescriptorType 1
  bcdUSB 2,00
  bDeviceClass 0 (Didefinisikan pada level Antarmuka)
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 64
  idVendor 0x2341
  idProduct 0x8036
  bcdDevice 1.00
  iManufaktur 1 Arduino LLC
  iProduct 2 Arduino Leonardo
  iSerial 0
  bNum Konfigurasi 1
  Penjelasan Konfigurasi:
    b Panjang 9
    bDescriptorType 2
    Panjang Total 100
    bNumInfaces 3
    bKonfigurasi Nilai 1
    Konfigurasi i 0
    bmAtribut 0x80
      (Didukung Bus)
    MaxPower 500mA
    Asosiasi Antarmuka:
      b Panjang 8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 Komunikasi
      bFunctionSubClass 2 Abstract (modem)
      bFunctionProtocol 1 AT-commands (v.25ter)
      iFungsi 0
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Komunikasi
      bInterfaceSubClass 2 Abstrak (modem)
      bInterfaceProtocol 0 Tidak ada
      iInterface 0
      Header CDC:
        bcdCDC 1.10
      Manajemen Panggilan CDC:
        kapasitas bm 0x01
          manajemen panggilan
        bDataInterface 1
      CDC ACM:
        kapasitas bm 0x06
          mengirimkan istirahat
          pengkodean baris dan status serial
      Serikat CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAtribut 3
          Jenis Transfer Interupsi
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 0
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAtribut 2
          Jenis Transfer Massal
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 0
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 3 Perangkat Antarmuka Manusia
      bInterfaceSubClass 0 No Subclass
      bInterfaceProtocol 0 Tidak ada
      iInterface 0
        Descriptor Perangkat HID:
          b Panjang 9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0 Tidak didukung
          bNumDescriptors 1
          bDescriptorType 34 Melaporkan
          wDescriptorLength 101
          Deskriptor Laporan: (panjangnya adalah 101)
            Item (Global): Halaman Penggunaan, data = [0x01] 1
                            Kontrol Desktop Umum
            Item (Lokal): Penggunaan, data = [0x02] 2
                            Mouse
            Item (Utama): Koleksi, data = [0x01] 1
                            Aplikasi
            Item (Lokal): Penggunaan, data = [0x01] 1
                            Pointer
            Item (Utama): Koleksi, data = [0x00] 0
                            Fisik
            Item (Global): ID Laporan, data = [0x01] 1
            Item (Global): Halaman Penggunaan, data = [0x09] 9
                            Tombol
            Item (Lokal): Minimum Penggunaan, data = [0x01] 1
                            Tombol 1 (Utama)
            Item (Lokal): Usage Maximum, data = [0x03] 3
                            Tombol 3 (Tersier)
            Item (Global): Minimum Logis, data = [0x00] 0
            Item (Global): Logical Maximum, data = [0x01] 1
            Item (Global): Hitungan Laporan, data = [0x03] 3
            Item (Global): Ukuran Laporan, data = [0x01] 1
            Item (Utama): Input, data = [0x02] 2
                            Data Variable Absolute No_Wrap Linear
                            Lebih disukai_State No_Null_Posisi Bitcoin Non_Volatile
            Item (Global): Hitungan Laporan, data = [0x01] 1
            Item (Global): Ukuran Laporan, data = [0x05] 5
            Item (Utama): Input, data = [0x03] 3
                            Constant Variable Absolute No_Wrap Linear
                            Lebih disukai_State No_Null_Posisi Bitcoin Non_Volatile
            Item (Global): Halaman Penggunaan, data = [0x01] 1
                            Kontrol Desktop Umum
            Item (Lokal): Penggunaan, data = [0x30] 48
                            Arah-X
            Item (Lokal): Penggunaan, data = [0x31] 49
                            Direction-Y
            Item (Lokal): Penggunaan, data = [0x38] 56
                            Roda
            Item (Global): Minimum Logis, data = [0x81] 129
            Item (Global): Logical Maximum, data = [0x7f] 127
            Item (Global): Ukuran Laporan, data = [0x08] 8
            Item (Global): Hitungan Laporan, data = [0x03] 3
            Item (Utama): Input, data = [0x06] 6
                            Variabel Data Relatif No_Wrap Linear
                            Lebih disukai_State No_Null_Posisi Bitcoin Non_Volatile
            Item (Utama): End Collection, data = tidak ada
            Item (Utama): End Collection, data = tidak ada

            ......

      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmAtribut 3
          Jenis Transfer Interupsi
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 1
Status Perangkat: 0x0000
  (Didukung Bus)

Dan Mega256:

Perangkat Bus 001 014: ID 2341: 0042
Penjelasan Perangkat:
  b Panjang 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 Komunikasi
  bDeviceSubClass 0
  bDeviceProtocol 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcdDevice 0,01
  iManufacturer 1 Arduino (www.arduino.cc)
  iProduct 2
  iSerial 220 55330313735351910141
  bNum Konfigurasi 1
  Penjelasan Konfigurasi:
    b Panjang 9
    bDescriptorType 2
    Panjang Total 62
    bNumInterfaces 2
    bKonfigurasi Nilai 1
    Konfigurasi i 0
    bmAtribut 0xc0
      Mandiri
    MaxPower 100mA
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 Komunikasi
      bInterfaceSubClass 2 Abstrak (modem)
      bInterfaceProtocol 1 AT-commands (v.25ter)
      iInterface 0
      Header CDC:
        bcdCDC 10.01
      CDC ACM:
        kapasitas bm 0x06
          mengirimkan istirahat
          pengkodean baris dan status serial
      Serikat CDC:
        bMasterInterface 0
        bSlaveInterface 1
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAtribut 3
          Jenis Transfer Interupsi
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0008 1x8 byte
        bInterval 255
    Deskriptor antarmuka:
      b Panjang 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 Data CDC
      bInterfaceSubClass 0 Tidak digunakan
      bInterfaceProtocol 0
      iInterface 0
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAtribut 2
          Jenis Transfer Massal
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 1
      Penjelasan Endpoint:
        b Panjang 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAtribut 2
          Jenis Transfer Massal
          Jenis Sinkronisasi Tidak Ada
          Data Jenis Penggunaan
        wMaxPacketSize 0x0040 1x64 byte
        bInterval 1
Status Perangkat: 0x0000
  (Didukung Bus)
vlad b.
sumber
lsusb -vvvkata?
Ignacio Vazquez-Abrams
Bisakah Anda mencabut satu dan melihat mana yang hilang?
Penguin Anonim
1
Tidak juga, saya ingin melakukan ini untuk sensor jarak jauh bertenaga surya yang akan sangat jauh bagi seseorang untuk melakukan itu ketika reboot.
vlad b.
Ignacio Vasquez-Abrams - bagaimana saya bisa memetakan informasi dari lsusb -vvv ke / dev / ttyACM <x>? APAKAH ada sesuatu dalam output lsusb yang bisa saya uraikan? Terima kasih atas idenya!
vlad b.
Apakah Anda memiliki Arduino lain yang dapat Anda bandingkan keluarannya?
Ignacio Vazquez-Abrams

Jawaban:

6

Dengan asumsi distro Anda menggunakan udev:

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

Anda mungkin memerlukan hak akses root untuk menjalankan ini (sudo / su). Ini akan menampilkan daftar informasi seperti ini:

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

Ini untuk Uno dengan firmware yang dimodifikasi pada atmega16u2 (usb ke serial). Baris yang menarik mungkin adalah ID_MODEL_ID dan ID_MODEL_FROM_DATABASE.

user2973
sumber
Terima kasih. Saya menggunakan OpenWrt dalam hal ini dengan hotplug2 secara default, tetapi saya akan mencoba untuk beralih ke udev dan menguji ini.
vlad b.
5

Anda dapat menambahkan alias untuk masing-masing. Maka Anda tahu yang mana. Berikut ini adalah tutorial yang bagus tentang cara mengaturnya.

Berikut ini cuplikan yang saya tulis berdasarkan tutorial. Dalam contoh di bawah ini, saya menggunakan USB FTDI RS232RL Serial adapter, yang saya percaya adalah apa yang digunakan Arduino juga.

  1. Untuk menetapkan alias ke perangkat USB-Serial, kita perlu menemukan beberapa info di perangkat
  2. Tancapkan usb. Ini mengasumsikan Anda sudah menginstal driver untuk penggunaan ini menjadi perangkat dan perangkat ini terlihat saat mengetik:

lsusb

  1. Kita akan membutuhkan yang berikut ini a. ID vendor b. ID produk c. Nomor seri perangkat
  2. Untuk melakukan ini, dibutuhkan sedikit perburuan. Semua perangkat Anda mencatat entri di '/ var / log / messages'.

Karena itu kita dapat membaca file ini dan menemukan USB yang benar:

grep "ftdi" /var/log/messages

Anda juga dapat menggunakan "usb"

  1. Ini menemukan semua pesan yang ditandai dengan ftdi:

  2. Di sebelah ftdi_sio, ada angka seperti 1-1.2. Ini adalah perangkat USB

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

Atau Anda dapat menggunakan:

dmesg | grep "usb 1-1.3"
  1. Ini memberi kami semua info yang kami butuhkan:

USB Alias

  1. Sekarang dengan daftar nomor seri di tangan mari kita membuat aturan UDEV yang akan membuat tautan simbolik yang bagus untuk masing-masing perangkat ini. Aturan UDEV biasanya tersebar ke banyak file di /etc/udev/rules.d. Buat file baru bernama 99-usb-serial.rules dan letakkan baris berikut di sana:

Dalam contoh ini alias saya disebut 'lcdbox'

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK adalah nama alias Anda. Dalam hal ini alias saya adalah lcdbox.
  2. Simpan file dan ketik

    sudo udevadm control --reload-rules

  3. Tipe

    ls –l / dev / lcdbox

lrwxrwxrwx 1 root root 7 Jan 1 1970 / dev / lcdbox -> ttyUSB0

  1. Ini menunjukkan bahwa alias lcdbox saya dipetakan ke ttyUSB0
PhillyNJ
sumber
4

Ini cukup mudah! Anda harus menyesuaikan firmware chip ftdi dan menambahkan aturan udev:

Pertama, dapatkan ftdi_eeprommelalui apt-getatau dari sumber. Identifikasi perangkat Anda melalui lsusb dan dapatkan id:

lsusb

Perangkat Bus 001 005: ID 0403: 6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
....

Siapkan konfigurasi dan pastikan, itu vendor_iddan product_idcocok. Kustomisasi string di Stringsbagian ini untuk mendapatkan id unik untuk perangkat Anda.

vendor_id = 0x0403 # ID Vendor
product_id = 0x6001 # ID Produk

max_power = 50 # Maks. konsumsi daya: nilai * 2 mA. Gunakan 0 jika self_powered = true.

############
# Strings #
############ 
manufacturer = "FTDI" # Produsen
product = "Arduino Nano" # Product
serial = "arduino1" # Serial

############
# Pilihan #
############
self_powered = false # Matikan ini karena bus bertenaga
remote_wakeup = false # Aktifkan ini untuk fitur bangun jarak jauh
use_serial = true # Gunakan string nomor seri

# Biasanya keluar tidak perlu mengubah salah satu dari bendera ini
# BM_type_chip = true # Chip yang lebih baru adalah semua tipe BM
in_is_isochronous = false # Di Endpoint is Isochronous
out_is_isochronous = false # Out Endpoint is Isochronous
suspend_pull_downs = false # Aktifkan pull down untuk daya yang lebih rendah
change_usb_version = false # Ubah Versi USB
usb_version = 0x0200 # Hanya digunakan ketika change_usb_version diaktifkan

#########
# Lain-lain #
#########

filename = "eeprom.old" # Nama file, biarkan kosong untuk melewati penulisan file
cbus0 = RXLED #
cbus1 = TXLED #

Buang firmware-ftdi saat ini:

ftdi_eeprom --read-eprom

Perintah ini dibuat ${pwd}/eeprom.old, yang berisi firmware saat ini di ftdi. Cadangkan file ini sebelum melanjutkan , karena selama flash-eepromfile ditulis ulang. Setelah pencadangan, jalankan flash ftdi:

ftdi_eeprom --flash-eeprom myconfig.conf

Sekarang, buat aturan udev, seperti itu

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

masuk /etc/udev/rules.d/90-arduino-usb.rulesdan mulai ulang udev.

service udev restart

Cabut dan pasang kembali perangkat Anda dan coba

ls -lah /dev/arduino1

Dimana arduino1 string didefinisikan serialdi bawah di atas .conf.

Lihat juga: Risiko ftdi_eeprom? - TX selalu tinggi setelah flashing

ansi_lumen
sumber
3

Saya akan menggunakan skrip untuk membuat alias di bawah /dev/ dan juga mengatur grup dan hak-hak di atasnya dengan udevseperti jawaban lainnya.

Tetapi jika saya tidak memiliki udevsaya akan pipa lsusbkegrep atau awk, suka lsusb|grep -e "idProduct".

Pokoknya, dengan udevaturan atau dengan lsusbdan grepuntuk mengidentifikasi perangkat USB, penggunaan idVendor, idProductdan iSerialdi Device descriptorbagian lsusbuntuk membuat idenification yang tepat. The idVendormemberitahu Anda manufaturer, idProductharus mengidentifikasi produk dari produsen tapi kadang-kadang mereka menggunakan id produk yang sama untuk lebih dari satu produk. Terakhir, jika diperlukan, iSerialharus menjadi id unik untuk setiap contoh produk itu.

Anders
sumber
3

Di Ubuntu 16.04 (dan mungkin versi sebelumnya atau distrib lain juga), Anda dapat melakukan:

> ls /dev/serial/by-id

yang menampilkan (pada kotak saya di mana Arduino UNO terhubung):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

Anda dapat dengan mudah menemukan Device ID 0043 (UNO) di sini.

File ini sebenarnya adalah tautan ke /dev/ttyACM0dalam kotak saya.

jfpoilpret
sumber
2

Anda selalu dapat membuat beberapa jenis id print melalui serial dalam pengaturan kosong (). Setelah papan tertentu terhubung, ia akan mengirimkan id ini ke antarmuka USB Anda (yang Anda dengarkan dengan semacam aplikasi daemon di kotak linux Anda). Setelah Anda menerima id, Anda dapat memetakannya ke jalurnya 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

Ketahuilah bahwa saat perangkat terputus karena suatu alasan dapat mengubah jalur fisiknya sehingga Anda mungkin harus memetakan ulang semuanya. Untuk kasus ini mungkin baik untuk menulis fungsi terpisah ex: get_id () yang dapat Anda panggil kapan saja (tidak hanya saat startup).

otak siber
sumber
1

Saya akan sangat tergoda untuk mengidentifikasi beberapa cara lain, seperti membuat sketsa itu sendiri menanggapi perintah identifikasi khusus, hanya untuk menghindari cara aneh USB mengidentifikasi perangkat.

EternityForest
sumber
0

Gambaran

  • Salah satu cara seperti ansi_lumen disebutkan dalam jawabannya adalah flash chip EtdPRE ftdi untuk memiliki nomor seri unik yang kemudian dapat diidentifikasi oleh aturan UDEV.

    Tetapi ternyata itu tidak akan bekerja pada Arduino Cina murah yang bukan FTDI memiliki chip CH340G yang tidak memiliki EEPROM untuk menyimpan ID unik ( CH340B harus bekerja ).

  • Jawaban ini menyarankan untuk menulis aturan UDEV dengan skrip khusus yang meminta Arduino untuk mengirim ID unik melalui serial. Masalahnya adalah Anda perlu memodifikasi sketsa Arduino dan secara umum itu cukup rumit.

Mengidentifikasi dengan port

Jadi cara termudah yang saya temukan adalah dengan menggunakan aturan UDEV dan mengidentifikasi Arduino melalui port usb (devpath) sehingga menghubungkan Arduino ke port yang sama (bahkan di hub usb bersarang) akan membuat nama tetap .

Penyiapan TLDR:

Versi modifikasi ini

  1. Temukan Arduino idVendor dan idProduct:

lsusb

Anda akan mendapatkan sesuatu seperti ini:

...
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 124: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 123: ID 214b:7000  
Bus 003 Device 122: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 121: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 120: ID 1a40:0101 Terminus Technology Inc. Hub
...

Dengan menghubungkan / memutuskan Arduino temukan yang mana (saya punya 3 yang terhubung). Kami sedang mencari ID-nya. Dalam kasus saya "... ID 1a86: 7523 QinHeng ...". Jadi idVendor = 1a86, idProduct = 7523

  1. Buat file aturan UDEV baru:

sudo nano /etc/udev/rules.d/99-usb-serial.rules

  1. Ubah nilai idVendor dan idProduct dengan apa yang Anda temukan pada langkah sebelumnya pada salin tempelkan ke file aturan yang telah kami buat:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"

  1. Muat ulang aturan UDEV

sudo udevadm control --reload

  1. Ganti Arduino dan sekarang akan memiliki nama yang unik. Untuk mengujinya ketik:

ls /dev/ttyUSB*


Yang akan menghasilkan:

/dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB-arduino2.1 /dev/ttyUSB-arduino2.4 /dev/ttyUSB2 /dev/ttyUSB4 /dev/ttyUSB-arduino2.2 /dev/ttyUSB-arduino3

Seperti yang Anda lihat, kita masih mendapatkan / dev / ttyUSBx seperti sebelumnya yang selalu berubah tergantung mana yang terhubung terlebih dahulu. Tetapi sekarang kita juga memiliki / dev / ttyUSB-arduino {port} yang selalu sama untuk port yang sama dan hanya untuk Arduinos. Untuk menganalisis apa artinya "..arduino2.4": 2 merujuk pada port kedua laptop dan 4 ke port keempat pada hub usb.

Untuk lebih baik melihatnya ketik:

lsusb -t

Keluaran:

...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 2: Dev 84, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 85, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 2: Dev 86, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
        |__ Port 3: Dev 87, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 88, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
    |__ Port 3: Dev 89, If 0, Class=Vendor Specific Class, Driver=ch341, 12M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
...

Dengan menghubungkan / memutuskan sambungan, Anda dapat melihat perangkat mana di port mana

Gintaras Grėbliūnas
sumber