OpenMV Cam H7

OpenMV Cam H7 คือบอร์ดสำหรับการมองเห็นของเครื่องแบบ Cortex‑M7 ที่สร้างบน STMicroelectronics STM32H743 ความถี่ 480 MHz พร้อม SRAM ภายใน 1 MB แฟลชภายใน 2 MB และตัวแปลงสัญญาณ JPEG แบบฮาร์ดแวร์ บอร์ดนี้มีให้เลือกสองรุ่น ได้แก่ H7 ที่ใช้ OV7725 และ H7 R2 ที่ใช้ ON Semi MT9M114 แต่เฟิร์มแวร์ การจัดเรียงพิน และ Python API เหมือนกันทุกประการ

OpenMV Cam H7

สำหรับข้อมูลจำเพาะ ภาพถ่าย และขนาดโดยละเอียด โปรดดูที่ หน้าผลิตภัณฑ์ OpenMV Cam H7

จุดเด่น

  • STMicroelectronics STM32H743 Cortex‑M7 ความถี่ 480 MHz (1027 DMIPS)

  • ตัวเข้ารหัส/ถอดรหัส JPEG แบบฮาร์ดแวร์

  • SRAM ภายใน 1 MB — ไม่มี SDRAM ภายนอก

  • แฟลชภายใน 2 MB (ไม่มีแฟลช QSPI ภายนอก)

  • เซนเซอร์ OV7725 (หรือ MT9M114 บน H7 R2)

  • USB ความเร็วเต็ม (12 Mb/s) — ปรากฏเป็น VCP + USB mass storage บนโฮสต์

  • ช่องเสียบ microSD — SD สูงสุด 2 GB, SDHC สูงสุด 32 GB, SDXC สูงสุด 2 TB

  • ขั้วต่อแบตเตอรี่ LiPo (ไม่มีวงจรชาร์จบนบอร์ด — ใช้แบตเตอรี่ที่ชาร์จแล้วหรือจ่ายไฟผ่าน VIN/USB)

  • พิน I/O 10 ตัว ทนแรงดัน 5 V พร้อมเอาต์พุต 3.3 V, 25 mA ต่อพิน (120 mA รวมทั้งหัวต่อ) รองรับอินเทอร์รัปต์ P6 ไม่ ทนแรงดัน 5 V เมื่อใช้ในโหมด ADC หรือ DAC

  • RGB LED สำหรับผู้ใช้ และ IR LED กำลังสูง 850 nm สองดวง สำหรับให้แสงสว่างในการมองเห็นในสภาพแสงน้อย

Note

H7 ไม่มีชิปจัดการพลังงานบนบอร์ด: ไม่มีวงจรชาร์จแบตเตอรี่ ไม่มี ADC วัดแรงดันแบตเตอรี่ ไม่มี LED แสดงสถานะการชาร์จ/พลังงาน และไม่มีปุ่มเปิด/ปิดแบบฮาร์ดแวร์ ต่อ LiPo ที่ชาร์จแล้วเข้ากับ JST แบตเตอรี่ หรือจ่ายไฟผ่าน USB / VIN

การจัดเรียงพิน

OpenMV Cam H7 OV7725 Pinout

อ้างอิงพิน

ชื่อพิน

ฟังก์ชัน

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

TIM4 CH3

RESET

ดึงไปยัง GND เพื่อรีเซ็ตบอร์ด

SYN

แพด frame‑sync — ต่อสายตรงกับเซนเซอร์กล้องเท่านั้น

BOOT0

ดึงไปยัง 3.3 V ขณะเปิดเครื่องเพื่อเข้าสู่บูตโหลดเดอร์ DFU / ROM

LED_RED

ช่องสีแดงของ RGB LED (active low)

LED_GREEN

ช่องสีเขียวของ RGB LED (active low)

LED_BLUE

ช่องสีน้ำเงินของ RGB LED (active low)

LED_IR

IR LED กำลังสูง (ทั้งสองช่องขับพร้อมกัน)

Note

แพด SYN บนหัวต่อเชื่อมต่อตรงกับสายทริกเกอร์/การรับแสงของเซนเซอร์กล้อง — ไม่ได้ เชื่อมต่อกับ MCU บน H7 ขับหรืออ่านค่าจากภายนอก ไม่สามารถสลับสถานะจาก MicroPython ได้

พินพลังงาน

  • 3.3V — ราง 3.3 V ที่กำกับแรงดันแล้ว มีให้สูงสุด 250 mA สำหรับชีลด์ (น้อยลงหากมีการใช้งานการ์ด microSD) ต่างจากกล้องรุ่นใหม่กว่า พินนี้เป็นแบบสองทิศทาง — ดูคำเตือนด้านล่าง

  • VIN — อินพุต 3.6 – 5 V จ่ายไฟให้บอร์ดผ่านตัวกำกับแรงดันบนบอร์ด

  • GND — กราวด์ร่วม

มีขั้วต่อ LiPo 3.7 V ด้วย แต่ H7 ไม่มีวงจรชาร์จแบตเตอรี่ — ต่อเซลล์ที่ชาร์จแล้ว หรือจ่ายผ่าน VIN / USB แทน

Note

เมื่อมีทั้ง USB และ VIN/LiPo พร้อมกัน VIN/LiPo จะชนะ — สวิตช์พลังงานบนบอร์ดจะเลือกใช้แทน USB เพื่อจ่ายไฟให้บอร์ด

Warning

ขั้วต่อแบตเตอรี่และ VIN ต่อถึงกัน บน H7 อย่า เสียบ LiPo และจ่าย VIN พร้อมกัน — แหล่งจ่ายทั้งสองจะต่อต้านกันและอาจทำให้แบตเตอรี่ บอร์ด หรือทั้งสองเสียหายได้

Warning

คุณ สามารถ จ่ายไฟให้ H7 โดยป้อน 3.3 V เข้าพิน 3.3V โดยตรงหากไม่ต้องการผ่านตัวกำกับแรงดันบนบอร์ด ในกรณีนี้ อย่าจ่าย VIN หรือไฟจาก USB พร้อมกัน — การขับย้อนตัวกำกับแรงดันขณะที่แหล่งจ่ายอื่นทำงานอยู่อาจทำให้กล้องเสียหายถาวรได้

Tip

ใช้ เครื่องประมาณอายุแบตเตอรี่ เพื่อจำลองระยะเวลาที่ H7 จะทำงานจากแบตเตอรี่สำหรับรอบการทำงานแบบ active / deep-sleep ที่กำหนด

พินสำหรับกู้คืนและดีบัก

  • RESET — ดึงไปยัง GND เพื่อรีเซ็ตบอร์ด การปล่อยจะให้ MCU เริ่มทำงานตามปกติ

  • BOOT0 — ดึงไปยัง 3.3 V ขณะเปิดเครื่องเพื่อเข้าสู่บูตโหลดเดอร์ ROM ของ STM32 (โหมด DFU) OpenMV IDE ใช้โหมดนี้ในการเขียนบูตโหลดเดอร์ลงบอร์ดใหม่

บอร์ดมีหัวต่อดีบัก SWD (RST / SWCLK / SWDIO) อยู่ถัดจากหัวต่อ GPIO รองรับอะแดปเตอร์ ST‑LINK และ SEGGER J‑Link

อุปกรณ์ต่อพ่วงบนบอร์ด

LEDs

H7 มี RGB LED สำหรับผู้ใช้หนึ่งดวงและ IR LED กำลังสูง 850 nm หนึ่งคู่:

  • 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 LEDs — LED ทั้งสองดวงถูกขับพร้อมกันผ่านพิน LED_IR ซึ่ง LED_IR ต่อสายแบบ active high ในฮาร์ดแวร์ ในขณะที่เฟิร์มแวร์ถือว่า LED อื่นๆ บนบอร์ดเป็น active low ดังนั้นควรใช้ low() / high() แทน on() / off() (ซึ่งจะกลับค่าการทำงาน):

    from machine import LED
    
    ir = LED("LED_IR")
    ir.low()    # turn IR illumination ON
    ir.high()   # turn IR illumination OFF
    

เซนเซอร์กล้อง

OV7725 (หรือ MT9M114 บน H7 R2) ถูกขับผ่านโมดูล 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()

เซนเซอร์อยู่บน โมดูลถอดเปลี่ยนได้ — สามารถเปลี่ยนเป็นโมดูลกล้อง OpenMV อื่นๆ ได้ (global shutter, ระบบระบายความร้อน, ความละเอียดสูงกว่า ฯลฯ) โดยไม่ต้องเปลี่ยนส่วนอื่นของบอร์ด

การ์ด microSD

เมื่อใส่การ์ดแล้ว จะถูก mount อัตโนมัติที่ /sdcard และใช้งานได้ผ่านระบบไฟล์ปกติ:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

อ้างอิงบัส

GPIO

ใช้ machine.Pin เพื่ออ่านหรือขับพินที่พิมพ์ไว้บนบอร์ด เอาต์พุตเป็น CMOS 3.3 V ทนแรงดัน 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")

ฮาร์ดแวร์เดียวกันนี้ยังสามารถใช้ในโหมด target (slave) ผ่าน machine.I2CTarget เพื่อเปิดเผยพื้นที่หน่วยความจำให้กับ I²C controller ตัวอื่น:

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 เป็นพินอะนาล็อกสำหรับผู้ใช้เพียงตัวเดียว สามารถใช้เป็นอินพุต ADC แบบ 12 บิต หรือเอาต์พุต 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

P9

TIM4 CH3

Note

TIM1 ถูกสงวนไว้ โดยเฟิร์มแวร์เพื่อสร้าง pixel clock ของเซนเซอร์กล้อง ดังนั้นช่อง TIM1 ที่อยู่บน P0/P1/P2 จึงไม่สามารถใช้สำหรับ PWM ของผู้ใช้โดยไม่ทำให้กล้องเสียหาย

TIM4 ใช้ร่วมกับ pyb.Servo — การสร้างเซอร์โวจะกำหนดค่าตัวจับเวลาทั้งหมดใหม่สำหรับการทำงาน 50 Hz ดังนั้นอย่าผสม machine.PWM บน P7/P8/P9 กับ pyb.Servo ในสคริปต์เดียวกัน

ขับพินใดก็ได้ผ่าน machine.PWM

from machine import Pin, PWM

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

บัสแบบ Software bit‑banged

machine.SoftI2C และ machine.SoftSPI ทำงานบน GPIO ใดก็ได้หากคุณต้องการบัสเพิ่มเติม

เซนเซอร์ระบายความร้อน (ภายนอกบอร์ด)

เฟิร์มแวร์รวมไดรเวอร์ fir --- ไดรเวอร์เซนเซอร์ความร้อน (fir == far infrared) สำหรับเซนเซอร์ถ่ายภาพความร้อนที่ต่อสายภายนอก:

  • MLX90621 — อาร์เรย์ IR ขนาด 16 × 4

  • MLX90640 — อาร์เรย์ IR ขนาด 32 × 24

  • MLX90641 — อาร์เรย์ IR ขนาด 16 × 12

  • AMG8833 — อาร์เรย์ IR ขนาด 8 × 8

ต่อสายโมดูลเข้ากับบัส 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 ครอบคลุมการหน่วงเวลาแบบบล็อก, การนับเวลาแบบ monotonic และการวัดเวลาที่ผ่านไป:

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 กำหนดตารางคอลแบ็กแบบต่อเนื่องหรือครั้งเดียวโดยไม่ต้องใช้สล็อตตัวจับเวลาฮาร์ดแวร์ ส่ง -1 เป็น id เพื่อใช้ตัวจับเวลาเสมือน (ซอฟต์แวร์):

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())

Watchdog

machine.WDT รีเซ็ตบอร์ดหากแอปพลิเคชันค้าง เมื่อเริ่มแล้วจะหยุดหรือกำหนดค่าใหม่ไม่ได้ — ป้อนค่าเป็นระยะๆ ภายใน main loop ของคุณ:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

ข้อมูลการบูตและรันไทม์

หน้าต่างบูตโหลดเดอร์ USB

ทุกครั้งที่เปิดเครื่อง กล้องจะรันบูตโหลดเดอร์สั้นๆ (ไม่กี่วินาที) ที่ให้ OpenMV IDE อัปเดตเฟิร์มแวร์โดยไม่ต้องให้ผู้ใช้เข้าสู่โหมด DFU หลังจากหน้าต่างหมดเวลา บูตโหลดเดอร์จะส่งต่อไปยัง boot.py แล้วจึง main.py

สคริปต์ที่กำลังรันสามารถกลับเข้าสู่บูตโหลดเดอร์ได้ตามต้องการโดยเรียก machine.bootloader()

import machine

machine.bootloader()

ระบบไฟล์และลำดับการบูต

เฟิร์มแวร์ H7 mount ระบบไฟล์สูงสุดสามระบบเมื่อบูต:

  • แฟลชภายใน — mount ที่ /flash เสมอ เก็บ main.py และ README.txt โดยค่าเริ่มต้น สร้างในการบูตครั้งแรก

  • การ์ด microSD — หากใส่การ์ดไว้จะถูก mount ที่ /sdcard

  • ROMFS — ระบบไฟล์แบบอ่านอย่างเดียว memory‑mapped ที่ /rom ใช้สำหรับจัดส่งสินทรัพย์ข้อมูลขนาดใหญ่ (เช่น โมเดล AI) ที่ได้ประโยชน์จากการเข้าถึงแบบ zero‑copy Mount อัตโนมัติโดย MicroPython เมื่อเริ่มต้น ก่อนที่ Python ของผู้ใช้จะรัน

หลังจาก mount แล้ว ไดเรกทอรีทำงานจะถูกตั้งค่าเป็น /sdcard เมื่อมีการ์ดอยู่ มิฉะนั้นเป็น /flash จากนั้น interpreter จะรันสคริปต์จากไดเรกทอรีนั้น:

  • boot.py จะถูกรันทุก ครั้ง ที่รีเซ็ตซอฟต์ (บูตเย็น, Ctrl‑D จาก REPL หรือเมื่อสคริปต์ที่รันอยู่ return)

  • main.py จะถูกรัน เฉพาะการบูตเย็นเท่านั้น ทันทีหลังจาก boot.py การรีเซ็ตซอฟต์ครั้งต่อไปจะรัน boot.py อีกครั้ง แต่จะตรงไปยัง REPL — หากต้องการรัน main.py ใหม่ต้องรีเซ็ตบอร์ดอย่างสมบูรณ์

การวาง boot.py หรือ main.py ลงบน SD card จะแทนที่สำเนาในแฟลชโดยไม่แตะต้องมัน — ทั้งสองไฟล์จะถูกค้นหาในไดเรกทอรีบูต (/sdcard เมื่อ mount การ์ดอยู่ มิฉะนั้น /flash)

main.py ที่ติดมาบนบอร์ดที่เพิ่งเขียนเฟิร์มแวร์ใหม่จะเพียงแค่กะพริบช่อง สีน้ำเงิน ของ RGB LED สำหรับผู้ใช้เป็นจังหวะ heartbeat (พัลส์สั้นสองครั้ง ช่วงพักสั้น) เพื่อให้คุณทราบว่าเฟิร์มแวร์บูตสำเร็จโดยไม่ต้องต่อโฮสต์

sys.path ถูกขยายให้รวมระบบไฟล์ทั้งสามและไดเรกทอรีย่อย lib/ ดังนั้นโมดูลที่ import ได้สามารถอยู่ใน /flash/lib, /sdcard/lib หรือ /rom/lib

เพื่อบังคับให้ระบบเพิกเฉยต่อ SD card ที่ใส่อยู่ (เช่น เพื่อรัน main.py ในแฟลชแม้มีการ์ดอยู่) ให้สร้างไฟล์เปล่าชื่อ SKIPSD ที่ root ของ /flash

เมื่อเชื่อมต่อผ่าน USB ระบบไฟล์บูต (/sdcard หากมีการ์ด มิฉะนั้น /flash) ยังแสดงเป็น USB mass‑storage drive บนโฮสต์ด้วย ทำให้คุณแก้ไข boot.py, main.py และไฟล์อื่นๆ ได้โดยตรง Eject drive ก่อนรีเซ็ตกล้อง เพื่อให้โฮสต์ flush การเขียนที่แคชไว้

Note

เนื่องจาก OS ถือว่า drive เป็น block device แบบ passive ไฟล์ที่สร้างหรือแก้ไขโดยโค้ดที่รันบน OpenMV Cam จะไม่ปรากฏจนกว่าโฮสต์จะ mount drive ใหม่ หาก OS และ OpenMV Cam เขียนลงในระบบไฟล์เดียวกันพร้อมกัน OS จะชนะและเขียนทับการเปลี่ยนแปลงที่กล้องทำ ใช้ SD card สำหรับข้อมูลที่สคริปต์เขียนกลับ และ remount ก่อนอ่านไฟล์เหล่านั้นจากโฮสต์

Note

ช่อง สีแดง ของ RGB LED สำหรับผู้ใช้อาจติดสั้นๆ ขณะที่โฮสต์กำลังอ่านหรือเขียน USB mass‑storage drive — นี่คือตัวบ่งชี้กิจกรรมที่ขับโดยเฟิร์มแวร์ ไม่ใช่ข้อผิดพลาด

ขนาดพื้นที่จัดเก็บ

H7 มาพร้อมกับ:

  • /flash — ระบบไฟล์ FAT 128 KB อ่าน/เขียน

  • /rom — ROMFS แบบ memory-mapped อ่านอย่างเดียว 128 KB

  • /sdcard — ขนาดเต็มของการ์ด microSD ที่ใส่ไว้ (เมื่อมีการ์ด) อ่าน/เขียน

ตัวบ่งชี้ hard‑fault

หาก RGB LED สำหรับผู้ใช้วนไปตามสีทุกสีอย่างรวดเร็ว — เร็วพอที่มักดูเหมือน LED สีขาวที่กะพริบ แทนที่จะเป็นสีที่ชัดเจน — แสดงว่าเฟิร์มแวร์เจอ hard fault ที่กู้ไม่ได้ ให้เขียนเฟิร์มแวร์ใหม่เพื่อกู้คืน หากการเขียนใหม่ไม่ช่วย บอร์ดอาจเสียหายทางกายภาพ

ไลบรารีซอฟต์แวร์

ดู ดัชนีไลบรารี สำหรับรายการโมดูลทั้งหมด — รวมถึงโมดูลที่เฉพาะสำหรับบิลด์ H7