On souhaite programmer le robot MR25 afin de contrôler ces mouvements via la détection des frappements de main :
👏 => Le robot MR25 avance
👏👏 => Le robot MR25 tourne à gauche
👏👏👏 => Le robot MR25 tourne à droite
👏👏👏👏 => Le robot MR25 s’arrête
Le microphone détecte les frappements en analysant le niveau sonore.

Voici un exemple de programme pour contrôler le robot avec le frappement de main :
import subprocess # permet de lancer le programme arecord pour récupérer le son du microphone.
import numpy as np # permet de traiter les données audio et de calculer le RMS.
import MR25
import time
DEVICE = "hw:0,0"
RATE = 48000
CHANNELS = 1
CHUNK = 1024
THRESHOLD = 0.01 # le seuil sonore.
# Temps minimum entre deux frappes
DEBOUNCE_TIME = 0.20
# Temps maximum pour regrouper les frappes
GROUP_TIMEOUT = 0.80
# Le programme attend au maximum 0,8 seconde après la dernière frappe.
cmd = [
"arecord",
"-D", DEVICE,
"-f", "S16_LE",
"-r", str(RATE),
"-c", str(CHANNELS),
"-t", "raw",
"-"
]
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL
)
nombre_frappes = 0
derniere_frappe = 0
dernier_signal = 0
print("Écoute du microphone...")
print("1 frappe = LED rouge")
print("3 frappes = LED verte")
print("Ctrl+C pour arrêter.\n")
try:
while True:
data = process.stdout.read(CHUNK * 2)
if len(data) != CHUNK * 2:
break
audio = np.frombuffer(data, dtype=np.int16)
audio = audio.astype(np.float32) / 32768.0
volume = np.sqrt(np.mean(audio ** 2))
maintenant = time.time()
# Affichage du volume
bar = min(50, int(volume * 50))
print(
f"\rVolume : {volume:.3f} "
f"[{'#' * bar:<50}] "
f"Frappes : {nombre_frappes}",
end="",
flush=True
)
# Détection d'une frappe
if volume > THRESHOLD:
# Évite de compter plusieurs fois la même frappe
if maintenant - derniere_frappe > DEBOUNCE_TIME:
nombre_frappes += 1
derniere_frappe = maintenant
print(f"\n>>> Frappe {nombre_frappes}")
# Si le délai entre les frappes est dépassé,
# on analyse le nombre de frappes
if (
nombre_frappes > 0
and maintenant - derniere_frappe > GROUP_TIMEOUT
):
if nombre_frappes == 1:
print(">>> 1 FRAPPE : avancer")
MR25.ledRGB("100")
MR25.forward(30)
time.sleep(0.5)
MR25.ledRGB("000")
elif nombre_frappes == 2:
print(">>> 2 FRAPPES : tourner à gauche")
MR25.ledRGB("010")
MR25.turnLeft(30)
time.sleep(0.5)
MR25.ledRGB("000")
elif nombre_frappes == 3:
print(">>> 3 FRAPPES : tourner à droite")
MR25.ledRGB("001")
MR25.turnRight(30)
time.sleep(0.5)
MR25.ledRGB("000")
elif nombre_frappes == 4:
print(">>> 4 FRAPPES : STOP")
MR25.ledRGB("111")
MR25.stop()
time.sleep(0.5)
MR25.ledRGB("000")
else:
print(f">>> {nombre_frappes} frappes : aucune action")
# Réinitialisation
nombre_frappes = 0
except KeyboardInterrupt:
print("\n\nArrêt du robot.")
MR25.stop()
finally:
process.terminate() Fin du tuto !
