Communication série

Lorsque l'on vient du monde d'Arduino, il faut reprendre un peu ses marques lorsque l'on se met à utiliser Micropython.

Note : on peut aussi faire une réflexion sur le déroulé du programme avec Arduino (tourne en boucle) et Python (à la volée, pas de boucle sauf si programmée, plutôt timer)

Avec Arduino

Avec Arduino :

  • la carte se comporte comme un dispositif série, capable de recevoir et envoyer des chaînes

Avec Micropython

Par défaut la carte communique en mode REPL via le port série. Cela veut dire qu'elle :

  • reçoit les chaînes que l'on saisit
  • qu'elle les interprète comme du code Python de façon native.

Il s'agit là d'une grande différence d'avec Arduino : avec Arduino, il est nécessaire d'implémenter la gestion des chaînes reçues sur le port série, etc. Ici, c'est fait en natif.

Noter que le mode REPL a 2 modes en fait :

  • le mode standard
  • le mode raw_repl qui est utilisé lorsque l'on veut envoyer des choses à la carte par programmation. Ceci, notamment, avec l'utilitaire pyboard.py

Une explication sur les 2 modes ici : https://forum.micropython.org/viewtopic.php?t=123

Il est également possible de modifier le comportement par défaut par modification du boot

  • la carte peut être activée en mode "Virtual Serial Port"

Le fichier boot.py sur la carte contient :

# boot.py -- run on boot-up
# can run arbitrary Python, but best to keep it minimal

import machine
import pyb

pyb.main('main.py') # main script to run after this one
pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse
Noter que l'activation du mode VCP n'a pas d'impact sur le mode REPL.

A noter que quand on est en mode REPL, on a plusieurs raccourcis de controle de la communication :

CTRL-A        -- on a blank line, enter raw REPL mode
CTRL-B        -- on a blank line, enter normal REPL mode
CTRL-C        -- interrupt a running program
CTRL-D        -- on a blank line, do a soft reset of the board
CTRL-E        -- on a blank line, enter paste mode

Voir ici pour une explication détaillée des différents modes

Pour interagir avec micropython depuis un code Python, le plus simple est le mode raw_repl mais ce mode permet uniquement une communication synchrone : requete / réponse. C'est déjà pas mal. Mais ce n'est pas ce que l'on peut vouloir, notamment pour du retour "live". Ceci étant, la carte micropython semble suffisamment réactive pour que l'on adopte le principe d'envoyer une commande avant de recevoir une réponse.

Sinon, pour envoyer / recevoir des caractères avec la carte Pyboard comme avec une Arduino, on a la classe USB_VCP (Virtual Comm Port )

http://docs.micropython.org/en/v1.9.3/pyboard/library/pyb.USB_VCP.html

Le passage dans ce mode correspond à l'envoi de CTRL+C ?

Voir ici à ce sujet ++ : http://docs.micropython.org/en/v1.8.2/pyboard/pyboard/tutorial/pass_through.html

Note

En fait, c'est tout bête : une fois que la carte est programmée avec un code, envoyé depuis Geany, et si elle n'est pas simultanément connectée via screen alors on peut s'y connecter simplement comme un dispositif série à partir d'un terminal série et les messages envoyés par la carte sont reçus par le PC. Ceci, si on ne veut que afficher les messages et que l'on n'a pas besoin d'interaction. Si on a besoin d'interaction, il faut utiliser à priori le mode REPL.

Donc soit mode REPL synchrone ? soit mode hors REPL "asynchrone" ?

Noter qu'il est également possible de simplement communiquer avec les interfaces série UART de la carte grâce à la classe uart : http://docs.micropython.org/en/latest/library/pyb.UART.html#pyb-uart

Ceci est intéressant notamment entre le Raspberry Pi et le pico pi : 2 simples straps croisés permettent de faire la connexion et la communication série entre les 2, de UART à UART !

Voir ici p.10. Attention, cette manip nécessite de recompiler le micropython pour la picopi.