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 145 : |
Ligne 143 : |
| | | |
| 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 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"> | | <syntaxhighlight lang="python"> |
Ligne 168 : |
Ligne 171 : |
| print( 'READY') | | print( 'READY') |
| l.on() | | 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. | | # User standard input to read instruction via the REPL connection. |
| # Utiliser l'entrée standard pout lire les insctruction via la connexion REPL | | # Utiliser l'entrée standard pout lire les insctruction via la connexion REPL |
Ligne 177 : |
Ligne 187 : |
| # Difference de vitesse entre les roues - pour prendre un virage | | # Difference de vitesse entre les roues - pour prendre un virage |
| speed_delta = 0 | | 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': | | while cmd!='q': |
| # Blocking read 1 char from stdin | | # Blocking read 1 char from stdin |
| # Lecture bloquante de 1 caractere sur stdin | | # Lecture bloquante de 1 caractere sur stdin |
| cmd = stdin.read(1) | | cmd = stdin.read(1) |
| + | </syntaxhighlight> |
| + | |
| + | Traitement des différentes commandes. |
| | | |
| + | <syntaxhighlight lang="python"> |
| if cmd == 'q': | | if cmd == 'q': |
| pass | | pass |
Ligne 190 : |
Ligne 209 : |
| print('halted') | | print('halted') |
| | | |
− | elif cmd == '8': # Increase Speed | + | elif cmd == '8': # Accroître la vitesse |
− | if abs(speed_delta)>0: # abort bending | + | if abs(speed_delta)>0: # abandonner le virage |
| speed_delta = 0 | | speed_delta = 0 |
| speed = speed_control( r2, speed, +0 ) | | speed = speed_control( r2, speed, +0 ) |
| if r2.state in [Robot2Wheel.RIGHT_ROTATE, Robot2Wheel.LEFT_ROTATE]: | | if r2.state in [Robot2Wheel.RIGHT_ROTATE, Robot2Wheel.LEFT_ROTATE]: |
− | # stop the rotation... keep current speed | + | # arrêter la rotation... garder la vitesse actuelle |
| speed = speed_control( r2, speed, +0 ) | | speed = speed_control( r2, speed, +0 ) |
| else: | | else: |
| + | # Simplement accroître la vitesse |
| speed = speed_control( r2, speed, +10 ) | | speed = speed_control( r2, speed, +10 ) |
| print( 'speed:%i' % speed ) | | print( 'speed:%i' % speed ) |
| | | |
− | elif cmd == '2': # Decrease speed | + | elif cmd == '2': # Diminuer la vitesse |
− | if abs(speed_delta) >0: # abord bending | + | if abs(speed_delta) >0: # Abandonner le virage |
| speed_delta = 0 | | speed_delta = 0 |
| speed = speed_control( r2, speed, 0 ) | | speed = speed_control( r2, speed, 0 ) |
| else: | | else: |
| + | # Simplement diminuer la vitesse |
| speed = speed_control( r2, speed, -10 ) | | speed = speed_control( r2, speed, -10 ) |
| print( 'speed:%i' % speed ) | | print( 'speed:%i' % speed ) |
| | | |
− | elif cmd == '9': # Bending (turning) on right | + | elif cmd == '9': # Entamer un virage sur la droite |
| if speed<50: | | if speed<50: |
| + | # Il faut une vitesse minimale pour entamer une |
| + | # opération de virage |
| print( 'bending:speed-too-low!') | | print( 'bending:speed-too-low!') |
| else: | | else: |
| + | # Appliquer une différence de vitesse sur les deux moteurs => virage |
| speed_delta = speed_delta_control( r2, speed, speed_delta, +10 ) | | speed_delta = speed_delta_control( r2, speed, speed_delta, +10 ) |
| print( 'bending:%i @ %i' %(speed, speed_delta) ) | | print( 'bending:%i @ %i' %(speed, speed_delta) ) |
| | | |
− | elif cmd == '7': # Bending (turning) on left | + | elif cmd == '7': # Entamer un virage sur la gauche |
| if speed<50: | | if speed<50: |
| + | # Il faut une vitesse minimale pour entamer une |
| + | # opération de virage |
| print( 'bending:speed-too-low!') | | print( 'bending:speed-too-low!') |
| else: | | else: |
| + | # Appliquer une différence de vitesse sur les deux moteurs => virage |
| speed_delta = speed_delta_control( r2, speed, speed_delta, -10 ) | | speed_delta = speed_delta_control( r2, speed, speed_delta, -10 ) |
| print( 'bending:%i @ %i' %(speed, speed_delta) ) | | print( 'bending:%i @ %i' %(speed, speed_delta) ) |
| | | |
− | elif cmd == '6': # Turning right | + | elif cmd == '6': # Tourner sur place à droite |
| r2.right( speed ) | | r2.right( speed ) |
| print( 'right:%i' % speed ) | | print( 'right:%i' % speed ) |
| | | |
− | elif cmd == '4': # turning left | + | elif cmd == '4': # tourner sur place à gauche |
| r2.left( speed ) | | r2.left( speed ) |
| print( 'left:%i' % 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 |
| | | |
− | # End of software | + | <syntaxhighlight lang="python"> |
| + | # Fin de programme |
| r2.halt() | | r2.halt() |
| l.off() | | l.off() |
| + | # destruction de l'instance de l'objet Robot2Wheel créé en début de script |
| del(r2) | | del(r2) |
| print( 'BYE' ) | | print( 'BYE' ) |