Robot Maqueen télécommandé - Niveau intermédiaire
Dans ce projet, nous utiliserons deux cartes micro:bit : l'une animera le robot Maqueen déjà présenté ici, et l'autre nous servira de télécommande. La communication entre les deux dispositifs se fait sans fil en utilisant le module radio.
Remarque : Téécommande Infrarouge
Il est possible de transformer ce projet en utilisant une télécommande infrarouge à la place de la seconde micro:bit puisque le robot maqueen est équipé d'un récepteur infrarouge.
La télécommande
Commençons par la télécommande. Nous utiliserons les deux boutons A et B ainsi que l'accéléromètre :
En inclinant la carte, un point se déplace sur la matrice de LED. Sa position indique la vitesse et la direction qui sera communiquée au robot. Le point central signifie l'arrêt.
En appuyant sur le bouton A, la position du point sera envoyée au robot qui bougera selon la position du point
En appuyant sur B, le robot tourne sur place. Il fait la toupie tant que le bouton reste appuyé. Lorsqu'on lâche le bouton, il s'arrête.
Protocole de communication radio
Il y a 3 types de message texte que la télécommande envoie au robot :
TOUPIE : le robot fait la toupie
STOP : le robot s'arrête
x,y : x et y sont des entiers entre -2 et 2 donc prennent 5 valeurs possibles chacun. Le robot se déplace dans la direction correspondant au point (x,y).
Méthode : Le programme télécommande
# Olivier Lecluse
# Avril 2019
from microbit import *
import radio
radio.config(group=3)
radio.on()
SENSIBILITE = 196
toupie = False
while True:
acc = accelerometer.get_values()
dx = max(-2,min(2,acc[0]//SENSIBILITE))
dy = max(-2,min(2,acc[1]//SENSIBILITE))
display.clear()
display.set_pixel(dx+2,dy+2,9)
if button_a.was_pressed():
message = "{},{}".format(dx, dy)
radio.send(message)
if button_b.is_pressed():
if not toupie :
radio.send("TOUPIE")
toupie = True
else:
if toupie:
# toupie or not toupie, that is the question :)
radio.send("STOP")
toupie = False
Le robot
Le robot reçoit les ordres et les exécute. Il utilise également son capteur ultrason pour détecter les obstacles. Si un obstacle est détecté à moins de 10cm, il fait la toupie une seconde et s'arrête l'air confus...
La seule partie du code nécessitant une explication est celle qui transforme les coordonnées du point x,y en vitesse moteur gauche et droite entre -100 et 100. La formule mise au point n'est pas très limpide, aussi vous trouverez ci-dessous un tableau 5x5 donnant pour chaque point de la matrice la vitesse des deux moteurs correspondant.
Correspondance point / vitesse
25/100 | 50/100 | 100/100 | 100/50 | 100/25 |
12/50 | 25/50 | 50/50 | 50/25 | 50/12 |
-100/100 | -50/50 | 0/0 | 50/-50 | 100/-100 |
-12/-50 | -25/-50 | -50/-50 | -50/-25 | -50/-12 |
-25/-100 | -50/-100 | -100/-100 | -100/-50 | -100/-25 |
Méthode : Le programme robot
# Olivier Lecluse
# Avril 2019
from microbit import *
from maqueen import Maqueen
import radio
radio.config(group=3)
radio.on()
SPEED = 50
mq = Maqueen()
while True:
incoming = radio.receive()
if incoming:
if incoming == "TOUPIE":
display.show(Image.HAPPY)
mq.moteurDroit(20)
mq.moteurGauche(-20)
elif incoming == "STOP":
display.show(Image.SAD)
mq.stop()
else:
display.clear()
try:
hx,hy = incoming.split(',')
dx,dy = int(hx), int(hy)
display.set_pixel(dx+2,dy+2,9)
if dy == 0:
vg = dx*SPEED
vd=-vg
else:
vg =-dy*SPEED
vd = vg//2**abs(dx)
if dx<0:
vg,vd = vd,vg
mq.moteurDroit(vd)
mq.moteurGauche(vg)
except:
continue
if mq.distance() < 10:
display.show(Image.CONFUSED)
mq.moteurDroit(-20)
mq.moteurGauche(20)
sleep(1000)
mq.stop()