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 o un ratolí. Per fer-ho cal importar la biblioteca adafruit_hid.

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

from digitalio import DigitalInOut, Direction, Pull
import usb_hid
import board
import time
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT
pols0 = DigitalInOut(board.D0)
pols0.direction = Direction.INPUT
pols0.pull = Pull.UP   
pols1 = DigitalInOut(board.D1)
pols1.direction = Direction.INPUT
pols1.pull = Pull.UP   
pols2 = DigitalInOut(board.D2)
pols2.direction = Direction.INPUT
pols2.pull = Pull.UP   
print("Prem un boto")
while True:
    if not pols0.value:
        print("S'ha premut P0")
        led.value = True
        while not pols0.value:
            pass  # Esperem que el deixi anar
        layout.write("Hola")
    if not pols1.value:
        print("S'ha premut P1")
        led.value = True
        while not pols1.value:
            pass  # Esperem que el deixi anar
        kbd.press(Keycode.SHIFT, Keycode.A)  # premem...
        kbd.release_all()        # Deixem anar
    if not pols2.value:
        print("S'ha premut P2")
        led.value = True
        while not pols2.value:
            pass  # Esperem que el deixi anar
        kbd.press(Keycode.A)  # premem...
        kbd.release_all()        # Deixem anar
    led.value = False
    time.sleep(0.01)

En aquest cas hem posat resistències pull-up i, per tant les entrades que fem servir (D0, D1 i D2) s'activen quan es connecten a GND. El polsador de l'entrada 0 envia un text, la comanda que es fa servir és layout.write. El de l'entrada 1 envia una lletra A majúscula fent servir la comanda kbd.press però fixem-nos que s'envia la pulsació de la tecla majúscules i la de la tecla A. Després hem d'enviar la comanda kbd.release_all que indica que hem deixat anar les tecles. Finalment el polsador de l'entrada 2 envia una A minúscula.

Si provem el programa amb el Mu en primer terme podrem veure els missatges que s'escriuen quan es prem un polsador (per exemple S'ha premut P2). Però si ho fem posant algun programa que admeti escriptura (per exemple la llibreta) podrem anar veient com aparèixen les tres opcions (A, a i Hola) segons el polsador premut.

Important: La biblioteca que estem fent servir (adafruit_hid.keyboard_layout_us, l'única disponible en el moment d'escriure això) correspon al teclat dels EUA. Atès que els codis 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 adafruit_hid.keyboard si hem anomenat kbd a l'objecte Keyboard.

Comanda Acció Exemple Comentari
press Prémer una tecla (sense deixar-la anar) kbd.press(Keycode.A) Sortirà la lletra A minúscula
kbd.press(Keycode.FOUR) Sortirà el número 4
Prémer diverses tecles a la vegada kbd.press(Keycode.A, Keycode.E, Keycode.I) Sortiran les tres lletres minúscules
Prémer tecles de control combinades amb altres tecles kbd.press(Keycode.SHIFT, Keycode.A) Sortirà la lletra A majúscula
kbd.press(Keycode.SHIFT, Keycode.FOUR) Sortirà el símbol $
kbd.press(Keycode.CONTROL, Keycode.HOME) Va a l'inici de la pàgina o del document
release Deixar anar diverses tecles (de cop) kbd.release(Keycode.A)
kbd.release(Keycode.SHIFT, Keycode.A)
release_all Deixar anar totes les tecles (de cop) kbd.release_all()

En la taula següent anem a comentar les opcions disponibles a la biblioteca adafruit_hid.keyboard_layout_us si hem anomenat layout a l'objecte KeyboardLayoutUS.

Comanda Acció Exemple Comentari
keycodes Torna el conjunt de tecles que cal prémer per obtenir el caràcter
Només funciona per a caràcters ASCII i alguns caràcters de control
Retorna les tecles en codificació numèrica
layout.keycodes('a') Retorna (4, )
layout.keycodes('A') Retorna (225, 4)
layout.keycodes('+') Retorna (225, 46)
layout.keycodes('à') Dóna error (no és un caràcter ASCII)
layout.keycodes('€') Dóna error (no és un caràcter ASCII)
write Envia el conjunt de tecles necessàries per escriure la cadena indicada layout.write("Hola") Obtindrem Hola
layout.write("Hola\n") Obtindrem Hola i un salt de línia
layout.write("Hola món") Dóna error (un dels caràcters no és ASCII)

A la taula següent hi ha els codis corresponents a les diferents tecles així com el valor numèric que els correspon (que és el que ens donarà la funció keycodes). Per a les tecles que corresponen a caràcters, 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
Codi
keycodes
Codi
numèric
Normal SHIFT RIGHT_ALT Codi
keycodes
Codi
numèric
Normal SHIFT RIGHT_ALT
A 4 a A N 17 n N
B 5 b B O 18 o O
C 6 c C P 19 p P
D 7 d D Q 20 q Q
E 8 e E R 21 r R
F 9 f F S 22 s S
G 10 g G T 23 t T
H 11 h H U 24 u U
I 12 i I V 25 v V
J 13 j J W 26 w W
K 14 k K X 27 x X
L 15 l L Y 28 y Y
M 16 m M Z 29 z Z

Números i símbols       Números i símbols
Codi
keycodes
Codi
numèric
Normal SHIFT RIGHT_ALT Codi
keycodes
Codi
numèric
Normal SHIFT RIGHT_ALT
ONE 30 1 ! | MINUS 45 ' ?
TWO 31 2 " @ EQUALS 46 ¡ ¿
THREE 32 3 · # LEFT_BRACKET 47 ` ^ [
FOUR 33 4 $ ˜ RIGHT_BRACKET 48 + * ]
FIVE 34 5 % BACKSLASH 49 ç Ç }
SIX 35 6 & ¬ POUND 50 ç Ç }
SEVEN 36 7 / SEMICOLON 51 ñ Ñ
EIGHT 37 8 ( QUOTE 52 ´ ¨ {
NINE 38 9 ) GRAVE_ACCENT 53 º ª
ZERO 39 0 = COMMA 54 , ;
SPACEBAR 44 Espai PERIOD 55 . :
SPACE FORWARD_SLASH 56 - _

Tecles de control i desplaçament       Tecles de control i desplaçament
Codi
keycodes
Codi
numèric
Nom de la tecla Codi
keycodes
Codi
numèric
Nom de la tecla
ENTER 40 Salt de línia DOWN_ARROW 81 Fletxa avall
RETURN UP_ARROW 82 Fletxa amunt
ESCAPE 41 Esc APPLICATION 101 Desplegar menú
BACKSPACE 42 Esborrar enrere POWER 102 Alimentació (Mac)
TAB 43 Tabulador LEFT_CONTROL 224 Ctrl (esquerra)
CAPS_LOCK 57 Bloq Mayús CONTROL
PRINT_SCREEN 70 Impr Pant (PetSis) LEFT_SHIFT 225 Majúscules (esquerra)
SCROLL_LOCK 71 Bloq Despl SHIFT
PAUSE 72 Pausa (Inter) LEFT_ALT 226 Alt (esquerra)
INSERT 73 Insert ALT
HOME 74 Inicio LEFT_GUI 227 Windows o
Mac (esquerra)
PAGE_UP 75 RePág GUI
DELETE 76 Supr RIGHT_CONTROL 228 Ctrl (dreta)
END 77 Fin RIGHT_SHIFT 229 Majúscules (dreta)
PAGE_DOWN 78 AvPág RIGHT_ALT 230 Alt Gr
RIGHT_ARROW 79 Fletxa dreta RIGHT_GUI 231 Windows o Mac (dreta)
LEFT_ARROW 80 Fletxa esquerra

Tecles de funció       Tecles de funció       Tecles de funció       Tecles de funció       Tecles de funció
Codi
keycodes
Codi
numèric
Codi
keycodes
Codi
numèric
Codi
keycodes
Codi
numèric
Codi
keycodes
Codi
numèric
Codi
keycodes
Codi
numèric
F1 58 F5 62 F9 66 F13 104 F17 108
F2 59 F6 63 F10 67 F14 105 F18 109
F3 60 F7 64 F11 68 F15 106 F19 110
F4 61 F8 65 F12 69 F16 107

Teclat numèric       Teclat numèric
Codi
keycodes
Codi
numèric
Tecla Codi
keycodes
Codi
numèric
Tecla
KEYPAD_NUMLOCK 83 Bloq Num KEYPAD_FIVE 93 5
KEYPAD_FORWARD_SLASH 84 / KEYPAD_SIX 94 Fletxa dreta 6
KEYPAD_ASTERISK 85 * KEYPAD_SEVEN 95 Inicio 7
KEYPAD_MINUS 86 - KEYPAD_EIGHT 96 Fletxa amunt 8
KEYPAD_PLUS 87 + KEYPAD_NINE 97 RePág 9
KEYPAD_ENTER 88 Intro KEYPAD_ZERO 98 Ins 0
KEYPAD_ONE 89 Fin 1 KEYPAD_PERIOD 99 Supr .
KEYPAD_TWO 90 Fletxa avall 2 KEYPAD_BACKSLASH 100 \
KEYPAD_THREE 91 AvPág 3 KEYPAD_EQUALS 103 = (Mac)
KEYPAD_FOUR 92 Fletxa esquerra 4

Emulació de ratolí

Ara anem a veure un exemple emulant el ratolí. En aquest cas el sensor d'acceleració d'una placa Circuit Playground Express ens servirà per moure el punter a la pantalla.

import adafruit_lis3dh
import board
import busio
import time
import adafruit_hid.mouse
rat = adafruit_hid.mouse.Mouse()
i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=25)
lis3dh.range = adafruit_lis3dh.RANGE_2_G
umbral1 = 2
umbral2 = 1
while True:
    x, y, z = lis3dh.acceleration
    if x > umbral1 and y < umbral2 and y > -umbral2:
        rat.move(-10, 0)
    if x < -umbral1 and y < umbral2 and y > -umbral2:
        rat.move(10, 0)
    if y > umbral1 and x < umbral2 and x > -umbral2:
        rat.move(0, 10)
    if y < -umbral1 and x < umbral2 and x > -umbral2:
        rat.move(0, -10)
    time.sleep(0.1)

En la taula següent anem a comentar les opcions disponibles a la biblioteca adafruit_hid.mouse si hem anomenat rat a l'objecte Mouse.

Comanda Acció Exemple Comentari
click Fa un clic (prémer i deixar anar)
sobre un o més botons del ratolí
rat.click(Mouse.LEFT_BUTTON) Els botons disponibles són:
    LEFT_BUTTON
    RIGHT_BUTTON
    MIDDLE_BUTTON
rat.click(Mouse.LEFT_BUTTON |
Mouse.RIGHT_BUTTON)
press Prem un o més botons del ratolí rat.press(Mouse.MIDDLE_BUTTON)
rat.press(Mouse.LEFT_BUTTON |
Mouse.MIDDLE_BUTTON)
release Deixa anar un o més botons del ratolí rat.release(Mouse.RIGHT_BUTTON)
rat.release(Mouse.RIGHT_BUTTON |
Mouse.MIDDLE_BUTTON)
release_all Deixa anar tots els botons del ratolí rat.release_all()
move Desplaçar el punter o moure
la roda del ratolí
rat.move(20, 10) Mou el punter 20 posicions a la dreta i 10 posicions avall
rat.move(-20, -10) Mou el punter 20 posicions a l'esquerra i 10 posicions amunt
rat.move(10, 0, 5) Mou el punter 10 posicions a la dreta i la roda 5 posicions amunt
rat.move(0, 0, -3) Mou la roda 3 posicions avall
rat.move(x=30, y=-20) Mou el punter 30 posicions a la dreta i 20 posicions amunt
rat.move(wheel=-2) Mou la roda 2 posicions avall

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