13.3.1.2. Hola cámara

La clase openmv.Camera es el punto de entrada de Python para todo lo que el paquete puede hacer. Todas las demás páginas de este tutorial la invocan. El programa útil más pequeño se conecta, sube un script MicroPython e imprime todo lo que el script escriba en 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. Algunas notas

stop() antes de exec() no es opcional. Sin ello, cualquier script que estuviera ejecutándose antes sigue escribiendo en stdout, y el nuevo exec compite con él por el control del canal stdin.

exec() sube la cadena del script al búfer stdin de la cámara y lo ejecuta en el mismo intérprete de MicroPython con el que habla el IDE. El script importa csi, image, ml y el resto de la superficie de la cámara que cubrieron los capítulos anteriores; lo único diferente es que el código fuente llega por USB en lugar de desde main.py en la cámara o desde el IDE.

13.3.1.2.2. Detener el script

Cuando el programa del anfitrión quiere interrumpir el script en ejecución, llama a stop(). El script recibe la misma interrupción que entregaría el IDE y sale en la siguiente oportunidad. Salir del gestor de contexto (el bloque with) cierra el puerto serie pero no detiene el script: la cámara sigue ejecutando lo último que se cargó hasta que algo lo interrumpa.

13.3.1.2.3. Errores y excepciones

Cualquier cosa que salga mal en la capa de protocolo genera una openmv.OMVException o una de sus subclases (TimeoutException, ChecksumException, SequenceException). Envolver el bloque with en try / except OMVException es la forma más sencilla de exponer un cable USB desconectado o una cámara que dejó de responder.

El protocolo reintenta internamente antes de generar la excepción; para cuando una OMVException llega a la aplicación, el presupuesto de reintentos se ha agotado y el enlace está genuinamente roto. Los valores por defecto (max_retry=3, timeout=1.0) funcionan para todos; ajústalos en el constructor solo si una aplicación específica necesita un comportamiento diferente.