Ligne 21 : |
Ligne 21 : |
| Les servo-moteurs savent se positionner à un certain angle... mais n'ont pas de capteur informant la PyBoard l'angle actuel du moteur. | | Les servo-moteurs savent se positionner à un certain angle... mais n'ont pas de capteur informant la PyBoard l'angle actuel du moteur. |
| | | |
− | La bibliothèque {{fname|servorobot}} fait donc le nécessaire pour mémorisé l'angle sélectionné pour chaque servo-moteur. | + | La bibliothèque {{fname|servorobot}} fait donc le nécessaire pour mémorisé l'angle sélectionné et positionné pour chaque servo-moteur. |
| + | |
| + | En conséquence: |
| + | {{ambox-stop|text=A l'initialisation du robot (de l'instance de la classe Doggy), tous les servo-moteurs sont initialisés et positionnés à l'angle 0° (suivant [[Hack-micropython-ServoRobot-servorobot-convention|les conventions du robot]]).<br />Cela signifie qu'il {{underline|étend ses pattes tout droit à l'horizontal!}} }} |
| + | |
| + | Si le robot est debout sur ses pattes, la séquence d'initialisation le couche en une seule opération... et cela surprend parfois (d'où le titre "avant de sursauter!"). |
| + | |
| + | == Tester == |
| + | La bibliothèque servorobot contient de nombreux exemples [https://github.com/mchobby/pyboard-driver/tree/master/servorobot/samples/Doggy servorobot/samples/Doggy/] |
| + | |
| + | Les plus curieux pourrons également se pencher sur les exemples [https://github.com/mchobby/pyboard-driver/tree/master/servorobot/samples/RobotBase servorobot/samples/RobotBase] qui testent les éléments fondamentaux. |
| + | |
| + | === Reinitialisation === |
| + | |
| + | Script de base pour Doggy, l'initialisation de la classe Doggy fait un appel à la méthode de réinitialisation '''reset()'''. |
| + | |
| + | Cette dernière positionne tous mes angles à 0° (étend les pattes à l'horizontal) |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from doggy import * |
| + | d = Doggy() |
| + | </syntaxhighlight> |
| + | |
| + | Mais rien ne vous empêche de faire appel directement à la méthode '''reset()''' |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | d.reset() |
| + | </syntaxhighlight> |
| + | |
| + | Lorsqu'un angle est sélectionné sur un servo, ce dernier le maintient activement la position. |
| + | |
| + | Il est possible de désactiver les servos en utilisant la méthode '''release()''' |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | d.release() |
| + | </syntaxhighlight> |
| + | |
| + | === Etude du mouvement === |
| + | {{ambox|text=Démarrer un mouvement, même pour un être humain, ne se fait pas n'importe comment! <br />Il faut se préparer au mouvement.}} |
| + | |
| + | Par exemple, '''SI''' vous êtes assis sur un chaise et que vous voulez marcher '''ALORS''' vous passez par une étape {{underline|préparatoire}} qui consiste à vous mettre debout '''PUIS''' seulement à {{underline|faire un pas après l'autre}}. |
| + | |
| + | Ce principe est repris dans les classes {{fname|RobotBase}} et {{fname|Movement}}... donc dans {{fname|Doggy}}. |
| + | |
| + | Dans ServoRobot, un mouvement se prépare en appelant {{fname|prepare()}} puis s'exécute en appelant {{fname|move()}}, vous allez pouvoir admirer cette mécanique au point suivant. |
| + | |
| + | L'appel à {{fname|prepare()}} configure les membres dans une position permettant de débuter le mouvement souhaité. |
| + | |
| + | L'appel à {{fname|move()}} peut être appelé de différentes façons mais elle permet d'exécuter le mouvement. |
| + | |
| + | {{underline|Pour les plus curieux:}} |
| + | # Les mouvements sont implémentés dans des classes dérivées de Movement. |
| + | # La classe Movement contient un méthode '''prepare()'''. '''prepare()''' accepte des paramètres optionnels, ce qui permet d'ajuster les paramètres du mouvement. |
| + | # La classe Movement contient également une méthode '''do()''' appelée répétitivement par '''move()'''.<br />'''do()''' permet de décomposer un mouvement complexe (par exemple: la marche) en plusieurs opérations élémentaires (ou sous mouvement partiels).<br />Il faudra donc de plusieurs appels a '''Movement.do()''' pour effectuer le mouvement complet qui permet à Doggy d'avancer sur ses 4 pattes. |
| + | N'hésitez pas à consulter les classes Foward, Backward, etc disponibles dans le module {{fname|doggy.py}} |
| + | |
| + | === Se lever === |
| + | Avant de faire bouger le robot, il serait peut être opportun de mettre le robot debout sur ses pattes |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from doggy import * |
| + | from pyb import delay |
| + | d = Doggy() |
| + | |
| + | # Nous avons besoin de connaître la position initiale |
| + | d.reset() |
| + | |
| + | # Laisser un peu de temps pour que les oscillations mécaniques se calme |
| + | delay( 1500 ) |
| + | |
| + | # Place toutes les epaules à +20 et -20 degree |
| + | d.align( sdegree=20, asymetric=True ) |
| + | |
| + | # FR: Place tous les poignets à +90 pour mettre Doggy debout |
| + | d.standup() |
| + | </syntaxhighlight> |
| + | |
| + | === Avancer / Reculer (version prédictive) === |
| + | Vous disposez de plusieurs approches pour faire avancer Doggy. |
| + | |
| + | Nous présentons ici une approche prédictive, c'est à dire que vous savez combien de "pas" vous allez faire avant d'appeler la fonction forward. |
| + | |
| + | Nous présentons ici les approches les plus simples jusqu'au plus avancées. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from doggy import * |
| + | from pyb import delay |
| + | d = Doggy() |
| + | |
| + | # Place le robot en positions de marche (debout). Les épaules sont placés a angles adéquat pour commencer la marche |
| + | # prepare() EST IMPORTANT AVANT DE COMMENCER UN MOUVEMENT |
| + | d.prepare('FORWARD') |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Déplacement en marche avant (angle poignet=90) en 40 étapes (de 5 degrés chacun) |
| + | for i in range( 40 ): |
| + | d.move( 'FORWARD' ) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Une autre façon de faire: appelle prepare() avant d'exécuter 40 fois l'étape de mouvement |
| + | d.reset() |
| + | d.move( 'FORWARD', repeat=40, prepare=True) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Changer les angles des mouvements des epaules (shoulder min & max) |
| + | # ainsi que l'angle du poignet (a 75 degrés). |
| + | # Chaque pas fait un déplacement de 2 degres |
| + | # |
| + | # Tous les paramètres correspondent a Forward.do() |
| + | d.reset() |
| + | d.prepare('FORWARD', sdegree_min=0, sdegree_max=85, wdegree=75 ) |
| + | for i in range( 150 ): |
| + | d.move( 'FORWARD', sdegree_min=0, sdegree_max=85, wdegree=75, step_angle=2 ) |
| + | |
| + | |
| + | # Tout en un |
| + | d.move( 'FORWARD', sdegree_min=0, sdegree_max=85, wdegree=75, step_angle=2, repeat=150, prepare=True ) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Faisons le vraiment à la dure (obtenir l'objet Movement). Voyez comment est implémenté Doggy.move() |
| + | d.reset() |
| + | mov_obj = d.movement('FORWARD') |
| + | mov_obj.prepare( wdegree=65 ) |
| + | for i in range( 50 ): |
| + | mov_obj.do( wdegree=65, step_angle=10 ) |
| + | </syntaxhighlight> |
| + | |
| + | Vous noterez l'utilisation du mot 'FORWARD' pour avancer. Vous pouvez le remplacer par 'F'. |
| + | |
| + | Pour reculer, vous pouvez utiliser les mots clés 'BACKWARD', 'BACK', 'B'. |
| + | |
| + | === Tourner === |
| + | Il est possible de faire tourner le robot Doggy à droite (RIGHT) ou à gauche (LEFT) |
| + | Nous présentons ici les approches les plus simples jusqu'au plus avancées. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from doggy import * |
| + | from pyb import delay |
| + | d = Doggy() |
| + | |
| + | # Place le robot en positions de marche (debout). |
| + | # Les épaules sont placés a angles adéquat pour commencer à tourner à gauche |
| + | # prepare() EST IMPORTANT AVANT DE COMMENCER UN MOUVEMENT |
| + | d.prepare('LEFT') |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Tourne à gauche (angle poignet=90) en 1 étapes de 90° (valeur par défaut) |
| + | d.move( 'LEFT' ) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Une autre façon de faire: appeler prepare() avant d'exécuter 2fois l'étape |
| + | # de mouvement (de 90 degrees) |
| + | d.reset() |
| + | d.move( 'LEFT', repeat=2, prepare=True) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Changer les angles des mouvements des épaules pour tourner à gauche de |
| + | # 160 degree (en total) et l'angle des poignet fixé à 5 degrees. |
| + | # Tous les paramètres correspondent a Left.do() |
| + | d.reset() |
| + | d.prepare('LEFT', wdegree=75 ) |
| + | d.move( 'LEFT', sdegree=160, wdegree=75 ) |
| + | |
| + | # Tout en un |
| + | d.move( 'LEFT', sdegree=160, wdegree=75, prepare=True ) |
| + | |
| + | delay( 2000 ) |
| + | |
| + | # Faisons le vraiment a la dure (obtenir l'objet Movement). Voyez comment est implémenté Doggy.move() |
| + | d.reset() |
| + | mov_obj = d.movement('LEFT') |
| + | mov_obj.prepare( wdegree=65 ) |
| + | mov_obj.do( sdegree=60, wdegree=65, prepare=True, repeat=3 ) # repeat 3 times the turn left |
| + | |
| + | # Réduire l'amplitude du mouvement de 60 degrés (valeur par défaut) |
| + | # à 30 degrées & faire une rotation à gauche de 75 degrée |
| + | d.move( 'L', sdegree=75, sdegree_max=30, prepare=True ) |
| + | </syntaxhighlight> |
| + | |
| + | Vous noterez l'utilisation du mot 'LEFT' pour tourner à gauche. Vous pouvez le remplacer par 'L'. |
| + | |
| + | Pour tourner à droite, vous pouvez utiliser les mots clés 'RIGHT', 'R'. |
| | | |
− | Cela signifie aussi qu'à l'initialisation du robot, tous les servo-moteurs sont initialisés et positionné à un angle par défaut.
| |
| | | |
| {{Hack-micropython-ServoRobot-TRAILER}} | | {{Hack-micropython-ServoRobot-TRAILER}} |