Estou procurando conectar vários dispositivos USB a um Arduino Uno (especificamente, um gamepad e uma webcam, mas estou interessado no caso geral ) Isso é possível sem usar o escudo de host USB, já que o Uno tem uma porta USB e um conversor USB para serial? Eu poderia usar o escudo, mas estou curioso se / por que ele é necessário.
O site Sparkfun afirma que:
O SparkFun USB Host Shield contém toda a lógica digital e circuitos analógicos necessários para implementar um periférico USB de velocidade total / controlador de host com seu Arduino.
O Arduino ainda não contém isso, apenas precisando do software adequado (embora obviamente seja mais fácil usar a biblioteca já escrita para o Host Shield). Ou existem limitações de hardware?
De acordo com Um dongle USB Ethernet pode ser em vez de escudo ethernet para arduino? (resposta de Majenko), pode, em teoria, ser feito com o Devido, mas não com o Uno . Nesse caso, é porque o Uno usa o ATmega16U2 em vez do FTDI FT232RL para comunicação USB?
Comentários
- Eu não ' Não acho que seja impossível, o USB é algum tipo de barramento serial com protocolos específicos, ou seja, dispositivos de divisão de marcação de dispositivo para intervalos de tempo específicos (alguns protocolos semelhantes, como um fio). Acho que a única limitação é a velocidade, portanto, sincronizar todos os comandos e dados específicos de USB é o que causa problemas,
- @GeneralChaos Você ' está certo, é ' não é " impossível " – mas é altamente impraticável. Há uma implementação de software de um dispositivo USB (VUSB) que não ' precisa de nenhum hardware especial. É ' é duvidoso na melhor das hipóteses e quase não funciona na melhor das vezes. Não há razão para que você não possa ' escrever um equivalente de host – no entanto, ele nunca poderia funcionar em nada mais do que 1,5 MHz de USB 1.0 " Baixa velocidade ", portanto, nunca poderia falar com nada além de um simples teclado ou mouse. Coisas como ethernet ou webcams são completamente impossíveis sem o hardware Host ou OTG, que o Due incorporou ao chip principal.
Resposta
As primeiras coisas primeiro, você precisa aprender o básico de como o USB funciona.
No USB, existem duas” coisas “principais: hosts e dispositivos.
Você tem um host (normalmente o seu computador) e muitos dispositivos (como Arduinos, impressoras, scanners, webcams, dongles WiFi, etc.).
Ser um host envolve saber quais dispositivos você vai conectar a você e como se comunicar com eles. Ser um dispositivo significa apenas se comunicar com o host à sua maneira.
Como você pode ver, ser um host do que ser um dispositivo é uma tarefa muito mais complexa.
Arduinos são dispositivos . Os pequenos chips de interface USB que eles usam têm energia muito baixa e só podem ser um dispositivo, nunca um host.
Se você deseja conectar um dispositivo a algo, ele precisa ser um host (observação: estou propositalmente ignorando hubs aqui).
O Arduino Due usa um chip muito mais poderoso e capaz de ser um host (usando o que é conhecido como modo On-The-Go).
Para fazer isso com nada menos poderoso do que um Devido, você precisa de hardware adicional que é projetado especificamente para ser um host USB – e é aí que a blindagem do host USB entra. Ele tem um chip que é projetado especialmente para ser um host USB para que você possa conectar um dispositivo nele.
Nenhum dos chips no Uno foi projetado para ser um host. Eles simplesmente não têm o poder.
Resposta
Não. O USB distingue estritamente entre as funções de host e dispositivo. Alguns chips têm blocos funcionais capazes de desempenhar qualquer função, mas os 8u2 / 16u2 não são exemplos disso.
Conversores seriais USB típicos como o FT232, CP210x, CH340, PL2303, etc também são estritamente dispositivos e incapazes de ser hosts
Existem MCUs baratos com capacidade de host, como o Kinetis KL25Z, mas para usá-los em sua forma mais barata você precisaria de uma abordagem de software diferente (por exemplo, mbed em vez de Arduino) e muito mais esforço pessoal. O Teensy-LC está relacionado, mas você paga mais pelo auxiliar de carregamento de código do Arduino nele do que pelo MCU que executa seu próprio programa.