OpenMV Cam M7¶
OpenMV Cam M7 là bo mạch thị giác máy dựa trên lõi Cortex-M7, được xây dựng xung quanh vi điều khiển STMicroelectronics STM32F765 chạy ở 216 MHz với 512 KB SRAM nội và 2 MB bộ nhớ flash nội. Cảm biến OV7725 đi kèm có khả năng chụp khung hình thang xám 640×480 hoặc RGB565 320×240 với tốc độ lên đến 150 FPS, và đầu nối người dùng 10 chân cho phép kết nối các ngoại vi UART, I²C, SPI, CAN, ADC/DAC và PWM.
Để xem đầy đủ datasheet, ảnh và kích thước, hãy truy cập trang sản phẩm OpenMV Cam M7.
Điểm nổi bật¶
STMicroelectronics STM32F765 Cortex-M7 chạy ở 216 MHz.
512 KB 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 — thang xám 640×480 hoặc RGB565 320×240 với tốc độ lên đến 150 FPS.
USB tốc độ đầy đủ (12 Mb/s) — được nhận diện là VCP + USB mass storage trên 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.
10 chân I/O, chịu điện áp 5 V với điện áp xuất 3,3 V, 25 mA mỗi chân (tổng cộng 120 mA trên toàn bộ đầu nối), có khả năng kích ngắt. P6 không chịu được 5 V khi sử dụng ở chế độ ADC hoặc DAC.
RGB LED người dùng và hai LED hồng ngoại 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ú
M7 không có chip quản lý nguồn tích hợp: không có đầu nối pin, không có mạch sạc pin, không có ADC đo điện áp pin, không có LED trạng thái sạc / nguồn, và không có nút nguồn phần cứng. Cấp nguồn cho bo mạch qua USB hoặc 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 / CAN2 TX |
P3 |
SPI2 NSS (CS) / CAN2 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 để đặt lại 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 khi cấp nguồn để vào chế độ DFU / ROM bootloader |
LED_RED |
kênh đỏ của RGB LED (mức thấp hoạt động) |
LED_GREEN |
kênh xanh lá của RGB LED (mức thấp hoạt động) |
LED_BLUE |
kênh xanh dương của RGB LED (mức thấp hoạt động) |
LED_IR |
LED hồng ngoại công suất cao (cả hai kênh được điều khiển cùng nhau) |
Ghi chú
Chân SYN trên đầu nối đượ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 được đưa đến MCU trên M7. Đ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 — nguồn điện 3,3 V được điều chỉnh. Có thể cung cấp lên đến 250 mA cho 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 điện áp tích hợp.
GND — mass chung.
Ghi chú
Khi cả USB và VIN đều được kết nối, nguồn nào có điện áp cao hơn sẽ cấp điện cho bo mạch — các diode tích hợp sẽ tự động chọn nguồn mạnh hơn.
Cảnh báo
Bạn có thể cấp nguồn cho M7 bằng cách đưa 3,3 V trực tiếp vào chân 3.3V nếu không muốn đi qua bộ điều chỉnh tích hợp. Trong trường hợp đó, không được đồng thời cấp VIN hoặc nguồn USB — việc cấp ngược vào bộ điều chỉnh khi một nguồn cấp khác đang hoạt động có thể gây hỏng vĩnh viễn camera.
Mẹo
Sử dụng công cụ ước tính tuổi thọ pin để mô phỏng thời gian hoạt động của M7 trên pin với chu kỳ hoạt động / ngủ sâu nhất định.
Chân khôi phục và gỡ lỗi¶
RESET — kéo xuống GND để đặt lại bo mạch. Thả ra để MCU khởi động bình thường.
BOOT0 — kéo lên 3,3 V khi cấp nguồn để vào STM32 ROM bootloader (chế độ DFU). OpenMV IDE sử dụng chế độ này để nạp lại bootloader tích hợp.
Bo mạch có đầu nối debug SWD (RST / SWCLK / SWDIO) bên cạnh đầu nối GPIO, tương thích với bộ chuyển đổi ST-LINK và SEGGER J-Link.
Ngoại vi tích hợp¶
LED¶
M7 có một RGB LED người dùng và một cặp LED hồng ngoại 850 nm công suất cao:
RGB LED 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 hồng ngoại — cả hai LED được điều khiển cùng nhau qua chân
LED_IR.LED_IRđược nối mức cao hoạt động trong phần cứng trong khi firmware xử lý tất cả các LED tích hợp khác là mức thấp hoạt động, vì vậy hãy dùnglow()/high()thay vìon()/off()(vì các hàm này sẽ đảo nghĩa):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 được điều khiển thông qua module 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 được hàn cố định vào bo mạch trên M7 — nó không phải dạng module có thể hoán đổi.
Thẻ microSD¶
Khi thẻ được cắm vào, nó sẽ được gắn kết tự động tại /sdcard và có thể sử dụng thô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¶
Sử dụng machine.Pin để đọc hoặc điều khiển bất kỳ chân nào được in trên mạch. Các ngõ ra là CMOS 3,3 V, chịu điện áp 5 V ở phía đầu vào, và có thể nhận/cấp lên đến 25 mA mỗi chân (tổng cộng 120 mA trên toàn bộ đầu nối).
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 khi 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")
Phần cứng này cũng có thể được sử dụng ở chế độ mục tiêu (slave) thông 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¶
Bus |
TX |
RX |
|---|---|---|
CAN2 |
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 dùng làm đầu vào ADC 12-bit hoặc đầu ra DAC.
ADC — thang đo đầy đủ ở 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 — thông qua
pyb.DAC. Giá trị 8-bit bao phủ dải 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 |
P9 |
TIM4 CH3 |
Ghi chú
TIM1 được dành riêng bởi firmware để tạo xung clock điểm ảnh cho cảm biến camera, vì vậy các kênh TIM1 nằm 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 — khi khởi tạo servo sẽ cấu hình lại toàn bộ bộ định thời sang hoạt động 50 Hz, vì vậy không được 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ố này 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 (bên ngoài)¶
Firmware bao gồm driver fir --- trình điều khiển cảm biến nhiệt (fir == hồng ngoại xa) cho các bộ chụp ảnh 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
Nối module với bus I²C của bo mạch và đọ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())
Driver fir chỉ giao tiếp với cảm biến qua I²C 2 — nối module với P4 (SCL) và P5 (SDA).
Thời gian¶
time¶
Module time cung cấp các hàm trễ chặn, đếm tick đơ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 chiếm dụng 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ực¶
machine.RTC duy trì thời gian thực qua các lần đặt lại:
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 đặt lại bo mạch nếu ứng dụng bị treo. Sau khi khởi động, nó không thể bị dừng hay cấu hình lại — hãy nạp lại định kỳ bên 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ổ bootloader USB¶
Mỗi lần 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à 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 M7 gắn kết lên đến ba hệ thống tệp khi khởi động:
Bộ nhớ flash nội — luôn được gắn kết tại
/flash. Chứamain.pyvàREADME.txttheo mặc định; được tạo ngay lần khởi động đầu tiên.Thẻ microSD — nếu thẻ được cắm vào, nó sẽ được gắn kết tại
/sdcard.ROMFS — hệ thống tệp ánh xạ bộ nhớ chỉ đọc tại
/rom, dùng để lưu trữ các tài sản dữ liệu lớn (ví dụ: mô hình AI) hưởng lợi từ truy cập zero-copy. Được MicroPython gắn kết tự động 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 trong mỗi lần soft reset (khởi động nguội,Ctrl‑Dtừ REPL, hoặc bất cứ khi nào tập lệnh đang chạy trả về).main.pychỉ được thực thi trong lần khởi động nguội, 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 đặt lại 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 kết, ngược lại là /flash).
Tệp 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 RGB LED người dùng như nhịp tim (hai xung ngắn, khoảng dừ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 module 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ắm (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 ở 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ư một ổ đĩa USB mass-storage trên máy chủ, cho phép bạn chỉnh sửa boot.py, main.py và các tệp khác trực tiếp. Hãy eject ổ đĩa trước khi đặt lại camera để máy chủ đẩy các thay đổi đã lưu trong cache.
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 code chạy trên OpenMV Cam sẽ không hiển thị cho đến khi máy chủ gắn kết 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 đè những thay đổi do camera thực hiện. Dùng thẻ SD cho mọi dữ liệu mà tập lệnh ghi lại, và gắn kết lại trước khi đọc các tệp đó từ máy chủ.
Ghi chú
Kênh đỏ của RGB LED người dùng có thể sáng lên trong chốc 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.
Dung lượng lưu trữ¶
M7 được xuất xưởng với:
/flash— hệ thống tệp FAT 96 KB, đọc/ghi./rom— ROMFS chỉ đọc ánh xạ bộ nhớ 256 KB./sdcard— dung lượng đầy đủ của thẻ microSD được cắm vào (khi có), đọc/ghi.
Chỉ báo lỗi phần cứng nghiêm trọng¶
Nếu RGB LED người dùng đang chuyển đổi nhanh qua tất cả các màu — nhanh đến mức trông giống như một đè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 phần cứng nghiêm trọng không thể phục hồi. Hãy 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 module — bao gồm cả những module dành riêng cho bản M7.