Conecte dispositivos USB ao Arduino usando o USB Host Shield

Conecte dispositivos USB ao Arduino usando o USB Host Shield

Neste artigo vamos ver uma forma de expandir a comunicação do Arduino com o mundo externo utilizando o Arduino USB Host Shield, uma placa na qual você pode ligar teclados, mouses, joysticks, celulares e praticamente qualquer dispositivo USB.

USB Host Shield Android

Antes de entrar nas propriedades do módulo, precisamos falar sobre o que é um USB Host.

Quando você conecta um mouse no seu computador, o seu computador é o USB Host (servidor), fornecendo energia e gerenciando a comunicação com o USB Client (no caso, o mouse, também chamado de “periférico”). Em toda comunicação USB você precisa de um USB host e um USB client.

No Arduino, o USB Host Shield vai atuar como um “servidor” USB, gerenciando a conexão, fornecendo alimentação USB  e permitindo a comunicação entre o Arduino e outros dispositivos como teclados, mouses, celulares, leitores de código de barras, controles de videogames (como PS3, PS4 e XBox), câmeras USB e até HD´s externos. E o que mais pudermos inventar, obviamente.

O Arduino USB Host Shield é compatível com Arduino Uno, Duemilanove, Diecimila, Arduino Mega 2560 e 1280, comunicando-se com o Arduino por meio da interface SPI.

Conectando um teclado USB ao Arduino USB Host Shield

Vamos mostrar dois exemplos de utilização dessa placa com o Arduino Uno. Como estamos trabalhando com um shield, basta encaixá-la sobre o Arduino, conforme a imagem:

Usb_Host_Shield_Arduino_Uno

Antes de carregarmos o primeiro programa vamos precisar da biblioteca USB Host Shield 2.0, disponível neste link. Descompacte o arquivo, renomeie a pasta USB_Host_Shield_2.0-master para USB_Host_Shield_2.0 e coloque-a dentro da pasta Libraries da IDE do Arduino.

O programa que vamos utilizar é baseado no programa de exemplo USBHIDBootKbd, da própria biblioteca. Criamos uma versão modificada (e reduzida) que mostra no serial monitor os caracteres digitados:

// Programa : Teste teclado no Arduino USB Host Shield
// Alteracoes e adaptacoes : FILIPEFLOP
// Baseado no exemplo USBHIDBootKbd da biblioteca USB_Host_Shield_2.0

#include <hidboot.h>
#include <usbhub.h>
// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class KbdRptParser : public KeyboardReportParser
{
    void PrintKey(uint8_t mod, uint8_t key);

  protected:
    void OnKeyDown	(uint8_t mod, uint8_t key);
    void OnKeyPressed(uint8_t key);
};

void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
  MODIFIERKEYS mod;
  *((uint8_t*)&mod) = m;
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
  uint8_t c = OemToAscii(mod, key);
  if (c)
    OnKeyPressed(c);
}

void KbdRptParser::OnKeyPressed(uint8_t key)
{
  // Se a tecla ENTER foi pressionada, vai para a linha seguinte
  if(key == 19)
  {
    Serial.println((char)key);
  }
  // Caso contrario, imprime na mesma linha
  else
  {
    Serial.print((char)key);
  }
};

USB     Usb;
//USBHub     Hub(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);

uint32_t next_time;

KbdRptParser Prs;

void setup()
{
  Serial.begin( 115200 );
  Serial.println("Utilize o teclado USB...");

  if (Usb.Init() == -1)
    Serial.println("USB Host Shield nao encontrado !");
  delay( 200 );
  next_time = millis() + 5000;
  HidKeyboard.SetReportParser(0, (HIDReportParser*)&Prs);
}

void loop()
{
  Usb.Task();
}

Carregue o programa, conecte o teclado USB ao Arduino USB Host Shield e abra o serial monitor setando a velocidade de conexão para 115200. Aguarde alguns instantes para começar a digitar:

Serial Monitor - Teste teclado

Vale a pena dar uma olhada no programa original, que mostra se a tecla foi pressionada ou liberada, mostra o número das teclas e também trata das teclas “especiais”, como shift, ctrl, etc. É uma boa referência se você precisar criar algum programa que faça uso do mapeamento do teclado.

Utilize o Arduino USB Host Shield com um celular Android

Uma das utilizações mais interessantes do USB Host Shield é a possibilidade de conectar um celular com Android e fazer com que ele envie e receba dados do Arduino.

Nesse caso serão necessários alguns conhecimentos sobre programação em Android, mas você pode, por exemplo, criar um programa que envie as informações do GPS para o Arduino. Ou configurar o celular para, caso este receba uma chamada ou SMS, acione uma porta do Arduino, envie mensagens para um display, toque uma sirene, etc.

Nessa mesma biblioteca que baixamos anteriormente, vamos encontrar o programa ArduinoBlinkLED, que já pode ser carregado no Arduino. Na IDE, o programa está em Arquivo => Exemplos => USB_Host_Shield_2.,0 = > adk:

#include <adk.h>

#if defined(LED_BUILTIN)
#define LED 2 // Use built in LED
#else
#define LED 2 // Set to something here that makes sense for your board.
#endif


// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

USB Usb;
ADK adk(&Usb, "TKJElectronics", // Manufacturer Name
              "ArduinoBlinkLED", // Model Name
              "Example sketch for the USB Host Shield", // Description (user-visible string)
              "1.0", // Version
              "http://www.tkjelectronics.dk/uploads/ArduinoBlinkLED.apk", // URL (web page to visit if no installed apps support the accessory)
              "123456789"); // Serial Number (optional)

uint32_t timer;
bool connected;

void setup() {
  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print("\r\nOSCOKIRQ failed to assert");
    while (1); // halt
  }
  pinMode(LED, OUTPUT);
  Serial.print("\r\nArduino Blink LED Started");
}

void loop() {
  Usb.Task();

  if (adk.isReady()) {
    if (!connected) {
      connected = true;
      Serial.print(F("\r\nConnected to accessory"));
    }

    uint8_t msg[1];
    uint16_t len = sizeof(msg);
    uint8_t rcode = adk.RcvData(&len, msg);
    if (rcode && rcode != hrNAK) {
      Serial.print(F("\r\nData rcv: "));
      Serial.print(rcode, HEX);
    } else if (len > 0) {
      Serial.print(F("\r\nData Packet: "));
      Serial.print(msg[0]);
      digitalWrite(LED, msg[0] ? HIGH : LOW);
    }

    if (millis() - timer >= 1000) { // Send data every 1s
      timer = millis();
      rcode = adk.SndData(sizeof(timer), (uint8_t*)&timer);
      if (rcode && rcode != hrNAK) {
        Serial.print(F("\r\nData send: "));
        Serial.print(rcode, HEX);
      } else if (rcode != hrNAK) {
        Serial.print(F("\r\nTimer: "));
        Serial.print(timer);
      }
    }
  } else {
    if (connected) {
      connected = false;
      Serial.print(F("\r\nDisconnected from accessory"));
      digitalWrite(LED, LOW);
    }
  }
}

O ArduinoBlinkLED trabalha em conjunto com um aplicativo que tem o mesmo nome, e aciona uma das portas do Arduino quando enviamos o comando pelo celular. No programa acima, vamos utilizar a porta 2 do shield:

Circuito Arduino Uno USB Host Shield

O instalador (APK) do ArduinoBlinkLED pode ser baixado neste link. Copie o arquivo ArduinoBlinkLED.apk para o seu celular e utilize o gerenciador de arquivos para instalar o programa:

ArduinoBlinkLED Install

Conecte o celular ao USB Host Shield e abra o aplicativo:

ArduinoBlinkLED

Acione a botão no centro da tela para acender e apagar o led ligado à porta 2:

Circuito_USB_Host_Shield

O celular mostrado acima possui Android versão 4.0.4 mas o programa funciona à partir da versão 2.3.4.

Se você deseja conhecer um pouco mais sobre a programação para o USB Host Shield e desenvolver seus próprios aplicativos, o desenvolvedor disponibliza o código fonte do programa utilizado acima no link https://github.com/Lauszus/ArduinoBlinkLED.

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP!

3
Conecte dispositivos USB ao Arduino usando o USB Host Shield
26 votos, 4.85 classificação média (96% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

49 Comentários

  1. Correia - 23 de maio de 2017

    Bom dia
    Quando compilo dá sempre o seguinte erro:
    (fatal error: usbhub.h: No such file or directory)

    Mas o ficheiro usbhub.h está na diretoria libraries na pasta USB_Host_Shield_2.0 assim como a hidboot.h e essa não dá erro.
    Alguém me pode ajudar por favor?

  2. Stella Marques - 5 de abril de 2017

    Boa tarde, gostaria de saber se com esse modulo eu consigo conectar o celular ao arduino e enviar e receber dados?

    Você teria exemplos dessa comunicação?

    No caso eu queria mandar strings e números.

    Por exemplo se um sensor enviasse o numero zero ‘0’, apareceria no celular led apagado. Um ‘1’, led aceso.
    E caso ele mande uma string tipo meu nome, “Stella Marques” Esse nome apareça na tela do celular. Consigo fazer isso? Você tem exemplos ou dicas de onde procurar isso?

  3. Stella Marques - 5 de abril de 2017

    Boa tarde, gostaria de saber se com esse modulo eu consigo conectar o celular ao arduino e enviar e receber dados?

    Por exemplo, recebo uma string, no arduino, mando essa string por uma variável para o celular, e essa string, é processada pelo celular e é mostrado algo na tela do celular.

    Consigo fazer isso?

    Você teria exemplos dessa comunicação?

    No caso eu queria mandar strings e números.

    Por exemplo se um sensor enviasse o numero zero ‘0’, apareceria no celular led apagado. Um ‘1’, led aceso.
    E caso ele mande uma string tipo meu nome, “Stella Marques” Esse nome apareça na tela do celular. Consigo fazer isso? Você tem exemplos ou dicas de onde procurar isso?

  4. Geiser - 23 de janeiro de 2017

    Pessoal, estou a procura de uma ajudinha aparentemente simples, no entanto nada longe do assunto aqui discutido, a ideia é a comunicação do USB host + MSR605, gostaria em um primeiro momento apenas controlar os leds da maquina, usei a library 2.0 e o exemplo PL2303 modificando basicamente apenas para o comando //uint8_t data= Serial.read(); uint8_t data2= 0x1b, data3=0x82; que seriam responsáveis (descritos no manual) por acender e apagar todos os leds, mais não é o que acontece, alguém pode ajudar! Grato.

    • Geiser - 23 de janeiro de 2017

      Bem mais aliviado, gostaria de deixar registrado que consegui resolver o problema!!! Eram meros detalhes na própria biblioteca USB Host 2.0 (problemas de incompatibilidade) contudo, pequenas alterações e inclusões vide manual, fizeram toda a diferença para ganhar o controle do produto. Dica:. IDVendor outros detalhes há futuros interessados será sempre um prazer poder ajudar!

  5. Vinicius - 7 de dezembro de 2016

    Eu estou realizando um projeto em que um Scanner barcode, conectado ao shield USB, lê um bar code e envia o número a uma variável do Arduino Uno que verifica, dentro da programação, qual é o número e, baseado nessa informação, se realiza uma ação no projeto. Existe alguma função que faça essa passagem de leitura para escrita ou qualquer sugestão para eu fazer isso?

    • Arthur - 8 de dezembro de 2016

      O codigo desse post, guarda o valor lido em uma variavel, mas apenas um numero, como você irá ler um codigo de barras teria que conctenar esses valores e guardar em uma string, depois disso executar o comando if.

  6. Leonardo - 20 de novembro de 2016

    Como faço para pegar dados de arquivos txt em pendrives?com a biblioteca principal ou ate mesmo a 2.0.

  7. Rafael - 26 de outubro de 2016

    Uma dúvida… É possível conectar um pen drive ao shield, e utilizá-lo para reproduzir arquivos de áudio de acordo com as entradas setadas em um Arduíno mega?

  8. Arthur - 31 de agosto de 2016

    quando eu vou compilar o codigo do teste do teclado aparece a seguinte mensagem:
    ‘HID_PROTOCOL_KEYBOARD’ was not declared in this scope
    alguem sabe o erro?

  9. Cesar - 26 de junho de 2016

    Uma informação por favor …

    No exemplo da conexão do teclado no shield, se invés de um tecladoi USB eu utilizasse um teclado sem fio onde eu colocaria na entrada USB do Shield o Trasncever que vem junto com o teclado , eu digitando no teclado teria o que foi digitado na Serial ? grato.

  10. Lucas Victor Pereira - 31 de maio de 2016

    Poderiam ajudar… usei este usb host Shield com o Arduíno R3… consegui controlar normalmente um servo pelo controle de ps3 mas os leds não acendiam direito(fikavam bem fracos) utilizei 9V de tensão… devo aumentar mais a tensão,ou a corrente? Obrigado

  11. darKnight - 14 de abril de 2016

    Alguém adquiriu esse shield e utilizou com mais teclados? obtiveram sucesso ou existiram alguns teclados que não “funcionaram”.

    grato

  12. Fernando - 21 de março de 2016

    Bom dia Srs.

    Como devo proceder para conectar este USB host shield em conjunto com Ethernet Shield?
    Está causando conflito de pinagem e o shield superior nunca funciona.

    Att,
    Fernando

  13. Fillipe - 18 de março de 2016

    Olá, em qual versão da IDE foi feito os testes? Pois carreguei a biblioteca na versão 1.0.1 e nenhum dos códigos de exemplos sequer compilam, sempre retornam alguns erros. Obrigado!

  14. Fernando - 28 de fevereiro de 2016

    Boa noite,
    Comprei 2 scanners barcode wifi da China e ambos queimaram o receptor ao conectar neste host USB. Alguma dica? Estou com receio de conectar qualquer outro scanner para tentar novamente. Grato

    • Adilson - 29 de fevereiro de 2016

      Boa tarde Fernando,

      Não temos informações de nenhuma queima causada pela placa, inclusive testamos com vários aparelhos como mouse, teclado, pendrive, e não tivemos problemas.Esse scanner que você comprou tem algum tipo de documentação para verificarmos se há alguma incompatibilidade com a porta USB ? O cabo de ligação é um cabo comum ?

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • Fernando Carrasco - 12 de março de 2016

        Boa tarde amigos,

        Obrigado pelo pronto retorno, enfim deve ter queimado por ser um scanner de baixa qualidade. Mas comprei um outro com fio de boa marca e funcionou perfeitamente, porém preciso de uma ajuda.

        Estou com este USB Shield conectado a um Leonardo e quando alimento através da USB do notebook e também uma fonte 12V 1A então o meu scanner é ativado perfeitamente no momento que conecto a este USB Shield, mas se eu desconecto a alimentação do notebook deixando apenas a fonte 12V o scanner desliga. Já tentei outras fontes porém de 9V 1000mA mas também sem sucesso.

        Alguém sabe o que poderia ser? E como posso fazer para que mantenha alimentado?

        Obrigado pela ajuda,
        Att,
        Fernando

  15. Brunocosmo - 27 de fevereiro de 2016

    Olá, tenho uma dúvida. Da para aclopar o ethernet shield em cima e conectar um repetidor nele, enviando assim, por exemplo, a imagem de uma câmera USB para o notebook, em um software?

  16. Pedro Gonçalves - 28 de janeiro de 2016

    Boa tarde Adilson,
    Esse shield conseguiria pegar tag de um leitor rfid usb tranquilamente, sem a necessidade de algo mais?
    Como por exemplo conecto esse leitor rfid usb no pc e o mesmo , me escreve a tag no bloco de notas.
    att

    • FILIPEFLOP - 11 de fevereiro de 2016

      Bom dia Pedro,

      Não fiz esse teste, mas creio que funcione sim, já que pela sua descrição, ele funciona como um dispositivo de entrada comum (como um teclado, por ex.).

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • darKnight - 14 de abril de 2016

        Essa questão pode ser muito mais ampla, caso seu leitor seja nativamente USB, ele provavelmente utiliza o protocolo PCSC, não lembro se este protocolo utiliza a classe HID, caso sim, pode ser que você consiga.

  17. Leonardo - 30 de outubro de 2015

    Olá. Posso usar esse shield no Arduino Leonardo? Se não, qual a alternativa? Ou o Leonardo não precisa de shield USB? Grato.

  18. Leonardo - 30 de outubro de 2015

    Olá. É possível utilizar esse shield com o Arduino Leonardo? Se não, como poderia contornar esse problema? Ou o Leonardo não precisa desse shield? Grato.

  19. Fernando Carrasco - 12 de outubro de 2015

    Boa tarde Srs.

    Saberiam me dizer porque ao tentar compilar este código o meu Arduino IDE fica processando sem retornar erro e também nao finaliza a compilação?

    Att,
    Fernando

  20. luiz - 2 de setembro de 2015

    ola boa noite gostaria de saber se com este shield é possivel fazer um auto download por exemplo ao eu conectar meu pendriver o arduino copie todos os arquivos do pendriver e passe para um cartao de memoria ou ao conectar um celular android ele copie todos os arquivos tipo conversas contatos chamadas etc…

  21. Brendo - 1 de setembro de 2015

    Consigo fazer um datalogger usb?

  22. Reinaldo Fernandes - 23 de agosto de 2015

    Olá, Boa Tarde.

    Há possibilidade de Ler/Escrever em um pendrive utilizando este shield?

  23. Anderson Dutra de Oliveira. - 20 de agosto de 2015

    Prezados,

    Será que da para utilizar este modulo, por exemplo com uma WebCan Usb?
    E pegar a imagem e enviar para o Android?

    Agradeço desde Já a colaboração.

    • FILIPEFLOP - 24 de agosto de 2015

      Bom dia Anderson,

      Não testamos nessa configuração, mas você terá que programar o Arduino para pegar os dados da câmera, creio que seja a mesma coisa que criar um “driver” para a câmera, dentro do Arduino. Vai dar um certo trabalho.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  24. Ricardo - 13 de julho de 2015

    Olá, é possível conectar um modem, para ter internet das operadoras como Claro, VIVO, etc?
    Caso sim, vocês têm exemplo?

    Agradeço.
    Ricardo.

  25. Guilherme - 13 de maio de 2015

    O link com o arquivo que eu tenho que baixar não esta funcionando, tem como me mandar por e-mail?

  26. Wesley Ricci - 23 de abril de 2015

    Olá. Boa Tarde.

    Daria para conectar uma WebCam nesse Host USB e utiliza-la para tirar foto?? Se sim, tem uma ideia do código de captura??

    Att,
    Wesley.

    • darKnight - 14 de abril de 2016

      Pelo que parece sim, ele daria suporte, já que o shield não possui inteligencia alguma, seria necessário adaptar toda a pilha USB no arduino. Alem do fato do desempenho baixo.
      Você não deve se preocupar com código e sim com a classe USB

Deixe uma resposta