Clavier I2C pour application MicroControleur (Arduino, MicroBit, MicroPython, M5Stack, Pyboard & PYBStick)

Dans les tréfonds de la gamme M5Stack nouvellement ouverte, nous avons déniché cette petite merveille.
CardKB un clavier pour MicroControleur
Je ne sais pas pour vous mais pour mois, un clavier c'est justement ce qui manque le plus dans le monde microcontrôleur.
Et comme celui-ci expose une interface I2C, nous nous retrouvons avec un module économique en broche. Même s'il est Qwerty... pour moi c'est top! cela manquait trop.

Quel langage de programmation?

Développé par M5Stack, ce module est supporté sous les plateformes Arduino par M5Stack lui même.
Du coup, ce joujou est compatible avec les plateforme suivantes:
  • Arduino support par M5Stack
  • Pyboard sous MicroPython, testé
  • PYBStick sous MicroPython
  • Micro:Bit sous MicroPython
  • M5Stack sous MicroPython, testé
Elle est pas belle la vie?

Quelques spécifications

CardKB - Clavier I2C
En réalisant le pilote MicroPython, de nombreux points sont venu améliorer notre appréciation de ce produit.
  1. Le fabriquant parle de "Full Featured Keyboard" et il faut avouer que celui-ci est particulièrement complet.
    Le clavier produit des minuscules, majuscules, symboles courant et même des touches directionnelle.
  2. La touche "SYM" (symbole) permet d'atteindre une foule de caractères généralement omis sur ce type de produit: @ # } ] $ ....
  3. La touche ESC, TAB, Retour arrière (backspace) et Retour clavier (Return) sont disponible.
  4. Des touches directionnelle pour déplacer un curseur sont présents (sous le microcontrôleur).
  5. Pas assez de touche ou besoin de fonctions spéciale? et bien la touche "Fn" (fonction) permet de créer autant de composition qu'il n'y a de touches.
Dans les bonnes nouvelles, ce produit fonctionne aussi bien sous 3.3V que 5V. Idéal donc pour nos microcontrôleurs favori.

Par contre, il faut aussi rester réaliste, c'est un petit clavier... donc adapté à de petites saisies mais pas question de faire de l'encodage intensif ;-)

Exploiter l'ASCII
Ce module exploite la codification ASCII (8 bits de données), ce qui est idéal pour transporter l'information sur un bus I2C.

Avant l'unicode, il y avait d'autres normes dont la codification ASCII (American Standard Code for Information Interchange) que les plus vieux d'entre-nous ont connu avec les premiers ordinateur familiaux (Commodore 64, Spectrum, etc).

L'ASCII est codée sur 8 bits (soit 255 caractères) dont seuls les 127 premiers caractères sont normalisés pour inclure l'alphabet courant, de nombreux symboles et des caractères de contrôles (ESC, BACKSPACE, RETURN, etc) hérités du monde Telex (télétypes). Les 128 derniers étant plutôt resté libre et permettant de mettre en place des caractères complémentaires.
Dans le cas du présent clavier, ces caractères complémentaires permettent de codifier les touches "FN" (fonction) et les touches de déplacement de curseur.

Connecteur Grove

La plupart des modules proposés par M5Stack sont équipés de connecteurs Grove, ce qui facilite les connexions au possible sur M5Stack.
Brancher un module Grove
Mais il n'est pas nécessaire d'avoir une carte compatible Groove pour utiliser ce type de module. Il existe des connecteurs Grove-vers-Pin (ou couper les fils d'un câble de raccordement).

Cas pratique

Passons à la pratique! Voici un des exemples issus de la bibliothèque CardKB pour MicroPython. Le schéma est également disponible pour Pyboard.
Brancher CardKB sur une PYBStick - Source: esp8266-upy/cardkb

L'exemple ci-dessous utilise la méthode read_key() qui permet de récupérer le KeyCode, le caractère (si disponible) et la touche de fonction activée (si applicable).
from machine import I2C
from cardkb import *

# Pyboard : X10=sda, X9=scl
# PYBStick: S3=sda, S5=scl
i2c = I2C(1)
# M5Stack : Connecteur Grove - réduire la vitesse est nécessaire
# i2c = I2C(freq=100000, sda=21, scl=22)

keyb = CardKB( i2c )

MOD_TEXT = { MOD_NONE : 'none', MOD_SYM : 'SYMBOL', MOD_FN : 'FUNCTION'}
CTRL_NAME = {0xB5:'UP',0xB4:'LEFT',0xB6:'DOWN',0xB7:'RIGHT',0x1B:'ESC',0x09:'TAB',0x08:'BS',0x7F:'DEL'}

print( 'Keycode | Ascii | Modifier' )
print( '---------------------------')
while True:
	keycode,ascii,modifier = keyb.read_key()

	# Pas de touche pressée = rien a afficher
	if keycode == None:
		continue

	# Les touche de contrôle ne peuvent pas être affichées normalement
	# Donc remplacer les touches de contrôle par leur libellé (plus facile à lire)
	if keyb.is_ctrl( keycode ):
		if keycode in CTRL_NAME:
			ascii = CTRL_NAME[keycode]
		else: # On the connait pas le nom pour le KeyCode
			ascii = 'ctrl' # Donc on remplace avec la chaîne "ctrl"

	# Afficher code de la touche, le caractère et la touche modifiante (si utilisée)
	print( "  %5s | %5s | %s" %(hex(keycode), ascii, MOD_TEXT[modifier]) )
exemple disponible dans les sources de la bibliothèque sous le nom test_readkey.py .
>>> import test_readkey
Keycode | Ascii | Modifier
---------------------------
   0xb5 |    UP | none
   0xb6 |  DOWN | none
   0xb4 |  LEFT | none
   0xb7 | RIGHT | none
   0xb7 | RIGHT | none
   0xb7 | RIGHT | FUNCTION
   0xb7 | RIGHT | none
   0x71 |     q | none
   0x77 |     w | none
   0x65 |     e | none
   0x85 |  None | FUNCTION
   0x35 |     5 | none
   0x50 |     P | none
   0x22 |     " | SYMBOL
   0x1b |   ESC | none
   0x1b |   ESC | none
   0x1b |   ESC | none
   0x80 |  None | FUNCTION
    0x8 |    BS | none
   0x7f |   DEL | none
   0x20 |       | none
   0xaf |  None | FUNCTION
Voici qui termine notre petite introduction.
Envie d'en savoir plus? n'hésitez pas à consulter les liens ci-dessous.

Où acheter

Aucun commentaire