Différences entre versions de « Hack-MotorSkin-Demo2 »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
 
(5 versions intermédiaires par le même utilisateur non affichées)
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 122 : Ligne 120 :
 
BYE                                                                             
 
BYE                                                                             
 
>>>  
 
>>>  
</noiki>
+
</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}}

Version actuelle datée du 3 octobre 2016 à 12:53


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

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.

Hack-MotorSkin-Demo2.jpg

Extra: Module Bluetooth

Si vous prêtez attention a l'image, nous avons greffé un module complémentaire sur la PyBoard. Il s'agit d'un module Bluetooth Serial HC05 branché sur l'UART(1) de la PyBoard.

Grâce à ce module (et au tutoriel ci-dessous), nous pourrons obtenir une invite de commande REPL via Bluetooth... ce qui sera pratique pour contrôler la motor skin depuis un ordinateur (un terminal)

Bluetooth & REPL

Tlogo-micropython-bluetooth.jpg

Utiliser un module Bluetooth série avec PyBoard. Dupliquer REPL sur Bluetooth.

 

 

Un petit films

MOVIE

Vous pouvez également accéder directement à la vidéo ici sur YouTube LIEN

Utilisation

  • Le programme démarre lorsque vous appeler la fonction console() mais nous y reviendrons plus tard.
    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.
    La LED utilisateur de la carte PyBoard s'éteint.

Hack-MotorSkin-Demo2-Keypad.jpg

Copier

Pour copier le script sur la carte, brancher votre pyboard et copier le fichier stdinctrl.py depuis les sources disponibles (ou l'archive) dans notre dépôt GitHub (voir notes d'installation).

Hack-MotorSkin-Demo2-copy.jpg

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 stdinctrl.py

from stdinctrl import *
console()

Vous devriez alors voir le résultat apparaître le message suivant:

--------------------
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 

Vous pouvez également interrompre l'exécution du programme en pressant 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:

>>> 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                                                                             
>>> 

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 Robot2Wheel qui permet de contrôler la plateforme 2 roues (via le MotorSkin).

import pyb
import sys

from pyb import delay, LED
from r2wheel import Robot2Wheel

Vient ensuite la définition de deux fonctions:

  • 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.
  • 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 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 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).
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()

Cette partie du code:

  • définit 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 cmd qui contient le dernier caractère lu sur stdin (donc la commande saisie par l'utilisateur).
  • définit les variables speed et 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)
	# 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

Boucle de traitement, qui s'exécute aussi longtemps que la commande "q" n'est pas arrivée :

	while cmd!='q':
		# Blocking read 1 char from stdin
		# Lecture bloquante de 1 caractere sur stdin 
		cmd = stdin.read(1)

Traitement des différentes commandes.

		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 )

Fin du script... lorsque la commande "q" est saisie et que la boucle while est terminée.

  • Arrêt du mobile
  • Extinction de la LED (le programme n'est plus actif)
  • Retour à l'invite de commande REPL
	# 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' )

Corrigé la dérive

Si vous avez parcouru le tutoriel, vous avez fort probablement croisé le point intitulé "la dérive".

Il est possible de démarrer la console en lui passant le paramètre de correction de la dérive.

from stdinctrl import *
console( derivative_fix=-10 )



Créé par Meurisse D. pour MCHobby.be - Created by Meurisse D. for MCHobby.be

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.