OpenMV Cam M4

OpenMV Cam M4 は、180 MHz 動作の STMicroelectronics STM32F427 を中心に構築された小型の Cortex‑M4 マシンビジョンボードで、256 KB の内蔵 SRAM と 1 MB の内蔵フラッシュを備えています。同梱の OV7725 センサーは 320×240 のグレースケールまたは RGB565 フレームを取り込み、9 ピンのユーザーヘッダーには UART、I²C、SPI、CAN、ADC/DAC、PWM の各ペリフェラルが引き出されています。

注釈

量産版の M4 ボードでは OV7725 が標準のセンサーでした。ごく初期の M4 バリアントには、代わりに OmniVision OV2640 が搭載されていました — QVGA プレビューパイプラインは同じですが、OV2640 は最大 UXGA(1600×1200)の JPEG フレームも取り込めます。どちらのセンサーも同じ csi --- カメラセンサー API を介して駆動されます。

OpenMV Cam M4

完全なデータシート、写真、寸法については、OpenMV Cam M4 製品ページ を参照してください。

ハイライト

  • STMicroelectronics STM32F427 Cortex‑M4、180 MHz 動作。

  • 256 KB 内蔵 SRAM — 外部 SDRAM なし。

  • 1 MB 内蔵フラッシュ(外部 QSPI フラッシュなし)。

  • OV7725 センサー(ごく初期の M4 バリアントでは OV2640)— 320×240 の 8 ビットグレースケールまたは RGB565。OV2640 は加えて最大 UXGA(1600×1200)の JPEG も取り込めます。

  • フルスピード USB(12 Mb/s)— ホストには VCP + USB マスストレージとして認識されます。

  • microSD ソケット — SD は最大 2 GB、SDHC は最大 32 GB、SDXC は最大 2 TB。

  • 9 本の I/O ピン、出力は 3.3 V ながら 5 V トレラント、ピンあたり 25 mA(ヘッダー全体で合計 120 mA)、割り込み対応。P6 は ADC または DAC モードで使用する場合は 5 V トレラントではありません

  • ユーザー RGB LED および 2 個の高出力 850 nm IR LED により、低照度のビジョン用にアクティブ照明を提供します。

注釈

M4 にはオンボードの電源管理チップがありません。バッテリーコネクタ、バッテリー充電器、バッテリー電圧 ADC、充電/電源ステータス LED、ハードウェア電源ボタンはいずれもありません。ボードへの給電は USB または VIN から行ってください。

ピン配置

OpenMV Cam M4 OV7725 ピン配置

ピンリファレンス

ピン名

機能

P0

SPI2 MOSI

P1

SPI2 MISO

P2

SPI2 SCK / CAN2 TX

P3

SPI2 NSS (CS) / CAN2 RX

P4

I2C2 SCL / UART3 TX / TIM2 CH3

P5

I2C2 SDA / UART3 RX / TIM2 CH4

P6

ADC / DAC / TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

RESET

GND に引き下げてボードをリセットします

BOOT0

電源投入時に 3.3 V に引き上げて DFU / ROM ブートローダーに入ります

SWCLK

ARM SWD クロック(デバッガアクセス)

SWDIO

ARM SWD データ(デバッガアクセス)

LED_RED

RGB LED の赤チャンネル(アクティブロー)

LED_GREEN

RGB LED の緑チャンネル(アクティブロー)

LED_BLUE

RGB LED の青チャンネル(アクティブロー)

LED_IR

高出力 IR LED(両チャンネルが一緒に駆動されます)

電源ピン

  • 3.3V — レギュレートされた 3.3 V レール。シールド向けに最大 250 mA を利用できます(microSD カード使用中はそれより少なくなります)。新しいカメラとは異なり、このピンは双方向です — 以下の警告を参照してください。

  • VIN — 3.6 – 5 V 入力。オンボードレギュレータを介してボードに給電します。

  • GND — 共通グランド。

注釈

USB と VIN の両方が存在する場合、電圧の高い方がボードに給電します — オンボードのダイオードが単純に強い方のレールを選びます。

警告

オンボードレギュレータを通したくない場合は、3.3 V を 3.3V ピンに直接供給して M4 に給電することも可能です。その場合は、同時に VIN や USB 電源も供給しないでください — 別の電源がアクティブな状態でレギュレータに逆電圧を加えると、カメラが恒久的に損傷・破壊されるおそれがあります。

Tip

バッテリー寿命見積りツール を使うと、与えられたアクティブ/ディープスリープのデューティサイクルで M4 がバッテリーでどれだけ動作するかをモデル化できます。

リカバリーおよびデバッグピン

  • RESET — GND に引き下げてボードをリセットします。解放すると MCU が通常どおり起動します。

  • BOOT0 — ボードへの給電中に 3.3 V に引き上げると、STM32 の ROM ブートローダー(DFU モード)に入ります。OpenMV IDE はこのモードを使ってオンボードブートローダーを再書き込みします。

SWCLK と SWDIO は(専用の SWD コネクタではなく)通常のヘッダーピンとして引き出されています。RESET、SWCLK、SWDIO、GND、3.3 V を ST‑LINK または SEGGER J‑Link アダプタに配線してボードをデバッグします。

オンボードペリフェラル

LED

M4 には単一のユーザー RGB LED に加えて、1 組の高出力 850 nm IR LED が搭載されています。

  • ユーザー RGB LED — ソフトウェアで制御可能で、LED_REDLED_GREENLED_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
    

カメラセンサー

同梱のセンサー(標準ボードでは OV7725、ごく初期のバリアントでは OV2640)は 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()

M4 ではセンサーはボードにはんだ付けされており、交換可能なモジュール上にはありません。

注釈

OV7725 ボードでは、センサーの FSIN(フレーム同期)ピンが MCU に配線されていますが、そのためのファームウェアサポートは追加されていません。

OV2640 ボードでは、センサーの STROBEFREX(フレーム露出)、EXPST(露出リセット)ピンが MCU に配線されていますが、それらのためのファームウェアサポートは追加されていません。

サーボヘッダー

ボードの裏面には 2 つのサーボコネクタ用はんだパッドがあり、P7P8 向けに標準的な 3 ピンのサーボヘッダー(信号 / VIN / GND)が引き出されています。信号ピンは TIM4 のチャンネル 1 と 2(pyb.Servo が使用するのと同じチャンネル)にそのままマッピングされ、各ヘッダーの V+ ピンは VIN に直結されているため、サーボは 3.3 V レギュレータではなく入力レールから電流を引き込みます。

パッドに 1 組の L 字型 3 ピンヘッダーをはんだ付けし、2 個のホビーサーボを接続すると、パン・チルトマウントを駆動できます:

from pyb import Servo

pan  = Servo(1)              # P7 — TIM4 CH1
tilt = Servo(2)              # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)

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

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

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

バス

TX

RX

CAN2

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)
    
  • DACpyb.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.PWMpyb.Servo を混在させないでください。

いずれも machine.PWM を介して駆動できます:

from machine import Pin, PWM

pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)

ソフトウェアビットバンギングバス

追加のバスが必要な場合は、machine.SoftI2Cmachine.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()

ファイルシステムとブート順序

M4 ファームウェアは、ブート時に最大 3 つのファイルシステムをマウントします。

  • 内蔵フラッシュ — 常に /flash にマウントされます。デフォルトで main.pyREADME.txt を保持し、初回ブート時に作成されます。

  • microSD カード — カードが挿入されている場合、/sdcard にマウントされます。

  • ROMFS/rom にある読み取り専用のメモリマップドファイルシステムで、ゼロコピーアクセスの恩恵を受ける大きなデータアセット(AI モデルなど)を同梱するために使用されます。MicroPython によって起動時、ユーザーの Python が実行される前に自動的にマウントされます。

マウント後、カードが存在する場合は作業ディレクトリが /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.pymain.py、その他のファイルを直接編集できます。カメラをリセットする前にドライブを取り出して、ホストがキャッシュした書き込みをフラッシュさせてください。

注釈

OS はドライブを受動的なブロックデバイスとして扱うため、OpenMV Cam 上で実行されるコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS と OpenMV Cam が同じファイルシステムに同時に書き込むと、OS が優先され、カメラによる変更が上書きされます。スクリプトが書き戻すデータには SD カードを使用し、ホストからそれらのファイルを読み取る前に再マウントしてください。

注釈

ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED のチャンネルが一時的に点灯することがあります — これはファームウェアによるアクティビティインジケータであり、故障ではありません。

ストレージサイズ

M4 は以下を搭載して出荷されます。

  • /flash32 KB の FAT ファイルシステム、読み書き可能。

  • /rom128 KB の読み取り専用メモリマップド ROMFS。

  • /sdcard — 挿入されている microSD カードのフルサイズ(存在する場合)、読み書き可能。

ハードフォルトインジケータ

ユーザー RGB LED がすべての色を高速に循環している場合 — 個別の色相というよりきらめく白色 LED のように見えるほど速い場合 — ファームウェアは回復不能なハードフォルトに陥っています。回復するにはファームウェアを再書き込みしてください。再書き込みしても改善しない場合、ボードが物理的に損傷している可能性があります。

ソフトウェアライブラリ

モジュールの完全な一覧(M4 ビルド固有のものを含む)については、ライブラリインデックス を参照してください。