13.3.1.2. Olá cam

A classe openmv.Camera é o ponto de entrada Python para tudo o que o pacote pode fazer. Todas as outras páginas deste tutorial chamam essa classe. O menor programa útil conecta, envia um script MicroPython e imprime o que quer que o script escreva em 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. Algumas observações

stop() antes de exec() não é opcional. Sem ele, qualquer script em execução anterior continua escrevendo em stdout, e o novo exec disputa com ele o controle do canal stdin.

exec() envia a string do script para o buffer stdin da cam e o executa no mesmo interpretador MicroPython com que a IDE conversa. O script importa csi, image, ml e o restante da superfície da cam que os capítulos anteriores cobriram – a única diferença é que o código-fonte chega via USB em vez de vir do main.py na câmera ou da IDE.

13.3.1.2.2. Parando o script

Quando o programa do host quer interromper o script em execução, chame stop(). O script recebe a mesma interrupção que a IDE entregaria e sai na próxima oportunidade. Sair do gerenciador de contexto (o bloco with) fecha a porta serial, mas não para o script – a cam continua executando o que foi carregado por último até que algo o interrompa.

13.3.1.2.3. Erros e exceções

Qualquer coisa que dê errado na camada de protocolo dispara uma openmv.OMVException ou uma de suas subclasses (TimeoutException, ChecksumException, SequenceException). Envolver o bloco with em try / except OMVException é a maneira mais simples de expor um cabo USB desconectado ou uma cam que parou de responder.

O protocolo faz retentativas internamente antes de disparar a exceção; quando uma OMVException chega à aplicação, o orçamento de retentativas se esgotou e o enlace está genuinamente quebrado. Os padrões (max_retry=3, timeout=1.0) funcionam para todos – ajuste-os no construtor apenas se uma aplicação específica precisar de comportamento diferente.