13.3.1.2. Hello cam

openmv.Camera クラスは、パッケージができるすべての操作に対する Python のエントリポイントです。このチュートリアルの他のすべてのページはこれを呼び出します。最小限の実用的なプログラムは、接続し、MicroPython スクリプトをアップロードし、そのスクリプトが 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. いくつかの注意点

exec() の前の stop() は省略できません。これがないと、以前に実行されていたスクリプトが stdout に書き込み続け、新しい execstdin チャンネルの制御を奪い合うことになります。

exec() はスクリプト文字列をカメラの stdin バッファにアップロードし、IDE が対話するのと同じ MicroPython インタープリタで実行します。スクリプトは csiimageml、そして先の章で扱ったカメラの機能の残りをインポートします。唯一異なるのは、ソースがカメラ上の main.py や IDE からではなく、USB 経由で到着するという点です。

13.3.1.2.2. スクリプトの停止

ホストプログラムが実行中のスクリプトを中断したい場合は、stop() を呼び出します。スクリプトは IDE が配信するのと同じ割り込みを受け取り、次の機会に終了します。コンテキストマネージャ(with ブロック)から抜けるとシリアルポートは閉じられますが、スクリプトは停止 しません。カメラは、何かが割り込むまで最後に読み込まれた内容を実行し続けます。

13.3.1.2.3. エラーと例外

プロトコル層で何か問題が起きると、openmv.OMVException またはそのサブクラスのいずれか(TimeoutExceptionChecksumExceptionSequenceException)が発生します。with ブロックを try / except OMVException で囲むことが、切断された USB ケーブルや応答しなくなったカメラを表面化させる最も簡単な方法です。

プロトコルは例外を発生させる前に内部でリトライします。OMVException がアプリケーションに到達した時点では、リトライの猶予は使い果たされており、リンクは本当に切断されています。デフォルト値(max_retry=3timeout=1.0)はすべての人に通用します。特定のアプリケーションが異なる動作を必要とする場合にのみ、コンストラクタで調整してください。