13.3.1.2. Hallo Kamera¶
Die Klasse openmv.Camera ist der Python-Einstiegspunkt für alles, was das Paket leisten kann. Jede andere Seite in diesem Tutorial ruft sie auf. Das kleinste nützliche Programm stellt eine Verbindung her, lädt ein MicroPython-Skript hoch und gibt aus, was das Skript auf stdout schreibt:
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. Ein paar Hinweise¶
stop() vor exec() ist nicht optional. Ohne es schreibt jedes zuvor laufende Skript weiterhin auf stdout, und das neue exec kämpft mit ihm um die Kontrolle über den stdin-Kanal.
exec() lädt die Skript-Zeichenkette in den stdin-Puffer der Kamera hoch und führt sie im selben MicroPython-Interpreter aus, mit dem die IDE kommuniziert. Das Skript importiert csi, image, ml und den Rest der Kameraoberfläche, die die früheren Kapitel behandelt haben – der einzige Unterschied ist, dass der Quellcode über USB eintrifft, anstatt aus main.py auf der Kamera oder aus der IDE.
13.3.1.2.2. Das Skript stoppen¶
Wenn das Host-Programm das laufende Skript unterbrechen möchte, rufen Sie stop() auf. Das Skript erhält dieselbe Unterbrechung, die die IDE liefern würde, und beendet sich bei der nächsten Gelegenheit. Das Verlassen des Kontextmanagers (des with-Blocks) schließt den seriellen Port, stoppt das Skript aber nicht – die Kamera führt weiterhin aus, was zuletzt geladen wurde, bis etwas es unterbricht.
13.3.1.2.3. Fehler und Ausnahmen¶
Alles, was auf der Protokollschicht schiefgeht, löst eine openmv.OMVException oder eine ihrer Unterklassen aus (TimeoutException, ChecksumException, SequenceException). Den with-Block in try / except OMVException zu verpacken, ist der einfachste Weg, ein abgezogenes USB-Kabel oder eine nicht mehr reagierende Kamera sichtbar zu machen.
Das Protokoll wiederholt intern, bevor es eine Ausnahme auslöst; bis eine OMVException die Anwendung erreicht, ist das Wiederholungsbudget aufgebraucht und die Verbindung tatsächlich unterbrochen. Die Standardwerte (max_retry=3, timeout=1.0) funktionieren für jeden – passen Sie sie nur am Konstruktor an, wenn eine bestimmte Anwendung ein anderes Verhalten benötigt.