OpenMV Cam M4¶
OpenMV Cam M4 là bo mạch thị giác máy Cortex‑M4 nhỏ gọn được xây dựng xung quanh vi điều khiển STMicroelectronics STM32F427 chạy ở 180 MHz với 256 KB SRAM nội và 1 MB bộ nhớ flash nội. Cảm biến OV7725 đi kèm chụp ảnh thang xám 320×240 hoặc khung hình RGB565, và header người dùng 9 chân cung cấp các ngoại vi UART, I²C, SPI, CAN, ADC/DAC và PWM.
Ghi chú
OV7725 là cảm biến tiêu chuẩn trên các bo M4 sản xuất. Các biến thể rất sớm của M4 được trang bị OmniVision OV2640 thay thế — cùng quy trình xem trước QVGA, nhưng OV2640 cũng có thể chụp các khung hình JPEG lên đến UXGA (1600×1200). Cả hai cảm biến đều được điều khiển qua cùng API csi --- cảm biến camera.
Để biết thêm bảng dữ liệu đầy đủ, ảnh và kích thước, xem trang sản phẩm OpenMV Cam M4.
Điểm nổi bật¶
STMicroelectronics STM32F427 Cortex‑M4 ở 180 MHz.
256 KB SRAM nội — không có SDRAM ngoài.
1 MB bộ nhớ flash nội (không có bộ nhớ flash QSPI ngoài).
Cảm biến OV7725 (hoặc OV2640 trên các biến thể M4 rất sớm) — thang xám 8‑bit 320×240 hoặc RGB565; OV2640 có thể chụp thêm đến UXGA (1600×1200) JPEG.
USB tốc độ đầy đủ (12 Mb/s) — xuất hiện dưới dạng VCP + lưu trữ USB mass storage cho 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.
9 chân I/O, chịu được 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 được 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 để chiếu sáng chủ động trong môi trường ánh sáng yếu.
Ghi chú
M4 không có chip quản lý nguồn trên bo mạch: không có đầu nối pin, 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. Cấp nguồn cho bo mạch từ USB hoặc VIN.
Sơ đồ chân¶
Tham chiếu chân¶
Tên chân |
Chức năng |
|---|---|
P0 |
SPI2 MOSI |
P1 |
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 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
RESET |
kéo xuống GND để reset bo mạch |
BOOT0 |
kéo lên 3,3 V khi bật nguồn để vào chế độ DFU / ROM bootloader |
SWCLK |
ARM SWD clock (truy cập debugger) |
SWDIO |
ARM SWD data (truy cập debugger) |
LED_RED |
Kênh đỏ của RGB LED (kích hoạt mức thấp) |
LED_GREEN |
Kênh xanh lá của RGB LED (kích hoạt mức thấp) |
LED_BLUE |
Kênh xanh dương của RGB LED (kích hoạt mức thấp) |
LED_IR |
đèn LED IR công suất cao (cả hai kênh được điều khiển cùng nhau) |
Các chân nguồn¶
3.3V — nguồn 3,3 V đã được điều chỉnh. Cung cấp tới 250 mA cho các shield (ít hơn nếu thẻ microSD đang được sử dụng). Không giống các camera mới hơn, chân này có 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 trên bo.
GND — chân mass chung.
Ghi chú
Khi cả USB và VIN đều được cấp, nguồn nào có điện áp cao hơn sẽ cấp cho bo mạch — các diode trên bo đơn giản chỉ chọn nguồn mạnh hơn.
Cảnh báo
Bạn có thể cấp nguồn cho M4 bằng cách nạp 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 trên bo. Trong trường hợp đó, không được đồng thời cấp VIN hoặc USB — việc cấp ngược cho bộ điều chỉnh trong khi 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
Dùng công cụ ước tính thời lượng pin để mô phỏng thời gian M4 hoạt động với pin cho chu kỳ làm việc 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 cho phép MCU khởi động bình thường.
BOOT0 — kéo lên 3,3 V khi bật nguồn để vào ROM bootloader của STM32 (chế độ DFU). OpenMV IDE sử dụng chế độ này để nạp lại bootloader trên bo.
SWCLK và SWDIO được đưa ra như các chân header thông thường (không phải đầu nối SWD chuyên dụng). Nối RESET, SWCLK, SWDIO, GND và 3,3 V với bộ điều hợp ST‑LINK hoặc SEGGER J‑Link để gỡ lỗi bo mạch.
Ngoại vi trên bo¶
Đèn LED¶
M4 có một RGB LED người dùng và một cặp đèn LED IR 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()
Đèn LED IR — cả hai đèn LED được điều khiển cùng nhau qua chân
LED_IR.LED_IRđược kết nối kích hoạt mức cao trong phần cứng trong khi firmware coi mọi đèn LED trên bo khác là kích hoạt mức thấp, vì vậy hãy dùnglow()/high()thay vìon()/off()(vì điều này sẽ đảo ngược ý 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¶
Cảm biến đi kèm (OV7725 trên bo tiêu chuẩn, OV2640 trên các biến thể rất sớm) đượ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 được hàn cố định vào bo mạch trên M4 — không phải trên mô-đun có thể thay thế được.
Ghi chú
Trên các bo OV7725, chân FSIN (đồng bộ khung hình) của cảm biến được nối với MCU nhưng hỗ trợ firmware cho nó chưa được thêm vào.
Trên các bo OV2640, các chân STROBE, FREX (thời gian phơi sáng khung hình) và EXPST (reset thời gian phơi sáng) của cảm biến được nối với MCU nhưng hỗ trợ firmware cho chúng chưa được thêm vào.
Header servo¶
Mặt sau của bo mạch có hai miếng hàn đầu nối servo đưa ra header servo chuẩn 3 chân (tín hiệu / VIN / GND) cho P7 và P8. Các chân tín hiệu ánh xạ trực tiếp đến kênh 1 và 2 của TIM4 (cùng các kênh được dùng bởi pyb.Servo), và chân V+ trên mỗi header được nối trực tiếp đến VIN, vì vậy các servo lấy dòng điện từ đường nguồn đầu vào thay vì bộ điều chỉnh 3,3 V.
Hàn một cặp header 3 chân góc vuông vào các miếng và kết nối hai servo thú vị để điều khiển giá đỡ xoay‑nghiêng:
from pyb import Servo
pan = Servo(1) # P7 — TIM4 CH1
tilt = Servo(2) # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)
Thẻ microSD¶
Khi thẻ được cắm vào, nó đượ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 mạch. Đầu ra là 3,3 V CMOS, chịu được 5 V ở phía đầu vào, và có thể tiêu thụ/cung cấp tới 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 |
|---|---|---|
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 |
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 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 sử dụng như đầu vào ADC 12‑bit hoặc đầu ra DAC.
ADC — toàn 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.
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 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 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 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ố đó qua machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Các 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 một bus bổ sung.
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 thiết bị chụp ảnh nhiệt được kết nối 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 mô-đun vào 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 — nối mô-đun vào P4 (SCL) và P5 (SDA).
Thời gian¶
time¶
Mô-đun time cung cấp các hàm trì hoãn khóa, 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 để sử 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 đồng hồ tường sau 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ể bị dừng hoặc cấu hình lại — hãy cấp thức ăn cho nó định kỳ trong vòng lặp chính của bạn:
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 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à không cần người dùng phải vào chế độ DFU. Sau khi cửa sổ hết hạn, bootloader chuyển giao cho boot.py rồi 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 M4 gắn kết tới 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 trong lần khởi động đầu tiên.Thẻ microSD — nếu thẻ được cắm vào, nó được gắn kết tại
/sdcard.ROMFS — hệ thống tệp chỉ đọc, ánh xạ bộ nhớ tại
/romđược dùng để vận chuyển 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 gắn kết 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 thì /flash. Sau đó trình thông dịch chạy các tập lệnh từ thư mục đó:
boot.pyđược thực thi vào mỗi lần reset mềm (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.pyđược thực thi chỉ khi khởi động nguội, ngay sauboot.py. Các lần reset mềm tiếp theo chạy lạiboot.pynhưng đi thẳng đến REPL — để chạy lạimain.py, bạn phải reset hoàn toàn bo mạch.
Thả một tệp boot.py hoặc main.py lên thẻ SD sẽ ghi đè bản sao trong flash mà không chạm vào 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 /flash).
Tệp main.py mặc định được cài sẵn trên bo mạch vừa nạp firmware 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 trống ngắn), giúp bạn biết firmware đã khởi động thành công mà không cần kết nối vớ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ể 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 trên flash ngay cả khi có thẻ), hãy tạo một tệp rỗ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 /flash) cũng được liệt kê như một ổ lưu trữ 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ả các ghi chép đã lưu trong bộ nhớ 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 sửa đổi bởi mã 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 đều ghi vào cùng hệ thống tệp cùng một lúc, hệ điều hành sẽ thắng và ghi đè các thay đổi do camera thực hiện. 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 RGB LED người dùng có thể sáng lên tạm thời trong khi máy chủ đang đọc hoặc ghi vào ổ lưu trữ 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ữ¶
M4 được cài sẵn với:
/flash— hệ thống tệp FAT 32 KB, đọc/ghi./rom— ROMFS ánh xạ bộ nhớ chỉ đọc 128 KB./sdcard— dung lượng đầy đủ của thẻ microSD được cắm vào (khi có), đọc/ghi.
Chỉ báo hard‑fault¶
Nếu RGB LED người dùng đang nhanh chóng chuyển qua tất cả các màu sắc — đủ nhanh đến mức có xu hướng 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 — firmware đã gặp lỗi 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 để biết danh sách đầy đủ các mô-đun — bao gồm những mô-đun duy nhất cho bản dựng M4.