This file also exists in ENGLISH here
Ce portage MicroPython concerne le Robot Zumo de Pololu. Ce robot peut être acheté en pièce détachées ou en version pré-assemblé (comme sur la photo). Ce robot est conçu pour un carte Arduino Uno MAIS NOUS ALLONS LE FAIRE FONCTIONNER avec une carte MicroPython Pyboard ou Raspberry-Pi PICO.
Le Zumo robot est composé d'un châssis, deux moteurs, un shield pour Arduino, une lame en acier inoxydable de 0,9mm d'épaisseur montée à l'avant du châssis lui permettant ainsi de pousser les objets et adversaires aux alentours, d'une matrice de capteurs infrarouge spécialement conçue pour le suivi de lignes.
Vous pouvez consulter les liens suivants pour plus de détails à propos du robot Zumo: Robot Zumo @ MCHOBBY ou Robot Zumo @ Pololu
Ce robot Zumo est initialement programmé à l'aide d'un Arduino Uno ou d'un Arduino Leonardo. Dans ce projet le robot Zumo est programmé à l'aide:
Toutes les bibliothèques et exemples en Arduino fournis par Pololu ont été portés sous Micropython.
Pour utiliser votre Zumo de façon optimal avec les scripts du dépôt, nous recommandons la configuration suivante.
Placer le cavalier du buzzer sur la position 328p pour utiliser le Buzzer
Retournez votre Zumo et retirez délicatement le suiveur de ligne de son connecteur.
Placez le cavalier LED ON sur la position 2. Puis replacez le suiveur de ligne en place.
<<< implementation PICO uniquement >>>
Si vous désirez pouvoir acquérir la tension des piles, alors placez un connecteur 2 broches (PinHeader) sur les broches A1 et Battery Level.
Ensuite, placez un cavalier sur ce connecteur.
L'adaptateur Pico-Zumo permet d'utiliser le Raspberry-Pi Pico pour contrôler directement le Zumo Robot de Pololu.
L'adaptateur Pyboard-Zumo propose également:
- Ajout du bouton Reset
- Réplica du bouton Utilisateur
- un connecteur UEXT (IDC 10 broches, 2.54mm) avec:
- Alimentation 3.3V
- bus SPI(0)
- bus I2C(0)
- UART(0)
- Voir la gamme UEXT @ Olimex et UEXT @ MCHobby .
- Un régulateur de tension 5V (optionnel) renvoyée vers la broche 5V du Zumo.
Ressources:
- Pico-Zumo : Fiche produit contenant de très nombreux détails.
- SCHEMA de l'adaptateur est disponible ici.
L'adaptateur Pyboard-Zumo permet de connecter directement un carte MicroPython Pyboard sur le Zumo Robot de Pololu.
L'adaptateur Pyboard-Zumo propose également:
- un réplica du bouton Reset
- un réplica du bouton Utilisateur
- deux connecteurs Servo-Moteur disponibles (GND, 7.45V, Signal)
- deux connecteurs Servo supplémentaires (si vous n'utilisez pas le capteur de ligne)
- un connecteur UEXT (IDC 10 broches, 2.54mm) avec:
- Alimentation 3.3V
- bus SPI(2)
- bus I2C(2)
- UART(1)
- Voir la gamme UEXT @ Olimex et UEXT @ MCHobby .
- Un régulateur de tension 5V (optionnel) renvoyée vers la broche 5V du Zumo.
ALIMENTATION DES SERVOS: la broche d'alimentation sur les connecteurs Servo correspond à la tension VIN produite par le régulateur boost du Zumo Robot. Cette tension est d'environ 7.45V. Il faut donc utiliser des Servo-moteurs 8V qui ne charge pas trop le régulateur (pas question de soulever du poids).
Le schéma de l'adaptateur est disponible ici
Vous pouvez aussi réaliser les connexions grâce au schéma de l'adaptateur. Ce n'est peut être pas la plus belle réalisation mais reste pleinement fonctionnel.
Avec raccordement DIY, vous aurez besoin d'utiliser un régulateur 5V S7V7F5 de Pololu pour générer 5V à partir de la tension VIN obtenue depuis les piles du shield Zumo robot. Suivez ce schéma de distribution d'alimentation repris du projet PYBOARD-UNO-R3. La carte PYBOARD-UNO-R3 dispose, elle, de son propre convertisseur de type buck.
Voyez le schéma de raccordement Pyboard vers Zumo ou du project PYBOARD-UNO-R3 pour les raccordements des broches-pyboard vers les broches-arduino.
Les bibliothèque MicroPython nécessaire doivent être copiées sur la carte MicroPython avant de tester l'adapteur Pyboard-Zumo (ou votre propre adaptateur).
Les bibliothèques ont été portées depuis le code source Arduino produit par Pololu. Les fonctions/méthodes sont très proches des conventions de nommage C pour faciliter la transition des utilisateurs Arduino vers MicroPython.
- zumoshield.py : commande moteur + interface Suiveur de ligne, Buzzer, bouton Zumo, LED zumo, LED microcontrôleur et bus I2C.
- pushbutton.py : outil de manipulation de bouton
- zumobuzzer.py : Support Zumo buzzer
- zumoimu.py : Support de la centrale inertielle (Gyroscope, Magnetomètre, Acceleromètre)
- qtrsensors.py : support général des suiveurs de ligne de Pololu
Les bibliothèque suivantes concerne le Zumo Robot V1.2 et son dépréciées
- lsm303.py : Support de l'accéléromètre/magnétomètre 3 axes
- L3G.py : Support Gyroscope 3 axes
Lors de la mise en route du microcontrôleur, les broches sont configurées en entrées, ce qui a pour effet de faire tourner le deux moteurs.
Il faut donc initialiser les sorties du microcontrôleur aussi vite que possible (pour éviter aux moteurs de se mettre en marche). Cela peu se fait à l'aide des lignes suivantes insérées dans le fichier main.py
.
from zumoshield import ZumoShield
z = ZumoShield()
Voyez le script examples/main.py qui contient le code minimaliste pour initialiser rapidement le Zumo.
Placer des piles dans le Zumo puis placer le commutateur en position "ON".
Les LEDs a l'arrière du Zumo doivent s'allumer.
Saisir le code suivant dans une session REPL:
from zumoshield import ZumoShield
z=ZumoShield()
# Marche avant
z.motors.setSpeeds( 200, 200 ) # -400..0..400
# Stop
z.motors.setSpeeds( 0, 0 ) # -400..0..400
# Marche arrière
z.motors.setSpeeds( -100, -100 ) # -400..0..400
z.motors.setSpeeds( 0, 0 ) # -400..0..400
L'exemple suivant montre comment inverser le sens de rotation du moteur droit pour faire tourner le Zumo à droite.
from zumoshield import ZumoShield
from time import sleep
z=ZumoShield()
# Marche avant
z.motors.setSpeeds( 100, 100 ) # -400..0..400
# Tourner à droite
z.motors.flipRightMotor( True )
z.motors.setSpeeds( 100, 100 ) # Indiquer la vitesse de rotation
# Attendre une seconde
sleep( 1 )
# Reprendre la marche avant (en indiquer la vitesse)
z.motors.flipRightMotor( False )
z.motors.setSpeeds( 100, 100 )
sleep( 1 )
# Stop
z.motors.setSpeeds( 0, 0 ) # -400..0..400
Voici un autre petit exemple:
from zumoshield import ZumoShield
z = ZumoShield()
z.motors.setSpeeds( 100, 100 ) # -400..0..400
z.motors.stop()
Voici quelques exemples extraient de mazesolver.py permettant de jouer des suites de notes.
La syntaxe est décrite dans document de Pololu pour la méthode Zumo32U4Buzzer::play()
from zumoshield import ZumoShield
from time import sleep
z=ZumoShield()
z.buzzer.play("c8")
sleep(2)
z.buzzer.play(">g32>>c32")
sleep(2)
z.buzzer.play("l16 cdegreg4")
sleep(2)
z.buzzer.play(">>a32")
sleep(2)
z.buzzer.play(">>a32")
Il est également possible de jouer directement de notes avec playNote()
en précisant la Note, sa durée en ms et le volume (0-15) de celle-ci.
Exemple issus de borderdetect.py .
from zumoshield import ZumoShield
from zumobuzzer import NOTE_G
z = ZumoShield()
for x in range(3):
time.sleep(1)
# Note(octave), Durée, Volume
z.buzzer.playNote(NOTE_G(3),200,15)
time.sleep(1)
z.buzzer.playNote(NOTE_G(4),500,15)
time.sleep(1)
Pour finir, la classe ZumoShield
dispose de quelques séquences prédéfinies pour le buzzer.
from zumoshield import ZumoShield
zumo = Zumoshield()
zumo.play_blip()
zumo.play_2tones()
zumo.play_done()
Le Zumo est équipé d'une LED utilisateur orange marquée "LED 13".
Cette LED est visible sur le côté droit du Zumo.
from zumoshield import ZumoShield
zumo = ZumoShield()
zumo.led.on()
zumo.led.off()
Le bouton poussoir du Zumo (à côté de l'interrupteur On/OFF) est raccordé sur une broche du microcontrôleur. L'entrée est placée à la masse lorsque ce bouton est pressé.
Le bouton Zumo est également répliqué sur la carte adapteur.
La bibliothèque pushbutton.py propose la classe Pushbutton
permettant de détecter l'état enfoncé ou relâché d'un bouton. Celle-ci est mise à disposition par l'intermédiaire de ZumoShield
(de la bibliothèque lib/zumoshield.py).
from zumoshield import ZumoShield
zumo = ZumoShield()
print( "Presser et relacher le bouton Zumo" )
zumo.button.waitForButton()
print( "c est fait" )
L'exemple line_follower.py utilise le suiveur de ligne présent à l'avant du Zumo. Il permet de détecter la présence d'une ligne noir ou ligne blanche (largeur de 15mm) sous le zumo et de la suivre.
Le script suivant active les LEDs infrarouges puis effectue une lecture récurrente des récepteurs Infrarouge.
La classe ZumoShield
permet également d'accéder directement aux capteurs infrarouges. Le code peut être réécrit comme suit:
# Arrêter les moteurs
from zumoshield import ZumoShield
zumo = ZumoShield()
# Calibration
for i in range(10):
print( "Calibrate %i / 10" % (i+1) )
zumo.ir.calibrate()
time.sleep(0.5)
# Lecture position ligne
while True:
sensors = [0 for i in range(6)]
position = zumo.ir.readLineBlack( sensors )
print( 'Line position: ', position )
time.sleep( 1 )
Le code de test_imu.py, repris ci-dessous, effectue une lecture basique de tous les éléments de la centrale inertielle.
ffrom zumoshield import ZumoShield
from zumoimu import *
import time
# Permet d'offrir un libellé d'identification de l'IMU
IMU_TYPE_LSM303DLHC = 1 # LSM303DLHC accelerometer + magnetometer
IMU_TYPE_LSM303D_L3GD20H = 2 # LSM303D accelerometer + magnetometer, L3GD20H gyro
IMU_TYPE_LSM6DS33_LIS3MDL = 3 # LSM6DS33 gyro + accelerometer, LIS3MDL magnetometer
imu_type_as_text = { IMU_TYPE_LSM303DLHC : "LSM303DLHC", IMU_TYPE_LSM303D_L3GD20H : "LSM303D_L3GD20H", IMU_TYPE_LSM6DS33_LIS3MDL : "LSM6DS33_LIS3MDL" }
z = ZumoShield() # Arrêt des moteurs
print( "Zumo I2C scan:", z.i2c.scan() )
imu = ZumoIMU( z.i2c ) # Auto-detection de l'IMU
print( "IMU type: %s" % imu_type_as_text[imu.imu_type] )
while True:
imu.read()
print( "Acc= %6i, %6i, %6i : Mag= %6i, %6i, %6i : Gyro= %6i, %6i, %6i " % (imu.a.values+imu.m.values+imu.g.values) )
time.sleep( 0.5 )
Ce qui produit les résultats suivants:
MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>>
>>> import test_imu
Zumo I2C scan: [30, 107]
IMU type: LSM6DS33_LIS3MDL
Acc= -127, -42, 16583 : Mag= -5353, -4654, -13695 : Gyro= 183, -972, -378
Acc= -125, -40, 16588 : Mag= -5379, -4655, -13680 : Gyro= 148, -959, -366
Acc= -127, -37, 16570 : Mag= -5372, -4671, -13680 : Gyro= 165, -965, -373
Acc= -125, -44, 16583 : Mag= -5366, -4642, -13688 : Gyro= 174, -951, -371
Acc= -113, -41, 16590 : Mag= -5350, -4678, -13636 : Gyro= 182, -962, -364
Acc= -122, -25, 16579 : Mag= -5371, -4670, -13613 : Gyro= 157, -940, -364
Acc= -120, -39, 16559 : Mag= -5361, -4686, -13665 : Gyro= 166, -953, -365
Acc= -113, -39, 16589 : Mag= -5346, -4644, -13673 : Gyro= 166, -948, -371
Acc= -90, 9, 16574 : Mag= -5373, -4673, -13648 : Gyro= 235, -780, -462
Acc= -55, 14, 16593 : Mag= -5405, -4657, -13618 : Gyro= 167, -920, -341
Acc= 4955, -1384, 21446 : Mag= -5759, -4419, -13937 : Gyro= -9584, -9800, 11313
Acc= -5509, -1035, 23783 : Mag= -4170, -4768, -12563 : Gyro= 32766, -11453, 13894
Acc= 10218, 12080, 2196 : Mag= -8195, -7845, -11131 : Gyro= -32766, 27757, 32766
Acc= -834, -955, 18470 : Mag= -5214, -5658, -13521 : Gyro= -16310, -5711, 4933
Acc= -215, 67, 16611 : Mag= -5362, -5564, -13492 : Gyro= 109, -984, -337
Acc= -111, 56, 16576 : Mag= -5346, -5576, -13516 : Gyro= 190, -887, -353
Acc= -122, 55, 16538 : Mag= -5331, -5573, -13477 : Gyro= 160, -950, -372
Qui peuvent être mis en corrélation avec les axes X,Y du Zumo (l'axe Z du magnétomètre peut être ignoré à cause de la masse des piles).
Les exemples proposés ci-dessous ont étés portés depuis le code Arduino de Pololu.
L'exemple examples/borderdetect.py est un programme ou le robot Zumo ne sors jamais d'un ring. Le ring est une surface blanche un contour noir.
Le capteur infrarouge détecte la différence de couleurs à l'aide de la bibliothèque qtrsensors.py. Le noir est peu réfléchissant et le blanc est fortement réfléchissant. En fonction de ces informations les moteurs vont avancer, reculer ou tourner.
Le script examples/line_follower.py permet au Zumo de suivre une ligne noir de 15 à 20mm de large (meilleurs résultats pour 20mm)
Cet exemple exploite les classes QTRsensors et ZumoShield.
Voir cette vidéo réalisée à la Maker Fair Paris 2019 (YouTube)
L'exemple examples/turn_square.py fait tourner le robot Zumo en dessinant un carré. C'est l'équivalent de l'exemple TurnWithCompass.ino produit par Pololu.
Grâce au magnétomètre le robot Zumo tourne de 90 degrés à chaque rotation en utilisant le champs magnétique terrestre comme référence d'orientation.
Cet exemple est très intéressant car il explique comment:
- faire une calibration du capteur magnétique.
- transformer les mesures du magnétomètre en angle (voir fonction
heading_degrees()
) - faire une moyenne de 10 lectures pour minimiser l'impact magnétique des moteurs du Zumo (voir fonction
average_heading()
) - calculer une différence d'angle entre deux relevés heading_degrees (voir fonction
relative_heading_degrees()
)
L'exemple examples/mazesolver.py permet de résoudre un labyrinthe. Ce script n'est pas infaillible mais fonctionne plutôt bien.
L'exemple examples/gyroscope.py permet de tester le gyroscope.
Cet exemple est n'est pas encore certifié.
- Zumo Robot pour Arduino @ MCHobby
- Zumo Robot pour Arduino @ Pololu
- Adaptateur Pico vers Zumo @ MCHobby
- Adaptateur Pyboard vers Zumo @ MCHobby
- MicroPython Pyboard @ MCHobby