Arduino가있어 때로는 바인딩되어 /dev/ttyUSB0
다른 시간에 바인딩되어 /dev/ttyUSB1
스크립트가 실패합니다.
내 장치가있을 수있는 모든 가능성을 열거하고 싶지는 않지만 정적 위치에 바인딩해야합니다 (예 :) /dev/arduino
.
어떻게하면 되나요?
Arduino가있어 때로는 바인딩되어 /dev/ttyUSB0
다른 시간에 바인딩되어 /dev/ttyUSB1
스크립트가 실패합니다.
내 장치가있을 수있는 모든 가능성을 열거하고 싶지는 않지만 정적 위치에 바인딩해야합니다 (예 :) /dev/arduino
.
어떻게하면 되나요?
답변:
제안한대로 일부 udev 규칙을 추가 할 수 있습니다. /etc/udev/rules.d/10-local.rules
포함하도록 편집했습니다 :
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
다음을 실행하여 장치의 변수를 확인할 수 있습니다
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
http://www.reactivated.net/writing_udev_rules.html에서 읽을 수있는 더 자세한 가이드가 있습니다
udevam
? my_uart
아래에 심볼릭 링크 가 생성 된다는 점에 유의해야 합니다 /dev/my_uart
. 나는 처음으로 썼는데 충분 /dev/arduino
하지만 실패했습니다 arduino
.
udevadm
완료되면 스스로 종료해야합니다.
위의 규칙 구문은 일부 배포판에서는 작동하지만 광산에서는 작동하지 않습니다 (라즈 비아 어). 모든 인과 아웃을 설명하는 단일 문서를 찾지 못했기 때문에 여기 에서 찾을 수있는 자신 만의 글을 썼습니다 . 이것이 비등하는 것입니다.
1. ttyUSB에 무엇이 있는지 확인하십시오 :
dmesg | grep ttyUSB
2. 장치의 모든 속성을 나열하십시오.
udevadm info --name=/dev/ttyUSBx --attribute-walk
(물론 x 대신 장치 번호로). 고유 식별자 세트 (예 : idVendor + idProduct)를 선택하십시오. idVendor 및 idProduct가 동일한 장치가 둘 이상인 경우 SerialNumber가 필요할 수도 있습니다. 일련 번호는 각 장치마다 고유해야합니다.
3. 다음 /etc/udev/rules.d/99-usb-serial.rules
과 같은 줄을 가진 파일 을 만듭니다 :
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
(일련 번호가 필요하지 않으며 물론 2 단계에서 찾은 idVendor 및 idProduct의 번호가 필요하다고 가정합니다.
4. 새 규칙을로드합니다.
sudo udevadm trigger
5. 무슨 일이 있었는지 확인하십시오 :
ls -l /dev/your_device_name
심볼릭 링크가 ttyUSB 번호를 보여줍니다. 이 경우 /dev/ttyUSB1
누가 소유하고 누가 어떤 그룹에 속하는지 확인하십시오.
ls -l /dev/ttyUSB1
그런 다음 그것의 재미를 위해 :
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
idVendor
와 idProduct
정확히 같은 경우 해결책이 있습니까? (동일한 모델의 USB에 UART 모듈에 연결된 2 개의 센서)
udevadm info --name=/dev/ttyUSB1 --attribute-walk
두 장치를 모두 수행 하고 일련 번호를 찾으면 각 장치마다 고유해야합니다. 센서에 일련 번호가 없으면 센서를 지정할 수 있습니까?
네 대의 카메라가있는 Rasperry Pi가 있습니다. 나는 fswebcam
카메라를 /dev/video0
.. 로 식별하는 pix를 사용 video3
합니다. 때때로 카메라는 video0
, vide02
, video4
그리고 video6
하지만 우리는 지금 그것에 대해 잊지 수 있습니다.
예를 들어 video0
사진을 캡션하기 때문에 항상 동일한 카메라가 되도록 카메라 번호를 식별하려면 영구 ID가 필요합니다 . 불행하게도 부팅시에 카메라가 video0
..으로 열거 video3
되지만 항상 같은 방식으로 나타나지는 않습니다.
카메라는 모두 동일한 ID와 일련 번호를 갖습니다.
이 문제에 대한 해결책은 udev 규칙과 관련이 있지만 많은 낚시 고리가 있습니다.
명령을 발행하면
udevadm info –attribute-walk –path=/dev/video0
당신은 많은 양의 출력을 얻지 만 두드러진 비트는
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
커널 비트는 USB 허브 포트입니다. 4 대의 카메라에는 4 개의 카메라가 있습니다. 재부팅시 변경되지 않지만 video{x}
포트와 관련된 포트 는 변경 될 수 있습니다.
따라서 비디오 번호를 USB 허브 포트에 연결하려면 udev 규칙이 필요합니다.
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
단순 해 보인다 – 카메라에 액세스
fswebcam –d $realpath /dev/camera0
작동하지 않는 경우를 제외하고 – 이것을 udev 규칙에 넣고 시스템이 다른 포트에 video0 (부팅시)을 할당 한 경우 udev 규칙은 무시됩니다. 에 대한 심볼릭 링크는 /dev/camera0
기본적으로 말합니다 no such device
. 광장 하나.
우리가 원하는 것은 심볼릭 링크를 video{x}
숫자가 아닌 USB 허브 주소에 바인딩하는 것 입니다. 파이썬 프로그램이 필요했습니다.
첫 번째 단계는
fswebcam –d /dev/video${x} tst.jpg
대 x
1 내지 8의 존재 tst.jpg
동영상 번호에 카메라가 있는지 각각의 호출 후에 식별한다. 여기에서 활성 비디오 번호 목록을 만듭니다. 내 경험은 그것이 내가 사용한 카메라 0,1,2,3
이거나 0,2,4,6
카메라라는 것입니다.
물론 다른 프로세스를 사용하여이 목록을 작성할 수도 있습니다.
그런 다음 목록의 각 비디오 번호에 대해
udevadm info –attribute-walk –path=/dev/videox > dd
과 추출 KERNELS= line
에서 dd
. 이 과정에서 카메라의 USB 포트 주소 목록이 나타납니다. 다음 단계에서 항상 동일한 순서로 처리하도록이 목록을 정렬하십시오. 이것을 "주소 목록"이라고합니다.
udevadm … > dd
일을 다시 실행하고 다음과 같은 목록을 만드십시오.
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
이제 주소 목록을 살펴보십시오. 각 항목마다 비디오 목록에서 해당 항목을 찾으십시오. 다음과 같은 줄 모음처럼 보이는 새 목록을 만듭니다.
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
x (기호 링크 번호)는 주소 목록의 시퀀스 번호로 대체됩니다.
이제 작동하는 udev 규칙이 있습니다. 부팅시 해당 비디오 포트에 할당 된 비디오 번호에 관계없이 USB 허브 주소에 연결된 심볼릭 링크입니다.
최종 목록을 파일로 작성하십시오 /etc/udev/rules.d/cam.rules
. 실행 udevadm trigger
하여 실행 하면 작업이 완료됩니다. /dev/camera2
비디오 번호에 관계없이 동일한 카메라 (USB 포트)가됩니다.
또한에서 고유 한 기기를 찾을 수있었습니다 /dev/serial/by-id
. 아직 재부팅을 시도하지는 않았지만 해당 디렉토리의 파일은 적절한 장치 파일 ( ttyACM[0-9]
)에 대한 링크 일뿐입니다 .`
나는 Raspberry Pi에서 아치 리눅스를 사용하고 있지만 find
"Arduino"를 포함하는 파일 이름 을 사용하여 우연히 발견되었습니다 . 내 파이썬 프로그램은 해당 파일을 장치로 사용하여 Arduino에서 데이터를 읽거나 쓰는 데 사용됩니다 (지금까지는 단일 Pi에서 2 개).
위의 내용은 저에게 효과적이며 / etc / fstab에 항목을 배치 한 후 장치를 자동 마운트했습니다 (또한 스틱을 제거한 후 umount를 호출합니다)
즉
/ etc / fstab
# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup /vol/backup ext4 defaults,errors=remount-ro 0 1
고양이 /etc/udev/rules.d/5-usb-stick.rules
#
# the next line creates a symlink to this disk drive called /dev/backup
# i.e.
# root:# ls -la /dev/backup
# lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0
# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade "
ACTION=="add", ATTRS{model}=="Cruzer Blade ", SYMLINK+="backup"
# Clean up after removal
ACTION=="remove", ATTRS{model}=="Cruzer Blade ", RUN+="/bin/umount /vol/backup"
내 USB 스틱을 삽입하면 다음과 같은 결과가 나타납니다.
root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)