Utiliser le robot Maqueen sur Python

Le robot Maqueen micro:bit est un robot très bon marché (autour de 20€) contrôlé par la carte micro:bit. Il est petit, maniable et facile d'utilisation. Il possède beaucoup de fonctionnalités :

  • capteurs de suivi de ligne

  • LEDs

  • 4 LED RVB neopixel pour éclairage d'ambiance

  • capteur de distance ultrason

  • buzzer pour effets sonores

  • moteurs à engrenage contrôlables séparément par i2c

  • alimentation par pack de 3 piles AAA

  • capteur infrarouge permettant au robot d'être télécommandé

A l'origine, ce robot se programme par blocs. J'ai développé un module python permettant de le programmer facilement sous Python également.

MéthodeInstallation du module pilote maqueen sous Python

Pour installer le module sur Mu-editor :

téléchargez le module maqueen.zip [zip][1] et décompressez-le dans votre dossier mu_code

Dans Mu, cliquez sur l'icône

Si vous avez copié le fichier maqueen.py dans le dossier mu_code, vous devriez le voir apparaître coté ordinateur. glissez-le sur la carte micro:bit. Vous devriez obtenir quelque chose du genre : maqueenFichier.png[2]

FondamentalMéthodes fournies par le module

  • avance(vitesse) : avance en ligne droite. vitesse est un nombre entre 0 et 100. Ce paramètre est optionnel. Si non spécifié, c'est la dernière vitesse spécifiée lors de avance() ou setVitesse() qui sera utilisée.

  • recule() : fait marche arrière.

  • stop() : stoppe les moteurs

  • moteurDroit(vitesse) : fait tourner la roue droite.

  • moteurGauche(vitesse) : fait tourner la roue gauche.

  • getVitesse() : renvoie la vitesse paramétrée par setVitesse() ou avance()

  • setVitesse() : change la valeur de la vitesse utilisée par avance, recule, moteur*

  • distance() : renvoie la distance (en cm) lue par le capteur ultrason

  • son_r2d2() et son_bip() : effets sonores

ComplémentAccès aux autres fonctions du robot

Sur le circuit imprimé du robot figurent les adresses des broches pour les LEDs et capteurs de ligne. les voici pour rappel :

  • LEDs rouges : 8 (gauche) et 12 (droite). Ex : pin8.write_digital(1)

  • Neopixel : pin15

  • capteurs de ligne : pin13 (gauche) et pin14 (droite). ex : pin13.read_digital()

  • infrarouge : pin16

1
# Exemple d'éclairage d'ambiance vert avec les neopixels
2
from microbit import *
3
from neopixel import NeoPixel
4
np=NeoPixel(pin15,4)
5
for i in range(4):
6
    np[i]=(0,255,0)
7
np.show()
8
9
# np.clear() pour eteindre les neopixels

ExempleUtilisation du module

Voici un exemple concret vous permettant de tester le module depuis le REPL afin de vous assurer que tout fonctionne. Je vous conseille de tester cela avec le robot sur le dos pour éviter qu'il parte avec un fil à la patte !

>>> from maqueen import Maqueen

>>> mq=Maqueen()

>>> mq.distance() # permet de vérifier le module ultrason

>>> mq.avance(10)

>>> mq.stop()

>>> mq.moteurDroit()

>>> mq.moteurGauche(-10)

>>> mq.stop()

ExempleExemple de mini-projet

Il est temps maintenant de passer à la réalisation d'un véritable projet. Il y a les incontournables classiques comme le robot suiveur de ligne, le robot télécommandé par infrarouge ou le robot éviteur d'obstacles. A vous de jouer !

ComplémentListing du module maqueen

1
# The MIT License (MIT)
2
# Copyright (c) 2016 British Broadcasting Corporation.
3
# This software is provided by Lancaster University by arrangement with the BBC.
4
# Permission is hereby granted, free of charge, to any person obtaining a
5
# copy of this software and associated documentation files (the "Software"),
6
# to deal in the Software without restriction, including without limitation
7
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
# and/or sell copies of the Software, and to permit persons to whom the
9
# Software is furnished to do so, subject to the following conditions:
10
# The above copyright notice and this permission notice shall be included in
11
# all copies or substantial portions of the Software.
12
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
# DEALINGS IN THE SOFTWARE.
19
20
# Olivier Lecluse
21
# Avril 2019
22
23
import microbit
24
import time
25
import machine
26
import music
27
28
class Maqueen():
29
    def __init__(self,addr=0x10):
30
        """Initiaisation robot
31
        addr : adresse i2c. 0x10 par defaut"""
32
        self.addr=addr
33
        self._vitesse=0 # vitesse entre 0 et 100
34
    
35
    def getVitesse(self):
36
        return self._vitesse
37
        
38
    def setVitesse(self, v):
39
        self._vitesse=v
40
        
41
    def moteurDroit(self, v=None):
42
        if v==None:
43
            v=self._vitesse
44
        sens=0 if v>=0 else 1 # sens moteur
45
        vit=abs(v)*255//100   # vitesse moteur 0..255
46
        microbit.i2c.write(self.addr,bytearray([0,sens, vit]))
47
    
48
    def moteurGauche(self, v=None):
49
        if v==None:
50
            v=self._vitesse
51
        sens=0 if v>=0 else 1 # sens moteur
52
        vit=abs(v)*255//100   # vitesse moteur 0..255
53
        microbit.i2c.write(self.addr,bytearray([2,sens, vit]))
54
    
55
    def avance(self,v=None):
56
        if v != None:
57
            self._vitesse=v
58
        self.moteurDroit()
59
        self.moteurGauche()
60
        
61
    def recule(self):
62
        self.moteurDroit(-self._vitesse)
63
        self.moteurGauche(-self._vitesse)
64
        
65
    def stop(self):
66
        microbit.i2c.write(self.addr,bytearray([0,0,0]))
67
        microbit.sleep(1)
68
        microbit.i2c.write(self.addr,bytearray([2,0,0]))
69
70
    def distance(self):
71
        """Calcule la distance à l'obstacle en cm
72
        pin1 : Trig
73
        pin2 : Echo"""
74
        microbit.pin1.write_digital(1)
75
        time.sleep_ms(10)
76
        microbit.pin1.write_digital(0)
77
78
        microbit.pin2.read_digital()
79
        t2 = machine.time_pulse_us(microbit.pin2, 1)
80
81
        d = 340 * t2 / 20000
82
        return d
83
84
    def son_r2d2(self):
85
        tune=["A7:0", "G7:0", "E7:0","C7:0","D7:0","B7:0","F7:0","C8:0","A7:0","G7:0","E7:0","C7:0","D7:0","B7:0","F7:0","C8:0"]
86
        music.play(tune)
87
        
88
    def son_bip(self):
89
        for i in range(2):
90
            freq=2000
91
            while freq>1000:
92
                music.pitch(int(freq),10)
93
                freq*=0.95
94
            freq=1000
95
            while freq<3000:
96
                music.pitch(int(freq),10)
97
                freq*=1.05
98