Hack-micropython-Robot2Wheel-HC-SR04-Code

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Eviter les obstacles

Voila, maintenant que nous disposons d'un senseur HC-SR04 sur notre PyBoard-a-Roulette, nous allons pouvoir le faire balader avec un programme relativement simple.

Le programme:

  1. Fait avancer le robot
  2. Détecte les obstacle présent devant le senseur HC-SR04
  3. Si un obstacle est détecté à moins de 20cm:
    1. Arrêter la plateforme
    2. Faire tourner la plateforme (sur la droite pendant 2.5 seconde).

Le code

Voici un extrait du code que nous avons testé en REPL.

Vous pouvez le télécharger ici:

Download-icon.pngRobot avec HC-SR04 (r2-uson.py)
from pyb import delay
from r2wheel import Robot2Wheel                                             
from ultrasonic import Ultrasonic

# Broche pour déclencher le senseur
TRIGGER_PIN = pyb.Pin.board.Y5 
# Broche pour attendre le retour d'echo
ECHO_PIN = pyb.Pin.board.Y6

r2 = Robot2Wheel( reverse_mot2 = True ) 
u = Ultrasonic( TRIGGER_PIN, ECHO_PIN )

MIN_DISTANCE = 20 # Minimum distance 

r2.forward()
while True:
    if u.distance_in_cm() < MIN_DISTANCE:
        r2.halt()
        delay(100)
        r2.right()
        delay( 2500 )
        r2.halt()
        delay(100)
    # If nothing in front then move
    if (r2.state == Robot2Wheel.HALTED) and (u.distance_in_cm() > MIN_DISTANCE): 
        r2.forward()

Il suffit de placer la main devant le senseur pour que le mobile entame une rotation.

Faire mieux

L'idéal serait de rendre le robot totalement autonome en plaçant le code directement dans le fichier main.py .

Mais il faut aussi qu'il soit plus pratique. En effet, le robot se mettrait en marche dès qu'il serait sous tension.

L'idéal serait de pouvoir le démarrer en pressant sur le bouton "User" (disponible sur la carte)... et de pouvoir l'arrêter en pressant une autre fois sur ce même bouton.

Nous allons également utiliser la LED bleue LED(4) pour indiquer l'activation du Robot.

Voici un second code nommé r2-uson-final.py que vous pouvez copier/coller dans votre fichier main.py .

Download-icon.pngTélécharger le script r2-uson-final.py
##
# Commande d'une plateforme robotique 2 roues avec détecteur UltraSon HC-SR04.
#    Tourne sur la droite quand il détecte un objet à moins de 20 cm. Sinon avance en ligne droite.
# Presser le bouton "user" pour démarrer / arrêter le robot. La LED bleue s'allume pendant que le programme est actif.
# 
# Control a 2 wheel robotic plateform with a L293D H Bridge and MicroPython PyBoard
#    Turn right when detecting an object within the 20 cm. Otherwise move forward.
# Press the "User" button to start/stop the software. Le blue LED is lit when the software is driving the robot.
#
#   http://shop.mchobby.be/product.php?id_product=741
#   http://shop.mchobby.be/product.php?id_product=155
#   http://shop.mchobby.be/product.php?id_product=570
#   http://shop.mchobby.be/product.php?id_product=561
# 
# Voir Tutoriel - See our french tutorial
#   http://wiki.mchobby.be/index.php?title=Hack-micropython-Robot2Wheel-HC-SR04
#
# Copyright 2016 - Dominique Meurisse for MC Hobby SPRL <info (at) mchobby (dot) be>
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##

from pyb import delay, LED, Switch
from r2wheel import Robot2Wheel                                             
from ultrasonic import Ultrasonic

# Broche pour déclencher le senseur
TRIGGER_PIN = pyb.Pin.board.Y5 
# Broche pour attendre le retour d'echo
ECHO_PIN = pyb.Pin.board.Y6

r2 = Robot2Wheel( reverse_mot2 = True ) 
u = Ultrasonic( TRIGGER_PIN, ECHO_PIN )
l = LED(4)   # LED Bleue
btn = Switch() # Button utilisateur (User)

MIN_DISTANCE = 20 # Minimum distance 

def drive_robot():
    r2.forward()
    # Tant que pas bouton User --> Continuer
    while btn() == False:
        #DEBUG: print( 'Running' )
        if u.distance_in_cm() < MIN_DISTANCE:
            r2.halt()
            delay(100)
            r2.right()
            delay( 2500 )
            r2.halt()
            delay(100)
        # Si rien devant --> Marche avant
        if (r2.state == Robot2Wheel.HALTED) and (u.distance_in_cm() > MIN_DISTANCE): 
            r2.forward()
    r2.halt()

# Routine principale
l.off()
while True:
    #DEBUG: print( 'Wait' )
    if btn() == True:
        # Deparasitage logiciel
        delay( 10 )
        if btn() == True:
           # Signaler le démarrage
           l.on()
           delay( 2000 ) 
           # Piloter le robot
           drive_robot()
           l.off()
           delay( 2000 )
    delay( 300 ) # ne rien faire 

Cela ne marche pas

Vous éprouvez des difficultés pour faire fonctionner le programme... voici quelques pistes pour vous aider.

Tester les différents éléments

Avez-vous exécuté les différents points présenté dans les prérequis de ce tutoriel?

Cela vous permet de maîtriser votre matériel et son fonctionnement. Cela permet également de s'assurer qu'il fonctionne correctement.

Il ne se déplace pas normalement

Il y a plusieurs paramètres permettant de corriger le fonctionnement des moteurs de la plateforme robotique. En effet, suivant vos raccordement, la plateforme pourrait tourner à droite au lieu de la gauche, avancer au lieu de reculer, ou tourner au lieu d'avancer.

Dans notre programme d'exemple, nous avons utiliser reverse_mot2 = True lors que l'appel r2 = Robot2Wheel( reverse_mot2 = True ) . Vous pourriez avoir besoin d'utiliser un autre paramètrage.

Cela est expliqué plus en détail dans notre tutoriel Robot 2 roues

Activer les commentaires de debug

Le programme contient deux commentaire vous permettant de suivre plus facilement son fonctionnement [[MicroPython-Hack-Outil#pyboard.py|en téléversant le programme sur la PyBoard depuis votre PC}} en mode REPL à l'aide de pyboard.py.

Vous trouverez donc les lignes suivantes dans le programme:

#DEBUG: print( 'Running' )
#DEBUG: print( 'Wait' )

Que vous pouvez transformer en:

print( 'Running' )
print( 'Wait' )
  • Wait indique que le programme attend que vous pressiez le bouton utilisateur pour démarrer. Ce message Apparaît toutes les 1/3 de seconde.
  • Running indique que le robot est en court de fonctionnement.... et ce dernier est affiché continuellement

Un seul message 'Running'!

Si vous ne voyez qu'un seul message Running (voir point précédent) puis que le programme semble planté... c'est qu'en fait il attend désespérément l'écho du senseur HC-SR04. Cela peut prendre jusqu'à 20 secondes.

Nous avons surtout constaté ce problème parce que nous n'arrivions pas à arrêter le robot en pressant sur le bouton utilisateur.

De fait, le régulateur de tension 5V n'était pas branché et, par conséquent, le senseur HC-SR04 ne pouvait pas répondre aux demandes de mesure de distance. Arf!

Tourne de trop

Tourner sur place pendant 2.5s (2500ms) permet de faire plusieurs tours... si vos piles sont bien chargées. Oui, votre pyboard-a-roulette peut tourner aussi vite qu'un valseur ;-)

            r2.right()
            delay( 2500 )

Pour que cela tourne moins, il suffit de diminuer ce temps de rotation une valeur plus raisonnable... pour tourner moins longtemps.

            r2.right()
            delay( 800 )

Vous pouvez également opter pour une rotation à vitesse réduite

            r2.right() # Commencer à 100% pour vaincre l'inertie
            delay( 20 )
            r2.right( speed=40 ) # 40% de cycle utile du signal PWM (40% de vitesse)
            delay( 800 )


Une autre option serait d'utiliser un magnétomètre (pour faire une rotation par rapport au nord) ou une centrale inertielle (IMU).


Projet original réalisé par Meurisse D. pour MC Hobby SPRL

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.