13.3.1.2. Olá, câmara

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-na. O programa mais simples liga-se, carrega um script MicroPython e imprime tudo o que o script escreve 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 notas

stop() antes de exec() não é opcional. Sem ele, qualquer script em execução anteriormente continua a escrever em stdout, e o novo exec entra em conflito com ele pelo controlo do canal stdin.

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

13.3.1.2.2. Parar o script

Quando o programa anfitrião quer interromper o script em execução, chame stop(). O script recebe a mesma interrupção que o IDE enviaria e termina na próxima oportunidade. Sair do gestor de contexto (o bloco with) fecha a porta série mas não para o script – a câmara continua a executar o que foi carregado por último até que algo o interrompa.

13.3.1.2.3. Erros e exceções

Qualquer problema na camada de protocolo levanta uma openmv.OMVException ou uma das suas subclasses (TimeoutException, ChecksumException, SequenceException). Envolver o bloco with em try / except OMVException é a forma mais simples de detetar um cabo USB desligado ou uma câmara que parou de responder.

O protocolo faz tentativas internamente antes de levantar a exceção; quando uma OMVException chega à aplicação, o orçamento de tentativas esgotou-se e a ligação está genuinamente interrompida. Os valores predefinidos (max_retry=3, timeout=1.0) funcionam para todos – ajuste-os no construtor apenas se uma aplicação específica precisar de um comportamento diferente.