Header Ads

MicroPython PyBoard: REPL et STDIN, USB Série - réception de données

Ce week-end, nous nous sommes penché sur notre projet Motor-Skin afin de prévoir un petit programme de pilotage en mode REPL... si possible sans fil via Bluetooth.

Pyboard-à-roulette - Pyboard + Motor Skin

Ce fût un moment captivant et très intéressant.

REPL via Bluetooth
Nous avons repris un plus ancien tutoriel qui se penchait sur la connexion Bluetooth Série mais surtout la réplication du REPL sur le UART(1).
Tutoriel - REPL via Bluetooth

Du coup, en une seule ligne de commande, nous avons une ligne de commande REPL via Bluetooth (sans connexion physique... c'est trop de la balle).

pyb.repl_uart( pyb.UART(1,9600) )


Print et Read
Nombre d'entre nous connaissent très bien la fonction print() qui envoi des informations très utiles sur l'invite REPL (donc aussi notre connexion série répliquée via Bluetooth).

Par contre, comment fait-on pour y lire des données????

C'est justement le but de cet article, car nous voulions créer un programme de pilotage en REPL qui fonctionne comme ceci:

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

Read via stdin
Pour lire la saisie utilisateur, nous avons utiliser le code suivant:

import sys
cmd = sys.stdin.read(1)
if cmd == '8': # increase speed
    pass 

read(1) fait une lecture de 1 octet/byte sur stdin (l'entrée standard).
La fonction ne rend la main qu'une fois le nombre d'octet attendu est lu.
C'est un appel bloquant!

L'avantage, c'est que cette méthode fonctionne sur l'invite REPL quelque soit le canal utilisé. Compatible avec USB, UART(1) ou UART(2)... et donc notre module Bluetooth.

L'inconvénient, c'est que la méthode est bloquante... votre script reste en attente tant que la lecture n'est pas complète. Cela peut être terriblement gênant dans certaines situations (mais pas celle de notre projet).

Read via USB_VPC
Si la gestion du temps est importante, vous pouvez utiliser le l'objet pyb.USB_VPC().

import pyb
usb = pyb.USB_VCP()
data = usb.recv( 10, timeout=500 )
if len(data) < 10:
    print('timeout')

L'avantage, c'est que la méthode prend un paramètre timeout qui permet de rendre la main au script principal si le nombre d'octet attendu n'arrive pas endéans le temps souhaité.

L'inconvénient, c'est que cette approche ne fonctionne qu'avec le port USB (liaison série via USB). Ce qui est gênant dans le cas de notre PyBoard-à-Roulette qui n'appréciera pas de traîner un câble USB derrière lui.

En savoir plus
Nous vous invitons à consulter la page du projet Motor-Skin (y compris la démo de la console stdin).

Venez également découvrir les pages des produits:
Où acheter