Neste tutorial vamos ver como criar um teclado USBvirtual com Attiny85. A ideia é que o computador reconheça o Attiny85 como um teclado HID, e que este seja capaz de mandar pulsações para formar uma frase, como se de um teclado normal se tratasse, para isso vamos usar a livraria V-USB.
Descarregar e instalar a livraria V-USB
Modificações da livraria
Dentro da pasta UsbKeyboard que copiamos à instalação do IDE do Arduino, há un arquivo chamado usbconfig.h, aí alteramos:
|
1
|
#define USB_CFG_IOPORTNAME D
|
por
|
1
|
#define USB_CFG_IOPORTNAME B
|
Este valor
|
1
|
#define USB_CFG_DMINUS_BIT 4
|
por
|
1
|
#define USB_CFG_DMINUS_BIT 1
|
Este valor
|
1
|
#define USB_CFG_DPLUS_BIT 7
|
por
|
1
|
#define USB_CFG_DPLUS_BIT 2
|
Também
|
1
|
#define USB_CFG_PULLUP_IOPORTNAME D
|
por
|
1
|
#define USB_CFG_PULLUP_IOPORTNAME B
|
Este valor e adicionamos 16000
|
1
|
#define USB_CFG_CLOCK_KHZ 16000
|
Opcionalmente trocamos o nome do fabricante e do dispositivo editando estes valores:
|
1
2
|
#define USB_CFG_VENDOR_NAME
#define USB_CFG_DEVICE_NAME
|
Se editas estes valores terás que editar estes para que se ajustem à nova configuração, há que introduzir quantos caracteres tem cada valor:
|
1
2
|
#define USB_CFG_VENDOR_NAME_LEN 15
#define USB_CFG_DEVICE_NAME_LEN 11
|
Para terminar guardamos as alterações e abrimos o arquivo UsbKeyboard.h onde alteramos:
|
1
2
|
PORTD = 0; // TODO: Only for USB pins?
DDRD |= ~USBMASK;
|
por
|
1
2
|
PORTB = 0; // TODO: Only for USB pins?
DDRB |= ~USBMASK;
|
Montagem e ligações
Para poder entender as ligações do Attiny na placa podemos usar a seguinte imagem como referência:
Código de exemplo
#include "UsbKeyboard.h" //Incluimos a livraria V-USB
int buttonPin = 0; //Declaramos o pino do botão
void setup()
{
delay(1000);
pinMode(buttonPin, INPUT); // Ajustamos o pino do botão como entrada
setupUSBInterrupt(); // Forçamos o host para que nos detecte
waitUntilUSBGetReady(); // Esperamos pela sincronização
}
void loop()
{
// Actualizamos o estado do dispositivo
UsbKeyboard.update();
// Se carregamos no botão
// Se enviam as pulsações
if (digitalRead(buttonPin) == HIGH) {
UsbKeyboard.sendKeyStroke(KEY_T);
UsbKeyboard.sendKeyStroke(KEY_E);
UsbKeyboard.sendKeyStroke(KEY_S);
UsbKeyboard.sendKeyStroke(KEY_T);
UsbKeyboard.sendKeyStroke(KEY_I);
UsbKeyboard.sendKeyStroke(KEY_N);
UsbKeyboard.sendKeyStroke(KEY_G);
delayMs(250);
UsbKeyboard.sendKeyStroke(KEY_ENTER);
delayMs(1000);
}
}
// Função substitutiva da função delay()
void delayMs(unsigned int ms)
{
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
void setupUSBInterrupt()
{
// Desactivamos o timer para que não interfira com o timer do USB
// Isto significa que funciona como delay() já não funcionaran
// para isso crearemos una função especial que nos fará de timer.
TIMSK&=!(1<<TOIE0);
// Eliminamos as interrupções
cli();
// Forçamos a reenumeração de dispositivos para que o host
// nos detecte o Attiny85 como dispositivo USB
usbDeviceDisconnect();
delayMs(250);
usbDeviceConnect();
// Iniciamos as interrupções de novo
sei();
}
// Esta função establece una pausa até que o dispositivo esta
// sincronizado com o host
void waitUntilUSBGetReady() {
while(true){
for(int i = 0; i < 10; i++){
UsbKeyboard.update();
delayMs(5);
}
if(usbInterruptIsReady()){
break;
}
}
}
Lista de teclas suportadas pela livraria V-USB
// Teclas de função UsbKeyboard.sendKeyStroke(KEY_SPACE); UsbKeyboard.sendKeyStroke(KEY_ENTER); // Numeros UsbKeyboard.sendKeyStroke(KEY_1); UsbKeyboard.sendKeyStroke(KEY_2); UsbKeyboard.sendKeyStroke(KEY_3); UsbKeyboard.sendKeyStroke(KEY_4); UsbKeyboard.sendKeyStroke(KEY_5); UsbKeyboard.sendKeyStroke(KEY_6); UsbKeyboard.sendKeyStroke(KEY_7); UsbKeyboard.sendKeyStroke(KEY_8); UsbKeyboard.sendKeyStroke(KEY_9); UsbKeyboard.sendKeyStroke(KEY_0); // Letras UsbKeyboard.sendKeyStroke(KEY_A); UsbKeyboard.sendKeyStroke(KEY_B); UsbKeyboard.sendKeyStroke(KEY_C); UsbKeyboard.sendKeyStroke(KEY_D); UsbKeyboard.sendKeyStroke(KEY_E); UsbKeyboard.sendKeyStroke(KEY_F); UsbKeyboard.sendKeyStroke(KEY_G); UsbKeyboard.sendKeyStroke(KEY_H); UsbKeyboard.sendKeyStroke(KEY_I); UsbKeyboard.sendKeyStroke(KEY_J); UsbKeyboard.sendKeyStroke(KEY_K); UsbKeyboard.sendKeyStroke(KEY_L); UsbKeyboard.sendKeyStroke(KEY_M); UsbKeyboard.sendKeyStroke(KEY_N); UsbKeyboard.sendKeyStroke(KEY_O); UsbKeyboard.sendKeyStroke(KEY_P); UsbKeyboard.sendKeyStroke(KEY_Q); UsbKeyboard.sendKeyStroke(KEY_R); UsbKeyboard.sendKeyStroke(KEY_S); UsbKeyboard.sendKeyStroke(KEY_T); UsbKeyboard.sendKeyStroke(KEY_U); UsbKeyboard.sendKeyStroke(KEY_V); UsbKeyboard.sendKeyStroke(KEY_W); UsbKeyboard.sendKeyStroke(KEY_X); UsbKeyboard.sendKeyStroke(KEY_Y); UsbKeyboard.sendKeyStroke(KEY_Z); // Maiusculas UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT); // Trocar KEY_H pela letra que se deseje // Caracteres especiais UsbKeyboard.sendKeyStroke(55); // Ponto UsbKeyboard.sendKeyStroke(45); // Guião
Demonstração de funcionamento
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?
Comments
Comentários