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 Ardunino Uno Rev 3 (Original)
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
Comentar
eu nao consigo fazer dar certo, sempre aparece a mensagem: “OSC did not start”
alguém sabe?
Marcelo... Aonde encontro a biblioteca?... Tentei algumas que não deram certo...
Help me, please!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
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)