ใน Linux จะระบุ Arduinos หลายตัวที่เชื่อมต่อผ่าน USB ได้อย่างไร?


17

ถ้าฉันมี Arduinos หลายตัวที่เชื่อมต่อผ่าน USB กับคอมพิวเตอร์ Linux และมันจะปรากฏเป็น

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

ฉันจะระบุ Arduino ที่ใช้โดยไม่ต้องเชื่อมต่อผ่านการเชื่อมต่อแบบอนุกรมได้อย่างไร มีหมายเลขซีเรียลหรือรหัสเฉพาะบน Arduino หรือไม่?

ขอขอบคุณสำหรับเวลาของคุณ.

สถานการณ์: 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 ผู้ขาย: อุปกรณ์ -vvv แสดงสำหรับแต่ละรายการ

Uno

อุปกรณ์ 001 บัส 014: ID 2341: 0042
ตัวอธิบายอุปกรณ์:
  bLength 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
  ตัวอธิบายการกำหนดค่า:
    bLength 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfiguration ค่า 1
    การกำหนดค่า iConfiguration 0
    bmAttributes 0xc0
      ขับเคลื่อนด้วยตนเอง
    MaxPower 100mA
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternate การตั้งค่า 0
      bNumEndpoints 1
      bInterfaceClass 2 การสื่อสาร
      bInterfaceSubClass 2 บทคัดย่อ (โมเด็ม)
      bInterfaceProtocol 1 คำสั่ง AT (v.25ter)
      iInterface 0
      ส่วนหัวของ CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          ส่งหยุดพัก
          การเข้ารหัสบรรทัดและสถานะอนุกรม
      สหภาพ CDC:
        bMasterInterface 0
        bSlaveInterface 1
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          ประเภทการโอนขัดจังหวะ
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0008 1x 8 ไบต์
        bInterval 255
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternate การตั้งค่า 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Data
      bInterfaceSubClass 0 ไม่ได้ใช้
      bInterfaceProtocol 0
      iInterface 0
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          โอนประเภทจำนวนมาก
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 1
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          โอนประเภทจำนวนมาก
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 1
สถานะอุปกรณ์: 0x0000
  (รถบัสขับเคลื่อน)

เลโอนาร์โด:

อุปกรณ์ 001 บัส 013: ID 2341: 8036
ตัวอธิบายอุปกรณ์:
  bLength 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
  ตัวอธิบายการกำหนดค่า:
    bLength 9
    bDescriptorType 2
    w รวมความยาว 100
    bNumInterfaces 3
    bConfiguration ค่า 1
    การกำหนดค่า iConfiguration 0
    bmAttributes 0x80
      (รถบัสขับเคลื่อน)
    MaxPower 500mA
    สมาคมอินเทอร์เฟซ:
      bLength 8
      bDescriptorType 11
      bFirstInterface 0
      bInterfaceCount 2
      bFunctionClass 2 การสื่อสาร
      bFunctionSubClass 2 บทคัดย่อ (โมเด็ม)
      bFunctionProtocol 1 คำสั่ง AT (v.25ter)
      iFunction 0
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternate การตั้งค่า 0
      bNumEndpoints 1
      bInterfaceClass 2 การสื่อสาร
      bInterfaceSubClass 2 บทคัดย่อ (โมเด็ม)
      bInterfaceProtocol 0 ไม่มี
      iInterface 0
      ส่วนหัวของ CDC:
        bcdCDC 1.10
      การจัดการการโทร CDC:
        bmCapabilities 0x01
          การจัดการการโทร
        bDataInterface 1
      CDC ACM:
        bmCapabilities 0x06
          ส่งหยุดพัก
          การเข้ารหัสบรรทัดและสถานะอนุกรม
      สหภาพ CDC:
        bMasterInterface 0
        bSlaveInterface 1
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x81 EP 1 IN
        bmAttributes 3
          ประเภทการโอนขัดจังหวะ
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 0
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          โอนประเภทจำนวนมาก
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 0
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 2
      bAlternate การตั้งค่า 0
      bNumEndpoints 1
      bInterfaceClass 3 อุปกรณ์เชื่อมต่อมนุษย์
      bInterfaceSubClass 0 ไม่มีคลาสย่อย
      bInterfaceProtocol 0 ไม่มี
      iInterface 0
        ตัวอธิบายอุปกรณ์ HID:
          bLength 9
          bDescriptorType 33
          bcdHID 1.01
          bCountryCode 0 ไม่รองรับ
          bNumDescriptors 1
          bDescriptorType 34 รายงาน
          wDescriptorLength 101
          รายงานอธิบาย: (ความยาวคือ 101)
            รายการ (ทั่วโลก): หน้าการใช้งาน data = [0x01] 1
                            การควบคุมเดสก์ทอปทั่วไป
            รายการ (ท้องถิ่น): การใช้งาน data = [0x02] 2
                            เม้าส์
            รายการ (หลัก): การรวบรวมข้อมูล = [0x01] 1
                            ใบสมัคร
            รายการ (ภายในเครื่อง): การใช้งาน data = [0x01] 1
                            ชี้
            รายการ (หลัก): การรวบรวมข้อมูล = [0x00] 0
                            กายภาพ
            รายการ (ทั่วโลก): ID รายงานข้อมูล = [0x01] 1
            รายการ (ทั่วโลก): หน้าการใช้งาน data = [0x09] 9
                            ปุ่ม
            รายการ (ท้องถิ่น): การใช้งานขั้นต่ำ data = [0x01] 1
                            ปุ่ม 1 (หลัก)
            รายการ (ภายในเครื่อง): สูงสุดการใช้งาน data = [0x03] 3
                            ปุ่ม 3 (ระดับอุดมศึกษา)
            รายการ (ทั่วโลก): ตรรกะขั้นต่ำ data = [0x00] 0
            รายการ (ทั่วโลก): โลจิคัลสูงสุด, data = [0x01] 1
            รายการ (ทั่วโลก): จำนวนรายงาน, ข้อมูล = [0x03] 3
            รายการ (ทั่วโลก): ขนาดรายงานข้อมูล = [0x01] 1
            รายการ (หลัก): อินพุต, data = [0x02] 2
                            Data Variable Absolute No_Wrap เป็น Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            รายการ (ทั่วโลก): จำนวนรายงาน, ข้อมูล = [0x01] 1
            รายการ (ทั่วโลก): ขนาดรายงานข้อมูล = [0x05] 5
            รายการ (หลัก): อินพุต, data = [0x03] 3
                            ตัวแปรคงที่สัมบูรณ์ No_Wrap เป็น Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            รายการ (ทั่วโลก): หน้าการใช้งาน data = [0x01] 1
                            การควบคุมเดสก์ทอปทั่วไป
            รายการ (ท้องถิ่น): การใช้งาน data = [0x30] 48
                            ทิศทาง-X
            รายการ (ท้องถิ่น): การใช้งาน data = [0x31] 49
                            ทิศทาง-Y
            รายการ (ท้องถิ่น): การใช้งาน data = [0x38] 56
                            ล้อ
            รายการ (ทั่วโลก): ตรรกะขั้นต่ำ data = [0x81] 129
            รายการ (ทั่วโลก): โลจิคัลสูงสุด, data = [0x7f] 127
            รายการ (ทั่วโลก): ขนาดรายงานข้อมูล = [0x08] 8
            รายการ (ทั่วโลก): จำนวนรายงาน, ข้อมูล = [0x03] 3
            รายการ (หลัก): อินพุต, data = [0x06] 6
                            Data Variable Relative No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            รายการ (หลัก): การรวบรวมสุดท้าย data = none
            รายการ (หลัก): การรวบรวมสุดท้าย data = none

            ......

      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x84 EP 4 IN
        bmAttributes 3
          ประเภทการโอนขัดจังหวะ
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 1
สถานะอุปกรณ์: 0x0000
  (รถบัสขับเคลื่อน)

และ Mega256:

อุปกรณ์ 001 บัส 014: ID 2341: 0042
ตัวอธิบายอุปกรณ์:
  bLength 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
  ตัวอธิบายการกำหนดค่า:
    bLength 9
    bDescriptorType 2
    wTotalLength 62
    bNumInterfaces 2
    bConfiguration ค่า 1
    การกำหนดค่า iConfiguration 0
    bmAttributes 0xc0
      ขับเคลื่อนด้วยตนเอง
    MaxPower 100mA
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 0
      bAlternate การตั้งค่า 0
      bNumEndpoints 1
      bInterfaceClass 2 การสื่อสาร
      bInterfaceSubClass 2 บทคัดย่อ (โมเด็ม)
      bInterfaceProtocol 1 คำสั่ง AT (v.25ter)
      iInterface 0
      ส่วนหัวของ CDC:
        bcdCDC 10.01
      CDC ACM:
        bmCapabilities 0x06
          ส่งหยุดพัก
          การเข้ารหัสบรรทัดและสถานะอนุกรม
      สหภาพ CDC:
        bMasterInterface 0
        bSlaveInterface 1
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x82 EP 2 IN
        bmAttributes 3
          ประเภทการโอนขัดจังหวะ
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0008 1x 8 ไบต์
        bInterval 255
    อินเตอร์เฟส Descriptor:
      bLength 9
      bDescriptorType 4
      bInterfaceNumber 1
      bAlternate การตั้งค่า 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC Data
      bInterfaceSubClass 0 ไม่ได้ใช้
      bInterfaceProtocol 0
      iInterface 0
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x04 EP 4 OUT
        bmAttributes 2
          โอนประเภทจำนวนมาก
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 1
      ตัวบอกปลายทาง:
        bLength 7
        bDescriptorType 5
        bEndpointAddress 0x83 EP 3 IN
        bmAttributes 2
          โอนประเภทจำนวนมาก
          ซิงค์ชนิดไม่มี
          ข้อมูลประเภทการใช้งาน
        wMaxPacketSize 0x0040 1x64 ไบต์
        bInterval 1
สถานะอุปกรณ์: 0x0000
  (รถบัสขับเคลื่อน)

lsusb -vvvกล่าวว่า?
Ignacio Vazquez-Abrams

คุณสามารถถอดปลั๊กอันใดอันหนึ่งแล้วดูว่าอันไหนหายไปหรือไม่
Penguin Penguin ไม่ระบุชื่อ

1
ไม่จริงฉันต้องการทำเช่นนี้สำหรับชุดเซ็นเซอร์พลังงานแสงอาทิตย์ระยะไกลซึ่งจะอยู่ไกลมากสำหรับบางคนที่ทำเช่นนั้นเมื่อรีบูตเครื่อง
vlad b.

อิกนาชิโอ Vasquez-Abrams - ฉันจะทำแผนที่ข้อมูลจาก lsusb -vvv ไปยัง / dev / ttyACM <x> ได้อย่างไร? มีบางสิ่งในเอาต์พุต lsusb ที่ฉันสามารถวิเคราะห์ได้หรือไม่ ขอบคุณสำหรับความคิด!
vlad b.

คุณมี Arduino อื่นที่คุณสามารถเปรียบเทียบเอาต์พุตด้วยหรือไม่
Ignacio Vazquez-Abrams

คำตอบ:


6

สมมติว่า distro ของคุณกำลังใช้งานudev:

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

คุณอาจต้องใช้สิทธิ์พิเศษในการเรียกใช้ (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

นี่สำหรับ Uno ที่มีเฟิร์มแวร์ที่แก้ไขแล้วใน atmega16u2 (usb เป็น serial) บรรทัดที่น่าสนใจน่าจะเป็น ID_MODEL_ID และ ID_MODEL_FROM_DATABASE


ขอขอบคุณ. ฉันใช้ OpenWrt ในกรณีนี้กับ hotplug2 เป็นค่าเริ่มต้น แต่ฉันจะพยายามเปลี่ยนไปใช้ udev และทดสอบสิ่งนี้
vlad b.

5

คุณสามารถเพิ่มชื่อแทนสำหรับแต่ละรายการได้ แล้วคุณจะรู้ว่าอันไหน นี่คือการสอนที่ดีเกี่ยวกับวิธีการตั้งค่านี้

นี่คือตัวอย่างข้อมูลที่ฉันเขียนตามบทช่วยสอน ในตัวอย่างด้านล่างฉันใช้ FTDI RS232RL USB เป็นอะแดปเตอร์แบบอนุกรมซึ่งฉันเชื่อว่าเป็นสิ่งที่ Arduino ใช้เช่นกัน

  1. ในการกำหนดนามแฝงให้กับอุปกรณ์ USB-Serial เราจำเป็นต้องค้นหาข้อมูลบางอย่างบนอุปกรณ์
  2. เสียบ USB สิ่งนี้ถือว่าคุณได้ติดตั้งไดรเวอร์สำหรับการใช้งานนี้เป็นอุปกรณ์แล้วและอุปกรณ์จะมองเห็นได้เมื่อพิมพ์:

lsusb

  1. เราจะต้องการสิ่งต่อไปนี้ 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 - โหลดกฎ

  3. ชนิด

    ls –l / dev / lcdbox

lrwxrwxrwx 1 รูทราก 7 Jan 1 1970 / dev / lcdbox -> ttyUSB0

  1. นี่แสดงว่านามแฝง lcdbox ของฉันถูกแมปกับ ttyUSB0

4

มันค่อนข้างง่าย! คุณต้องปรับแต่งเฟิร์มแวร์ชิป ftdi และเพิ่มกฎ udev:

ก่อนอื่นรับftdi_eepromผ่านapt-getหรือจากแหล่งที่มา ระบุอุปกรณ์ของคุณผ่าน lsusb และรับ id:

lsusb

Bus 001 อุปกรณ์ 005: ID 0403: 6001 Future Technology Devices International, Ltd FT232 อนุกรม (UART) IC
....

เตรียมการกำหนดค่าและตรวจสอบให้แน่ใจว่าvendor_idและproduct_idตรงกับ กำหนดค่าสตริงในStringsส่วนเพื่อรับรหัสเฉพาะสำหรับอุปกรณ์ของคุณ

vendor_id = 0x0403 # รหัสผู้ขาย
product_id = 0x6001 # รหัสผลิตภัณฑ์

max_power = 50 # สูงสุด การใช้พลังงาน: ค่า * 2 mA ใช้ 0 ถ้า self_powered = true

###########
# สตริง #
########### 
ผู้ผลิต = "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 เป็นแบบ Isochronous
out_is_isochronous = false # End End is issochronous
suspend_pull_downs = false # เปิดใช้งาน pull down เพื่อลดพลังงาน
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 สำรองไฟล์นี้ก่อนดำเนินการต่อเพราะในระหว่างflash-eepromไฟล์จะถูกเขียนใหม่ หลังจากการสำรองข้อมูลแฟลช ftdi:

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ผมจะท่อlsusbเข้าgrepหรือเช่นawklsusb|grep -e "idProduct"

อย่างไรก็ตามมีudevกฎหรือlsusbและgrepจะระบุอุปกรณ์ USB ใช้งานidVendor, idProductและiSerialในDevice descriptorส่วนหนึ่งของการlsusbที่จะทำให้ idenification เหมาะสม ผู้ผลิตidVendorบอกคุณว่าidProductควรระบุผลิตภัณฑ์จากผู้ผลิต แต่บางครั้งพวกเขาใช้รหัสผลิตภัณฑ์เดียวกันมากกว่าหนึ่งผลิตภัณฑ์ สุดท้ายหากจำเป็นiSerialควรเป็น id ที่ไม่ซ้ำกันสำหรับแต่ละตัวอย่างของผลิตภัณฑ์นั้น


3

บน Ubuntu 16.04 (และอาจเป็นรุ่นก่อนหน้าหรือ distribs อื่น ๆ ด้วย) คุณสามารถทำได้:

> ls /dev/serial/by-id

ซึ่งจะแสดง (ในกล่องของฉันซึ่งเชื่อมต่อกับ Arduino UNO):

usb-Arduino__www.arduino.cc__0043_A4139363931351318241-if00

คุณสามารถมองเห็น Device ID 0043 (UNO) ได้อย่างง่ายดายที่นี่

ไฟล์นี้เป็นลิงค์ไปยัง/dev/ttyACM0ในกล่องของฉัน


2

คุณสามารถพิมพ์ id บางประเภทผ่านอนุกรมในการตั้งค่าโมฆะ () หลังจากเชื่อมต่อบอร์ดบางอันแล้วมันจะส่ง id นี้ไปยังอินเตอร์เฟส USB ของคุณ (ซึ่งคุณกำลังฟังด้วยแอพ daemon บางชนิดในกล่อง linux ของคุณ) เมื่อคุณได้รับรหัสคุณสามารถแมปไปยังเส้นทาง 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc

โปรดทราบว่าเมื่ออุปกรณ์ถูกตัดการเชื่อมต่อด้วยเหตุผลบางอย่างมันสามารถเปลี่ยนเป็นเส้นทางกายภาพดังนั้นคุณอาจต้องทำการแมปใหม่ทั้งหมด สำหรับกรณีนี้อาจเป็นการดีที่จะเขียนฟังก์ชั่นแยกต่างหากเช่น: get_id () ซึ่งคุณสามารถโทรหาได้ตลอดเวลา (ไม่เพียง แต่เมื่อเริ่มต้น)


1

ฉันถูกล่อลวงอย่างมากที่จะระบุวิธีอื่นเช่นให้ร่างภาพตอบสนองต่อคำสั่งระบุพิเศษเพื่อหลีกเลี่ยงวิธีการระบุอุปกรณ์แปลก ๆ ของ USB


0

ภาพรวม

  • วิธีหนึ่งใน ansi_lumen ที่กล่าวถึงในคำตอบของเขาคือการแฟลชชิป ftdi EEPROM ให้มีหมายเลขเฉพาะที่ไม่ซ้ำกันซึ่งสามารถระบุได้โดยกฎ UDEV

    แต่กลับกลายเป็นว่ามันจะไม่ทำงานกับ Arduinos จีนราคาถูกซึ่งแทนที่จะเป็น FTDI มีชิป CH340G ซึ่งไม่มี EEPROMในการจัดเก็บ ID เฉพาะ ( CH340B ควรใช้งานได้ )

  • คำตอบนี้แนะนำให้เขียนกฎ UDEV ด้วยสคริปต์พิเศษซึ่งขอให้ Arduino ส่ง ID เฉพาะผ่านทางอนุกรม ปัญหาที่เกิดขึ้นคือคุณต้องแก้ไข Arduino Sketch โดยทั่วไปแล้วมันค่อนข้างซับซ้อน

การระบุโดยพอร์ต

ดังนั้นวิธีที่ง่ายที่สุดที่ฉันพบคือการใช้กฎ udev และระบุ Arduinos โดยพอร์ต USB (DEVPATH) เพื่อให้การเชื่อมต่อ Arduino กับพอร์ตเดียวกัน (แม้ในฮับ USB ที่ซ้อนกัน) จะสร้างชื่อถาวร

การตั้งค่า TLDR:

รุ่นที่แก้ไขของสิ่งนี้

  1. ค้นหา Arduino idVendor และ idProduct:

lsusb

คุณจะได้รับสิ่งนี้:

...
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 จะค้นหาว่าอันใดอันหนึ่ง (ฉันเชื่อมต่อ 3 ตัว) เรากำลังมองหา ID ในกรณีของฉัน "... ID 1a86: 7523 QinHeng ... " ดังนั้น idVendor = 1a86, idProduct = 7523

  1. สร้างไฟล์กฎ UDEV ใหม่:

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

  1. แก้ไขค่า idVendor และ idProduct ตามสิ่งที่คุณพบในขั้นตอนก่อนหน้านี้ในการคัดลอกวางไว้ในไฟล์กฎที่เราสร้างขึ้น:

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

  1. โหลดกฎ UDEV ซ้ำ

sudo udevadm control --reload

  1. Replug Arduinos และตอนนี้มันจะมีชื่อที่ไม่ซ้ำกัน หากต้องการทดสอบให้พิมพ์:

ls /dev/ttyUSB*


ซึ่งจะส่งออก:

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

อย่างที่คุณเห็นว่าเรายังคงได้รับ / dev / ttyUSBx เหมือนเมื่อก่อนซึ่งมีการเปลี่ยนแปลงอยู่เสมอขึ้นอยู่กับว่ามีการเชื่อมต่อใดก่อน แต่ตอนนี้เรายังมี / dev / ttyUSB-arduino {port} ซึ่งมักจะเหมือนกันสำหรับพอร์ตเดียวกันและสำหรับ Arduinos เท่านั้น เพื่อวิเคราะห์ว่า "..arduino2.4" หมายถึงอะไร: 2 หมายถึงพอร์ตที่สองของแล็ปท็อปและ 4 ถึงพอร์ตที่สี่บนฮับ usb

หากต้องการดูให้ดีขึ้นพิมพ์:

lsusb -t

เอาท์พุท:

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

ด้วยการเชื่อมต่อ / ตัดการเชื่อมต่อคุณจะเห็นว่าอุปกรณ์ใดอยู่บนพอร์ตใด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.