0

Teclado USB virtual com Attiny85 e V-USB

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

DESCARREGAR 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

Este valor

por

Este valor

por

Também

por

Este valor e adicionamos 16000

Opcionalmente trocamos o nome do fabricante e do dispositivo editando estes valores:

Se editas estes valores terás que editar estes para que se ajustem à nova configuração, há que introduzir quantos caracteres tem cada valor:

Para terminar guardamos as alterações e abrimos o arquivo UsbKeyboard.h onde alteramos:

por

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

Jaime Mota

Deixar uma resposta