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.
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).
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).
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:
Read via stdin
Pour lire la saisie utilisateur, nous avons utiliser le code suivant:
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().
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
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
Écrire un commentaire