13.3.1.2. Ciao cam

La classe openmv.Camera è il punto di ingresso Python per tutto ciò che il pacchetto può fare. Ogni altra pagina di questo tutorial effettua chiamate verso di essa. Il programma utile più piccolo si connette, carica uno script MicroPython e stampa tutto ciò che lo script scrive su 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. Alcune note

stop() prima di exec() non è opzionale. Senza, qualsiasi script precedentemente in esecuzione continua a scrivere su stdout, e il nuovo exec se ne contende il controllo del canale stdin.

exec() carica la stringa dello script nel buffer stdin della cam e lo esegue nello stesso interprete MicroPython con cui dialoga l’IDE. Lo script importa csi, image, ml e il resto della superficie della cam trattata nei capitoli precedenti: l’unica cosa diversa è che il sorgente arriva tramite USB anziché da main.py sulla camera o dall’IDE.

13.3.1.2.2. Arresto dello script

Quando il programma host vuole interrompere lo script in esecuzione, chiama stop(). Lo script riceve lo stesso interrupt che fornirebbe l’IDE ed esce alla prima occasione. Uscire dal context manager (il blocco with) chiude la porta seriale ma non arresta lo script: la cam continua a eseguire ciò che è stato caricato per ultimo finché qualcosa non lo interrompe.

13.3.1.2.3. Errori ed eccezioni

Qualsiasi cosa vada storta al livello di protocollo solleva una openmv.OMVException o una delle sue sottoclassi (TimeoutException, ChecksumException, SequenceException). Avvolgere il blocco with in un try / except OMVException è il modo più semplice per far emergere un cavo USB scollegato o una cam che ha smesso di rispondere.

Il protocollo riprova internamente prima di sollevare l’eccezione; quando una OMVException raggiunge l’applicazione, il budget dei tentativi è esaurito e il collegamento è davvero interrotto. I valori predefiniti (max_retry=3, timeout=1.0) vanno bene per tutti: regolali nel costruttore solo se un’applicazione specifica necessita di un comportamento diverso.