OpenMV Cam H7 Plus¶
OpenMV Cam H7 Plus は、STMicroelectronics STM32H743(Cortex‑M7 @ 480 MHz)に 32 MB の外部 SDRAM、32 MB の QSPI フラッシュ、ハードウェア JPEG コーデック、そして着脱可能なキャリア上の OV5640 5MP カメラモジュールを組み合わせています。この追加メモリは、高解像度キャプチャや大きな画像バッファに適しています。
完全なデータシート、写真、寸法については OpenMV Cam H7 Plus 製品ページ を参照してください。
主な特徴¶
STMicroelectronics STM32H743 Cortex‑M7、480 MHz(1027 DMIPS)。
ハードウェア JPEG エンコーダー/デコーダー。
32 MB の外部 SDRAM(32 ビット @ 100 MHz、400 MB/s)に加え 1 MB の内部 SRAM。
2 MB の内部フラッシュ + 32 MB の外部 QSPI フラッシュ(読み出し約 100 MB/s)。
OV5640 5MP ローリングシャッターセンサー。
フルスピード USB(12 Mb/s)— ホストには VCP + USB マスストレージとして認識されます。
microSD ソケット — SD は最大 2 GB、SDHC は最大 32 GB、SDXC は最大 2 TB。
LiPo バッテリーコネクタ(オンボード充電器なし — 充電済みのセルを供給するか、VIN/USB から動作させてください)。
10 本の I/O ピン、出力 3.3 V で 5 V トレラント、ピンあたり 25 mA(ヘッダ全体で合計 120 mA)、割り込み対応。P6 は ADC または DAC モードで使用する場合は 5 V トレラントではありません。
ユーザー RGB LED と、暗所視で能動照明を行うための 2 つの高出力 850 nm IR LED。
注釈
H7 Plus には オンボードの電源管理チップがありません。バッテリー充電器、バッテリー電圧 ADC、充電/電源ステータス LED、ハードウェア電源ボタンはいずれも搭載されていません。充電済みの LiPo をバッテリー JST に接続するか、USB / VIN からボードを動作させてください。
ピン配置¶
ピンリファレンス¶
ピン名 |
機能 |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / FDCAN2 TX |
P3 |
SPI2 NSS (CS) / FDCAN2 RX |
P4 |
I2C2 SCL / UART3 TX / TIM2 CH3 |
P5 |
I2C2 SDA / UART3 RX / TIM2 CH4 |
P6 |
ADC / DAC / TIM2 CH1 |
P7 |
I2C4 SCL / TIM4 CH1 |
P8 |
I2C4 SDA / TIM4 CH2 |
P9 |
デジタル I/O |
RESET |
GND に引き下げるとボードがリセットされます |
SYN |
フレーム同期パッド — カメラセンサーにのみ配線されています |
BOOT0 |
電源投入時に 3.3 V に引き上げると DFU / ROM ブートローダーに入ります |
LED_RED |
RGB LED の赤チャンネル(アクティブロー) |
LED_GREEN |
RGB LED の緑チャンネル(アクティブロー) |
LED_BLUE |
RGB LED の青チャンネル(アクティブロー) |
LED_IR |
高出力 IR LED(両チャンネルが一緒に駆動されます) |
注釈
ヘッダ上の SYN パッドはカメラセンサーのトリガー/露出ラインに直接接続されています。H7 Plus では MCU には 接続されていません。外部から駆動または読み取ってください。MicroPython からトグルすることはできません。
電源ピン¶
3.3V — レギュレートされた 3.3 V レール。シールド向けに最大 250 mA 利用可能です(microSD カード使用時はそれより少なくなります)。新しいカメラとは異なり、このピンは双方向です — 下記の警告を参照してください。
VIN — 3.6 – 5 V 入力。オンボードレギュレータを介してボードに給電します。
GND — 共通グランド。
3.7 V の LiPo コネクタも搭載されていますが、H7 Plus にはバッテリー充電器がありません — 充電済みのセルを接続するか、代わりに VIN / USB を供給してください。
注釈
USB と VIN/LiPo の両方が存在する場合は VIN/LiPo 入力が優先されます — オンボードの電源スイッチがボードへの給電に USB より VIN/LiPo を選択します。
警告
H7 Plus では バッテリーコネクタと VIN は結線されています。LiPo を接続した状態で同時に VIN を印加 しないでください — 2 つの電源が互いに競合し、バッテリー、ボード、またはその両方を損傷する可能性があります。
警告
オンボードレギュレータを介さずに 3.3 V を 3.3V ピンに直接供給して H7 Plus に給電することも できます。その場合は 同時に VIN や USB 電源を印加しないでください — 別の電源がアクティブな状態でレギュレータを逆駆動すると、カメラが恒久的に損傷し破壊される可能性があります。
Tip
バッテリー寿命推定ツール を使うと、所定のアクティブ/ディープスリープのデューティサイクルで H7 Plus がバッテリーでどれくらい動作するかをモデル化できます。
リカバリーピンとデバッグピン¶
RESET — GND に引き下げるとボードがリセットされます。解放すると MCU が通常どおり起動します。
BOOT0 — ボードへの給電中に 3.3 V に引き上げると STM32 ROM ブートローダー(DFU モード)に入ります。OpenMV IDE はこのモードを使ってオンボードのブートローダーを再書き込みします。
ボードには GPIO ヘッダの隣に SWD デバッグヘッダ(RST / SWCLK / SWDIO / SWO)が用意されており、ST‑LINK および SEGGER J‑Link アダプターと互換性があります。
注釈
SWO トレースピンはカメラヘッダの SPI クロックラインと共有されています。SWO は、MCU と SPI で通信するカメラモジュール — 例えば FLIR® Lepton® アダプターモジュール — と同時には使用できません。どちらか一方を選択してください。
オンボードペリフェラル¶
LED¶
H7 Plus には単一のユーザー RGB LED と、1 対の高出力 850 nm IR LED が搭載されています:
ユーザー RGB LED — ソフトウェアで制御可能で、
LED_RED、LED_GREEN、LED_BLUEとして公開されています:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
IR LED — 両 LED は
LED_IRピンを通じて一緒に駆動されます。LED_IRはハードウェア上 アクティブハイ で配線されている一方、ファームウェアは他のすべてのオンボード LED をアクティブローとして扱うため、on()/off()(センスが反転してしまいます)ではなくlow()/high()を使用してください:from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
カメラセンサー¶
OV5640 は csi --- カメラセンサー モジュールを通じて駆動されます:
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
OV5640 にはオンボードの JPEG コンプレッサーが搭載されています。csi.CSI.pixformat を csi.JPEG に設定すると、センサーは圧縮されたフレームをカメラバス経由でカメラに直接送り、高解像度キャプチャが実用的になります。csi.HD(1280×720)、csi.FHD(1920×1080)、そしてフル 5MP の csi.WQXGA2(2592×1944)はすべて JPEG としてストリーミングされます。圧縮は csi.CSI.quality(0-100、高いほどフレームが大きく、より詳細)で調整します:
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
センサーは 着脱可能なモジュール に載っています — ボードの他の部分を変更することなく、他の OpenMV カメラモジュール(グローバルシャッター、サーマル、より高解像度など)に交換できます。
機械学習¶
ml --- 機械学習 は、量子化された TFLite モデルを CMSIS‑NN カーネルを用いて Cortex‑M7 上で実行します — コンパクトな検出器なら数フレーム毎秒で動作するほど高速です。読み取り専用の /rom ファイルシステム上のモデルは、RAM にコピーすることなくフラッシュから直接ロードされます。以下は、検出した顔とその 6 つのランドマークを毎フレームにオーバーレイする 128×128 の BlazeFace 検出器です:
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces is a list of ((x, y, w, h), score, keypoints) tuples
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints is a ndarray of shape (6, 2)
# 0 - right eye (x, y)
# 1 - left eye (x, y)
# 2 - nose (x, y)
# 3 - mouth (x, y)
# 4 - right ear (x, y)
# 5 - left ear (x, y)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
microSD カード¶
カードが挿入されると自動的に /sdcard にマウントされ、通常のファイルシステムを通じて利用できます:
import os
for entry in os.listdir("/sdcard"):
print(entry)
バスリファレンス¶
GPIO¶
シルク印刷されたピンのいずれかを読み取りまたは駆動するには machine.Pin を使用します。出力は 3.3 V CMOS で、入力側は 5 V トレラント、ピンあたり最大 25 mA をシンク/ソースできます(ヘッダ全体で合計 120 mA)。
from machine import Pin
out = Pin("P0", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("P1", Pin.IN, Pin.PULL_UP)
print(inp.value())
任意の入力ピンはエッジ遷移で割り込みを発生させることもできます:
def handler(pin):
print("triggered:", pin)
Pin("P1", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
バス |
TX |
RX |
|---|---|---|
UART1 |
P1 |
P0 |
UART3 |
P4 |
P5 |
from machine import UART
uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
バス |
SCL |
SDA |
|---|---|---|
I2C2 |
P4 |
P5 |
I2C4 |
P7 |
P8 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
同じハードウェアは、machine.I2CTarget を通じてターゲット(スレーブ)モードでも使用でき、メモリ領域を別の I²C コントローラに公開できます:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
バス |
MOSI |
MISO |
SCK |
CS |
|---|---|---|---|---|
SPI2 |
P0 |
P1 |
P2 |
P3 |
from machine import SPI
from machine import Pin
spi = SPI(2, baudrate=10_000_000)
cs = Pin("P3", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
CAN (FDCAN)¶
バス |
TX |
RX |
|---|---|---|
FDCAN2 |
P2 |
P3 |
from machine import CAN
can = CAN(2, 500_000)
can.set_filters(None)
can.send(0x123, b"\xDE\xAD\xBE\xEF")
print(can.recv())
ADC と DAC¶
P6 は唯一のユーザーアナログピンです。12 ビット ADC 入力または DAC 出力のいずれかとして使用できます。
ADC — ピンで 3.3 V がフルスケール:
from machine import ADC import time adc = ADC("P6") while True: voltage = adc.read_u16() * 3.3 / 65535 print(voltage) time.sleep_ms(100)
DAC —
pyb.DACを通じて利用します。8 ビット値が 0–3.3 V をカバーします:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
ADC または DAC モードでは P6 は 3.3 V トレラントのみ — 5 V を供給しないでください。
PWM¶
ピン |
タイマー / チャンネル |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
注釈
TIM1 はファームウェアによって予約されており、カメラセンサーのピクセルクロックを生成するために使われます。そのため、物理的に P0/P1/P2 上にある TIM1 チャンネルは、カメラを壊さずにユーザー PWM として使用することはできません。
TIM4 は pyb.Servo と共有されています — サーボをインスタンス化するとタイマー全体が 50 Hz 動作に再構成されるため、同じスクリプト内で P7/P8 の machine.PWM と pyb.Servo を混在させないでください。
いずれも machine.PWM を通じて駆動できます:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
ソフトウェアによるビットバンギングバス¶
追加のバスが必要な場合は、machine.SoftI2C と machine.SoftSPI を任意の GPIO で使用できます。
サーマルセンサー(オフボード)¶
ファームウェアには、外部配線されたサーマルイメージャー向けの fir --- 熱センサードライバー(fir == 遠赤外線) ドライバが含まれています:
MLX90621 — 16 × 4 IR アレイ
MLX90640 — 32 × 24 IR アレイ
MLX90641 — 16 × 12 IR アレイ
AMG8833 — 8 × 8 IR アレイ
モジュールをボードの I²C バスに配線し、fir.init() + fir.snapshot() でフレームを読み取ります:
import time
import image
import fir
fir.init() # auto‑detects the sensor
clock = time.clock()
while True:
clock.tick()
try:
img = fir.snapshot(x_scale=5, y_scale=5,
color_palette=image.PALETTE_IRONBOW,
hint=image.BICUBIC,
copy_to_fb=True)
except OSError:
continue
print(clock.fps())
fir ドライバはセンサーと I²C 2 経由でのみ通信します — モジュールを P4(SCL)と P5(SDA)に配線してください。
タイミング¶
time¶
time モジュールは、ブロッキング遅延、モノトニックティック、経過時間測定をカバーします:
import time
time.sleep(1) # seconds
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
# ...do work...
elapsed = time.ticks_diff(time.ticks_ms(), start)
仮想タイマー¶
machine.Timer は、ハードウェアタイマースロットを消費せずに周期的またはワンショットのコールバックをスケジュールします。仮想(ソフトウェア)タイマーを使用するには、id として -1 を渡します:
from machine import Timer
one_shot = Timer(-1)
one_shot.init(period=5_000, mode=Timer.ONE_SHOT,
callback=lambda t: print("once"))
periodic = Timer(-1)
periodic.init(period=2_000, mode=Timer.PERIODIC,
callback=lambda t: print("tick"))
期間の値はミリ秒単位です。スロットを停止して解放するには deinit() を呼び出します。
リアルタイムクロック¶
machine.RTC はリセットをまたいで実時刻を保持します:
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0)) # Y, M, D, weekday, h, m, s, subsec
print(rtc.datetime())
ウォッチドッグ¶
machine.WDT は、アプリケーションがハングした場合にボードをリセットします。一度開始すると停止や再構成はできません — メインループ内で定期的にフィードしてください:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
ブートとランタイム情報¶
USB ブートローダーウィンドウ¶
電源投入のたびに、カメラは短いブートローダー(数秒)を実行します。これにより、ユーザーが DFU モードに入らなくても OpenMV IDE がファームウェアを更新できます。ウィンドウが期限切れになると、ブートローダーは boot.py、続いて main.py に処理を引き渡します。
実行中のスクリプトは、machine.bootloader() を呼び出すことで必要に応じてブートローダーに再突入できます:
import machine
machine.bootloader()
ファイルシステムとブート順序¶
H7 Plus のファームウェアは、ブート時に最大 3 つのファイルシステムをマウントします:
内部フラッシュ — 常に
/flashにマウントされます。デフォルトでmain.pyとREADME.txtを保持し、初回起動時に作成されます。microSD カード — カードが挿入されている場合は
/sdcardにマウントされます。ROMFS —
/romにある読み取り専用のメモリマップドファイルシステムで、ゼロコピーアクセスの恩恵を受ける大きなデータアセット(例: AI モデル)を出荷するために使用されます。ユーザーの Python が実行される前の起動時に、MicroPython によって自動的にマウントされます。
マウント後、カードが存在する場合は作業ディレクトリが /sdcard に、そうでない場合は /flash に設定されます。インタプリタはその後、そのディレクトリからスクリプトを実行します:
boot.pyは すべての ソフトリセット時(コールドブート、REPL からのCtrl‑D、または実行中のスクリプトが復帰したときなど)に実行されます。main.pyは コールドブート時のみ、boot.pyの直後に実行されます。その後のソフトリセットではboot.pyが再実行されますが、そのまま REPL に落ちます —main.pyを再実行するには、ボードを完全にリセットする必要があります。
boot.py または main.py を SD カードに置くと、フラッシュ内のコピーには手を加えずにそれを上書きします — どちらのファイルもブートディレクトリ(カードがマウントされている場合は /sdcard、そうでない場合は /flash)で探索されます。
新たにフラッシュされたボードに同梱されるデフォルトの main.py は、ハートビートとしてユーザー RGB LED の 青 チャンネルを点滅させるだけです(短いパルス 2 回、短い間隔)。これにより、ホストを接続しなくてもファームウェアがクリーンに起動したことを確認できます。
sys.path は 3 つすべてのファイルシステムとその lib/ サブディレクトリを含むよう拡張されるため、インポート可能なモジュールは /flash/lib、/sdcard/lib、/rom/lib のいずれにも置けます。
挿入された SD カードをシステムに無視させる(例えばカードが存在してもフラッシュの main.py を実行する)には、/flash のルートに SKIPSD という名前の空ファイルを作成してください。
USB 経由で接続すると、ブートファイルシステム(カードが存在する場合は /sdcard、そうでない場合は /flash)もホスト上で USB マスストレージドライブとして列挙され、boot.py、main.py、その他のファイルを直接編集できます。カメラをリセットする前にドライブを取り出して ホストがキャッシュした書き込みをフラッシュさせてください。
注釈
OS はドライブを受動的なブロックデバイスとして扱うため、OpenMV Cam 上で動作するコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS と OpenMV Cam が同時に同じファイルシステムに書き込むと、OS が優先され、カメラによって行われた変更を上書きします。スクリプトが書き戻すデータには SD カードを使用し、ホストからそれらのファイルを読み取る前に再マウントしてください。
注釈
ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED の 赤 チャンネルが一時的に点灯することがあります — これはファームウェアによるアクティビティインジケータであり、故障ではありません。
ストレージサイズ¶
H7 Plus には以下が同梱されています:
/flash— 24 MB の FAT ファイルシステム、読み書き可能。/rom— 8 MB の読み取り専用メモリマップド ROMFS。ゼロコピー mmap アクセスの恩恵を受けるスクリプトや ML モデルを出荷するために使用されます。/sdcard— 挿入されている microSD カードのフルサイズ(存在する場合)、読み書き可能。
ハードフォールトインジケータ¶
ユーザー RGB LED がすべての色を高速で循環している場合 — 個別の色相というよりも またたく白い LED のように見えるほど高速な場合 — ファームウェアが回復不能なハードフォールトに陥っています。回復するにはファームウェアを再書き込みしてください。再書き込みでも改善しない場合は、ボードが物理的に損傷している可能性があります。
ソフトウェアライブラリ¶
モジュールの完全な一覧(H7 Plus ビルドに固有のものを含む)については、ライブラリインデックス を参照してください。