13.3.1.2. Bonjour la caméra¶
La classe openmv.Camera est le point d’entrée Python de tout ce que le paquet peut faire. Toutes les autres pages de ce tutoriel l’appellent. Le plus petit programme utile se connecte, téléverse un script MicroPython et affiche tout ce que le script écrit sur stdout:
from openmv import Camera
script = """
import time
while True:
print('hello from the cam')
time.sleep(1)
"""
with Camera('/dev/ttyACM0') as cam:
cam.stop()
cam.exec(script)
while True:
if text := cam.read_stdout():
print(text, end='')
13.3.1.2.1. Quelques remarques¶
Appeler stop() avant exec() n’est pas facultatif. Sans cela, tout script précédemment en cours continue d’écrire sur stdout, et le nouvel exec se dispute avec lui le contrôle du canal stdin.
exec() téléverse la chaîne du script dans le tampon stdin de la caméra et l’exécute dans le même interpréteur MicroPython auquel l’IDE s’adresse. Le script importe csi, image, ml et le reste de la surface de la caméra que les chapitres précédents ont couverte : la seule différence est que le code source arrive via USB au lieu de provenir de main.py sur la caméra ou de l’IDE.
13.3.1.2.2. Arrêter le script¶
Lorsque le programme hôte veut interrompre le script en cours, appelez stop(). Le script reçoit la même interruption que l’IDE lui délivrerait et se termine à la première occasion. Sortir du gestionnaire de contexte (le bloc with) ferme le port série mais n’arrête pas le script : la caméra continue d’exécuter ce qui a été chargé en dernier jusqu’à ce que quelque chose l’interrompe.
13.3.1.2.3. Erreurs et exceptions¶
Tout ce qui ne va pas au niveau de la couche protocole déclenche une openmv.OMVException ou l’une de ses sous-classes (TimeoutException, ChecksumException, SequenceException). Envelopper le bloc with dans try / except OMVException est le moyen le plus simple de faire remonter un câble USB déconnecté ou une caméra qui a cessé de répondre.
Le protocole effectue des tentatives en interne avant de déclencher une exception ; au moment où une OMVException atteint l’application, le budget de tentatives est épuisé et la liaison est réellement rompue. Les valeurs par défaut (max_retry=3, timeout=1.0) conviennent à tout le monde : ne les ajustez au niveau du constructeur que si une application spécifique nécessite un comportement différent.