Tutorial: Como utilizar o USB Host Shield com teclado e mouse

Olá Garagistas, no tutorial de hoje vou apresentar o tão pedido USB Host Shield e demonstrar seu funcionamento com um mouse e um teclado. E também realizar uma básica modificação para controlar um pequeno servo motor.

Material utilizado:


1x USB Host Shield

1x Ardunino Uno Rev 3 (Original)

1x Servo Motor (Pequeno)

1x Fonte de Alimentação 9V/1A para Arduino

1x Jumper Premium 6mm (Pacote com 10)

1x Cabo USB A para B- 1,80 Metros

1x Teclado USB

1x Mouse

1. USB Host Shield 

Características: 

USB Host Shield proporciona ao seu Arduino implementar periférico/host USB de alta velocidade. Isto significa que pode controlar qualquer dispositivo USB "SLAVE" - câmeras digitais, USB Bluetooth, e muito mais!

A interface do Shield com o Arduino é feito pelo barramento de comunicação SPI(D10-13) usando apenas 4 linhas. O Shield contém o conector USB do tipo A e que também fornece os 5V, tal como uma porta USB normal.

O Host Shield é alimentado através do pino 'VIN' do Arduino. A tensão de entrada nesse pino no shiled pode ser 5V ou 3,3V. Todos o sinais do SPI passam pelo chip 'Hex Converter' convertendo-os para 3,3V.

 

Documentos:

2. Funcionamento

   Nesse tutorial eremos dar um breve demonstração de como fazer o USB Host Shield funcionar com um mouse e um teclado, apenas iremos mostrar os sinais quem são enviados para o Monitor Serial, uma utilização posterior fica por conta do desenvolvedor. O objetivo principal desse tutorial é apresentar o shield e mostra lo funcionando, iremos fazer uma pequena modificação no exemplo relacionado ao teclado, um servo motor pequeno será controlado, e a partir desse exemplo você pode criar sua aplicação. Para se aprofundar mais sobre seu funcionamento acesse os links em Documentos e saiba mais e para entender um pouco mais sobre a tecnologia USB click aqui.

   Iremos utilizar as teclas direcionais teclado USB, cada tecla retorna um valor em decimal mais seu valor em carácter, porém esse valor em decimal nesses exemplos não tem relação com a tabela ASCII. Nesse tutorial poderemos verificar todas as informações envias tanto pelo teclado quanto o mouse, você deve apenas pegar esses dados e criar sua lógica, podendo até modificar a  biblioteca ou os exemplos para um uso específico.

3. Montagem

.

OBS: Recomenda-se utilizar o USB Host Shield com um uma alimentação externa como uma fonte ou uma bateria, pois a saída USB computador não tem corrente  suficiente para suportar esse shield, podendo ocasionar falhas e até mesmo nem funcionar.

   

4. Sketch

    Utilizamos um exemplo da biblioteca USB Host Shield, acrescentamos alguns comandos para que consigamos controlar o servo motor, você pode realizar outras modificações e controlar outros dispositivos sem problemas, apenas não se esquecendo de utilizar uma alimentação externa.  



//Icluir Bibliotecas
#include <hidboot.h>
#include <usbhub.h>
#include span style="color: #cc6600;">Servo.h>
// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
//Variaveis globais
int x=0;
int y=0;
class KbdRptParser : public KeyboardReportParser
{
        void PrintKey(uint8_t mod, uint8_t key);

protected:
        virtual void OnControlKeysChanged(uint8_t before, uint8_t after);

virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyUp (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};

void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
    MODIFIERKEYS mod;
    *((uint8_t*)&mod) = m;
    Serial.print((mod.bmLeftCtrl == 1) ? "C" : " ");
    Serial.print((mod.bmLeftShift == 1) ? "S" : " ");
    Serial.print((mod.bmLeftAlt == 1) ? "A" : " ");
    Serial.print((mod.bmLeftGUI == 1) ? "G" : " ");
    //Modificação no exemplo
//=========================================================================
    Serial.print(" >");
    y=key;// Variavel que receberá o valor enviado pelo teclado.
    Serial.print(y);//Printa o valor na serial
    Serial.print("< ");
    if(y==79&&x>=0)
    {
      x=x-10;
    }
    if(y==80&&x<180)
    {
      x=x+10;
    } 
    Serial.print(x); // Printa a posição do servo na serial
//=========================================================================
    Serial.print((mod.bmRightCtrl == 1) ? "C" : " ");
    Serial.print((mod.bmRightShift == 1) ? "S" : " ");
    Serial.print((mod.bmRightAlt == 1) ? "A" : " ");
    Serial.println((mod.bmRightGUI == 1) ? "G" : " ");
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
    Serial.print("DN ");
    PrintKey(mod, key);
    uint8_t c = OemToAscii(mod, key);

    if (c)
        OnKeyPressed(c);
}

void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {

    MODIFIERKEYS beforeMod;
    *((uint8_t*)&beforeMod) = before;

    MODIFIERKEYS afterMod;
    *((uint8_t*)&afterMod) = after;

    if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl) {
        Serial.println("LeftCtrl changed");
    }
    if (beforeMod.bmLeftShift != afterMod.bmLeftShift) {
        Serial.println("LeftShift changed");
    }
    if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt) {
        Serial.println("LeftAlt changed");
    }
    if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI) {
        Serial.println("LeftGUI changed");
    }

    if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl) {
        Serial.println("RightCtrl changed");
    }
    if (beforeMod.bmRightShift != afterMod.bmRightShift) {
        Serial.println("RightShift changed");
    }
    if (beforeMod.bmRightAlt != afterMod.bmRightAlt) {
        Serial.println("RightAlt changed");
    }
    if (beforeMod.bmRightGUI != afterMod.bmRightGUI) {
        Serial.println("RightGUI changed");
    }

}

void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
    Serial.print("UP ");
    PrintKey(mod, key);
}

void KbdRptParser::OnKeyPressed(uint8_t key)
{
    Serial.print("ASCII: ");
    Serial.println((char)key);
};

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

uint32_t next_time;

KbdRptParser Prs;
//Inicializa o motor
Servo motor;
void setup()
{
    // seleciona o pino 3 como controle do servo
    motor.attach(3);
    Serial.begin( 115200 );// Não esqueca de configurar o Baud rate Monitor Serial
    while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
    Serial.println("Start");

    if (Usb.Init() == -1)
        Serial.println("OSC did not start.");

    delay( 200 );

    next_time = millis() + 5000;

    HidKeyboard.SetReportParser(0, (HIDReportParser*)&Prs);
}

void loop()
{
    Usb.Task();
     motor.write(x);
}

Referências

http://www.infowester.com/usb.php

http://labdegaragem.com/profiles/blogs/tutorial-arduino-com-servomotor

Exibições: 6050

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Henrique O. R. F. Arantes em 2 setembro 2015 às 19:08

eu nao consigo fazer dar certo, sempre aparece a mensagem: “OSC did not start” 

alguém sabe?

Comentário de andre rodrigues paiva em 29 abril 2015 às 16:55

Marcelo... Aonde encontro a biblioteca?... Tentei algumas que não deram certo... 

Help me, please!

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço