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.

OpenMV Cam M7

Để 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

Sơ đồ chân OV7725 của OpenMV Cam M7

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_GREENLED_BLUE

    from 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ùng low() / 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.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 (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ứa main.pyREADME.txt theo 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‑D từ REPL, hoặc bất cứ khi nào tập lệnh đang chạy trả về).

  • main.py chỉ được thực thi trong lần khởi động nguội, 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 đặ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.