Capteur de gestes PAJ7620U2
Ce tutoriel montre la mise en oeuvre d’un module Grove capteur de geste PAJ7620U2 avec MicroPython. Vous trouverez ici la fiche technique du capteur PAJ7620U2 de PixArt Imaging Inc.
Le module Grove capteur de gestes PAJ7620U2 :

Ce capteur est capable de reconnaître jusqu’à 9 gestes et peut aussi être utilisé comme un détecteur de proximité. Les gestes possibles, qui doivent être réalisés à quelques centimètres du capteur, sont :
- Balayage du bas vers le haut
- Balayage du haut vers le bas
- Balayage de gauche à droite
- Balayage de droite à gauche
- Mouvement circulaire de sens horaire autour du capteur
- Mouvement circulaire de sens anti-horaire autour du capteur
- On s’approche du capteur
- On séloigne du capteur
- Mouvement “de vague” (agitez la main de gauche à droite devant le capteur comme pour lui dire “au-revoir”)
Vous trouverez une vidéo illustrant ces mouvements ici.
Nous allons dans un premier temps présenter un script mettant en oeuvre le capteur de gestes seul, puis, dans un deuxième temps, l’utiliser pour piloter un module Grove anneau de LED RGB, avec les fonctions de la bibliothèque uasyncio
pour la programmation asynchrone.
Pour commencer : Test du module capteur de gestes
Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.
Ce premier tutoriel montre comment utiliser le capteur de gestes pour envoyer des informations sur le port série de l’USB User. Le capteur communique simplement quel geste il vient de reconnaître.
Le matériel
- Une carte d’extension de base Grove
- La carte NUCLEO-WB55
- Un module Grove capteur de gestes PAJ7620U2
Le script MicroPython
# Objet du script :
# Test d'un module Grove capteur de gestes
# Code adapté de :
# https://github.com/itechnofrance/micropython/blob/master/librairies/paj7620/use_paj7620.py
import paj7620 # Pilotes pour l'anneau de LED RGB et le capteur de gestes
from time import sleep_ms # Pour temporiser et mesurer le temps écoulé
from machine import I2C # Pour gérer le bus I2C
# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur de gestes
i2c = I2C(1)
# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)
# Liste des adresses I2C des périphériques présents
print("Adresses I2C utilisées : " + str(i2c.scan()))
# Adresse du capteur sur le bus I2C : 0x73
PAJ7620U2_ADR = const(0x73)
# Instanciation du capteur de gestes
g = paj7620.PAJ7620(i2c = i2c)
# Liste des gestes
gestes = [ "Aucun geste", "Avant", "Arrière", "Droite", "Gauche", "Haut", "Bas", "Sens horaire", "Sens anti-horaire", "Vague"]
while True:
# Lecture du geste
index = g.gesture()
# Extrait le geste de la liste
if index > 0 and index < 10:
print(gestes[index])
# Temporisation de 10 millisecondes
sleep_ms(10)
Usage
Lancez le script avec CTRL+D. Agitez simplement la main devant le capteur et observez la confirmation (ou pas) de votre geste sur le terminal série de PuTTY.
Pour aller plus loin : Utilisation du module capteur de gestes pour piloter un anneau de LED RGB
Les scripts présentés ci-après sont disponibles dans la zone de téléchargement.
Ce deuxième exemple montre comment modifier l’animation d’un module Grove anneau de LED RGB (adressables, de type Neopixel) à l’aide du module Grove capteur de gestes. Nous souhaitons que l’animation sur l’anneau reste fluide, qu’elle ne soit pas perturbée par la scrutation du capteur de gestes.Cette contrainte nous impose naturellement l’utilisation **des fonctions asynchrones de la bibliothèque uasyncio
de MicroPython. Cet exemple peut être avantageusement transposé à de nombreuses applications qui nécessitent une acquisition de données et leur affichage simultané sans dégrader l’expérience utilisateur.
Le sujet de la programmation asynchrone est vaste, et les possibilités offertes par MicroPython sur ce sujet sont nombreuses et raisonnablement faciles à mettre en oeuvre. Vous trouverez un tutoriel à ce propos ici.
Le matériel
- Une carte d’extension de base Grove
- La carte NUCLEO-WB55
- Un module Grove capteur de gestes PAJ7620U2
- Un module Grove anneau de LED RGB (24 - WS2813 Mini)
Le script MicroPython
# Objet du script :
# Pilotage d'un module Grove anneau de LED RGB avec un module Grove capteur de gestes
import neopixel, paj7620 # Pilotes pour l'anneau de LED RGB et le capteur de gestes
from time import sleep_ms # Pour temporiser et mesurer le temps écoulé
from machine import Pin, I2C # Pour gérer les broches et le bus I2C
import uasyncio # Pour la gestion asynchrone
# On initialise l'anneau de LED sur la broche D2
_NB_LED = const(24) # 24 LED sur l'anneau
ring = neopixel.NeoPixel(Pin('D2'), _NB_LED)
# On utilise l'I2C n°1 de la carte NUCLEO-WB55 pour communiquer avec le capteur de gestes
i2c = I2C(1)
# Pause d'une seconde pour laisser à l'I2C le temps de s'initialiser
sleep_ms(1000)
# Liste des adresses I2C des périphériques présents
print("Adresses I2C utilisées : " + str(i2c.scan()))
# Adresse du capteur sur le bus I2C : 0x73
PAJ7620U2_ADR = const(0x73)
# Instanciation du capteur de gestes
g = paj7620.PAJ7620(i2c = i2c)
ROTATION = 1 # Sens de rotation (horaire au démarrage)
_NB_LED_M1 = const(_NB_LED - 1)
# Coroutine asynchrone de gestion de l'anneau de LED RGB
@micropython.native # Demande au compilateur bytecode de produire un code pour le STM32WB55
async def wheel():
global ROTATION
led = 0
while True:
# Index de la LED acourante
if ROTATION: # Rotation horaire
led += 1
if led > _NB_LED_M1:
led = 0
else: # Rotation anti-horaire
led -= 1
if led < 0:
led = _NB_LED_M1
# Eteint toutes les LED
for i in range(_NB_LED):
ring[i] = (0, 0, 0)
# Allume la LED courante
ring[led] = (128, 128, 128)
ring.write()
# Temporisation non blocante
await uasyncio.sleep_ms(10)
# Coroutine asynchrone de gestion du capteur de gestes
@micropython.native # Demande au compilateur bytecode de produire un code pour le STM32WB55
async def control():
global ROTATION
while True:
geste = g.gesture()
if geste == 7:
print("Sens horaire")
ROTATION = 1
elif geste == 8:
print("Sens anti-horaire")
ROTATION = 0
# Temporisation non blocante
await uasyncio.sleep_ms(100)
# Coroutine asynchrone pour lancer les deux autres coroutines
@micropython.native
async def main():
# Crée une tache par coroutine
task1 = uasyncio.create_task(wheel()) # Tache pour la coroutine de gestion de l'anneau
task2 = uasyncio.create_task(control()) # Tache pour la couroutine de gestion du capteur
await task1, task2 # Reste en pause aussi longtemps que les deux taches ne sont pas terminées
# Démarre le planificateur (et donc, les deux taches)
uasyncio.run(main())
Usage
Lancez le script avec CTRL+D. Réalisez le geste “sens-horaire” (respectivement “sens anti-horaire”) pour animer l’anneau dans le sens-horaire (respectivement sens anti-horaire).