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
จุดเด่น¶
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
การจัดเรียงพิน¶
อ้างอิงพิน¶
ชื่อพิน |
ฟังก์ชัน |
|---|---|
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_BLUEfrom 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 ที่
/sdcardROMFS — ระบบไฟล์แบบอ่านอย่างเดียว 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