Ligne 1 : |
Ligne 1 : |
| {{Hack-micropython-Robot2Wheel-NAV}} | | {{Hack-micropython-Robot2Wheel-NAV}} |
| == Installer == | | == Installer == |
− | Vous pouvez télécharger la bibliothèque et les codes d'exemples directement depuis le dépôt GitHub du PyBoard-a-roulette | + | Vous pouvez télécharger la bibliothèque et les codes d'exemples directement depuis le [https://github.com/mchobby/pyboard-a-roulette dépôt GitHub du PyBoard-a-roulette] |
| | | |
| {{download-box|Télécharger PyBoard-a-Roulette.zip|https://github.com/mchobby/pyboard-a-roulette/archive/master.zip}} | | {{download-box|Télécharger PyBoard-a-Roulette.zip|https://github.com/mchobby/pyboard-a-roulette/archive/master.zip}} |
Ligne 31 : |
Ligne 31 : |
| Petit rappel avec [[MicroPython.brochage.pyboard#Le_brochage|le schéma des broches]], si nous utilisons la sortie X3, nous devons choisir le Timer et Channel approprié pour pouvoir créer un signal PWM. | | Petit rappel avec [[MicroPython.brochage.pyboard#Le_brochage|le schéma des broches]], si nous utilisons la sortie X3, nous devons choisir le Timer et Channel approprié pour pouvoir créer un signal PWM. |
| | | |
− | <nowiki>>>> from hbridge import HBridge
| + | <syntaxhighlight lang="python"> |
− | >>> MOT1_PINS = ( pyb.Pin.board.X6, pyb.Pin.board.X5 )
| + | from hbridge import HBridge |
− | >>> MOT1_PWM = {'pin' : pyb.Pin.board.X3, 'timer' : 2, 'channel' : 3 } </nowiki>
| + | MOT1_PINS = ( pyb.Pin.board.X6, pyb.Pin.board.X5 ) |
| + | MOT1_PWM = {'pin' : pyb.Pin.board.X3, 'timer' : 2, 'channel' : 3 } |
| + | </syntaxhighlight> |
| | | |
| Voila, nous avons défini nos broches de commandes dans le tuple {{fname|MOT1_PINS}} et les informations de la broche PWM dans {{fname|MOT1_PWM}} pour le contrôle de la vitesse. | | Voila, nous avons défini nos broches de commandes dans le tuple {{fname|MOT1_PINS}} et les informations de la broche PWM dans {{fname|MOT1_PWM}} pour le contrôle de la vitesse. |
Ligne 39 : |
Ligne 41 : |
| Nous allons pouvoir créer l'objet Pont-H pour le commander. | | Nous allons pouvoir créer l'objet Pont-H pour le commander. |
| | | |
− | <nowiki>>>> h = HBridge( MOT1_PINS, MOT1_PWM )</nowiki>
| + | <syntaxhighlight lang="python"> |
| + | h = HBridge( MOT1_PINS, MOT1_PWM ) |
| + | </syntaxhighlight> |
| | | |
| Nous allons pouvoir tester les méthodes de base: | | Nous allons pouvoir tester les méthodes de base: |
Ligne 48 : |
Ligne 52 : |
| Laissez un peu de temps entre chacune des commandes pour pouvoir constater les effets sur votre mobile. | | Laissez un peu de temps entre chacune des commandes pour pouvoir constater les effets sur votre mobile. |
| | | |
− | <nowiki>>>> h.forward()
| + | <syntaxhighlight lang="python"> |
− | >>> h.backward()
| + | h.forward() |
− | >>> h.halt()</nowiki>
| + | h.backward() |
| + | h.halt() |
| + | </syntaxhighlight> |
| | | |
| Vous pouvez maintenant tester votre deuxieme pont-H avec les commandes suivantes: | | Vous pouvez maintenant tester votre deuxieme pont-H avec les commandes suivantes: |
− | <nowiki>>>> MOT2_PINS = ( pyb.Pin.board.X7, pyb.Pin.board.X8 )
| + | <syntaxhighlight lang="python"> |
− | >>> MOT2_PWM = {'pin' : pyb.Pin.board.X4, 'timer' : 5, 'channel' : 4 }
| + | MOT2_PINS = ( pyb.Pin.board.X7, pyb.Pin.board.X8 ) |
− | >>> h2 = HBridge( MOT2_PINS, MOT2_PWM )
| + | MOT2_PWM = {'pin' : pyb.Pin.board.X4, 'timer' : 5, 'channel' : 4 } |
− | >>> h2.forward()
| + | h2 = HBridge( MOT2_PINS, MOT2_PWM ) |
− | >>> h2.backward()
| + | h2.forward() |
− | >>> h2.halt()</nowiki>
| + | h2.backward() |
| + | h2.halt() |
| + | </syntaxhighlight> |
| | | |
| === Contrôle de vitesse === | | === Contrôle de vitesse === |
Ligne 71 : |
Ligne 79 : |
| Nous allons donc revoir notre programme de commande du deuxième pont-h pour contrôler la vitesse moteur. | | Nous allons donc revoir notre programme de commande du deuxième pont-h pour contrôler la vitesse moteur. |
| | | |
− | <nowiki>>>> from hbridge import HBridge
| + | <syntaxhighlight lang="python"> |
− | >>> from pyb import delay
| + | from hbridge import HBridge |
− | >>> MOT2_PINS = ( pyb.Pin.board.X7, pyb.Pin.board.X8 )
| + | from pyb import delay |
− | >>> MOT2_PWM = {'pin' : pyb.Pin.board.X4, 'timer' : 5, 'channel' : 4 }
| + | MOT2_PINS = ( pyb.Pin.board.X7, pyb.Pin.board.X8 ) |
− | >>> h2 = HBridge( MOT2_PINS, MOT2_PWM )
| + | MOT2_PWM = {'pin' : pyb.Pin.board.X4, 'timer' : 5, 'channel' : 4 } |
− | >>> for speed in range( 0, 100, 10 ):
| + | h2 = HBridge( MOT2_PINS, MOT2_PWM ) |
− | >>> h2.backward( 100-speed )
| + | for speed in range( 0, 100, 10 ): |
− | >>> delay( 1000 )
| + | h2.backward( 100-speed ) |
− | >>> h2.halt()</nowiki>
| + | delay( 1000 ) |
| + | h2.halt() |
| + | </syntaxhighlight> |
| | | |
| L'instruction {{fname|for speed in range( 0, 100, 10 )}} permet de faire varier la vitesse entre 0 et 100 par pas de 10. | | L'instruction {{fname|for speed in range( 0, 100, 10 )}} permet de faire varier la vitesse entre 0 et 100 par pas de 10. |
Ligne 97 : |
Ligne 107 : |
| | | |
| Allons y: | | Allons y: |
− | <nowiki>>>> from r2wheel import Robot2Wheel
| + | <syntaxhighlight lang="python"> |
− | >>> r2 = Robot2Wheel()
| + | from r2wheel import Robot2Wheel |
− | >>> r2.forward( 80 )
| + | r2 = Robot2Wheel() |
− | >>> r2.halt()</nowiki>
| + | r2.forward( 80 ) |
| + | r2.halt() |
| + | </syntaxhighlight> |
| | | |
| Dans cet exemple, nous avons demandé à la plateforme d'avancer à la vitesse de 80% avec {{fname|r2.forward(80)}} . | | Dans cet exemple, nous avons demandé à la plateforme d'avancer à la vitesse de 80% avec {{fname|r2.forward(80)}} . |
Ligne 106 : |
Ligne 118 : |
| Vous l'aurez compris, pour passer la marche arrière, il suffit de... | | Vous l'aurez compris, pour passer la marche arrière, il suffit de... |
| | | |
− | <nowiki>>>> r2.backward()</nowiki>
| + | <syntaxhighlight lang="python"> |
| + | r2.backward() |
| + | </syntaxhighlight> |
| | | |
| === Un moteur tourne dans le mauvais sens! === | | === Un moteur tourne dans le mauvais sens! === |
Ligne 117 : |
Ligne 131 : |
| Vous pouvez inverser la commande de l'un OU l'autre OU des deux pont-H durant la création de l'objet Robot2Wheel... voici les différentes syntaxes à votre disposition. | | Vous pouvez inverser la commande de l'un OU l'autre OU des deux pont-H durant la création de l'objet Robot2Wheel... voici les différentes syntaxes à votre disposition. |
| | | |
− | <nowiki>r2 = Robot2Wheel( reverse_mot2 = True )
| + | <syntaxhighlight lang="python"> |
| + | r2 = Robot2Wheel( reverse_mot2 = True ) |
| r2 = Robot2Wheel( reverse_mot1 = True ) | | r2 = Robot2Wheel( reverse_mot1 = True ) |
− | r2 = Robot2Wheel( reverse_mot1 = True, reverse_mot2 = True )</nowiki> | + | r2 = Robot2Wheel( reverse_mot1 = True, reverse_mot2 = True ) |
| + | </syntaxhighlight> |
| | | |
| Dans le cadre de mes tests, j'ai utilisé {{fname|1=r2 = Robot2Wheel( reverse_mot2 = True )}} pour corriger la rotation de l'un de mes moteurs. | | Dans le cadre de mes tests, j'ai utilisé {{fname|1=r2 = Robot2Wheel( reverse_mot2 = True )}} pour corriger la rotation de l'un de mes moteurs. |
Ligne 128 : |
Ligne 144 : |
| 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. | | 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. |
| | | |
− | <nowiki>>>> r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur
| + | <syntaxhighlight lang="python"> |
− | >>> r2.turn( Robot2Wheel.RIGHT_ROTATE )
| + | r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur |
− | >>> r2.halt()</nowiki>
| + | r2.turn( Robot2Wheel.RIGHT_ROTATE ) |
| + | r2.halt() |
| + | </syntaxhighlight> |
| | | |
| Vous pouvez également indiquer une vitesse moteur durant la rotation. | | Vous pouvez également indiquer une vitesse moteur durant la rotation. |
− | | + | <syntaxhighlight lang="python"> |
− | <nowiki>>>> r2.turn( Robot2Wheel.RIGHT_ROTATE, speed=60 )</nowiki>
| + | r2.turn( Robot2Wheel.RIGHT_ROTATE, speed=60 ) |
| + | </syntaxhighlight> |
| | | |
| === La plateforme tourne dans le mauvais sens! === | | === La plateforme tourne dans le mauvais sens! === |
Ligne 148 : |
Ligne 167 : |
| Nous avons prévu un paramètre supplémentaire lors de la création de Robot2Wheel pour échanger le moteur1 et moteur2 de façon logiciel. | | Nous avons prévu un paramètre supplémentaire lors de la création de Robot2Wheel pour échanger le moteur1 et moteur2 de façon logiciel. |
| | | |
− | <nowiki>>>> r2 = Robot2Wheel( fix_rotate = True )</nowiki>
| + | <syntaxhighlight lang="python"> |
| + | r2 = Robot2Wheel( fix_rotate = True ) |
| + | </syntaxhighlight> |
| | | |
| Après cela, la plateforme tournera dans le bon sens. | | Après cela, la plateforme tournera dans le bon sens. |
Ligne 168 : |
Ligne 189 : |
| Comme pour la marche avant/arrière, vous avez la possibilité d'indiquer une vitesse (par défaut c'est 100%). | | Comme pour la marche avant/arrière, vous avez la possibilité d'indiquer une vitesse (par défaut c'est 100%). |
| | | |
− | <nowiki>>>> from r2wheel import Robot2Wheel
| + | <syntaxhighlight lang="python"> |
− | >>> from pyb import delay
| + | from r2wheel import Robot2Wheel |
− | >>> r2 = Robot2Wheel()
| + | from pyb import delay |
− | >>> r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur
| + | r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur |
− | >>> r2.turn( Robot2Wheel.RIGHT_ROTATE )
| + | r2.turn( Robot2Wheel.RIGHT_ROTATE ) |
− | >>> delay( 1500 ) # pendant 1.5 secondes
| + | delay( 1500 ) # pendant 1.5 secondes |
− | >>> r2.forward()
| + | r2.forward() |
− | >>> delay( 5000 )
| + | delay( 5000 ) |
− | >>> r2.turn( Robot2Wheel.LEFT_ROTATE, speed=80 )
| + | r2.turn( Robot2Wheel.LEFT_ROTATE, speed=80 ) |
− | >>> r2.forward()
| + | r2.forward() |
− | >>> delay( 5000 )
| + | delay( 5000 ) |
− | >>> r2.halt()</nowiki>
| + | r2.halt() |
| + | </syntaxhighlight> |
| | | |
| Vous pourriez obtenir le même résultat avec les méthodes {{fname|right()}} et {{fname|left()}}. | | Vous pourriez obtenir le même résultat avec les méthodes {{fname|right()}} et {{fname|left()}}. |
| | | |
− | <nowiki>>>> from r2wheel import Robot2Wheel
| + | <syntaxhighlight lang="python"> |
− | >>> from pyb import delay
| + | from r2wheel import Robot2Wheel |
− | >>> r2 = Robot2Wheel()
| + | from pyb import delay |
− | >>> r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur
| + | r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur |
− | >>> r2.right()
| + | r2.right() |
− | >>> delay( 1500 ) # pendant 1.5 secondes
| + | delay( 1500 ) # pendant 1.5 secondes |
− | >>> r2.forward()
| + | r2.forward() |
− | >>> delay( 5000 )
| + | delay( 5000 ) |
− | >>> r2.left( speed=80 )
| + | r2.left( speed=80 ) |
− | >>> r2.forward()
| + | r2.forward() |
− | >>> delay( 5000 )
| + | delay( 5000 ) |
− | >>> r2.halt()</nowiki>
| + | r2.halt() |
| + | </syntaxhighlight> |
| | | |
| === Les virages === | | === Les virages === |
Ligne 211 : |
Ligne 234 : |
| 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. | | 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. |
| | | |
− | <nowiki>>>> from r2wheel import Robot2Wheel
| + | <syntaxhighlight lang="python"> |
− | >>> from pyb import delay
| + | from r2wheel import Robot2Wheel |
− | >>> r2 = Robot2Wheel()
| + | from pyb import delay |
− | >>> r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur
| + | r2 = Robot2Wheel() |
− | >>> r2.turn(Robot2Wheel.RIGHT_BEND, speed=40)
| + | r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur |
− | >>> delay( 15000 )
| + | r2.turn(Robot2Wheel.RIGHT_BEND, speed=40) |
− | >>> r2.forward()
| + | delay( 15000 ) |
− | >>> delay( 5000 )
| + | r2.forward() |
− | >>> r2.halt()</nowiki>
| + | 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}}. | | 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}}. |
| | | |
− | <nowiki>>>> from r2wheel import Robot2Wheel
| + | <syntaxhighlight lang="python"> |
− | >>> from pyb import delay
| + | from r2wheel import Robot2Wheel |
− | >>> r2 = Robot2Wheel()
| + | from pyb import delay |
− | >>> r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur
| + | r2 = Robot2Wheel() |
− | >>> r2.turn(Robot2Wheel.LEFT_BEND, speed=70, speed2=40)
| + | r2 = Robot2Wheel( reverse_mot2 = True ) # inverser la commande du moteur moteur |
− | >>> delay( 15000 )
| + | r2.turn(Robot2Wheel.LEFT_BEND, speed=70, speed2=40) |
− | >>> r2.forward()
| + | delay( 15000 ) |
− | >>> delay( 5000 )
| + | r2.forward() |
− | >>> r2.halt()</nowiki>
| + | 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%. | | 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%. |
Ligne 239 : |
Ligne 266 : |
| === Corriger la dérive === | | === 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.}} | | {{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. | | Deux moteurs d'un même fabricant et d'un même modèle ne sont {{underline|jamais totalement}} identiques. |
| | | |
Ligne 250 : |
Ligne 277 : |
| [[Fichier:RB-2-WHEEL-MOVE-Derive.jpg|900px]] | | [[Fichier:RB-2-WHEEL-MOVE-Derive.jpg|900px]] |
| | | |
| + | ==== Comment corriger la dérive ==== |
| {{underline|'''La solution consiste'''}} à ralentir le moteur qui est trop rapide (ou parcours trop de distance), c'est pour cela que nous avons besoin du contrôle PWM... pour pouvoir contrôler la dérive. | | {{underline|'''La solution consiste'''}} à ralentir le moteur qui est trop rapide (ou parcours trop de distance), c'est pour cela que nous avons besoin du contrôle PWM... pour pouvoir contrôler la dérive. |
| | | |
Ligne 262 : |
Ligne 290 : |
| Voici deux exemple avec corrige de dérive, l'un appliquée sur un moteur... et l'autre sur l'autre moteur: | | Voici deux exemple avec corrige de dérive, l'un appliquée sur un moteur... et l'autre sur l'autre moteur: |
| | | |
− | <nowiki>>>> robot = Robot2Wheel( reverse_mot2 = True, derivative_fix = 5 )
| + | <syntaxhighlight lang="python"> |
− | >>> robot.forward() | + | robot = Robot2Wheel( reverse_mot2 = True, derivative_fix = 5 ) |
− | >>> delay( 15000 )
| + | robot.forward() |
− | >>> robot.halt()</nowiki>
| + | delay( 15000 ) |
| + | robot.halt() |
| + | </syntaxhighlight> |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | robot = Robot2Wheel( reverse_mot2 = True, derivative_fix = -3 ) |
| + | robot.forward() |
| + | delay( 15000 ) |
| + | robot.halt() |
| + | </syntaxhighlight> |
| | | |
− | <nowiki>>>> robot = Robot2Wheel( reverse_mot2 = True, derivative_fix = -3 )
| + | ==== D'autres options ==== |
− | >>> robot.forward()
| + | Il est possible de contrôler partiellement la dérive en utilisant des moteurs avec encodeur. L'encodeur sert à compter précisément la rotation des moteurs... il est donc possible de savoir exactement quand chaque moteur à fait rotation de 360°. Cela permet de contrôler la dérive au niveau moteur... mais pas celle issue des roues, de l'alignement des moteurs, des forces de glissement (des pneu sur le sol). |
− | >>> delay( 15000 )
| |
− | >>> robot.halt()</nowiki>
| |
| | | |
− | {{traduction}}
| + | 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 corriger au besoin :-) |
| | | |
| == Bibliothèque r2wheel et hbridge == | | == Bibliothèque r2wheel et hbridge == |