Modifications

Sauter à la navigation Sauter à la recherche
10 931 octets ajoutés ,  3 octobre 2016 à 12:53
aucun résumé de modification
Ligne 2 : Ligne 2 :     
= Introduction =
 
= Introduction =
{{traduction}}
  −
   
'''StdinCtrl''' est un programme assez simple qui permet de contrôler votre PyBoard depuis un terminal via la console REPL. Une fois démarré, vous pourrez facilement contrôler la direction et la vitesse de votre bolide à partir des touches du pavé numérique.
 
'''StdinCtrl''' est un programme assez simple qui permet de contrôler votre PyBoard depuis un terminal via la console REPL. Une fois démarré, vous pourrez facilement contrôler la direction et la vitesse de votre bolide à partir des touches du pavé numérique.
   Ligne 25 : Ligne 23 :     
{{ttuto-end}}
 
{{ttuto-end}}
 
+
<p>&nbsp;</p>
<p>v</p>
      
== Un petit films ==
 
== Un petit films ==
Ligne 35 : Ligne 32 :     
== Utilisation ==
 
== Utilisation ==
* Le programme démarre lorsque vous appeler la fonction {{fname|console()}}.<br />Une fois actif, le programme allume la LED utilisateur 4 (LED Bleue) de la carte PyBoard.
+
* Le programme démarre lorsque vous appeler la fonction {{fname|console()}} mais nous y reviendrons plus tard.<br />Une fois actif, le programme allume la LED utilisateur 4 (LED Bleue) de la carte PyBoard.
 
* Vous pouvez utiliser la touche "q" (minuscule) Re-pressez ce même bouton pour arrêter ce programme.<br />La LED utilisateur de la carte PyBoard s'éteint.
 
* Vous pouvez utiliser la touche "q" (minuscule) Re-pressez ce même bouton pour arrêter ce programme.<br />La LED utilisateur de la carte PyBoard s'éteint.
    +
[[Fichier:Hack-MotorSkin-Demo2-Keypad.jpg|640px]]
 +
 +
= Copier =
 +
Pour copier le script sur la carte, brancher votre pyboard et copier le fichier {{fname|stdinctrl.py}} depuis les sources disponibles (ou l'archive) dans [[Hack-MotorSkin-Installer|notre dépôt GitHub (voir notes d'installation)]].
 +
 +
[[Fichier:Hack-MotorSkin-Demo2-copy.jpg|800px]]
 +
 +
N'oubliez pas d'éjecter le lecteur de la carte MicroPython si vous voulez redémarrer débrancher votre PyBoard de votre PC.
 +
 +
= Tester =
 +
Vous pouvez tester très facilement le script à l'aide d'une connexion REPL.
 +
 +
Si vous avez répliqué la session REPL sur votre connexion Bluetooth alors vous pourrez piloter votre robot à roulette depuis une connexion sans fils.
 +
 +
Saisissez simplement le code suivant en ligne de commande pour charger et exécuter le code disponible dans {{fname|stdinctrl.py}}
 +
 +
<syntaxhighlight lang="python">
 +
from stdinctrl import *
 +
console()
 +
</syntaxhighlight>
 +
 +
Vous devriez alors voir le résultat apparaître le message suivant:
 +
 +
<nowiki>--------------------
 +
MotorSkin Interactive Console
 +
q: quit to REPL  - quitter vers REPL
 +
 +
8: increase speed - accelerer
 +
2: decrease speed - ralentir
 +
7: going left    - aller a gauche
 +
9: going right    - aller a droite
 +
4: turn left      - tourner à gauche                                         
 +
6: turn right    - tourner à droite                                         
 +
5: HALT          - ARRET                                                     
 +
--------------------                                                           
 +
INIT MOTORSKIN                                                                 
 +
READY </nowiki>
 +
 +
{{ambox-stop|text=L'invite REPL n'est pas disponible pendant que le programme fonctionne, vous pouvez revenir à REPL en pressant la touche "'''q'''".}}
 +
 +
Vous pouvez également interrompre l'exécution du programme en pressant {{fname|CTRL+C}} plusieurs fois.
 +
 +
En pressant les différentes touches de commandes (cfr début de cette page), vous commencerez à contrôler votre petit bolide.
 +
 +
Le programme de contrôle renvoi également différents messages concernant l'exécution des différentes commandes.
 +
 +
Voici un exemple complet '''incluant les différents messages retournée par le script''':
 +
 +
<nowiki>>>> from stdinctrl import *
 +
>>> console()
 +
--------------------
 +
MotorSkin Interactive Console
 +
q: quit to REPL  - quitter vers REPL
 +
 +
8: increase speed - accelerer
 +
2: decrease speed - ralentir
 +
7: going left    - aller a gauche
 +
9: going right    - aller a droite
 +
4: turn left      - tourner à gauche                                         
 +
6: turn right    - tourner à droite                                         
 +
5: HALT          - ARRET                                                     
 +
--------------------                                                           
 +
INIT MOTORSKIN                                                                 
 +
READY                                                                         
 +
speed:50                                                                       
 +
speed:60                                                                       
 +
speed:70                                                                       
 +
bending:70 @ 5                                                                 
 +
bending:70 @ 10                                                               
 +
bending:70 @ 15                                                               
 +
speed:80                                                                       
 +
speed:90                                                                       
 +
halted                                                                         
 +
speed:-50                                                                     
 +
speed:-60                                                                     
 +
halted                                                                         
 +
left:0                                                                         
 +
speed:0                                                                       
 +
speed:50                                                                       
 +
left:50                                                                       
 +
speed:50                                                                       
 +
right:50                                                                       
 +
speed:50                                                                       
 +
BYE                                                                           
 +
>>>
 +
</nowiki>
 +
 +
= Inspectons le code =
 +
 +
Voici le code avec quelques commentaires pour vous aider à comprendre son fonctionnement
 +
 +
La toute première partie importe les éléments nécessaires et surtout la classe {{fname|Robot2Wheel}} qui permet de contrôler la plateforme 2 roues (via le MotorSkin).
 +
 +
<syntaxhighlight lang="python">
 +
import pyb
 +
import sys
 +
 +
from pyb import delay, LED
 +
from r2wheel import Robot2Wheel 
 +
</syntaxhighlight>
 +
 +
Vient ensuite la définition de deux fonctions:
 +
* {{fname|speed_control}} - qui permet de contrôler les valeurs de la vitesse (speed) et s'assure que le robot avance pour les vitesses positives et recule pour les vitesses négatives.
 +
* {{fname|speed_delta_control}} - qui permet de contrôler la différence de vitesse entre les moteurs droit et gauche, fonctionnalité utilisée pour entamer des virages avec les touches "7" et "9".
 +
 +
Le contenu  de ces fonctions n'est pas pertinent à ce stade. Vous pouvez consulter le code pour de plus amples informations.
 +
 +
Le corps du script se trouve dans la fonction {{fname|console()}} dont nous trouvons les différents éléments ci-dessous que nous allons élaguer pour en faciliter la lecture:
 +
 +
Le corps de la fonction {{fname|console()}} débute par:
 +
* l'affichage du message d'acceuil
 +
* l'initialisation du motor skin
 +
* Allumage de la LED Bleue (qui indique que le programme est en cours de fonctionnement).
 +
 +
<syntaxhighlight lang="python">
 +
def console( derivative_fix=0 ):
 +
print( '-'*20 )
 +
print( 'MotorSkin Interactive Console')
 +
print( 'q: quit to REPL  - quitter vers REPL')
 +
print( '')
 +
print( '8: increase speed - accelerer' )
 +
print( '2: decrease speed - ralentir' )
 +
print( '7: going left    - aller a gauche')
 +
print( '9: going right    - aller a droite')
 +
print( '4: turn left      - tourner à gauche')
 +
print( '6: turn right    - tourner à droite')
 +
print( '5: HALT          - ARRET')
 +
print( '-'*20)
 +
print( 'INIT MOTORSKIN')
 +
l = LED(4)  # LED Bleue / Blue LED
 +
l.off()
 +
r2 = Robot2Wheel( derivative_fix=derivative_fix )
 +
r2.halt()
 +
 +
print( 'READY')
 +
l.on()
 +
</syntaxhighlight>
 +
 +
Cette partie du code:
 +
* définit {{fname|stdin}}, la dite "entrée standard" par laquelle arrive tous les caractères émis sur le port série correspondant à la ligne de commande (donc celui utilisé par REPL).
 +
* définit la variable {{fname|cmd}} qui contient le dernier caractère lu sur {{fname|stdin}} (donc la commande saisie par l'utilisateur).
 +
* définit les variables {{fname|speed}} et {{fname|speed_delta}}, servant à mémorisé la vitesse actuelle du mobile (ainsi que la différence de vitesse entre les moteurs... lorsque le robot prend un virage)
 +
 +
<syntaxhighlight lang="python">
 +
# User standard input to read instruction via the REPL connection.
 +
# Utiliser l'entrée standard pout lire les insctruction via la connexion REPL
 +
stdin = sys.stdin
 +
cmd = ''
 +
speed = 0
 +
# Difference of speed between wheel - to have a bend turning
 +
# Difference de vitesse entre les roues - pour prendre un virage
 +
speed_delta = 0 
 +
</syntaxhighlight>
 +
 +
Boucle de traitement, qui {{underline|s'exécute aussi longtemps que la commande "q" n'est pas arrivée}} :
 +
 +
<syntaxhighlight lang="python">
 +
while cmd!='q':
 +
# Blocking read 1 char from stdin
 +
# Lecture bloquante de 1 caractere sur stdin
 +
cmd = stdin.read(1)
 +
</syntaxhighlight>
 +
 +
Traitement des différentes commandes.
 +
 +
<syntaxhighlight lang="python">
 +
if cmd == 'q':
 +
pass
 +
elif cmd == '5': # Halt
 +
r2.halt()
 +
speed = 0
 +
speed_delta = 0
 +
print('halted')
 +
 +
elif cmd == '8': # Accroître la vitesse
 +
if abs(speed_delta)>0: # abandonner le virage
 +
speed_delta = 0
 +
speed = speed_control( r2, speed, +0 )
 +
if r2.state in [Robot2Wheel.RIGHT_ROTATE, Robot2Wheel.LEFT_ROTATE]:
 +
# arrêter la rotation... garder la vitesse actuelle
 +
speed = speed_control( r2, speed, +0 )
 +
else:
 +
                                # Simplement accroître la vitesse
 +
speed = speed_control( r2, speed, +10 )
 +
print( 'speed:%i' % speed )
 +
 +
elif cmd == '2': # Diminuer la vitesse
 +
if abs(speed_delta) >0: # Abandonner le virage
 +
speed_delta = 0
 +
speed = speed_control( r2, speed, 0 )
 +
else:
 +
                                # Simplement diminuer la vitesse
 +
speed = speed_control( r2, speed, -10 )
 +
print( 'speed:%i' % speed )
 +
 +
elif cmd == '9': # Entamer un virage sur la droite
 +
if speed<50:
 +
                                # Il faut une vitesse minimale pour entamer une
 +
                                # opération de virage
 +
print( 'bending:speed-too-low!')
 +
else:
 +
                                # Appliquer une différence de vitesse sur les deux moteurs => virage
 +
speed_delta = speed_delta_control( r2, speed, speed_delta, +10 )
 +
print( 'bending:%i @ %i' %(speed, speed_delta) )
 +
 +
elif cmd == '7': # Entamer un virage sur la gauche
 +
if speed<50:
 +
                                # Il faut une vitesse minimale pour entamer une
 +
                                # opération de virage
 +
print( 'bending:speed-too-low!')
 +
else:
 +
                                # Appliquer une différence de vitesse sur les deux moteurs => virage
 +
speed_delta = speed_delta_control( r2, speed, speed_delta, -10 )
 +
print( 'bending:%i @ %i' %(speed, speed_delta) )
 +
 +
elif cmd == '6': # Tourner sur place à droite
 +
r2.right( speed )
 +
print( 'right:%i' % speed )
 +
 +
elif cmd == '4': # tourner sur place à gauche
 +
    r2.left( speed )
 +
    print( 'left:%i' % speed )
 +
 +
 +
</syntaxhighlight>
 +
 +
Fin du script... lorsque la commande "q" est saisie et que la boucle {{fname|while}} est terminée.
 +
* Arrêt du mobile
 +
* Extinction de la LED (le programme n'est plus actif)
 +
* Retour à l'invite de commande REPL
 +
 +
<syntaxhighlight lang="python">
 +
# Fin de programme
 +
r2.halt()
 +
l.off()
 +
        # destruction de l'instance de l'objet Robot2Wheel créé en début de script
 +
del(r2)
 +
print( 'BYE' )
 +
</syntaxhighlight>
 +
 +
= Corrigé la dérive =
 +
Si vous avez parcouru le tutoriel, vous avez fort probablement croisé le point intitulé "[[Hack-MotorSkin-Tester#Corriger_la_d.C3.A9rive|la dérive]]".
 +
 +
Il est possible de démarrer la console en lui passant le paramètre de correction de la dérive.
 +
 +
<syntaxhighlight lang="python">
 +
from stdinctrl import *
 +
console( derivative_fix=-10 )
 +
</syntaxhighlight>
    
{{Hack-MotorSkin-TRAILER}}
 
{{Hack-MotorSkin-TRAILER}}
29 836

modifications

Menu de navigation