| 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 | 
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 | 
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.

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