Eu tenho um Arduino que às vezes fica vinculado /dev/ttyUSB0
e outras vezes /dev/ttyUSB1
, fazendo com que meu script falhe.
Eu não quero enumerar todas as possibilidades de onde meu dispositivo pode estar, mas prefiro que ele esteja vinculado a algum lugar estático, por exemplo /dev/arduino
.
Como faço para conseguir isso?
linux
arch-linux
usb
serial-port
arduino
k0pernikus
fonte
fonte
Respostas:
Como sugerido, você pode adicionar algumas regras do udev. Eu editei o
/etc/udev/rules.d/10-local.rules
para conter:Você pode verificar as variáveis do seu dispositivo executando
Há um guia mais detalhado que você pode ler em http://www.reactivated.net/writing_udev_rules.html
fonte
udevam
? E é importante observar quemy_uart
cria o link simbólico abaixo/dev/my_uart
. Eu escrevi/dev/arduino
pela primeira vez e falhou enquantoarduino
é suficiente.udevadm
deve sair por si só quando terminar.A sintaxe da regra acima pode funcionar em algumas distribuições, mas não na minha (Raspbian). Como nunca encontrei um único documento que explique todos os detalhes, escrevi o meu, para ser encontrado aqui . É para isso que tudo se resume.
1. descubra o que está no ttyUSB:
2. liste todos os atributos do dispositivo:
(com o (s) número (s) do seu dispositivo em vez de x, é claro). Escolha um conjunto de identificadores exclusivo, por exemplo, idVendor + idProduct. Você também pode precisar de SerialNumber se tiver mais de um dispositivo com o mesmo idVendor e idProduct. Os números de série devem ser exclusivos para cada dispositivo.
3. Crie um arquivo
/etc/udev/rules.d/99-usb-serial.rules
com algo como esta linha:(supondo que você não precise de um número de série e, é claro, com os números de idVendor e idProduct que você encontrou na etapa 2.
4. Carregue a nova regra:
5. Verifique o que aconteceu:
mostrará para qual número ttyUSB o link simbólico foi. Se for
/dev/ttyUSB1
, verifique quem é o proprietário e a qual grupo pertence:Então, apenas por diversão:
fonte
idVendor
eidProduct
for exatamente o mesmo? (dois sensores ligados em modelo USB idênticos aos módulos UART)udevadm info --name=/dev/ttyUSB1 --attribute-walk
para ambos os dispositivos e procure números de série, eles devem ser exclusivos para cada dispositivo. Se seus sensores não tiverem número de série, você pode especificar o que são?O problema de vários dispositivos USB idênticos
Eu tenho um Rasperry Pi com quatro câmeras. Eu tomo pix com
fswebcam
que identifica as câmeras como/dev/video0
..video3
. Às vezes, a câmera évideo0
,vide02
,video4
evideo6
mas podemos esquecer que, por enquanto.Eu preciso de um ID persistente para identificar um número de câmera, de modo que, por exemplo,
video0
seja sempre a mesma câmera, porque eu legendo as fotos. Infelizmente, isso não acontece de maneira confiável - na inicialização, as câmeras são enumeradas comovideo0
...video3
mas nem sempre da mesma maneira.As câmeras têm o mesmo ID e número de série.
A solução para esse problema envolve regras do udev, mas também existem muitos anzóis.
Se você emitir o comando
você obtém uma mesa de saída, mas os bits salientes são
O bit KERNELS é uma porta de hub USB. Com quatro câmeras, há quatro delas - elas não mudam na reinicialização, mas a
video{x}
associada a uma porta pode mudar.Portanto, precisamos de uma regra do udev para vincular um número de vídeo a uma porta de hub USB - algo como:
Parece simples - acesse a câmera com
Exceto que não funciona - se você colocar isso em uma regra do udev e o sistema tiver alocado video0 (na inicialização) para uma porta diferente, a regra do udev será ignorada. O link simbólico para
/dev/camera0
basicamente dizno such device
. Quadrado um.O que queremos é vincular um link simbólico a um endereço de hub USB, não a um
video{x}
número. Foi necessário um programa Python.O primeiro passo foi correr
para
x
entre 1 e 8. A existência detst.jpg
após cada chamada identifica a existência de uma câmara nesta número de vídeo. A partir disso, faça uma lista dos números de vídeo ativos. Minha experiência tem sido que é tanto0,1,2,3
ou0,2,4,6
para câmeras que tenho usado.Outros podem, é claro, criar essa lista usando um processo diferente.
Em seguida, para cada número de vídeo na lista, execute
e extraia o
KERNELS= line
dedd
. Nesse processo, você acaba com uma lista dos endereços de porta USB das câmeras. Classifique esta lista para que, na próxima etapa, você sempre a processe na mesma ordem. Chame isso de "lista de endereços".Execute a
udevadm … > dd
coisa novamente e faça uma lista que se parece comAgora, percorra a lista de endereços - para cada entrada, encontre a entrada correspondente na lista de vídeos. Crie uma nova lista que se pareça com uma coleção de linhas como
O x (número do link simbólico) é substituído pelo número de sequência na lista de endereços.
Agora você tem uma regra do udev que funciona. Um link simbólico vinculado a um endereço de hub USB, independentemente do número de vídeo atribuído a essa porta na inicialização.
Escreva a lista final em um arquivo
/etc/udev/rules.d/cam.rules
. Executeudevadm trigger
para ativá-lo e o trabalho está concluído./dev/camera2
será a mesma câmera (porta USB), independentemente do número de vídeo.fonte
Eu também consegui encontrar um dispositivo exclusivo no
/dev/serial/by-id
. Ainda não tentei reiniciar, mas os arquivos nesse diretório eram apenas links para o arquivo de dispositivo apropriado (ttyACM[0-9]
).Estou executando o arch linux no Raspberry Pi, mas me deparei com eles apenas fazendo um
find
para nomes de arquivos que contêm "Arduino". Meus programas python funcionam bem usando esses arquivos como dispositivos para ler / gravar dados de / para meus Arduinos (até agora, dois em um único Pi).fonte
Apenas para dizer que o acima funcionou para mim e também montou automaticamente o dispositivo para mim depois que eu coloquei uma entrada no / etc / fstab (e também chama umount após remover o stick)
ie
/ etc / fstab
cat /etc/udev/rules.d/5-usb-stick.rules
Então, depois de inserir meu pendrive, recebo:
fonte