OpenMV Cam H7

OpenMV Cam H7 là bo mạch thị giác máy Cortex‑M7 được xây dựng xung quanh STMicroelectronics STM32H743 ở 480 MHz với 1 MB SRAM nội và 2 MB bộ nhớ flash nội, cùng bộ mã hóa/giải mã JPEG phần cứng. Bo mạch có hai phiên bản cảm biến — H7 với OV7725H7 R2 với ON Semi MT9M114 — nhưng firmware, sơ đồ chân và Python API hoàn toàn giống nhau.

OpenMV Cam H7

Để xem datasheet đầy đủ, ảnh và kích thước, hãy truy cập trang sản phẩm OpenMV Cam H7.

Điểm nổi bật

  • STMicroelectronics STM32H743 Cortex‑M7 ở 480 MHz (1027 DMIPS).

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

  • 1 MB SRAM nội — không có SDRAM ngoài.

  • 2 MB bộ nhớ flash nội (không có bộ nhớ flash QSPI ngoài).

  • Cảm biến OV7725 (hoặc MT9M114 trên H7 R2).

  • USB tốc độ đầy đủ (12 Mb/s) — xuất hiện như VCP + lưu trữ mass USB với máy chủ.

  • Khe cắm microSD — SD lên đến 2 GB, SDHC lên đến 32 GB, SDXC lên đến 2 TB.

  • Đầu nối pin LiPo (không có bộ sạc trên bo — dùng pin đã sạc đầy hoặc cấp nguồn qua VIN/USB).

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

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

Ghi chú

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

Sơ đồ chân

OpenMV Cam H7 OV7725 Sơ đồ chân

Tài liệu tham khảo 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

TIM4 CH3

RESET

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

SYN

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

BOOT0

kéo lên 3,3 V khi cấp nguồn để vào DFU / ROM bootloader

LED_RED

Kênh đỏ LED RGB (tích cực thấp)

LED_GREEN

Kênh xanh lá LED RGB (tích cực thấp)

LED_BLUE

Kênh xanh dương LED RGB (tích cực thấp)

LED_IR

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

Ghi chú

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

Chân nguồn

  • 3.3V — ray nguồn 3,3 V đã ổn định. Có thể cung cấp đến 250 mA cho shield (ít hơn nếu thẻ microSD đang hoạt động). Không giống 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ộ ổn áp trên bo.

  • GND — mass chung.

Cổng kết nối LiPo 3,7 V cũng có sẵn, nhưng H7 không có bộ sạc pin — kết nối pin đã sạc đầy, hoặc dùng VIN / USB thay thế.

Ghi chú

Khi cả USB và VIN/LiPo đều có, đầu vào VIN/LiPo sẽ thắng — công tắc nguồn trên bo sẽ ưu tiên nó hơn 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. Không cắm LiPo và cấp VIN cùng lúc — hai nguồn sẽ xung đột với 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 bằng cách cấp 3,3 V trực tiếp vào chân 3.3V nếu không muốn đi qua bộ ổn áp trên bo. Trong trường hợp đó, không được cấp VIN hoặc USB cùng lúc — cấp ngược vào bộ ổn áp trong khi nguồn khác đang hoạt động có thể gây hỏng vĩnh viễn và phá hủy camera.

Mẹo

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

Chân khôi phục và debug

  • RESET — kéo xuống GND để reset bo mạch. Thả ra cho 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 STM32 (chế độ DFU). OpenMV IDE dùng chế độ này để nạp lại bootloader trên bo.

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

Ngoại vi trên bo

LEDs

H7 có một LED RGB người dùng cùng với một cặp LED IR 850 nm công suất cao:

  • LED RGB người dùng — đ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()
    
  • LED IR — cả hai LED được điều khiển cùng nhau qua chân LED_IR. LED_IR được nối tích cực cao trong phần cứng trong khi firmware xử lý mọi LED trên bo khác là tích cực thấp, vì vậy hãy dùng low() / high() thay vì on() / off() (điều này sẽ đảo ngược trạng thái):

    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

OV7725 (hoặc MT9M114 trên H7 R2) đượ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()

Cảm biến nằm trên mô-đun có thể tháo rời — có thể thay thế bằng bất kỳ mô-đun camera OpenMV nào khác (màn trập toàn cục, 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.

Thẻ microSD

Khi thẻ được cắm vào, nó sẽ được mount 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)

Tài liệu tham khảo bus

GPIO

Dùng machine.Pin để đọc hoặc điều khiển bất kỳ chân in lụa nào. Đầu ra là CMOS 3,3 V, chịu được 5 V ở phía đầu vào, và có thể sink/source tới 25 mA mỗi chân (tổng cộng 120 mA 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 trên các chuyển đổi cạnh:

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

Cùng một phần cứng cũng có thể dùng ở chế độ target (slave) qua machine.I2CTarget để hiển thị một vùng bộ nhớ cho 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 tương tự người dùng duy nhất. Nó có thể được dùng như đầu vào ADC 12-bit hoặc đầu ra DAC.

  • ADC — toàn thang ở 3,3 V tại 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 — 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.

PWM

Chân

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

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

P9

TIM4 CH3

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 vật lý trên P0/P1/P2 không thể dùng cho PWM người dùng mà không làm hỏ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 đừng kết hợp machine.PWM trên P7/P8/P9 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ố đó qua machine.PWM

from machine import Pin, PWM

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

Bus bit-bang bằng 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 (gắn ngoài)

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 kết nối 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 và đọc các khung hình bằng 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ào P4 (SCL) và P5 (SDA).

Timing

time

Mô-đun time bao gồm các hàm delay blocking, 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 định 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ị Period 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 giữ 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. Sau khi khởi động, nó không thể dừng hoặc cấu hình lại — nạp lại đị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à thời gian chạy

Cửa sổ USB bootloader

Mỗi khi cấp 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à không cần người dùng 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ể quay 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 mount tới ba hệ thống tệp khi khởi động:

  • Bộ nhớ flash nội — luôn được mount tại /flash. Chứa main.pyREADME.txt theo mặc định; được tạo trong lần khởi động đầu tiên.

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

  • ROMFS — hệ thống tệp chỉ đọc, ánh xạ bộ nhớ tại /rom dùng để chứa các tài sản dữ liệu lớn (ví dụ: mô hình (ML) AI) hưởng lợi từ truy cập không sao chép. Được mount 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 mount, 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 trên mỗi lần soft reset (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 được thực thi chỉ khi khởi động lạnh, ngay sau boot.py. Các lần soft reset 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 vào thẻ SD sẽ ghi đè bản sao trong flash mà không ảnh hưởng đến nó — cả hai tệp đều được tìm kiếm trong thư mục khởi động (/sdcard khi thẻ được mount, ngược lại là /flash).

main.py mặc định được cung cấp trên bo mới flash chỉ nhấp nháy kênh xanh dương của LED RGB người dùng như tín hiệu nhịp tim (hai xung ngắn, khoảng dừng ngắn), để bạn có thể 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 tất 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ể import được có thể nằm trong /flash/lib, /sdcard/lib, hoặc /rom/lib.

Để buộc hệ thống bỏ qua thẻ SD được cắm vào (ví dụ để chạy main.py trong flash ngay cả khi có thẻ), hãy tạo một tệp rỗng tên SKIPSD tại 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ủ flush các lần ghi đã được cache.

Ghi chú

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

Ghi chú

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

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

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

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

  • /rom — ROMFS ánh xạ bộ nhớ chỉ đọc 128 KB.

  • /sdcard — kích thước đầy đủ của thẻ microSD được cắm vào (khi có), đọc/ghi.

Chỉ thị hard fault

Nếu LED RGB người dùng đang chuyển đổi nhanh qua tất cả các màu — đủ nhanh để trông giống như đèn LED trắng lấp lánh hơn là các màu riêng biệt — firmware đã gặp hard fault không thể phục hồi. Nạp lại firmware để phục hồi; 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 để có danh sách đầy đủ các mô-đun — bao gồm cả những mô-đun dành riêng cho bản H7.