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.

RemarqueTéé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éthodeLe programme télécommande

1
# Olivier Lecluse
2
# Avril 2019
3
4
from microbit import *
5
import radio
6
7
radio.config(group=3)
8
radio.on()
9
10
SENSIBILITE = 196
11
12
toupie = False
13
14
while True:
15
    acc = accelerometer.get_values()
16
    dx = max(-2,min(2,acc[0]//SENSIBILITE))
17
    dy = max(-2,min(2,acc[1]//SENSIBILITE))
18
    display.clear()
19
    display.set_pixel(dx+2,dy+2,9)
20
    if button_a.was_pressed():
21
        message = "{},{}".format(dx, dy)
22
        radio.send(message)
23
    if button_b.is_pressed():
24
        if not toupie :
25
            radio.send("TOUPIE")
26
            toupie = True
27
    else:
28
        if toupie:
29
        # toupie or not toupie, that is the question :)
30
            radio.send("STOP")
31
            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éthodeLe programme robot

1
# Olivier Lecluse
2
# Avril 2019
3
4
from microbit import *
5
from maqueen import Maqueen
6
import radio
7
8
radio.config(group=3)
9
radio.on()
10
11
SPEED = 50
12
13
mq = Maqueen()
14
while True:
15
    incoming = radio.receive()
16
    if incoming:
17
        if incoming == "TOUPIE":
18
            display.show(Image.HAPPY)
19
            mq.moteurDroit(20)
20
            mq.moteurGauche(-20)
21
        elif incoming == "STOP":
22
            display.show(Image.SAD)
23
            mq.stop()
24
        else:
25
            display.clear()
26
            try:
27
                hx,hy = incoming.split(',')
28
                dx,dy = int(hx), int(hy)
29
                display.set_pixel(dx+2,dy+2,9)
30
                if dy == 0:
31
                    vg = dx*SPEED
32
                    vd=-vg
33
                else:
34
                    vg =-dy*SPEED
35
                    vd = vg//2**abs(dx) 
36
                if dx<0:
37
                    vg,vd = vd,vg
38
                mq.moteurDroit(vd)
39
                mq.moteurGauche(vg)
40
            except:
41
                continue
42
    if mq.distance() < 10:
43
            display.show(Image.CONFUSED)
44
            mq.moteurDroit(-20)
45
            mq.moteurGauche(20)
46
            sleep(1000)
47
            mq.stop()
48