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 OV7725 và H7 R2 với ON Semi MT9M114 — nhưng firmware, sơ đồ chân và Python API hoàn toàn giống nhau.
Để 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¶
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_GREENvàLED_BLUEfrom 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ùnglow()/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.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 (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ứamain.pyvàREADME.txttheo 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
/romdù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‑Dtừ 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 sauboot.py. Các lần soft reset 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 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.