20 maio 2014

Usando Arduino Leonardo como teclado e mouse

O Arduino Leonardo é mais uma das placas da (grande) família Arduino. Utiliza o microcontrolador ATmega32u4 com comunicação USB embutida, o que dispensa o uso de circuitos auxiliares para comunicação. Essa placa possui 20 pinos de entrada/saída, sendo que 7 podem ser usados como saídas PWM, e 12 como portas analógicas. O clock é de 16 Mhz.

arduino leonardo teclado mouse
O Arduino Leonardo funciona da mesma maneira que as outras placas Arduino, mas tem uma funcionalidade adicional que vamos abordar nesse post, que é a possibilidade de utilizá-lo como se fosse um mouse ou um teclado.

Fisicamente, o Arduino Leonardo tem as mesmas dimensões que o Arduino Uno, e os conectores também estão dispostos de forma semelhante : na parte de cima, as portas digitais de 0 a 13, e os pinos GND, AREF, SDA e SCL. Na parte de baixo, as portas analógicas de 0 a 5 e os pinos de RESET, GND, 5v e 3.3v :

Arduino Leonardo - Detalhes
Para conexão ao computador é utilizado um cabo micro-usb e a instalação no Windows não exigiu a utilização de nenhum driver específico. Ao conectar o cabo, foram detectados três dispositivos : o Arduino Leonardo na porta serial COM13, o USB Composite Device e o USB Input Device :

Arduino Leonardo - Drivers

Finalizada a instalação da placa, a utilização é igual à de outras placas Arduino : carregue a IDE, e no menu Ferramentas => Placas selecione Arduino Leonardo. Em Ferramentas => Porta Serial, selecione a porta serial detectada no momento da instalação da placa (no nosso caso, COM13).

Para demonstrar a capacidade do Leonardo em ser utilizado como um teclado e um mouse, vamos montar um circuito composto por um push-button (será o nosso teclado), que vai enviar uma sequência de caracteres para o computador, e também um joystick (o nosso mouse), que vai determinar o movimento do cursor na tela do computador :

circuito Arduino Leonardo joystick push-button
No programa que vai controlar tudo isso (baseado no programa original do site oficial do Arduino), veremos novos comandos como o Keyboard.begin() e o Mouse.begin().

O Keyboard.begin() é o comando que inicia a emulação do teclado no Leonardo, ou seja, diz para a placa que a partir daquele momento ela pode se comportar como um teclado e enviar caracteres ao computador.

O Mouse.begin() faz a mesma coisa, mas com as funções de mouse. No programa, vamos ler as informações recebidas do joystick pelas portas A1 (eixo X) e A2 (eixo Y), e movimentar o cursor na tela do computador.

O push-button ligado à porta 7, cada vez que é acionado, executa o comando

Keyboard.println("Arduino e Cia !")

e envia a sequência de caracteres para o computador como se fosse um teclado. Você pode testar isso utilizando qualquer programa de edição de texto, como por exemplo o Bloco de Notas (notepad).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
//Programa : Teclado e Mouse com o Arduino Leonardo
//Alteracoes e adaptacoes : Arduino e Cia

//Pino do push-button
int botao_msg = 7;
//Armazena estado do push-button
int previousButtonState = HIGH;

const int xAxis = A1;  //Pino entrada eixo X
const int yAxis = A2;  //Pino entrada eixo Y

int range = 2;              // output range of X or Y movement
int responseDelay = 2;      // response delay of the mouse, in ms
int threshold = range/4;    // resting threshold
int center = range/2;       // resting position value
int minima[] = { 
  1023, 1023};              // actual analogRead minima for {x, y}
int maxima[] = {
  0,0};                     // actual analogRead maxima for {x, y}
int axis[] = {
  xAxis, yAxis};            // pin numbers for {x, y}
int mouseReading[2];        // final mouse readings for {x, y}


void setup() 
{
  pinMode(botao_msg, INPUT);
  //Inicializa teclado
  Keyboard.begin();
  //Inicializa mouse
  Mouse.begin();
}

void loop() 
{
  //Checa se o push-button foi pressionado
  int valor = digitalRead(botao_msg);
  if ((valor != previousButtonState) && (valor == LOW)) 
  {
    Keyboard.println("Arduino e Cia !");
  }
  //Salva o estado do botao para comparacao no proximo loop
  previousButtonState = valor;
  
  // read and scale the two axes:
  int xReading = readAxis(0);
  int yReading = readAxis(1);
  
  // move the mouse:
   Mouse.move(xReading, yReading, 0);
   delay(responseDelay);
}

/*
  reads an axis (0 or 1 for x or y) and scales the 
  analog input range to a range from 0 to <range>
*/

int readAxis(int axisNumber) 
{
  int distance = 0;    // distance from center of the output range

  // read the analog input:
  int reading = analogRead(axis[axisNumber]);

// of the current reading exceeds the max or min for this axis,
// reset the max or min:
  if (reading < minima[axisNumber]) {
    minima[axisNumber] = reading;
  }
  if (reading > maxima[axisNumber]) {
    maxima[axisNumber] = reading;
  }

  // map the reading from the analog input range to the output range:
  reading = map(reading, minima[axisNumber], maxima[axisNumber], 0, range);

 // if the output reading is outside from the
 // rest position threshold,  use it:
  if (abs(reading - center) > threshold) {
    distance = (reading - center);
  } 

  // the Y axis needs to be inverted in order to 
  // map the movemment correctly:
  if (axisNumber == 1) {
    distance = -distance;
  }

  // return the distance for this axis:
  return distance;
}

Uma relação completa dos comandos de teclado e mouse que você pode utilizar no Arduino Leonardo estão na página oficial da placa, em http://arduino.cc/en/Reference/MouseKeyboard

Por último, uma observação sobre as funcionalidades de teclado e mouse do Arduino Leonardo. Funções como Mouse.move() e Keyboard.print() enviarão comandos diretamente para o seu computador, e isso pode dificultar um pouco a operação se por acaso algum comando errado for executado. O cursor do seu mouse, por exemplo, pode ficar em algum canto da tela, ou se mover de forma estranha.

Para evitar isso, é recomendável incluir no programa algum tipo de chave para que você possa ligar e desligar essas funções, utilizando-se dos comandos Mouse.begin() e Mouse.end() e Keyboard.begin() e Keyboard.end().

Atualizado - Vídeo do circuito em funcionamento: http://www.arduinoecia.com.br/2014/05/arduino-leonardo-teclado-mouse-video.html

12 comentários:

  1. da para fazer o mesmo com arduino nano?

    ResponderExcluir
    Respostas
    1. Bom dia Matheus,

      Veja este exemplo com o Uno. creio que seja possível fazer com o Nano:

      http://www.practicalarduino.com/projects/virtual-usb-keyboard

      Abraço!

      Excluir






  2. In file included from C:\Users\Ã?talo\Documents\Projetos\teste kb2\TESTA\TESTA.ino:1:0:

    C:\Program Files (x86)\Arduino\libraries\Mouse\src/Mouse.h:29:2: warning: #warning "Using legacy HID core (non pluggable)" [-Wcpp]

    #warning "Using legacy HID core (non pluggable)"

    ^

    In file included from C:\Users\Ã?talo\Documents\Projetos\teste kb2\TESTA\TESTA.ino:4:0:

    C:\Program Files (x86)\Arduino\libraries\Keyboard\src/Keyboard.h:29:2: warning: #warning "Using legacy HID core (non pluggable)" [-Wcpp]

    #warning "Using legacy HID core (non pluggable)"

    ^

    C:\Users\Ã?talo\Documents\Projetos\teste kb2\TESTA\TESTA.ino: In function 'void setup()':

    TESTA:36: error: 'Keyboard' não encontrado. Existe a linha '#include ' no seu sketch?
    TESTA:38: error: 'Mouse' não encontrado. Existe a linha '#include ' no seu sketch?
    C:\Users\Ã?talo\Documents\Projetos\teste kb2\TESTA\TESTA.ino: In function 'void loop()':

    TESTA:47: error: 'Keyboard' não encontrado. Existe a linha '#include ' no seu sketch?
    TESTA:57: error: 'Mouse' não encontrado. Existe a linha '#include ' no seu sketch?
    exit status 1
    'Keyboard' não encontrado. Existe a linha '#include ' no seu sketch?



    Aparece esse erro. Mesmo tendo importado. as 2 lib. o que fazer?

    ResponderExcluir
    Respostas
    1. Bom dia Italo,

      Não sei exatamente, mas me parece que mudou algo na versão nova da IDE. Tente colocar os includes no inicio do programa para o keyboard.h e mouse.h. Aqui eu coloquei e funcionou normalmente. vou atualizar o programa do post:

      #include "Keyboard.h"
      #include "Mouse.h"

      Abraço!

      Excluir
  3. Olá amigo, mesmo colocando os includes
    #warning "Using legacy HID core (non pluggable)"

    o mesmo erro permanece, tens alguma solução?? obrigado as dicas

    ResponderExcluir
  4. olá, gostaria de saber se há a possibilidade de usar o botao direito do mouse

    ResponderExcluir
    Respostas
    1. Oi Lucas,

      Dá sim, veja este link, por favor: https://www.arduino.cc/en/Reference/MouseClick

      Abraço!

      Excluir
  5. Muito legal o post. Funciona com Arduino Pro Micro Atmega32u4???

    ResponderExcluir
  6. Gostaria de saber se alguém poderia me ajudar, como ficaria a programação usando as teclas direita e esquerda do teclado, mas usando o arduino via Bluetooth , para eventualmente usá-lo como um virador, passador de páginas no pdf ou slide do power point

    ResponderExcluir
  7. Funciona no Windows 10?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Teoricamente não tem nenhuma restrição, já que o Leonardo vai aparecer no computador como um dispositivo "HID", que é como aparece um mouse ou teclado USB, por exemplo.

      Abraço!

      Excluir