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 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 |
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.
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.