Se eu tiver vários Arduinos conectados via USB a um computador Linux, e eles aparecerem como
- / tty / ACM0
- / tty / ACM1
- / tty / ACM2
Como posso identificar qual é o Arduino sem conectar a eles via conexão serial ? Existe um número de série ou um ID exclusivo no Arduino?
Obrigado pelo seu tempo.
Situação: Uno R3, Mega, Leonardo com / ttyACM [1,2,3]
Saída lsusb com dispositivos na ordem mencionada acima:
... Barramento 001 Dispositivo 011: ID 2341: 0043 Dispositivo 0013 do barramento 001: ID 2341: 8036 ... Barramento 001 Dispositivo 014: ID 2341: 0042
lsusb -d vendor: dispositivo -vvv mostra para cada um
Uno
Barramento 001 Dispositivo 014: ID 2341: 0042 Descritor de dispositivo: bComprimento 18 bDescriptorType 1 bcdUSB 1.10 Comunicações do 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 Descritor de configuração: bComprimento 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Auto-alimentado MaxPower 100mA Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 Comunicações bInterfaceClass 2 Resumo de bInterfaceSubClass 2 (modem) bInterfaceProtocol 1 comandos AT (v.25ter) iInterface 0 Cabeçalho do CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 envia pausa codificação de linha e estado serial União CDC: bMasterInterface 0 bSlaveInterface 1 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Interrupção do tipo de transferência Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0008 1x 8 bytes bInterval 255 Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 Dados do CDC do bInterfaceClass 10 bInterfaceSubClass 0 Não utilizado bInterfaceProtocol 0 iInterface 0 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Tipo de transferência em massa Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Tipo de transferência em massa Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Status do dispositivo: 0x0000 (Alimentado por barramento)
Leonardo:
Dispositivo 0013 do barramento 001: ID 2341: 8036 Descritor de dispositivo: bComprimento 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (definido no nível da interface) 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 Descritor de configuração: bComprimento 9 bDescriptorType 2 wTotalLength 100 bNumInterfaces 3 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Alimentado por barramento) MaxPower 500mA Associação de interface: bComprimento 8 bDescriptorType 11 bFirstInterface 0 bInterfaceCount 2 Comunicações bFunctionClass 2 Resumo de bFunctionSubClass 2 (modem) bFunctionProtocol 1 comandos AT (v.25ter) iFunction 0 Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 Comunicações bInterfaceClass 2 Resumo de bInterfaceSubClass 2 (modem) bInterfaceProtocol 0 Nenhum iInterface 0 Cabeçalho do CDC: bcdCDC 1.10 Gerenciamento de chamadas do CDC: bmCapabilities 0x01 gerenciamento de chamadas bDataInterface 1 CDC ACM: bmCapabilities 0x06 envia pausa codificação de linha e estado serial União CDC: bMasterInterface 0 bSlaveInterface 1 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Interrupção do tipo de transferência Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Tipo de transferência em massa Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 0 Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 2 bAlternateSetting 0 bNumEndpoints 1 Dispositivo de interface humana bInterfaceClass 3 bInterfaceSubClass 0 Nenhuma subclasse bInterfaceProtocol 0 Nenhum iInterface 0 Descritor de dispositivo HID: bComprimento 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Não suportado bNumDescriptors 1 Relatório bDescriptorType 34 wDescriptorLength 101 Descritor do relatório: (length is 101) Item (global): página de uso, dados = [0x01] 1 Controles genéricos de área de trabalho Item (local): uso, dados = [0x02] 2 Rato Item (Principal): Coleta, dados = [0x01] 1 Inscrição Item (local): uso, dados = [0x01] 1 Ponteiro Item (Principal): Coleta, dados = [0x00] 0 Fisica Item (global): ID do relatório, dados = [0x01] 1 Item (Global): Página de Uso, dados = [0x09] 9 Botões Item (local): uso mínimo, dados = [0x01] 1 Botão 1 (Primário) Item (local): uso máximo, dados = [0x03] 3 Botão 3 (Terciário) Item (Global): Mínimo Lógico, dados = [0x00] 0 Item (Global): Máximo Lógico, dados = [0x01] 1 Item (Global): Contagem de Relatórios, dados = [0x03] 3 Item (global): tamanho do relatório, dados = [0x01] 1 Item (Principal): Entrada, dados = [0x02] 2 Variável de dados Absoluto No_Wrap Linear Campo de bits não-volátil de estado preferencial Item (Global): contagem de relatórios, dados = [0x01] 1 Item (Global): Tamanho do Relatório, dados = [0x05] 5 Item (Principal): Entrada, dados = [0x03] 3 Variável constante Absoluto No_Wrap Linear Campo de bits não-volátil de estado preferencial Item (global): página de uso, dados = [0x01] 1 Controles genéricos de área de trabalho Item (local): uso, dados = [0x30] 48 Direção-X Item (local): uso, dados = [0x31] 49 Direção-Y Item (local): uso, dados = [0x38] 56 Roda Item (Global): Mínimo Lógico, dados = [0x81] 129 Item (Global): Máximo Lógico, dados = [0x7f] 127 Item (global): tamanho do relatório, dados = [0x08] 8 Item (Global): Contagem de Relatórios, dados = [0x03] 3 Item (Principal): Entrada, dados = [0x06] 6 Variável de dados relativa No_Wrap linear Campo de bits não-volátil de estado preferencial Item (Principal): Finalizar Coleta, dados = nenhum Item (Principal): Finalizar Coleta, dados = nenhum ...... Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x84 EP 4 IN bmAttributes 3 Interrupção do tipo de transferência Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Status do dispositivo: 0x0000 (Alimentado por barramento)
E Mega256:
Barramento 001 Dispositivo 014: ID 2341: 0042 Descritor de dispositivo: bComprimento 18 bDescriptorType 1 bcdUSB 1.10 Comunicações do 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 Descritor de configuração: bComprimento 9 bDescriptorType 2 wTotalLength 62 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Auto-alimentado MaxPower 100mA Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 Comunicações bInterfaceClass 2 Resumo de bInterfaceSubClass 2 (modem) bInterfaceProtocol 1 comandos AT (v.25ter) iInterface 0 Cabeçalho do CDC: bcdCDC 10.01 CDC ACM: bmCapabilities 0x06 envia pausa codificação de linha e estado serial União CDC: bMasterInterface 0 bSlaveInterface 1 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Interrupção do tipo de transferência Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0008 1x 8 bytes bInterval 255 Descritor de Interface: bComprimento 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 Dados do CDC do bInterfaceClass 10 bInterfaceSubClass 0 Não utilizado bInterfaceProtocol 0 iInterface 0 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Tipo de transferência em massa Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Descritor de ponto final: bComprimento 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 2 Tipo de transferência em massa Tipo de sincronização Nenhum Dados do tipo de uso wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Status do dispositivo: 0x0000 (Alimentado por barramento)
lsusb -vvv
diz?Respostas:
Supondo que sua distribuição esteja usando
udev
:Você pode precisar de privilégios de root para executar isso (sudo / su). Ele exibirá uma lista de informações como esta:
Isto é para um Uno com firmware modificado no atmega16u2 (usb para serial). As linhas de interesse provavelmente são ID_MODEL_ID e ID_MODEL_FROM_DATABASE.
fonte
Você pode adicionar um alias para cada um. Então você sabe qual é qual. Aqui está um bom tutorial sobre como configurar isso.
Aqui está um trecho que escrevi com base no tutorial. No exemplo abaixo, estou usando um adaptador USB para serial FTDI RS232RL, que acredito ser o que o Arduino também usa.
lsusb
Portanto, podemos ler este arquivo e encontrar o USB correto:
Você também pode usar "usb"
Esta é a localização de todas as mensagens marcadas com ftdi:
Ao lado de ftdi_sio, há um número como 1-1.2. Este é o dispositivo USB
grep "usb 1-1.2" /var/log/messages
Ou você pode usar:
Neste exemplo, meu apelido é chamado 'lcdbox'
Salve o arquivo e digite
sudo udevadm control --reload-rules
Tipo
ls –l / dev / lcdbox
lrwxrwxrwx 1 root root 7 de janeiro de 1970 / dev / lcdbox -> ttyUSB0
fonte
Isso é bem fácil! Você precisa personalizar o firmware dos chips ftdi e adicionar uma regra do udev:
Primeiro, obtenha
ftdi_eeprom
viaapt-get
ou das fontes. Identifique seu dispositivo via lsusb e obtenha o ID:Prepare uma configuração e certifique-se, que
vendor_id
eproduct_id
corresponder. Personalize as seqüências de caracteres naStrings
seção para obter um ID exclusivo para o seu dispositivo.Despejar o firmware ftdi atual:
ftdi_eeprom --read-eprom
Este comando cria
${pwd}/eeprom.old
, que contém o firmware atual no ftdi. Faça backup desse arquivo antes de continuar , porque duranteflash-eeprom
o arquivo é reescrito. Após o backup, atualize o ftdi:Agora, crie uma regra do udev, assim
no
/etc/udev/rules.d/90-arduino-usb.rules
e reinicie o udev.Desconecte e reconecte seu dispositivo e tente
Onde
arduino1
é a seqüência definido emserial
no exemplo acima.conf
.Veja também: Riscos de ftdi_eeprom? - TX sempre alto depois de piscar
fonte
Eu teria usado um script para criar um alias abaixo
/dev/
e também definir o grupo e os direitos comudev
as outras respostas.Mas se eu não tivesse,
udev
eu irialsusb
entrargrep
ouawk
gostarlsusb|grep -e "idProduct"
.De qualquer forma, com
udev
regras ou comlsusb
egrep
para identificar dispositivos USB, usoidVendor
,idProduct
eiSerial
emDevice descriptor
partelsusb
para fazer a idenification adequada. OidVendor
aviso indica que o fabricanteidProduct
deve identificar o produto do fabricante, mas às vezes eles usam o mesmo ID de produto para mais de um produto. Por fim, se necessário,iSerial
deve ser um ID exclusivo para cada exemplo desse produto.fonte
No Ubuntu 16.04 (e talvez versões anteriores ou outros distribs também), você pode:
que é exibido (na minha caixa onde um UNO do Arduino está conectado):
Você pode identificar facilmente o ID do dispositivo 0043 (UNO) aqui.
Este arquivo é realmente um link para
/dev/ttyACM0
na minha caixa.fonte
Você sempre pode imprimir algum tipo de identificação via serial na configuração de cancelamento (). Depois que determinada placa for conectada, ela enviará esse ID à sua interface USB (que você está ouvindo com algum tipo de aplicativo daemon na sua caixa Linux). Depois de receber o ID, você pode mapeá-lo para o caminho 'Arduino1': '/ dev / ttyACM0', 'Arduino2': '/ dev / ttyACM1', 'Arduino3': '/dev/ttyACM2'...etc
Esteja ciente de que, quando o dispositivo é desconectado, por algum motivo, ele pode alterar seu caminho físico; portanto, é necessário remapear todos eles. Nesse caso, pode ser bom escrever uma função separada ex: get_id () que você pode chamar a qualquer momento (não apenas na inicialização).
fonte
Eu ficaria muito tentado a identificar outra maneira, como fazer com que o próprio esboço respondesse a um comando de identificação especial, apenas para evitar as estranhas maneiras de identificação de dispositivos do USB.
fonte