Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Emulació de teclat i ratolí

Emulació de teclat

El microcontrolador pot enviar caràcters a l'ordinador emulant el comportament d'un teclat. Per fer-ho cal importar la biblioteca Keyboard.h.

Comencem veient un exemple en el que uns polsadors connectats a una placa Flora emulen la polsació de tecles:

#include <Keyboard.h>
void setup() {
  Serial.begin(9600);
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  Keyboard.begin();
  delay(1000);
  Serial.println("Prem un botó");
}
void loop() {
  // Polsador 0
  if (!digitalRead(0)) {
    Serial.println("Has premut el botó 0, escrivim Hola"); 
    Keyboard.write('H');
    Keyboard.write('o');
    Keyboard.write('l');
    Keyboard.write('a');
  }
  while (!digitalRead(0))
    ;    // Esperem que es deixi anar
  // Polsador 1
  if (!digitalRead(1)) {
    Serial.println("Has premut el botó 1, escrivim 'm'"); 
    Keyboard.press('m');
  }
  while (!digitalRead(1))
    ;    // Esperem que es deixi anar
  Keyboard.release('m');
  // Polsador 2
  if (!digitalRead(2)) {
    Serial.println("Has premut el botó 2, escrivim 'M'"); 
    Keyboard.press(KEY_LEFT_SHIFT);
    Keyboard.press('m');
  }
  while (!digitalRead(2))
    ;    // Esperem que es deixi anar
  Keyboard.releaseAll();
  // Polsador 3
  if (!digitalRead(3)) {
    Serial.println("Has premut el botó 3, enviem ENTER"); 
    Keyboard.press(KEY_RETURN);
  }
  while (!digitalRead(3))
    ;    // Esperem que es deixi anar
  Keyboard.release(KEY_RETURN);
  delay(200);    // Pausa per evitar rebots
}

En aquest cas hem posat resistències pull-up i, per tant, les entrades que fem servir (de la 0 a la 3) s'activen quan es connecten a GND. El polsador de l'entrada 0 envia un text, la comanda que es fa servir és Keyboard.write, que permet enviar caràcters ASCII individualment i cal posar-li el caràcter entre cometes simples o el seu codi ASCII. El de l'entrada 1 envia una lletra m fent servir la comanda Keyboard.press i després hem d'enviar la comanda Keyboard.release per indicar que hem deixat de polsar la tecla. El polsador de l'entrada 2 envia una M, fixem-nos que s'envia la pulsació de la tecla majúscules i la de la tecla M. Després hem enviat la comanda Keyboard.releaseAll que indica que hem deixat anar les tecles, així no cal enviar un Keyboard.release per a cada una. La funció Keyboard.write ja envia l'ordre de deixar anar la tecla i, per tant, no cal dir res més. Finalment, el polsador de l'entrada 2 envia la pulsació de la tecla ENTER. Si mb les comandes Keyboard.write i Keyboard.press s'envia una lletra majúscula, en realitat s'acaba enviant la tecla de majúscules i la de la lletra corresponent.

Atenció: Quan provem el programa hem de tenir la precaució de posar el cursor sobre una aplicació en la que poguem escriure, per exemple la llibreta, on anirem veient els caràcters que s'envien en prémer els polsadors. Si tinguéssim el cursor en el nostre programa a l'entorn Arduino veuríem com el programa es modifica amb els caràcters que es van enviant. Quan fem programes, cal que ens assegurem que hi ha un estat en el que el programa no envia caràcters perquè sinó se'ns farà molt difícil modificar-lo.

Important: La biblioteca que estem fent servir correspon al teclat dels EUA. Atès que els codis dels caràcters especials estan relacionats amb la posició de la tecla i no amb el caràcter, en un altre teclat podem obtenir caràcters diferents. Així doncs, es fa imprescindible fer proves abans de donar un programa per definitiu).

En la taula següent anem a comentar les opcions disponibles a la biblioteca Keyboard.h.

Comanda Acció Exemple Comentari
press Prémer una tecla (sense deixar-la anar) Keyboard.press('m') Envia la tecla M
Sortirà la lletra M minúscula
Keyboard.press('M') Envia la tecla majúscules i la tecla m
Sortirà la lletra M majúscula
Keyboard.press(109) Envia la tecla M
Sortirà la lletra M minúscula
Keyboard.press(77) Envia la tecla majúscules i la tecla m
Sortirà la lletra M majúscula
Keyboard.press('4') Envia la tecla 4
Sortirà un 4
Prémer tecles de control combinades amb altres tecles Keyboard.press(KEY_RIGHT_SHIFT)
Keyboard.press('a')
Envia la tecla majúscules i la tecla A
Sortirà la lletra A majúscula
Keyboard.press(KEY_RIGHT_SHIFT)
Keyboard.press('7')
Sortirà el símbol /
Keyboard.press(KEY_RIGHT_CTRL)
Keyboard.press(KEY_HOME)
Envia la tecla majúscules i la tecla inici
Va a l'inici de la pàgina o del document
release Deixar anar una diverses tecles (de cop) Keyboard.release('b') Deixa anar la tecla B
Keyboard.release('B') Deixa anar la tecla majúscules i la tecla B
releaseAll Deixar anar totes les tecles (de cop) Keyboard.releaseAll()

També tenim les funcions Keyboard.print i Keyboard.println que ens permeten enviar una seqüència de caràcters, que en el segon cas acabarà amb un salt de línia. El següent programa n'és un exemple.

#include <Keyboard.h>
void setup() {
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
  delay(1000);
}
void loop() {
  // Polsador 0
  if (!digitalRead(0)) {
    Keyboard.print("Hola");
  }
  while (!digitalRead(0))
    ;    // Esperem que es deixi anar
  // Polsador 1
  if (!digitalRead(1)) {
    Keyboard.println("Bon dia");
  }
  while (!digitalRead(1))
    ;    // Esperem que es deixi anar
  // Polsador 2
  if (!digitalRead(2)) {
    Keyboard.println();
  }
  while (!digitalRead(2))
    ;    // Esperem que es deixi anar
  delay(200);    // Pausa per evitar rebots
}

A la taula següent hi ha els caràcters que hem de posar entre cometes simples i els resultats que obrindrem segons la combinació. Hem posat els caràcters que obtindríem amb els fitxers de configuració de teclat que acostumem a fer servir. Cal tenir present que el comportament que obtindrem amb moltes de les tecles depèn del programa en el que les fem servir o del context del programa.

Lletres       Lletres
Caràcter Normal KEY_RIGHT_SHIFT
KEY_LEFT_SHIFT
KEY_RIGHT_ALT Caràcter Normal KEY_RIGHT_SHIFT
KEY_LEFT_SHIFT
KEY_RIGHT_ALT
a a A n n N
b b B o o O
c c C p p P
d d D q q Q
e e E r r R
f f F s s S
g g G t t T
h h H u u U
i i I v v V
j j J w w W
k k K x x X
l l L y y Y
m m M z z Z

Números i símbols       Números i símbols
Caràcter Normal SHIFT RIGHT_ALT Codi Normal SHIFT RIGHT_ALT
1 1 ! | 39 ´ ¨ {
2 2 " @ 44 , ;
3 3 · # 45 ' ?
4 4 $ ˜ 46 . :
5 5 % 47 - _
6 6 & ¬ 59 ñ Ñ
7 7 / 63 ¡ ¿
8 8 ( 91 ` ^ [
9 9 ) 92 ç Ç }
0 0 = 93 + * ]
Espai Espai 96 º ª \

Nota: Per als caràcters especials hem fet servir el seu codi numèric. Si no obtenim els caràcters llistats vol dir que el nostre teclat no es correspon amb el de la taula. Llavors haurem de provar els codis ASCII que corresponen a caràcters que no són ni lletres ni xifres (és a dir del 33 al 47, del 58 al 64, del 91 al 96 i del 123 al 126) fins trobar el que ens fa falta.

Tecles de control i desplaçament       Tecles de control i desplaçament
Codi Nom de la tecla Codi Nom de la tecla
KEY_LEFT_CTRL Ctrl (esquerra) KEY_RIGHT_CTRL Ctrl (dreta)
KEY_LEFT_SHIFT Majúscules (esquerra) KEY_RIGHT_SHIFT Majúscules (dreta)
KEY_LEFT_ALT Alt (esquerra) KEY_RIGHT_ALT Alt Gr
KEY_LEFT_GUI Windows o
Mac (esquerra)
KEY_RIGHT_GUI Windows o Mac (dreta)
KEY_UP_ARROW Fletxa amunt KEY_DOWN_ARROW Fletxa avall
KEY_LEFT_ARROW Fletxa esquerra KEY_RIGHT_ARROW Fletxa dreta
KEY_BACKSPACE Esborrar enrere KEY_TAB Tabulador
KEY_RETURN Salt de línia KEY_ESC Esc
KEY_INSERT Insert KEY_DELETE Supr
KEY_PAGE_UP RePág KEY_PAGE_DOWN AvPág
KEY_HOME Inicio KEY_END Fin
KEY_CAPS_LOCK Bloq Mayús

Tecles de funció
Codi Codi Codi Codi
KEY_F1 KEY_F4 KEY_F7 KEY_F10
KEY_F2 KEY_F5 KEY_F8 KEY_F11
KEY_F3 KEY_F6 KEY_F9 KEY_F12

Emulació de ratolí

Ara anem a veure un exemple emulant el ratolí. Comencem veient un exemple en el que uns polsadors connectats a una placa Flora ens servirà per moure el punter a la pantalla.

#include <Mouse.h>
void setup() {
  Serial.begin(9600);
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  Mouse.begin();
  delay(1000);
  Serial.println("Prem un botó");
}
void loop() {
  // Polsador 0
  if (!digitalRead(0)) {
    Serial.println("Has premut el botó 0, pujar"); 
    Mouse.move(0, -5, 0);
  }
  while (!digitalRead(0))
    ;    // Esperem que es deixi anar
  // Polsador 1
  if (!digitalRead(1)) {
    Serial.println("Has premut el botó 1, dreta"); 
    Mouse.move(5, 0, 0);
  }
  while (!digitalRead(1))
    ;    // Esperem que es deixi anar
  // Polsador 2
  if (!digitalRead(2)) {
    Serial.println("Has premut el botó 2, baixar"); 
    Mouse.move(0, 5, 0);
  }
  while (!digitalRead(2))
    ;    // Esperem que es deixi anar
  // Polsador 3
  if (!digitalRead(3)) {
    Serial.println("Has premut el botó 3, esquerra"); 
    Mouse.move(-5, 0, 0);
  }
  while (!digitalRead(3))
    ;    // Esperem que es deixi anar
  // Polsador 12
  if (!digitalRead(12)) {
    Serial.println("Has premut el botó 12, clic"); 
    Mouse.click();
  }
  while (!digitalRead(12))
    ;    // Esperem que es deixi anar
  delay(200);    // Pausa per evitar rebots
}

Atenció: Quan fem programes, cal que ens assegurem que hi ha un estat en el que el programa no envia caràcters perquè sinó se'ns farà molt difícil modificar-lo.

En la taula següent anem a comentar les opcions disponibles a la biblioteca Mouse.h.

Comanda Acció Exemple Comentari
click Fa un clic (prémer i deixar anar)
sobre un botó del ratolí
Mouse.click(MOUSE_RIGHT) Els botons disponibles són:
    MOUSE_LEFT
    MOUSE_RIGHT
    MOUSE_MIDDLE
 
 Si no posem res és el de l'esquerra
press Prem un botó del ratolí Mouse.press(MOUSE_MIDDLE)
release Deixa anar un botó del ratolí Mouse.release(MOUSE_RIGHT)
move Desplaçar el punter o moure
la roda del ratolí
Mouse.move(20, 10, 0) Mou el punter 20 posicions a la dreta i 10 posicions avall
Mouse.move(-20, -10, 0) Mou el punter 20 posicions a l'esquerra i 10 posicions amunt
Mouse.move(10, 0, 5) Mou el punter 10 posicions a la dreta i la roda 5 posicions amunt
Mouse.move(0, 0, -3) Mou la roda 3 posicions avall

Els valors han de ser signed char i, per tant, han d'estar entre -127 i 127

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.