Qwiic Keypad 12 boutons sous MicroPython

Bonjours à tous,

Toujours occupé à poursuivre les découvertes du MicroMod-RP2040 de SparkFun avec le Machine Learning Carrier Board, c'est le module "Qwiic Keypad 12 Buttons" qui est à l'honneur.

Keypad 12 touches - interface Qwiic - Sparkfun

L'interface Qwiic de Sparkfun transporte un bus I2C et une alimentation 3.3V sur une connectique JSTSH-4 pôles permettant de brancher rapidement des modules sur un microcontrôleur. 

Dans l'exemple ci-dessous, le module est branché sur un MicroMod-RP2040 sous MicroPython.

Source: qwiic-keypad-i2c (GitHub, MCHobby)

Comme il s'agit d'un bus I2C, il est possible de chaîner plusieurs modules sur un même bus (pour autant que chaque module dispose de sa propre adresse).

Mais rien n'empêche de le brancher sur un Raspberry-Pi Pico (ou un PYBStick-RP2040)

Source: qwiic-keypad-i2c (GitHub, MCHobby)

Note: cette connectique est par ailleurs connue chez Adafruit sous le nom StemmaQT.

Bibliothèque MicroPython

Avant de pouvoir utiliser le KeyPad I2C sur votre plateforme MicroPython, il faudra y copier la bibliothèque kpadi2c.py sur le microcontrôleur.

Cette bibliothèque est disponible sur le dépôt GitHub.

Du code... pour le peuple

Voici comment utiliser la bibliothèque kpadi2c :
from machine import I2C, Pin
from kpadi2c import Keypad_I2C
import time

# MicroMod-RP2040 - SparkFun
i2c = I2C( 0, sda=Pin(4), scl=Pin(5) )
# Raspberry-Pi Pico
# i2c = I2C( 1 ) # sda=GP6, scl=GP7

kpad = Keypad_I2C( i2c )

print( 'KeyPad connected:', 'Yes' if kpad.is_connected else 'NO' )
print( 'Version:', kpad.version )
print( 'Press buttons: * to exit reading loop')
while True:
	kpad.update_fifo()
	_btn = kpad.button # Return ASCII code
	while _btn != 0:
		print( "ASCII: %s,  Char: %s" % (_btn, chr(_btn) ) )
		if _btn == 42:
			raise Exception( 'User Exit!' )
		kpad.update_fifo()
		_btn = kpad.button # read next
	time.sleep_ms( 200 )

Le code est assez transparent en soi. Il faut faire un appel à update_fifo() pour réaliser la mise-à-jour des registres du clavier (pour acquérir, la prochaine touche pressée). La dernière touche pressée est acquise avec un appel à button() .

L'éxécution du script d'exemple produit le résultat suivant.

>>> import test
KeyPad connected: Yes
Version: v1.0
Press buttons: * to exit reading loop
ASCII: 49,  Char: 1
ASCII: 50,  Char: 2
ASCII: 51,  Char: 3
ASCII: 52,  Char: 4
ASCII: 53,  Char: 5
ASCII: 54,  Char: 6
ASCII: 55,  Char: 7
ASCII: 56,  Char: 8
ASCII: 57,  Char: 9
ASCII: 48,  Char: 0
ASCII: 35,  Char: #
ASCII: 35,  Char: #
ASCII: 35,  Char: #
ASCII: 42,  Char: *
Traceback (most recent call last):
  File "&tl;stdin>", line 1, in &tl;module>
  File "test.py", line 34, in &tl;module>
Exception: User Exit!

Réaliser un DigiCode

Le bibliothèque contient un deuxième fichier nommé kpadcode.py . Ce dernier contient la classe CodeChecker .
from machine import I2C, Pin
from kpadcode import CodeChecker
import time

# MicroMod-RP2040 - SparkFun
i2c = I2C( 0, sda=Pin(4), scl=Pin(5) )
# Raspberry-Pi Pico
# i2c = I2C( 1 ) # sda=GP6, scl=GP7

# Fonction de rappel utilisée par CodeChecker pour tenir informé
# de l'encodage utilisateur
def update_display( user_entry, timeout ):
	# user_entry : chaîne de caractères
	# timeout : True lorsque l'utilisateur n'encode plus rien (et RAZ user_entry)
	if timeout:
		print( 'Callback: timeout!' )
	print( 'Callback: "%s"' % user_entry )

locker = CodeChecker( i2c, address=0x4B, code='1234*' ) # Code secret = '1234*'
locker.on_update = update_display # Associe la fonction de rappel
print( 'KeyPad connected:', 'Yes' if locker.is_connected else 'NO' )
print( 'Version:', locker.version )

locked = True
while locked:
	print( '==== Enter KeyCode to Unlock ====' )
	# execute() demande un code sur le clavier. Retourne True s'il est correct.
	# Retourne False si l'utilisateur n'encode rien et délai d'attente dépassé (timeout)
	locked = not( locker.execute() )
	if locked:
		print( 'Execute() timeout! Try again' )

# La boucle se termine lorsque le code est correct
print( 'Yes! Unlocked!' )

Ce qui produit le résultat suivant où les différents messages montre le fonctionnement interne de la classe CodeChecker .

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> import checkcode
KeyPad connected: Yes
Version: v1.0
==== Enter KeyCode to Unlock ====
Callback: "     "
Callback: "5    "
Callback: "55   "
Callback: "555  "
Callback: "5555 "
Callback: "55555"
Callback: "     "

Callback: "     "
Callback: "4    "
Callback: "44   "
Callback: timeout!
Callback: "     "
Callback: "4    "
Callback: "44   "
Callback: "444  "
Callback: timeout!
Callback: "     "
Execute() timeout! Try again
==== Enter KeyCode to Unlock ====
Callback: "     "
Execute() timeout! Try again
==== Enter KeyCode to Unlock ====
Callback: "     "
Execute() timeout! Try again
==== Enter KeyCode to Unlock ====
Callback: "     "
Callback: "6    "
Callback: "66   "
Callback: "666  "
Callback: "6666 "
Callback: "66666"
Callback: "     "
Callback: timeout!
Callback: "     "
Execute() timeout! Try again
==== Enter KeyCode to Unlock ====
Callback: "     "
Callback: "1    "
Callback: "12   "
Callback: "123  "
Callback: "1234 "
Callback: "12345"
Callback: "     "
Callback: "1    "
Callback: "12   "
Callback: "123  "
Callback: "1234 "
Callback: "1234*"
Yes! Unlocked!

Ressources

Envie d'en savoir plus?

Aucun commentaire