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.
Để 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¶
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_GREENvàLED_BLUEfrom 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ùnglow()/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.SoftI2C và machine.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ứamain.pyvàREADME.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
/romdù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‑Dtừ REPL, hoặc bất cứ khi nào tập lệnh đang chạy kết thúc).main.pychỉ được thực thi khi khởi động lạnh, ngay sauboot.py. Các lần reset mềm tiếp theo sẽ chạy lạiboot.pynhưng chuyển thẳng đến REPL — để chạy lạimain.pybạ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.