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)
lsusb -vvv
kata?Jawaban:
Dengan asumsi distro Anda menggunakan
udev
:Anda mungkin memerlukan hak akses root untuk menjalankan ini (sudo / su). Ini akan menampilkan daftar informasi seperti ini:
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.
sumber
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.
lsusb
Karena itu kita dapat membaca file ini dan menemukan USB yang benar:
Anda juga dapat menggunakan "usb"
Ini menemukan semua pesan yang ditandai dengan ftdi:
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:
Dalam contoh ini alias saya disebut 'lcdbox'
Simpan file dan ketik
sudo udevadm control --reload-rules
Tipe
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7 Jan 1 1970 / dev / lcdbox -> ttyUSB0
sumber
Ini cukup mudah! Anda harus menyesuaikan firmware chip ftdi dan menambahkan aturan udev:
Pertama, dapatkan
ftdi_eeprom
melaluiapt-get
atau dari sumber. Identifikasi perangkat Anda melalui lsusb dan dapatkan id:Siapkan konfigurasi dan pastikan, itu
vendor_id
danproduct_id
cocok. Kustomisasi string diStrings
bagian ini untuk mendapatkan id unik untuk perangkat Anda.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 selamaflash-eeprom
file ditulis ulang. Setelah pencadangan, jalankan flash ftdi:Sekarang, buat aturan udev, seperti itu
masuk
/etc/udev/rules.d/90-arduino-usb.rules
dan mulai ulang udev.Cabut dan pasang kembali perangkat Anda dan coba
Dimana
arduino1
string didefinisikanserial
di bawah di atas.conf
.Lihat juga: Risiko ftdi_eeprom? - TX selalu tinggi setelah flashing
sumber
Saya akan menggunakan skrip untuk membuat alias di bawah
/dev/
dan juga mengatur grup dan hak-hak di atasnya denganudev
seperti jawaban lainnya.Tetapi jika saya tidak memiliki
udev
saya akan pipalsusb
kegrep
atauawk
, sukalsusb|grep -e "idProduct"
.Pokoknya, dengan
udev
aturan atau denganlsusb
dangrep
untuk mengidentifikasi perangkat USB, penggunaanidVendor
,idProduct
daniSerial
diDevice descriptor
bagianlsusb
untuk membuat idenification yang tepat. TheidVendor
memberitahu Anda manufaturer,idProduct
harus mengidentifikasi produk dari produsen tapi kadang-kadang mereka menggunakan id produk yang sama untuk lebih dari satu produk. Terakhir, jika diperlukan,iSerial
harus menjadi id unik untuk setiap contoh produk itu.sumber
Di Ubuntu 16.04 (dan mungkin versi sebelumnya atau distrib lain juga), Anda dapat melakukan:
yang menampilkan (pada kotak saya di mana Arduino UNO terhubung):
Anda dapat dengan mudah menemukan Device ID 0043 (UNO) di sini.
File ini sebenarnya adalah tautan ke
/dev/ttyACM0
dalam kotak saya.sumber
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).
sumber
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.
sumber
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 ).
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
lsusb
Anda akan mendapatkan sesuatu seperti ini:
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
sudo nano /etc/udev/rules.d/99-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyUSB-arduino%s{/devpath}"
sudo udevadm control --reload
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:
Keluaran:
Dengan menghubungkan / memutuskan sambungan, Anda dapat melihat perangkat mana di port mana
sumber