Linux에서 USB를 통해 연결된 여러 Arduino를 식별하는 방법은 무엇입니까?


17

USB를 통해 Linux 컴퓨터에 여러 Arduino가 연결되어 있는데

  • / 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
  b 설명자 유형 1
  bcdUSB 1.10
  bDeviceClass 2 통신
  bDeviceSubClass 0
  bDevice 프로토콜 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcd 장치 0.01
  iManufacturer 1 Arduino (www.arduino.cc)
  i 제품 2
  iSerial 220 55330313735351910141
  bNum 구성 1
  구성 설명자 :
    길이 9
    b 설명자 유형 2
    총 길이 62
    bNum 인터페이스 2
    b 구성 값 1
    구성 0
    bmAttributes 0xc0
      자가 전원
    최대 전력 100mA
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 0
      b 대체 설정 0
      bNumEndpoints 1
      bInterfaceClass 2 커뮤니케이션
      bInterfaceSubClass 2 초록 (모뎀)
      b 인터페이스 프로토콜 1 AT 명령 (v.25ter)
      i 인터페이스 0
      CDC 헤더 :
        bcdCDC 10.01
      CDC ACM :
        bmCapabilities 0x06
          휴식을 보낸다
          라인 코딩 및 시리얼 상태
      CDC 연합 :
        b 마스터 인터페이스 0
        bSlaveInterface 1
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x82 EP 2 IN
        bm 속성 3
          전송 유형 인터럽트
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0008 1x 8 바이트
        b 간격 255
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 1
      b 대체 설정 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC 데이터
      bInterfaceSubClass 0 미사용
      b 인터페이스 프로토콜 0
      i 인터페이스 0
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x04 EP 4 OUT
        bm 속성 2
          전송 유형 벌크
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 1
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpoint 주소 0x83 EP 3 IN
        bm 속성 2
          전송 유형 벌크
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 1
장치 상태 : 0x0000
  (버스 파워)

레오나르도 :

버스 001 장치 013 : ID 2341 : 8036
장치 설명자 :
  길이 18
  b 설명자 유형 1
  bcdUSB 2.00
  bDeviceClass 0 (인터페이스 레벨에서 정의)
  bDeviceSubClass 0
  bDevice 프로토콜 0
  bMaxPacketSize0 64
  idVendor 0x2341
  idProduct 0x8036
  bcd 장치 1.00
  iManufacturer 1 Arduino LLC
  iProduct 2 아두 이노 레오나르도
  iSerial 0
  bNum 구성 1
  구성 설명자 :
    길이 9
    b 설명자 유형 2
    wTotalLength 100
    bNum 인터페이스 3
    b 구성 값 1
    구성 0
    bmAttributes 0x80
      (버스 파워)
    MaxPower 500mA
    인터페이스 협회 :
      길이 8
      b 설명자 유형 11
      b 첫번째 인터페이스 0
      b 인터페이스 수 2
      b 기능 클래스 2 통신
      bFunctionSubClass 2 초록 (모뎀)
      b 기능 프로토콜 1 AT 명령 (v.25ter)
      기능 0
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 0
      b 대체 설정 0
      bNumEndpoints 1
      bInterfaceClass 2 커뮤니케이션
      bInterfaceSubClass 2 초록 (모뎀)
      bInterfaceProtocol 0 없음
      i 인터페이스 0
      CDC 헤더 :
        bcdCDC 1.10
      CDC 통화 관리 :
        bmCapabilities 0x01
          통화 관리
        bDataInterface 1
      CDC ACM :
        bmCapabilities 0x06
          휴식을 보낸다
          라인 코딩 및 시리얼 상태
      CDC 연합 :
        b 마스터 인터페이스 0
        bSlaveInterface 1
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x81 EP 1 IN
        bm 속성 3
          전송 유형 인터럽트
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 0
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpoint 주소 0x83 EP 3 IN
        bm 속성 2
          전송 유형 벌크
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 0
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 2
      b 대체 설정 0
      bNumEndpoints 1
      bInterfaceClass 3 휴먼 인터페이스 장치
      bInterfaceSubClass 0 서브 클래스 없음
      bInterfaceProtocol 0 없음
      i 인터페이스 0
        HID 장치 설명자 :
          길이 9
          b 설명자 유형 33
          bcdHID 1.01
          bCountryCode 0 지원되지 않습니다
          bNumDescriptors 1
          b 설명자 유형 34 보고서
          wDescriptorLength 101
          보고서 설명자 : (길이는 101입니다)
            항목 (글로벌) : 사용 페이지, 데이터 = [0x01] 1
                            일반 데스크탑 컨트롤
            항목 (로컬) : 사용량, 데이터 = [0x02] 2
                            쥐
            항목 (메인) : 수집, 데이터 = [0x01] 1
                            신청
            항목 (로컬) : 사용법, 데이터 = [0x01] 1
                            바늘
            항목 (메인) : 수집, 데이터 = [0x00] 0
                            물리적 인
            항목 (글로벌) : 보고서 ID, 데이터 = [0x01] 1
            항목 (글로벌) : 사용 페이지, 데이터 = [0x09] 9
                            버튼
            항목 (로컬) : 사용 최소값, 데이터 = [0x01] 1
                            버튼 1 (1 차)
            항목 (로컬) : 최대 사용량, data = [0x03] 3
                            버튼 3 (3 차)
            항목 (글로벌) : 논리 최소값, 데이터 = [0x00] 0
            항목 (글로벌) : 논리 최대 값, 데이터 = [0x01] 1
            항목 (글로벌) : 보고서 수, 데이터 = [0x03] 3
            항목 (글로벌) : 보고서 크기, 데이터 = [0x01] 1
            항목 (메인) : 입력, 데이터 = [0x02] 2
                            데이터 변수 절대 No_Wrap 선형
                            Preferred_State No_Null_Position 비 _ 휘발성 비트 필드
            항목 (글로벌) : 보고서 수, 데이터 = [0x01] 1
            항목 (글로벌) : 보고서 크기, 데이터 = [0x05] 5
            항목 (메인) : 입력, 데이터 = [0x03] 3
                            상수 변수 절대 No_Wrap 선형
                            Preferred_State No_Null_Position 비 _ 휘발성 비트 필드
            항목 (글로벌) : 사용 페이지, 데이터 = [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 비 _ 휘발성 비트 필드
            항목 (메인) : 엔드 콜렉션, 데이터 = 없음
            항목 (메인) : 엔드 콜렉션, 데이터 = 없음

            ......

      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x84 EP 4 IN
        bm 속성 3
          전송 유형 인터럽트
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 1
장치 상태 : 0x0000
  (버스 파워)

그리고 Mega256 :

버스 001 장치 014 : ID 2341 : 0042
장치 설명자 :
  길이 18
  b 설명자 유형 1
  bcdUSB 1.10
  bDeviceClass 2 통신
  bDeviceSubClass 0
  bDevice 프로토콜 0
  bMaxPacketSize0 8
  idVendor 0x2341
  idProduct 0x0042
  bcd 장치 0.01
  iManufacturer 1 Arduino (www.arduino.cc)
  i 제품 2
  iSerial 220 55330313735351910141
  bNum 구성 1
  구성 설명자 :
    길이 9
    b 설명자 유형 2
    총 길이 62
    bNum 인터페이스 2
    b 구성 값 1
    구성 0
    bmAttributes 0xc0
      자가 전원
    최대 전력 100mA
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 0
      b 대체 설정 0
      bNumEndpoints 1
      bInterfaceClass 2 커뮤니케이션
      bInterfaceSubClass 2 초록 (모뎀)
      b 인터페이스 프로토콜 1 AT 명령 (v.25ter)
      i 인터페이스 0
      CDC 헤더 :
        bcdCDC 10.01
      CDC ACM :
        bmCapabilities 0x06
          휴식을 보낸다
          라인 코딩 및 시리얼 상태
      CDC 연합 :
        b 마스터 인터페이스 0
        bSlaveInterface 1
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x82 EP 2 IN
        bm 속성 3
          전송 유형 인터럽트
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0008 1x 8 바이트
        b 간격 255
    인터페이스 설명자 :
      길이 9
      b 설명자 유형 4
      b 인터페이스 번호 1
      b 대체 설정 0
      bNumEndpoints 2
      bInterfaceClass 10 CDC 데이터
      bInterfaceSubClass 0 미사용
      b 인터페이스 프로토콜 0
      i 인터페이스 0
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpointAddress 0x04 EP 4 OUT
        bm 속성 2
          전송 유형 벌크
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 1
      엔드 포인트 설명자 :
        길이 7
        b 설명자 유형 5
        bEndpoint 주소 0x83 EP 3 IN
        bm 속성 2
          전송 유형 벌크
          동기화 유형 없음
          사용 유형 데이터
        wMaxPacketSize 0x0040 1x 64 바이트
        b 간격 1
장치 상태 : 0x0000
  (버스 파워)

lsusb -vvv말한다?
Ignacio Vazquez-Abrams

하나를 뽑고 어느 것이 사라지는 지 볼 수 있습니까?
익명 펭귄

1
실제로, 나는 재부팅 할 때 누군가가 그렇게 할 수있는 원격 태양 에너지 센서 어레이에 대해 이것을하고 싶습니다.
블라드 b.

Ignacio Vasquez-Abrams-lsusb -vvv의 정보를 / dev / ttyACM <x>에 어떻게 매핑 할 수 있습니까? lsusb 출력에 구문 분석 할 수있는 것이 있습니까? 아이디어 주셔서 감사합니다!
블라드 b.

출력을 비교할 수있는 다른 Arduino가 있습니까?
Ignacio Vazquez-Abrams

답변:


6

배포판이 다음을 사용한다고 가정합니다 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

atmega16u2 (usb to serial)의 펌웨어가 수정 된 Uno 용입니다. 관심있는 라인은 아마도 ID_MODEL_ID 및 ID_MODEL_FROM_DATABASE 일 것입니다.


감사합니다. 이 경우 기본적으로 hotplug2와 함께 OpenWrt를 사용하고 있지만 udev로 전환하여 테스트하려고합니다.
블라드 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 제어 --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_id하고 product_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 # 엔드 포인트에서 등시성
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- 펌웨어를 덤프하십시오.

ftdi_eeprom --read-eprom

이 명령은 ${pwd}/eeprom.oldftdi의 현재 펌웨어를 포함하는를 만듭니다. 파일이 재 작성 되므로 계속하기 전에이 파일을 백업 하십시오 . 백업 후 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나 파이프를 것 lsusb으로 grep또는 awk같은, lsusb|grep -e "idProduct".

어쨌든, 함께 udev규칙 또는 lsusbgrepUSB 장치 사용을 확인하는 idVendor, idProduct그리고 iSerial에서 Device 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 ()에서 serial을 통해 어떤 종류의 id 인쇄를 만들 수 있습니다. 특정 보드가 연결되면이 ID를 USB 인터페이스 (Linux 상자에서 일종의 데몬 응용 프로그램으로 듣고 있음)로 보냅니다. 일단 ID를 받으면 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/ dev / ttyACM2'경로에 매핑 할 수 있습니다.

어떤 이유로 든 장치 연결이 끊어지면 물리적 경로를 변경하여 모든 장치를 다시 매핑해야 할 수도 있습니다. 이 경우 언제든지 시작할 수있는 별도의 함수 ex : get_id ()를 작성하는 것이 좋습니다.


1

USB가 장치를 식별하는 이상한 방법을 피하기 위해 스케치 자체가 특별한 식별 명령에 응답하는 것과 같은 다른 방법을 식별하려고 할 것입니다.


0

개요

  • 그의 답변 에서 언급 된 ansi_lumen의 한 가지 방법은 ftdi 칩 EEPROM을 고유 한 일련 번호를 갖도록 플래시하여 UDEV 규칙으로 식별 할 수 있습니다.

    그러나 FTDI 대신 고유 ID를 저장할 EEPROM이없는 CH340G 칩이있는 저렴한 중국 Arduino에서는 작동 하지 않습니다 ( CH340B 작동해야 함 ).

  • 답변은 Arduino가 시리얼을 통해 고유 ID를 보내도록 요청하는 특수 스크립트로 UDEV 규칙을 작성하도록 제안 합니다. 문제는 Arduino 스케치를 수정해야하며 일반적으로 매우 복잡하다는 것입니다.

포트로 식별

그래서 내가 찾은 가장 쉬운 방법 은 UDEV 규칙을 사용하고 usb 포트 (devpath)로 Arduino를 식별하는 것이므로 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. Arduino를 다시 연결하면 고유 한 이름을 갖습니다. 테스트하려면 다음을 입력하십시오.

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}를 가지고 있습니다.이 포트는 항상 같은 포트와 Arduino에만 동일합니다. "..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.