OpenMV Cam H7 Plus

OpenMV Cam H7 Plus kết hợp vi điều khiển STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) với 32 MB SDRAM ngoài, 32 MB bộ nhớ flash QSPI, bộ mã hóa/giải mã JPEG phần cứng và mô-đun camera OV5640 5MP trên một bo mạch mở rộng có thể tháo rời. Bộ nhớ dồi dào này rất phù hợp cho việc chụp ảnh độ phân giải cao và các bộ đệm khung hình lớn.

OpenMV Cam H7 Plus

Để xem thông số kỹ thuật đầy đủ, ảnh chụp và kích thước, hãy truy cập trang sản phẩm OpenMV Cam H7 Plus.

Điểm nổi bật

  • STMicroelectronics STM32H743 Cortex‑M7 ở tốc độ 480 MHz (1027 DMIPS).

  • Bộ mã hóa/giải mã JPEG phần cứng.

  • 32 MB SDRAM ngoài (32‑bit @ 100 MHz, 400 MB/s) cộng với 1 MB SRAM nội bộ.

  • 2 MB bộ nhớ flash nội bộ + 32 MB bộ nhớ flash QSPI ngoài (~100 MB/s đọc).

  • Cảm biến cuộn OV5640 5MP.

  • USB tốc độ đầy đủ (12 Mb/s) — xuất hiện như VCP + thiết bị lưu trữ USB trên máy chủ.

  • Khe microSD — SD tới 2 GB, SDHC tới 32 GB, SDXC tới 2 TB.

  • Đầu nối pin LiPo (không có bộ sạc tích hợp — sử dụng pin đã sạc hoặc cấp nguồn qua VIN/USB).

  • 10 chân I/O, chịu 5 V với đầu ra 3.3 V, 25 mA mỗi chân (120 mA tổng cộng trên toàn bộ header), có khả năng ngắt. P6 không chịu 5 V khi dùng ở chế độ ADC hoặc DAC.

  • Đèn LED RGB người dùng và hai đèn LED IR 850 nm công suất cao dùng để chiếu sáng chủ động trong điều kiện thiếu sáng.

Ghi chú

H7 Plus không có chip quản lý nguồn tích hợp: không có bộ sạc pin, không có ADC đo điện áp pin, không có đèn LED báo trạng thái sạc/nguồn và không có nút nguồn phần cứng. Kết nối pin LiPo đã sạc vào đầu nối JST pin hoặc cấp nguồn cho bo mạch qua USB / VIN.

Sơ đồ chân

OpenMV Cam H7 Plus OV5640 Pinout

Tham chiếu chân

Tên chân

Chức năng

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 kỹ thuật số

RESET

kéo xuống GND để reset bo mạch

SYN

chân đồng bộ khung hình — chỉ nối với cảm biến camera

BOOT0

kéo lên 3.3 V lúc khởi động để vào chế độ DFU / ROM bootloader

LED_RED

kênh đỏ của đèn LED RGB (mức thấp kích hoạt)

LED_GREEN

kênh xanh lá của đèn LED RGB (mức thấp kích hoạt)

LED_BLUE

kênh xanh dương của đèn LED RGB (mức thấp kích hoạt)

LED_IR

đèn LED IR công suất cao (cả hai kênh điều khiển cùng nhau)

Ghi chú

Chân SYN trên header được nối trực tiếp với đường kích hoạt/phơi sáng của cảm biến camera — nó không dẫn đến MCU trên H7 Plus. Điều khiển hoặc đọc nó từ bên ngoài; bạn không thể điều khiển nó từ MicroPython.

Chân nguồn

  • 3.3V — ray điện áp điều chỉnh 3.3 V. Tối đa 250 mA dùng cho các shield (ít hơn nếu thẻ microSD đang hoạt động). Khác với các camera mới hơn, chân này là hai chiều — xem cảnh báo bên dưới.

  • VIN — đầu vào 3.6 – 5 V. Cấp nguồn cho bo mạch qua bộ điều chỉnh tích hợp.

  • GND — nối đất chung.

Đầu nối LiPo 3.7 V cũng có mặt, nhưng H7 Plus không có bộ sạc pin — kết nối pin đã sạc sẵn, hoặc cấp nguồn qua VIN / USB thay thế.

Ghi chú

Khi cả USB và VIN/LiPo đều có mặt, VIN/LiPo sẽ được ưu tiên — công tắc nguồn tích hợp chọn nó thay vì USB để cấp nguồn cho bo mạch.

Cảnh báo

Đầu nối pin và VIN được nối chung trên H7 Plus. Không cắm LiPo và cấp VIN cùng lúc — hai nguồn sẽ xung đột nhau và có thể làm hỏng pin, bo mạch hoặc cả hai.

Cảnh báo

Bạn có thể cấp nguồn cho H7 Plus bằng cách đưa 3.3 V trực tiếp vào chân 3.3V nếu không muốn qua bộ điều chỉnh tích hợp. Trong trường hợp đó, không cấp VIN hoặc USB cùng lúc — cấp ngược vào bộ điều chỉnh khi một nguồn khác đang hoạt động có thể làm hỏng vĩnh viễn và phá hủy camera.

Mẹo

Sử dụng công cụ ước tính thời lượng pin để mô phỏng thời gian H7 Plus hoạt động trên pin với chu kỳ hoạt động / ngủ sâu nhất định.

Chân phục hồi và gỡ lỗi

  • RESET — kéo xuống GND để reset bo mạch. Nhả ra để MCU khởi động bình thường.

  • BOOT0 — kéo lên 3.3 V khi cấp nguồn để vào ROM bootloader của STM32 (chế độ DFU). OpenMV IDE sử dụng chế độ này để nạp lại bootloader tích hợp.

Bo mạch có header debug SWD (RST / SWCLK / SWDIO / SWO) bên cạnh header GPIO, tương thích với các adapter ST‑LINK và SEGGER J‑Link.

Ghi chú

Chân trace SWO chia sẻ với đường xung nhịp SPI của header camera. SWO không thể sử dụng đồng thời với bất kỳ mô-đun camera nào giao tiếp với MCU qua SPI — ví dụ FLIR® Lepton® Adapter Module — hãy chọn một trong hai.

Ngoại vi tích hợp

Đèn LED

H7 Plus có một đèn LED RGB người dùng cộng với hai đèn LED IR 850 nm công suất cao:

  • Đèn LED RGB người dùng — có thể điều khiển bằng phần mềm, được hiển thị là LED_RED, LED_GREENLED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • Đèn LED IR — cả hai đèn LED được điều khiển cùng nhau qua chân LED_IR. LED_IR được nối mức cao kích hoạt trong phần cứng trong khi firmware xử lý mọi đèn LED tích hợp khác là mức thấp kích hoạt, vì vậy hãy dùng low() / high() thay vì on() / off() (vì chúng sẽ đảo ngược logic):

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

Cảm biến camera

OV5640 được điều khiển qua mô-đun csi --- cảm biến camera

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 có bộ nén JPEG tích hợp. Đặt csi.CSI.pixformat thành csi.JPEG và cảm biến sẽ gửi các khung hình nén trực tiếp đến camera qua bus camera, giúp chụp ảnh độ phân giải cao trở nên khả thi: csi.HD (1280×720), csi.FHD (1920×1080) và csi.WQXGA2 5MP đầy đủ (2592×1944) đều phát trực tiếp dưới dạng JPEG. Điều chỉnh chất lượng nén với csi.CSI.quality (0-100, cao hơn = khung hình lớn hơn, nhiều chi tiết hơn):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

Cảm biến nằm trên một mô-đun có thể tháo rời — thay thế bằng bất kỳ mô-đun camera OpenMV nào khác (màn trập toàn cầu, nhiệt, độ phân giải cao hơn, v.v.) mà không cần thay đổi phần còn lại của bo mạch.

Học máy

ml --- Machine Learning chạy các mô hình TFLite đã lượng tử hóa trên Cortex‑M7 với các nhân CMSIS‑NN — đủ nhanh cho các bộ phát hiện nhỏ gọn ở vài khung hình mỗi giây. Các mô hình trên hệ thống tệp /rom chỉ đọc tải trực tiếp từ bộ nhớ flash mà không cần sao chép vào RAM. Đây là bộ phát hiện khuôn mặt BlazeFace 128×128 phủ khuôn mặt và sáu điểm đặc trưng lên mỗi khung hình:

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

Thẻ microSD

Khi thẻ được lắp vào, nó sẽ được gắn kết tự động tại /sdcard và có thể sử dụng qua hệ thống tệp thông thường:

import os

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

Tham chiếu bus

GPIO

Dùng machine.Pin để đọc hoặc điều khiển bất kỳ chân nào được in trên bảng mạch. Đầu ra là 3.3 V CMOS, chịu 5 V ở phía đầu vào, và có thể chìm/nguồn tối đa 25 mA mỗi chân (120 mA tổng cộng trên toàn bộ header).

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

Bất kỳ chân đầu vào nào cũng có thể kích hoạt ngắt theo sườn xung:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Bus

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

Bus

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

Phần cứng tương tự cũng có thể được sử dụng ở chế độ target (slave) thông qua machine.I2CTarget để hiển thị một vùng bộ nhớ cho một bộ điều khiển I²C khác:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

SPI

Bus

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)

Bus

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 và DAC

P6 là chân analog người dùng duy nhất. Nó có thể được sử dụng như đầu vào ADC 12‑bit hoặc đầu ra DAC.

  • ADC — điện áp đầy thang tại 3.3 V ở chân:

    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 — thông qua pyb.DAC. Giá trị 8‑bit bao phủ 0–3.3 V:

    from pyb import DAC
    
    dac = DAC("P6")
    voltage = 1.65
    dac.write(int(voltage / 3.3 * 255))
    

Ở chế độ ADC hoặc DAC, P6 chỉ chịu được 3.3 V — không được cấp 5 V vào đây.

PWM

Chân

Bộ định thời / kênh

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

Ghi chú

TIM1 được dành riêng bởi firmware để tạo xung nhịp điểm ảnh của cảm biến camera, vì vậy các kênh TIM1 nằm vật lý trên P0/P1/P2 không thể được dùng cho PWM người dùng mà không làm hỏng chức năng camera.

TIM4 được chia sẻ với pyb.Servo — khởi tạo một servo sẽ cấu hình lại toàn bộ bộ định thời cho hoạt động 50 Hz, vì vậy không được kết hợp machine.PWM trên P7/P8 với pyb.Servo trong cùng một tập lệnh.

Điều khiển bất kỳ chân nào trong số chúng qua machine.PWM

from machine import Pin, PWM

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

Bus giả lập phần mềm

machine.SoftI2Cmachine.SoftSPI hoạt động trên bất kỳ GPIO nào nếu bạn cần thêm bus.

Cảm biến nhiệt (ngoài bo mạch)

Firmware bao gồm trình điều khiển fir --- trình điều khiển cảm biến nhiệt (fir == hồng ngoại xa) cho các camera nhiệt được nối dây bên ngoài:

  • MLX90621 — mảng IR 16 × 4

  • MLX90640 — mảng IR 32 × 24

  • MLX90641 — mảng IR 16 × 12

  • AMG8833 — mảng IR 8 × 8

Kết nối mô-đun với bus I²C của bo mạch và đọc các khung hình với 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())

Trình điều khiển fir chỉ giao tiếp với cảm biến qua I²C 2 — kết nối mô-đun với P4 (SCL) và P5 (SDA).

Thời gian

time

Mô-đun time bao gồm các trễ chặn, ticks đơn điệu và đo thời gian trôi qua:

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)

Bộ định thời ảo

machine.Timer lên lịch các hàm gọi lại theo chu kỳ hoặc một lần mà không tiêu thụ khe bộ định thời phần cứng. Truyền -1 làm id để dùng bộ định thời ảo (phần mềm):

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

Giá trị chu kỳ tính bằng mili giây. Gọi deinit() để dừng và giải phóng khe.

Đồng hồ thời gian thực

machine.RTC duy trì thời gian thực qua các lần reset:

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 reset bo mạch nếu ứng dụng bị treo. Một khi đã khởi động nó không thể dừng hay cấu hình lại — hãy cấp dữ liệu cho nó định kỳ trong vòng lặp chính:

from machine import WDT

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

Thông tin khởi động và runtime

Cửa sổ USB bootloader

Mỗi lần bật nguồn, camera chạy một bootloader ngắn (vài giây) cho phép OpenMV IDE cập nhật firmware mà người dùng không cần vào chế độ DFU. Sau khi cửa sổ hết hạn, bootloader chuyển sang boot.py rồi đến main.py.

Một tập lệnh đang chạy có thể vào lại bootloader theo yêu cầu bằng cách gọi machine.bootloader()

import machine

machine.bootloader()

Hệ thống tệp và thứ tự khởi động

Firmware H7 Plus gắn kết tối đa ba hệ thống tệp khi khởi động:

  • Bộ nhớ flash nội bộ — luôn được gắn tại /flash. Mặc định chứa main.pyREADME.txt; được tạo ngay lần khởi động đầu tiên.

  • Thẻ microSD — nếu thẻ được lắp vào, nó sẽ được gắn tại /sdcard.

  • ROMFS — hệ thống tệp chỉ đọc, ánh xạ bộ nhớ tại /rom dùng để đóng gói các tài nguyên dữ liệu lớn (ví dụ: các mô hình AI) được hưởng lợi từ truy cập không sao chép. Được gắn tự động bởi MicroPython khi khởi động, trước khi bất kỳ Python người dùng nào chạy.

Sau khi gắn kết, thư mục làm việc được đặt thành /sdcard khi thẻ có mặt, ngược lại là /flash. Trình thông dịch sau đó chạy các tập lệnh từ thư mục đó:

  • boot.py được thực thi ở mỗi lần reset mềm (khởi động lạnh, Ctrl‑D từ REPL, hoặc bất cứ khi nào tập lệnh đang chạy kết thúc).

  • main.py chỉ được thực thi khi khởi động lạnh, ngay sau boot.py. Các lần reset mềm tiếp theo sẽ chạy lại boot.py nhưng chuyển thẳng đến REPL — để chạy lại main.py bạn phải reset hoàn toàn bo mạch.

Đặt boot.py hoặc main.py lên thẻ SD sẽ ghi đè bản sao trong flash mà không ảnh hưởng đến nó — cả hai tệp đều được tra cứu trong thư mục khởi động (/sdcard khi thẻ được gắn, ngược lại là /flash).

main.py mặc định được cài trên bo mạch mới flash chỉ nhấp nháy kênh xanh dương của đèn LED RGB người dùng như nhịp đập (hai xung ngắn, khoảng lặng ngắn), để bạn biết firmware đã khởi động thành công mà không cần kết nối máy chủ.

sys.path được mở rộng để bao gồm cả ba hệ thống tệp và các thư mục con lib/ của chúng, vì vậy các mô-đun có thể nhập được có thể nằm trong /flash/lib, /sdcard/lib hoặc /rom/lib.

Để buộc hệ thống bỏ qua thẻ SD đã lắp (ví dụ để chạy main.py từ flash ngay cả khi có thẻ), hãy tạo một tệp trống có tên SKIPSD ở thư mục gốc của /flash.

Khi kết nối qua USB, hệ thống tệp khởi động (/sdcard nếu có thẻ, ngược lại là /flash) cũng được liệt kê như ổ đĩa USB mass‑storage trên máy chủ, cho phép bạn chỉnh sửa boot.py, main.py và bất kỳ tệp nào khác trực tiếp. Eject ổ đĩa trước khi reset camera để máy chủ xả bộ nhớ đệm ghi.

Ghi chú

Vì hệ điều hành xử lý ổ đĩa như một thiết bị khối thụ động, các tệp được tạo hoặc chỉnh sửa bởi mã đang chạy trên OpenMV Cam sẽ không hiển thị cho đến khi máy chủ gắn lại ổ đĩa. Nếu cả hệ điều hành và OpenMV Cam cùng ghi vào hệ thống tệp, hệ điều hành sẽ thắng và ghi đè các thay đổi của camera. Sử dụng thẻ SD cho bất kỳ dữ liệu nào mà tập lệnh ghi lại, và gắn lại trước khi đọc các tệp đó từ máy chủ.

Ghi chú

Kênh đỏ của đèn LED RGB người dùng có thể sáng lên trong giây lát khi máy chủ đang đọc hoặc ghi vào ổ đĩa USB mass‑storage — đây là chỉ báo hoạt động do firmware điều khiển, không phải lỗi.

Kích thước lưu trữ

H7 Plus được cung cấp với:

  • /flash — hệ thống tệp FAT 24 MB, đọc/ghi.

  • /rom — ROMFS ánh xạ bộ nhớ chỉ đọc 8 MB, dùng để đóng gói các tập lệnh và mô hình ML được hưởng lợi từ truy cập mmap không sao chép.

  • /sdcard — dung lượng đầy đủ của thẻ microSD được lắp vào (khi có mặt), đọc/ghi.

Chỉ báo hard‑fault

Nếu đèn LED RGB người dùng liên tục chuyển đổi qua tất cả các màu — nhanh đến mức trông giống như đèn LED trắng nhấp nháy hơn là các màu riêng biệt — thì firmware đã gặp lỗi nghiêm trọng không thể phục hồi. Nạp lại firmware để khôi phục; nếu nạp lại không giúp được, bo mạch có thể bị hỏng vật lý.

Thư viện phần mềm

Xem chỉ mục thư viện để biết danh sách đầy đủ các mô-đun — bao gồm cả những mô-đun dành riêng cho bản dựng H7 Plus.