Modifications

Sauter à la navigation Sauter à la recherche
13 102 octets ajoutés ,  20 août 2016 à 10:47
aucun résumé de modification
Ligne 1 : Ligne 1 :  
{{Hack-MotorSkin-NAV}}
 
{{Hack-MotorSkin-NAV}}
  −
{{traduction}}
      
== Préambule ==
 
== Préambule ==
Ligne 20 : Ligne 18 :  
Vous êtes prêt? C'est maintenant que l'on commence à jouer.
 
Vous êtes prêt? C'est maintenant que l'on commence à jouer.
   −
== Tests ==
+
= Tests =
=== Marche avant/arrière ===
+
Vous pouvez tester facilement toutes ces fonctionnalités en utilisant [[MicroPython-Hack-REPL|le mode REPL]] et en saisissant les lignes suivantes une à une.
 +
 
 +
== Marche avant/arrière ==
 
[[Fichier:RB-2-WHEEL-MOVE-00.jpg|480px]]
 
[[Fichier:RB-2-WHEEL-MOVE-00.jpg|480px]]
   Ligne 44 : Ligne 44 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
voyez la section xxxx si l'un des moteurs ne tourne pas dans le bon sens.
+
Voyez la section [[Hack-MotorSkin-Tester#D.C3.A9pannage|dépannage]] si l'un des moteurs ne tourne pas dans le bon sens.
 +
 
 +
== Tourner à droite/gauche ==
 +
[[Fichier:RB-2-WHEEL-MOVE-01.jpg|480px]]
 +
 
 +
Pour tourner à droite, il y a la méthode {{fname|turn()}}, cette méthode peut prendre plusieurs paramètres.
 +
 
 +
Nous allons commencer simplement, nous allons faire tourner la plateforme 2 roues sur place... en faisant tourner un moteur dans un sens et l'autre dans l'autre sens.
 +
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
r2 = Robot2Wheel()
 +
r2.turn( Robot2Wheel.RIGHT_ROTATE )
 +
r2.halt()
 +
</syntaxhighlight>
 +
 
 +
Vous pouvez également indiquer une vitesse moteur durant la rotation.
 +
<syntaxhighlight lang="python">
 +
r2.turn( Robot2Wheel.RIGHT_ROTATE, speed=60 )
 +
</syntaxhighlight>
 +
 
 +
Voyez la section [[Hack-MotorSkin-Tester#D.C3.A9pannage|dépannage]] si robot ne tourne pas dans le bon sens.
 +
 
 +
== Tourner à droite/gauche (bis) ==
 +
Il existe des méthodes plus directes {{fname|right()}} et {{fname|left()}} pour tourner sur place à droite ou à gauche.
 +
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
r2 = Robot2Wheel()
 +
r2.right()
 +
r2.halt()
 +
r2.left()
 +
r2.halt()
 +
</syntaxhighlight>
 +
 
 +
Voyez la section [[Hack-MotorSkin-Tester#D.C3.A9pannage|dépannage]] si l'un des moteurs ne tourne pas dans le bon sens.
 +
 
 +
== Les virages ==
 +
Il est également possible de négocier un virage, technique plus appropriée pour le suivi de tracé... ou négocier des parcours avec la meilleure optimisation possible.
 +
 
 +
La technique est simple, il suffit de ralentir le moteur du côté où l'on désire prendre le virage... l'autre moteur restant à vitesse plus élevée, le trajectoire du mobile va inévitable suivre un arc de cercle.
 +
 
 +
Plus la différence de vitesse est grande et plus le rayon de courbure est petit (donc virage plus serré).  Ce parcours en arc de cercle signifie que l'on circule sur le périmètre d'un cercle... si le mobile poursuit son parcours suffisamment longtemps... il dessinera un cercle.
 +
 
 +
Ce cercle à un centre et il y a donc un rayon entre le centre et votre plateforme robot.
 +
 
 +
[[Fichier:RB-2-WHEEL-MOVE-02.jpg|800px]]
 +
 
 +
Dans l'exemple suivant, nous allons entamer un virage à droite {{fname|Robot2Wheel.RIGHT_BEND}}. Pour cela, nous allons ralentir le moteur droit de 40% ({{fname|1=speed=40}}) par rapport au moteur gauche.
 +
 
 +
Lorsqu'il n'y a qu'un seul paramètre de vitesse, ce paramètre {{fname|speed}} mentionne la différence de vitesse entre les deux moteurs.
 +
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
from pyb import delay
 +
r2 = Robot2Wheel()
 +
r2.turn(Robot2Wheel.RIGHT_BEND, speed=40)
 +
delay( 15000 )
 +
r2.forward()
 +
delay( 5000 )
 +
r2.halt()
 +
</syntaxhighlight>
 +
 
 +
Il est également possible de contrôler la vitesse du mobile durant un virage en précisant 2 vitesses. Lorsqu'il y a deux vitesses mentionnées: la vitesse globale du mobile est précisée avec {{fname|speed}}, puis la différence de vitesse entre les deux moteurs dans {{fname|speed2}}.
 +
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
from pyb import delay
 +
r2 = Robot2Wheel()
 +
# Vitesse globale 70, RALENTIR le moteur gauche de 40%
 +
# Vitesse moteur droit = 70%, Vitesse moteur gauche = 30%
 +
r2.turn(Robot2Wheel.LEFT_BEND, speed=70, speed2=40)
 +
delay( 15000 )
 +
r2.forward()
 +
delay( 5000 )
 +
r2.halt()
 +
</syntaxhighlight>
 +
 
 +
Dans l'exemple ci-dessus, nous tournons à gauche avec une vitesse globale du mobile de 70% et une différence de vitesse de 40%. Le moteur droit fonctionne donc à 70% et le moteur gauche à 70%-40%, soit 30%.
 +
 
 +
== Senseur Ultrason ==
 +
Vous pouvez utiliser un senseur ultrason avec le moteur-skin. Etant donné que le senseur HC-SR04 fonctionne en 5V, il sera nécessaire de monter un régulateur 5V sur votre motor-Skin.
 +
 
 +
{{ambox-stop|text=Vous devez brancher votre pack batterie pour utiliser le senseur Ultrason.<br />Ce dernier à besoin d'une tension de 5V généré par le régulateur, lui même alimenté par les piles.}}
 +
 +
[[Fichier:HC-SR04-00.jpg]]
 +
 
 +
Le HC-SR04 est un module ultrason permettant l'évaluation d'une distance de 2cm à 400cm. La mesure est réalisée "sans contact" et dispose d'une précision de 3mm dans les conditions optimales. Le module inclus un émetteur et un récepteur ultrason ainsi qu'une électronique de contrôle. Le fonctionnement de ce module s'apparente à celui d'un sonar de sous marin et sa mise en oeuvre est relativement simple.
 +
 
 +
=== principe de fonctionnement ===
 +
[[Fichier:HC-SR04-10.jpg|480px]]
 +
 
 +
# Le module émet une onde sonar composée d'une série de 8 impulsions à 40 kHz.<br />Un son à 40 KHz est inaudible pour l'oreille humaine capable de percevoir [http://fr.wikipedia.org/wiki/Audition_humaine des sons entre 16Hz et 16KHz] (cfr Wikipédia).
 +
# En utilisant la broche Trig, vous envoyez un signal pour  activer le déclenchement de l'impulsion sonar.
 +
# Si le signal revient... la sortie passe au niveau haut durant toute la période où l'onde voyage vers l'objet et revient après avoir été réfléchit par se dernier.
 +
 
 +
{{underline|Note:}} L'avantage d'utiliser un son plus aigu est qu'il est directionnel (se propage en ligne droite) alors que les basses fréquences transitent plutôt par la matière. C'est pour cette raison que l'on entend uniquement les basses de la sono lorsque les voisins font la fiesta!
 +
 
 +
Voyez notre [[MicroPython-HC-SR04|tutoriel HC-SR04 pour PyBoard pour plus d'information]].
 +
 
 +
=== Lire la distance ===
 +
La fonction {{fname|distance()}} permet de lire la distance '''en centimètre'''.
 +
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
r2 = Robot2Wheel()
 +
r2.turn(Robot2Wheel.RIGHT_BEND, speed=40)
 +
print( 'distance = %i cm' % r2.distance() )
 +
</syntaxhighlight>
 +
 
 +
{{ambox|text=La méthode {{fname|distance_in_cm()}} est équipée d'un mécanisme de timeout qui retourne la valeur 10000 (100m) au bout de 0.33 seconde.<br />Cela évite à votre programme de rester bloqué sur la lecture de la distance dans le cas où l'écho ne reviendrait jamais (ou ne partirait jamais). }}
 +
 
 +
=== Fonctionnalités avancées ===
 +
Vous pouvez utiliser directement l'objet {{fname|Ultrasonic}}, il est accessible par l'intermédiaire de la propriété {{fname|ultrason}}
 +
 
 +
<syntaxhighlight lang="python">
 +
>>> from r2wheel import Robot2Wheel
 +
>>> r2 = Robot2Wheel()
 +
>>> r2.ultrason                                                               
 +
<Ultrasonic object at 20005430>
 +
</syntaxhighlight>
 +
 
 +
Vous pouvez saisir le code suivant en REPL pour obtenir la distance en pouce:
   −
=== Tourner à droite ===
+
<syntaxhighlight lang="python">
x
+
from r2wheel import Robot2Wheel
 +
r2 = Robot2Wheel()
 +
dist = r2.ultrason.distance_in_inches()                                                               
 +
print( 'Distance = %i pouce' % dist )
 +
</syntaxhighlight>
   −
=== Tourner à gauche ===
+
== Boutons utilisateurs ==
x
+
Motor-Skin dispose de 4 boutons poussoirs (SW1 à SW4) que vous pouvez utiliser pour réaliser une interface utilisateur.
   −
=== Senseur Ultrason ===
+
[[Fichier:Hack-MotorSkin-Tester-20.jpg|320px]]
x
     −
=== Boutons utilisateurs ===
+
Vous pouvez très facilement tester l'état d'un bouton à l'aide de la fonction {{fname|button_pressed(button_nr)}} où button_nr est le numéro de bouton de 1 à 4.
x
     −
= La dérive =
+
La fonction retourne True si le bouton est pressé et False si le bouton n'est pas pressé.
x
+
 
 +
<syntaxhighlight lang="python">
 +
from r2wheel import Robot2Wheel
 +
r2 = Robot2Wheel()
 +
# Tester le bouton 1
 +
print( r2.button_pressed(1) )
 +
</syntaxhighlight>
 +
 
 +
N'hésitez pas saisir plusieurs fois la dernière ligne en pressant et/ou relâchant le bouton 1.
 +
 
 +
Voici un tout petit bout de code qui permet de tester facilement les 4 boutons. Il affiche le nom du bouton enfoncé.
 +
 
 +
Pressez {{fname|Ctrl+C}} pour arrêter le script.
 +
 
 +
<syntaxhighlight lang="python">
 +
while True:                                                               
 +
    for i in range(1,5): # de 1 à 4                                               
 +
        if r2.button_pressed( i ):                                         
 +
            print( 'bouton SW%i active' % i )                             
 +
            delay( 100 )
 +
</syntaxhighlight>
 +
 
 +
= Corriger la dérive =
 +
{{ambox|text=Ce point n'est pertinent que si vous avez besoin de parcourir des distances relativement importantes en ligne droite.}}
 +
== Qu'est-ce que la dérive ==
 +
Deux moteurs d'un même fabricant et d'un même modèle ne sont {{underline|jamais totalement}} identiques.
 +
 
 +
La raison? d'infimes différences provoqués par les processus de fabrication, les jeux (différents d'un moteur à l'autre) mais aussi l'alignement des moteurs sur votre plateforme robotique. Dans le même ordre d'idée, un pneu plus usé que l'autre aura un diamètre légèrement inférieur... et parcourra une distance légèrement inférieur à chaque tour de roue. Les moteurs sont donc identiques mais pas tout à fait!
 +
 
 +
Dans la vie réelle, les deux moteurs ne tournent pas exactement à la même vitesse... il y en a toujours un qui est un poil plus lent. De même, les deux roues n'étant pas rigoureusement identiques, elles ne parcourent pas exactement la même distance à chaque tour de roue. Même si cette distance est inférieur à 1/10mm, au bout de 500 tours, cela fait quand même une différence de 50mm (5 cm)... par rapport à l'autre moteur.
 +
 
 +
Voila, vous venez de découvrir la cause de la dérive... et comme vous pouvez le constater, son effet ne se fait ressentir que sur des distances relativement importante.
 +
 
 +
[[Fichier:RB-2-WHEEL-MOVE-Derive.jpg|900px]]
 +
 
 +
== Comment corriger la dérive ==
 +
{{underline|'''La solution consiste'''}} à ralentir le moteur "''trop rapide''" (celui qui parcours trop de distance). C'est pour cela que nous avons besoin du contrôle PWM, afin de pour pouvoir contrôler la dérive.
 +
 
 +
{{underline|'''En pratique'''}}, vous mentionnerez une valeur entre -10 et +10 pour la dérive (en fait, vous pouvez mentionner une valeur de -100 à +100 mais cela à peu de sens).
 +
 
 +
La valeur numérique absolue (rien que les chiffres) indique le pourcentage dont il faut ralentir le moteur trop rapide... le "+" agit sur l'un des moteurs... tandis que le "-" (valeur négative) agira sur le moteur opposé.
 +
 
 +
Lorsque vous commanderez les moteurs, par exemple avec {{fname|forward()}}, l'un des moteurs sera à la vitesse maximale (ou celle spécifiée) et l'autre sera légèrement ralenti avec la valeur de la dérive.
 +
 +
Il vous faudra donc procéder par essai/erreur, en ajustant la valeur de la dérive jusqu'à ce que votre plateforme parcours une ligne droite comme attendu.
 +
 
 +
Voici deux exemples avec correction de la dérive, l'un appliquée sur un moteur... et l'autre sur l'autre moteur:
 +
 
 +
<syntaxhighlight lang="python">
 +
robot = Robot2Wheel( derivative_fix = 5 )
 +
robot.forward()
 +
delay( 5000 )
 +
robot.halt()
 +
</syntaxhighlight>
 +
 
 +
<syntaxhighlight lang="python">
 +
robot = Robot2Wheel( derivative_fix = -3 )
 +
robot.forward()
 +
delay( 5000 )
 +
robot.halt()
 +
</syntaxhighlight>
 +
 
 +
== D'autres options ==
 +
Une autre façon de contrôler la dérive est d'utiliser une centrale inertielle (IMU)... et donc de savoir si l'on s'écarte de la trajectoire voulue... et de la corriger au besoin en agissant vous même sur la vitesse des moteurs :-)
    
= Dépannage =
 
= Dépannage =
== Moteur tourne dans le mauvais sens ==
+
== Un moteur tourne dans le mauvais sens ==
'''Un moteur tourne dans le mauvais sens?'''
+
'''Je suis en marche avant (ou arrière) et un moteur tourne dans le mauvais sens!'''
    
Si vous avez l'un ou l'autre de vos moteurs qui ne dans le mauvais sens... c'est que celui-ci est branché à l'envers sur le pont-H.
 
Si vous avez l'un ou l'autre de vos moteurs qui ne dans le mauvais sens... c'est que celui-ci est branché à l'envers sur le pont-H.
    
Solution:
 
Solution:
* '''Inverser la fiche de branchement de ce moteur sur le motor-skin'''. Faire un demi-tour à la fiche.
+
* '''Inverser la fiche de branchement de ce moteur sur le motor-skin'''. Lui faire faire un demi-tour.
 
* Faire la même chose mais de façon logicielle.
 
* Faire la même chose mais de façon logicielle.
   Ligne 79 : Ligne 266 :  
</syntaxhighlight>
 
</syntaxhighlight>
    +
== Le robot tourne dans le mauvais sens ==
 +
'''Le robot tourne à droite au lieu de tourner à gauche!'''
 +
 +
{{ambox-stop|text=Assurez vous que la marche avant et marche arrière fonctionne comme attendu avant de corriger la rotation!}}
 +
 +
Si la marche avant et marche arrière fonctionnent correctement, cela signifie que le moteur gauche se prend pour le moteur droit (et inversement).
 +
 +
Vous avez deux solutions:
 +
* '''Intervertir le raccordement du moteur 1 avec celui du moteur 1 (l'approche la plus simple et plus facile)'''<br />Re-testez d’abord la marche avant et marche arrière pour vous assurer que les moteurs tournent dans le bon sens après inversion PUIS rester la rotation à droite et à gauche).
 +
* Intervertir les deux moteurs de façon logiciel
 +
 +
Vous pouvez échanger le moteur droit et le moteur gauche durant la création de l'objet Robot2Wheel... voici la syntaxs à votre disposition.
 +
 +
<syntaxhighlight lang="python">
 +
r2 = Robot2Wheel( fix_rotate = True )
 +
</syntaxhighlight>
 +
 +
Après cela, la plateforme tournera dans le bon sens.
 +
 +
== distance() retourne toujours 10000! ==
 +
'''La méthode distance() ne semble pas fonctionner correctement. J'ai toujours la valeur 10000!'''
 +
 +
La méthode {{fname|Ultrasonic.distance_in_cm()}} (et donc distance()) est équipée d'un mécanisme de timeout qui retourne la valeur 10000 (100m) au bout de 0.33 seconde.
 +
 +
0.33 sec est le temps nécessaire au son pour parcourir une distance de 100m.
 +
 +
Cela évite à votre programme de rester bloqué sur la lecture de la distance dans le cas où l'écho ne reviendrait jamais (ou ne partirait jamais)... c'est du vécu.
 +
 +
Vérifiez les éléments suivants:
 +
* Vos piles soient branchées. Pas d'alimentation = Pas de senseur ultrason
 +
* Votre régulateur 5V produise bien du 5 Volts<br />Vous avez des pastilles 5V et GND disponibles juste derrière le senseur ultrason.
 +
* Vous ne mesurez pas la distance sur une surface absorbante<br />Certaines surfaces absorbent les ondes sonores et dans ce cas, il n'y a pas d'écho.
    
{{Hack-MotorSkin-TRAILER}}
 
{{Hack-MotorSkin-TRAILER}}
29 836

modifications

Menu de navigation