Linux'ta, USB üzerinden bağlı birden fazla Arduino nasıl tanımlanır?


17

Bir Linux bilgisayara USB üzerinden bağlı birden fazla Arduino'm varsa ve

  • / TTY / ACM0
  • / TTY / ACM1
  • / TTY / ACM2

Seri bağlantı yoluyla bunlara bağlanmadan hangi Arduino'nun hangisi olduğunu nasıl belirleyebilirim ? Arduino'da bir seri numarası veya benzersiz bir kimlik var mı?

Zaman ayırdığınız için teşekkür ederim.

Durum: / ttyACM ile Uno R3, Mega, Leonardo [1,2,3]

lsusb çıkışı yukarıda belirtilen sırayla cihazlarla:

...
Otobüs 001 Cihaz 011: ID 2341: 0043
Otobüs 001 Cihaz 013: ID 2341: 8036
...
Otobüs 001 Cihaz 014: ID 2341: 0042

lsusb -d satıcı: cihaz -vvv her biri için gösterir

Uno

Otobüs 001 Cihaz 014: ID 2341: 0042
Cihaz Tanımlayıcı:
  Uzunluk 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 İletişim
  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
  Yapılandırma Tanımlayıcısı:
    Uzunluk 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bYapılandırmaDeğer 1
    i Yapılandırma 0
    bm Öznitelikler 0xc0
      Kendinden Beslemeli
    MaxPower 100mA
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 İletişim
      bInterfaceSubClass 2 Özet (modem)
      bInterfaceProtocol 1 AT komutları (v.25ter)
      i Arayüz 0
      CDC Başlığı:
        bcdCDC 10.01
      CDC ACM:
        Kapasiteler 0x06
          mola gönderir
          satır kodlama ve seri durum
      CDC Birliği:
        bMasterInterface 0
        bSlaveInterface 1
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 GİRİŞ
        bmÖzellikler 3
          Transfer Türü Kesmesi
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0008 1x 8 bayt
        Aralık 255
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Verileri
      bInterfaceSubClass 0 Kullanılmadı
      b Arayüz Protokolü 0
      i Arayüz 0
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 ÇIKIŞ
        bmÖzellikler 2
          Transfer Türü Toplu
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 1
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmÖzellikler 2
          Transfer Türü Toplu
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 1
Aygıt Durumu: 0x0000
  (Otobüs Destekli)

leonardo:

Otobüs 001 Cihaz 013: ID 2341: 8036
Cihaz Tanımlayıcı:
  Uzunluk 18
  bDescriptorType 1
  bcdUSB 2.00
  bDeviceClass 0 (Arayüz düzeyinde tanımlanmıştır)
  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
  Yapılandırma Tanımlayıcısı:
    Uzunluk 9
    bDescriptorType 2
    wTotalLength 100
    bNumInterfaces 3
    bYapılandırmaDeğer 1
    i Yapılandırma 0
    bm Öznitelikler 0x80
      (Otobüs Destekli)
    MaxPower 500mA
    Arayüz İlişkisi:
      bLength 8
      bAçıklayıcıTürü 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 İletişim
      bFunctionSubClass 2 Özet (modem)
      bFunctionProtocol 1 AT komutları (v.25ter)
      iFonksiyon 0
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 İletişim
      bInterfaceSubClass 2 Özet (modem)
      bInterfaceProtocol 0 Yok
      i Arayüz 0
      CDC Başlığı:
        bcdCDC 1.10
      CDC Çağrı Yönetimi:
        Kapasiteler 0x01
          çağrı yönetimi
        bDataInterface 1
      CDC ACM:
        Kapasiteler 0x06
          mola gönderir
          satır kodlama ve seri durum
      CDC Birliği:
        bMasterInterface 0
        bSlaveInterface 1
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmÖzellikler 3
          Transfer Türü Kesmesi
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 0
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmÖzellikler 2
          Transfer Türü Toplu
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 0
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 3 İnsan Arabirim Aygıtı
      bInterfaceSubClass 0 Alt Sınıf Yok
      bInterfaceProtocol 0 Yok
      i Arayüz 0
        HID Cihaz Tanımlayıcısı:
          bLength 9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0 Desteklenmiyor
          bNumDescriptors 1
          bDescriptorType 34 Raporu
          wDescriptorLength 101
          Rapor Tanımlayıcı: (uzunluk 101)
            Öğe (Global): Kullanım Sayfası, veri = [0x01] 1
                            Genel Masaüstü Denetimleri
            Öğe (Yerel): Kullanım, veri = [0x02] 2
                            Fare
            Öğe (Ana): Toplama, veri = [0x01] 1
                            Uygulama
            Öğe (Yerel): Kullanım, veri = [0x01] 1
                            Işaretçi
            Öğe (Ana): Toplama, veri = [0x00] 0
                            Fiziksel
            Öğe (Global): Rapor Kimliği, veri = [0x01] 1
            Öğe (Global): Kullanım Sayfası, veri = [0x09] 9
                            Düğmeler
            Öğe (Yerel): Minimum Kullanım, veri = [0x01] 1
                            Düğme 1 (Birincil)
            Öğe (Yerel): Maksimum Kullanım, veri = [0x03] 3
                            Düğme 3 (Üçüncül)
            Öğe (Global): Mantıksal Minimum, veri = [0x00] 0
            Öğe (Global): Mantıksal Maksimum, veri = [0x01] 1
            Öğe (Global): Rapor Sayısı, veri = [0x03] 3
            Öğe (Global): Rapor Boyutu, veri = [0x01] 1
            Öğe (Ana): Giriş, veri = [0x02] 2
                            Veri Değişkeni Mutlak No_Wrap Doğrusal
                            Tercih Edilen_Stat No_Null_Position Non_Volatile Bitfield
            Öğe (Global): Rapor Sayısı, veri = [0x01] 1
            Öğe (Global): Rapor Boyutu, veri = [0x05] 5
            Öğe (Ana): Giriş, veri = [0x03] 3
                            Sabit Değişken Mutlak No_Wrap Doğrusal
                            Tercih Edilen_Stat No_Null_Position Non_Volatile Bitfield
            Öğe (Global): Kullanım Sayfası, veri = [0x01] 1
                            Genel Masaüstü Denetimleri
            Öğe (Yerel): Kullanım, veri = [0x30] 48
                            Yön-X
            Öğe (Yerel): Kullanım, veri = [0x31] 49
                            Yön-Y
            Öğe (Yerel): Kullanım, veri = [0x38] 56
                            tekerlek
            Öğe (Global): Mantıksal Minimum, veri = [0x81] 129
            Öğe (Global): Mantıksal Maksimum, veri = [0x7f] 127
            Öğe (Global): Rapor Boyutu, veri = [0x08] 8
            Öğe (Global): Rapor Sayısı, veri = [0x03] 3
            Öğe (Ana): Giriş, veri = [0x06] 6
                            Veri Değişkeni Göreli No_Wrap Doğrusal
                            Tercih Edilen_Stat No_Null_Position Non_Volatile Bitfield
            Öğe (Ana): Koleksiyonu Topla, veri = yok
            Öğe (Ana): Koleksiyonu Topla, veri = yok

            ......

      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmÖzellikler 3
          Transfer Türü Kesmesi
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 1
Aygıt Durumu: 0x0000
  (Otobüs Destekli)

Ve Mega256:

Otobüs 001 Cihaz 014: ID 2341: 0042
Cihaz Tanımlayıcı:
  Uzunluk 18
  bDescriptorType 1
  bcdUSB 1.10
  bDeviceClass 2 İletişim
  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
  Yapılandırma Tanımlayıcısı:
    Uzunluk 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bYapılandırmaDeğer 1
    i Yapılandırma 0
    bm Öznitelikler 0xc0
      Kendinden Beslemeli
    MaxPower 100mA
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternateSetting 0
      bNumEndpoints 1
      bInterfaceClass 2 İletişim
      bInterfaceSubClass 2 Özet (modem)
      bInterfaceProtocol 1 AT komutları (v.25ter)
      i Arayüz 0
      CDC Başlığı:
        bcdCDC 10.01
      CDC ACM:
        Kapasiteler 0x06
          mola gönderir
          satır kodlama ve seri durum
      CDC Birliği:
        bMasterInterface 0
        bSlaveInterface 1
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 GİRİŞ
        bmÖzellikler 3
          Transfer Türü Kesmesi
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0008 1x 8 bayt
        Aralık 255
    Arayüz Tanımlayıcısı:
      Uzunluk 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternateSetting 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Verileri
      bInterfaceSubClass 0 Kullanılmadı
      b Arayüz Protokolü 0
      i Arayüz 0
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 ÇIKIŞ
        bmÖzellikler 2
          Transfer Türü Toplu
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 1
      Bitiş Noktası Tanımlayıcısı:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmÖzellikler 2
          Transfer Türü Toplu
          Senkronizasyon Türü Yok
          Kullanım Türü Verileri
        wMaxPacketSize 0x0040 1x 64 bayt
        Aralık 1
Aygıt Durumu: 0x0000
  (Otobüs Destekli)

lsusb -vvvdiyor?
Ignacio Vazquez-Abrams

Birini çıkarıp hangisinin kaybolduğunu görebiliyor musunuz?
Anonim Penguen

1
Gerçekten değil, ben yeniden başlatıldığında bunu yapmak için çok uzakta olacak bir uzaktan güneş enerjili sensör dizisi için bunu yapmak istiyorum.
vlad b.

Ignacio Vasquez-Abrams - lsusb -vvv ile / dev / ttyACM <x> arasındaki bilgiyi nasıl eşleyebilirim? Lsusb çıkışında ayrıştırabileceğim bir şey var mı? Fikir için teşekkürler!
vlad b.

Çıktı ile karşılaştırabileceğiniz başka bir Arduino var mı?
Ignacio Vazquez-Abrams

Yanıtlar:


6

Dağıtımınızın kullandığını varsayarsak udev:

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

Bunu çalıştırmak için root ayrıcalıklarına ihtiyacınız olabilir (sudo / su). Bunun gibi bilgilerin bir listesini çıkarır:

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

Bu, atmega16u2'de (usb'den seriye) değiştirilmiş ürün yazılımı olan bir Uno içindir. İlgilenilen satırlar muhtemelen ID_MODEL_ID ve ID_MODEL_FROM_DATABASE şeklindedir.


Teşekkür ederim. Bu durumda varsayılan olarak hotplug2 ile OpenWrt kullanıyorum ama udev'e geçmeye ve bunu test etmeye çalışacağım.
vlad b.

5

Her biri için bir takma ad ekleyebilirsiniz. Sonra hangisinin hangisi olduğunu biliyorsun. İşte bunu nasıl ayarlayacağınızla ilgili güzel bir eğitim .

İşte öğreticiye dayanarak yazdığım bir pasaj. Aşağıdaki örnekte, Arduino'nun da ne kullandığına inandığım bir FTDI RS232RL USB - Seri adaptör kullanıyorum.

  1. Bir USB Seri cihaza takma ad atamak için cihazda bazı bilgiler bulmamız gerekiyor
  2. USB'yi takın. Bu, bu kullanım için sürücüleri zaten cihaz olarak yüklediğinizi ve cihazın yazarken görünür olduğunu varsayar:

lsusb

  1. Aşağıdakilere ihtiyacımız olacak a. Satıcı kimliği b. Ürün kimliği c. Cihazın seri numarası
  2. Bunu yapmak için biraz avcılık gerekir. Tüm cihazlarınız '/ var / log / messages' içindeki girişleri kaydeder.

Bu nedenle bu dosyayı okuyabilir ve doğru USB'yi bulabiliriz:

grep "ftdi" /var/log/messages

Ayrıca "usb" kullanabilirsiniz

  1. Ftdi ile etiketlenen tüm mesajları bul:

  2. Ftdi_sio'nun yanında 1-1.2 gibi bir sayı var. Bu USB cihazı

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

Veya şunları kullanabilirsiniz:

dmesg | grep "usb 1-1.3"
  1. Bu bize ihtiyacımız olan tüm bilgileri verir:

USB Takma Adı

  1. Şimdi elinizdeki seri numaraları listesi ile bu cihazların her biri için hoş bir sembolik bağlantı yapacak bir UDEV kural kümesi oluşturalım. UDEV kuralları genellikle /etc/udev/rules.d içindeki birçok dosyaya dağıtılır. 99-usb-serial.rules adlı yeni bir dosya oluşturun ve aşağıdaki satırları buraya yerleştirin:

Bu örnekte diğer adıma 'lcdbox' deniyor

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A601ERJJ", SYMLINK+="lcdbox"
  1. SYMLINK, takma adınızın adıdır. Bu durumda benim takma adım lcdbox.
  2. Dosyayı kaydedin ve yazın

    sudo udevadm control --reload-rules

  3. tip

    ls –l / dev / lcdbox

lrwxrwxrwx 1 kök kök 7 Ocak 1 1970 / dev / lcdbox -> ttyUSB0

  1. Bu benim lcdbox takma adım ttyUSB0 ile eşlendiğini gösterir

4

Bu oldukça kolay! Ftdi yongaları ürün yazılımını özelleştirmeniz ve bir udev kuralı eklemeniz gerekir:

İlk olarak, almak ftdi_eepromyoluyla apt-getveya kaynaklardan. Cihazınızı lsusb ile tanımlayın ve kimliği alın:

lsusb

Otobüs 001 Cihaz 005: ID 0403: 6001 Gelecek Teknoloji Cihazları International, Ltd FT232 Seri (UART) IC
....

Bir yapılandırma hazırlayın ve emin olun ki vendor_idve product_idmaç. StringsCihazınız için benzersiz bir kimlik almak üzere bölümdeki dizeleri özelleştirin .

vendor_id = 0x0403 # Tedarikçi Kimliği
product_id = 0x6001 # Ürün kimliği

max_power = 50 # Maks. güç tüketimi: değer * 2 mA. Self_powered = true ise 0 kullanın.

###########
# Teller #
########### 
üretici = "FTDI" # Üretici
ürün = "Arduino Nano" # Ürün
serial = "arduino1" # Seri

###########
# Seçenekler #
###########
self_powered = false # Otobüsle çalışanlar için bunu kapatın
remote_wakeup = false # Uzaktan uyandırma özelliği için bunu açın
use_serial = true # Seri numarası dizesini kullan

# Normalde bu bayraklardan birini değiştirmek zorunda değilsiniz
# BM_type_chip = true # Daha yeni yongaların tümü BM türüdür
in_is_isochronous = false # Bitiş Noktasında Eşzamanlı
out_is_isochronous = false # Çıkış Bitiş Noktası Eş Zamanlı
suspend_pull_downs = false # Daha düşük güç için çekilmeleri askıya almayı etkinleştir
change_usb_version = false # USB Sürümünü Değiştir
usb_version = 0x0200 # Yalnızca change_usb_version etkinleştirildiğinde kullanılır

########
# Çeşitli #
########

filename = "eeprom.old" # Dosya adı, dosya yazmayı atlamak için boş bırakın
cbus0 = RXLED #
cbus1 = TXLED #

Geçerli ftdi-firmware'i boşaltın:

ftdi_eeprom --read-eprom

Bu komut ${pwd}/eeprom.old, ftdi'deki geçerli ürün yazılımını içeren oluşturur . Yedekleme bu dosya devam etmeden önce esnasında, çünkü flash-eepromdosyasını yeniden alır. Yedeklemeden sonra, ftdi'yi yanıp söner:

ftdi_eeprom --flash-eeprom myconfig.conf

Şimdi, bir udev kuralı oluşturun,

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

girin /etc/udev/rules.d/90-arduino-usb.rulesve udev'i yeniden başlatın.

service udev restart

Cihazınızı çıkarıp yeniden takın ve deneyin

ls -lah /dev/arduino1

Yukarıda belirtilen arduino1dize nerede .serial.conf

Ayrıca bakınız: ftdi_eeprom riskleri? - TX yanıp söndükten sonra daima yüksek


3

Ben altında bir takma ad yapmak /dev/ve aynı zamanda udevdiğer cevaplar gibi üzerinde grup ve hakları ayarlamak için bir komut dosyası kullanırdım .

Ama udevben olmasaydım lsusb, grepya da awk, gibi boruları olurdum lsusb|grep -e "idProduct".

Neyse, olan udevkurallara ya lsusbve grepUSB cihazlarını, kullanımını tanımlamak için idVendor, idProductve iSerialde Device descriptorbir parçası lsusbdüzgün idenification yapmak. idVendorSize manufaturer söyler, idProductüreticiden ürünü indentify ancak bazen birden fazla ürün için aynı ürün kimliği kullanmalıdır. Son olarak, gerekirse iSerial, bu ürünün her örneği için benzersiz bir kimlik olmalıdır.


3

Ubuntu 16.04'te (ve belki önceki sürümlerde veya diğer rahatsızlıklarda) şunları yapabilirsiniz:

> ls /dev/serial/by-id

hangi görüntüler (bir Arduino UNO bağlı nerede benim kutusunda):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

Aygıt Kimliği 0043'ü (UNO) burada kolayca bulabilirsiniz.

Bu dosya aslında kutumdaki bir bağlantı /dev/ttyACM0.


2

Void kurulumunda () seri olarak her zaman bir çeşit kimlik baskısı yapabilirsiniz. Belirli kart bağlandıktan sonra bu kimliği USB arayüzünüze gönderir (linux kutunuzda bir çeşit daemon uygulamasıyla dinliyorsunuz). Bir kez kimlik aldıktan sonra onu 'Arduino1' yoluna eşleyebilirsiniz: '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

Cihazın herhangi bir nedenle bağlantısı kesildiğinde, fiziksel yolunu değiştirebileceğini ve böylece tümünü yeniden eşlemeniz gerekebileceğini unutmayın. Bu durumda, ex: get_id () işlevini istediğiniz zaman çağırabileceğiniz ayrı bir işlev yazmak iyi olabilir (yalnızca başlangıçta değil).


1

USB'nin aygıtları tanımlamanın garip yollarından kaçınmak için, çizimin kendisinin özel bir tanımlama komutuna yanıt vermesi gibi başka bir yolu tanımlamak için cazip olurdu.


0

genel bakış

  • Ansi_lumen gibi bir şekilde onun cevabı sonra udev kuralları ile tespit edilebilir benzersiz seri numarası var Ftdi çip EEPROM yanıp etmektir.

    Ama FTDI yerine benzersiz ID depolamak için EEPROM olmayan CH340G yongası olan ucuz Çin Arduinos üzerinde çalışmayacak ( CH340B çalışmalıdır ).

  • Bu yanıt, Arduino'dan benzersiz kimliğini seri yoluyla göndermesini isteyen özel komut dosyasıyla UDEV kuralını yazmanızı önerir . Bununla ilgili sorun, Arduino çizimini değiştirmeniz gerektiğidir ve genel olarak oldukça karmaşıktır.

Bağlantı noktasına göre tanımlama

Bu yüzden bulduğum en kolay yol , UDEV kurallarını kullanmak ve Arduino'ları usb portu (devpath) ile tanımlamaktı, böylece Arduino'yu aynı bağlantı noktasına (iç içe usb hub'larında bile) bağlamak kalıcı bir isim yaratacak .

TLDR kurulumu:

Modifiye sürümü bu

  1. Arduino idVendor ve id Ürününü bulun:

lsusb

Bunun gibi bir şey alacaksınız:

...
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
...

Arduino'yu bağlayarak / çıkararak hangisi olduğunu bulun (3 tane bağlandım). Kimliğini arıyoruz. Benim durumumda "... ID 1a86: 7523 QinHeng ...". Yani idVendor = 1a86, idProduct = 7523

  1. Yeni UDEV kural dosyası oluştur:

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

  1. İdVendor ve idProduct değerlerini, kopyalamayla ilgili önceki adımda bulduğunuz şekilde değiştirin, oluşturduğumuz kural dosyasına yapıştırın:

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

  1. UDEV kurallarını yeniden yükle

sudo udevadm control --reload

  1. Arduinos'u yeniden takın ve şimdi benzersiz bir isme sahip olacak. Test etmek için şunu yazın:

ls /dev/ttyUSB*


Hangi çıktı:

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

Gördüğünüz gibi hala / dev / ttyUSBx'i alıyoruz. Ama şimdi aynı liman için ve sadece Arduinos için her zaman aynı olan / dev / ttyUSB-arduino {port} var. "..Arduino2.4" nin ne anlama geldiğini analiz etmek için: 2 dizüstü bilgisayarın ikinci bağlantı noktasını, 4 ise usb hub üzerindeki dördüncü bağlantı noktasını ifade eder.

Daha iyi görmek için şunu yazın:

lsusb -t

Çıktı:

...
/:  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
...

Bağlayarak / bağlantısını keserek hangi bağlantı noktalarında hangi aygıtların bulunduğunu görebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.