Modifications

Sauter à la navigation Sauter à la recherche
Ligne 1 : Ligne 1 :  
{{Hack-micropython-Robot2Wheel-HC-SR04-NAV}}
 
{{Hack-micropython-Robot2Wheel-HC-SR04-NAV}}
    +
== Eviter les obstacles ==
 +
{{bloc-etroit|text=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:
 +
# Fait avancer le robot
 +
# Détecte les obstacle présent devant le senseur HC-SR04
 +
# Si un obstacle est détecté à moins de 20cm:
 +
## Arrêter la plateforme
 +
## 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-box|Robot avec HC-SR04 (r2-uson.py)|https://raw.githubusercontent.com/mchobby/pyboard-a-roulette/master/02-ultrason/r2-uson.py}}
 +
 +
<nowiki>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()</nowiki>
 +
 +
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 {{fname|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 {{fname|LED(4)}} pour indiquer l'activation du Robot.
 +
 +
Voici un second code nommé {{fname|r2-uson-final.py}} que vous pouvez copier/coller dans votre fichier {{fname|main.py}} .
 +
 +
{{download-box|Télécharger le script r2-uson-final.py|https://raw.githubusercontent.com/mchobby/pyboard-a-roulette/master/02-ultrason/r2-uson-final.py}}
 +
 +
<nowiki>##
 +
# 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 </nowiki>
 +
 +
== 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 [[Hack-micropython-Robot2Wheel-HC-SR04#Pr.C3.A9requis|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 {{fname|1=reverse_mot2 = True}} lors que l'appel {{fname|1=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 [[hack-micropython-Robot2Wheel|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 {{fname|pyboard.py}}.
 +
 +
Vous trouverez donc les lignes suivantes dans le programme:
 +
<nowiki>#DEBUG: print( 'Running' )
 +
#DEBUG: print( 'Wait' )</nowiki>
 +
 +
Que vous pouvez transformer en:
 +
<nowiki>print( 'Running' )
 +
print( 'Wait' )</nowiki>
 +
 +
* '''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 ;-)
 +
 +
<nowiki>            r2.right()
 +
            delay( 2500 )</nowiki>
 +
 +
Pour que cela tourne moins, il suffit de diminuer ce temps de rotation une valeur plus raisonnable... pour tourner moins longtemps.
 +
 +
<nowiki>            r2.right()
 +
            delay( 800 )</nowiki>
 +
 +
Vous pouvez également opter pour une rotation à vitesse réduite
 +
 +
<nowiki>            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 )</nowiki>
 +
 +
 +
 +
Une autre option serait d'utiliser un magnétomètre (pour faire une rotation par rapport au nord) ou une centrale inertielle (IMU).
    
{{Hack-micropython-Robot2Wheel-TRAILER}}
 
{{Hack-micropython-Robot2Wheel-TRAILER}}
29 922

modifications

Menu de navigation