OpenMV Cam M4¶
OpenMV Cam M4 adalah papan visi mesin Cortex-M4 yang ringkas, dibangun di atas STMicroelectronics STM32F427 pada 180 MHz dengan 256 KB SRAM internal dan 1 MB flash internal. Sensor OV7725 yang disertakan dapat menangkap bingkai skala abu-abu 320×240 atau RGB565, dan header pengguna 9-pin memaparkan periferal UART, I²C, SPI, CAN, ADC/DAC, dan PWM.
Catatan
OV7725 merupakan sensor standar pada papan M4 produksi. Varian M4 yang sangat awal dikirimkan dengan OmniVision OV2640 — pipeline pratinjau QVGA yang sama, tetapi OV2640 juga dapat menangkap bingkai JPEG hingga UXGA (1600×1200). Kedua sensor dikendalikan melalui API csi --- sensor kamera yang sama.
Untuk datasheet lengkap, foto, dan dimensi, lihat halaman produk OpenMV Cam M4.
Sorotan¶
STMicroelectronics STM32F427 Cortex-M4 pada 180 MHz.
256 KB SRAM internal — tanpa SDRAM eksternal.
1 MB flash internal (tanpa flash QSPI eksternal).
Sensor OV7725 (atau OV2640 pada varian M4 yang sangat awal) — skala abu-abu 8-bit 320×240 atau RGB565; OV2640 juga dapat menangkap hingga JPEG UXGA (1600×1200).
USB kecepatan penuh (12 Mb/s) — muncul sebagai VCP + penyimpanan massal USB ke host.
Slot microSD — SD hingga 2 GB, SDHC hingga 32 GB, SDXC hingga 2 TB.
9 pin I/O, toleran 5 V dengan keluaran 3,3 V, 25 mA per pin (total 120 mA di seluruh header), mampu interupsi. P6 tidak toleran 5 V saat digunakan dalam mode ADC atau DAC.
LED RGB pengguna dan dua LED IR 850 nm berdaya tinggi untuk pencahayaan aktif dalam visi cahaya rendah.
Catatan
M4 tidak memiliki chip manajemen daya on-board: tidak ada konektor baterai, tidak ada pengisi baterai, tidak ada ADC tegangan baterai, tidak ada LED status pengisian/daya, dan tidak ada tombol daya perangkat keras. Beri daya pada papan dari USB atau VIN.
Pinout¶
Referensi pin¶
Nama pin |
Fungsi |
|---|---|
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 |
tarik ke GND untuk mereset papan |
BOOT0 |
tarik ke 3,3 V saat power-on untuk DFU / ROM bootloader |
SWCLK |
jam ARM SWD (akses debugger) |
SWDIO |
data ARM SWD (akses debugger) |
LED_RED |
saluran merah LED RGB (aktif rendah) |
LED_GREEN |
saluran hijau LED RGB (aktif rendah) |
LED_BLUE |
saluran biru LED RGB (aktif rendah) |
LED_IR |
LED IR berdaya tinggi (kedua saluran dikendalikan bersamaan) |
Pin daya¶
3.3V — rail 3,3 V yang diregulasi. Tersedia hingga 250 mA untuk shield (lebih sedikit jika kartu microSD sedang digunakan). Berbeda dengan kamera yang lebih baru, pin ini bersifat dua arah — lihat peringatan di bawah.
VIN — input 3,6 – 5 V. Memberi daya pada papan melalui regulator on-board.
GND — ground bersama.
Catatan
Ketika USB dan VIN keduanya tersambung, sumber dengan tegangan lebih tinggi yang memberi daya pada papan — dioda on-board secara otomatis memilih rail yang lebih kuat.
Peringatan
Anda boleh memberi daya pada M4 dengan memasukkan 3,3 V langsung ke pin 3.3V jika tidak ingin melalui regulator on-board. Dalam hal ini, jangan juga menerapkan daya VIN atau USB secara bersamaan — menggerakkan balik regulator saat sumber daya lain aktif dapat merusak dan menghancurkan kamera secara permanen.
Tip
Gunakan estimator masa pakai baterai untuk memodelkan berapa lama M4 akan berjalan dengan baterai untuk siklus kerja aktif/tidur dalam yang diberikan.
Pin pemulihan dan debug¶
RESET — tarik ke GND untuk mereset papan. Melepaskannya memungkinkan MCU mulai dengan normal.
BOOT0 — tarik ke 3,3 V saat memberi daya pada papan untuk memasuki ROM bootloader STM32 (mode DFU). OpenMV IDE menggunakan mode ini untuk mereflash bootloader on-board.
SWCLK dan SWDIO dikeluarkan sebagai pin header biasa (bukan konektor SWD khusus). Hubungkan RESET, SWCLK, SWDIO, GND, dan 3,3 V ke adaptor ST-LINK atau SEGGER J-Link untuk men-debug papan.
Periferal on-board¶
LED¶
M4 memiliki satu LED RGB pengguna ditambah sepasang LED IR 850 nm berdaya tinggi:
LED RGB pengguna — dapat dikontrol oleh perangkat lunak, diekspos sebagai
LED_RED,LED_GREENdanLED_BLUEfrom machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
LED IR — kedua LED dikendalikan bersama melalui pin
LED_IR.LED_IRdihubungkan aktif tinggi di perangkat keras sementara firmware memperlakukan setiap LED on-board lainnya sebagai aktif rendah, jadi gunakanlow()/high()daripadaon()/off()(yang akan membalik maknanya):from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
Sensor kamera¶
Sensor yang disertakan (OV7725 pada papan standar, OV2640 pada varian yang sangat awal) dikendalikan melalui modul csi --- sensor kamera
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()
Sensor disolder ke papan pada M4 — tidak terpasang pada modul yang dapat diganti.
Catatan
Pada papan OV7725, pin FSIN (frame-sync) sensor terhubung ke MCU tetapi dukungan firmware untuk pin tersebut belum ditambahkan.
Pada papan OV2640, pin STROBE, FREX (eksposur bingkai), dan EXPST (reset eksposur) sensor terhubung ke MCU tetapi dukungan firmware untuk pin-pin tersebut belum ditambahkan.
Header servo¶
Sisi belakang papan memiliki dua bantalan solder konektor servo yang mengeluarkan header servo 3-pin standar (sinyal / VIN / GND) untuk P7 dan P8. Pin sinyal langsung memetakan ke saluran TIM4 1 dan 2 (saluran yang sama yang digunakan oleh pyb.Servo), dan pin V+ pada setiap header dihubungkan langsung ke VIN, sehingga servo mengambil arusnya dari rail input daripada regulator 3,3 V.
Solder sepasang header 3-pin sudut kanan ke bantalan dan hubungkan dua servo hobi untuk mengemudikan dudukan pan-and-tilt:
from pyb import Servo
pan = Servo(1) # P7 — TIM4 CH1
tilt = Servo(2) # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)
Kartu microSD¶
Ketika kartu dimasukkan, kartu tersebut dipasang secara otomatis di /sdcard dan dapat digunakan melalui sistem file biasa:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Referensi bus¶
GPIO¶
Gunakan machine.Pin untuk membaca atau mengemudikan salah satu pin yang tercetak pada silkscreen. Keluaran adalah 3,3 V CMOS, toleran 5 V pada sisi input, dan dapat menyerap/mensumber hingga 25 mA per pin (total 120 mA di seluruh 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())
Pin input mana pun juga dapat memicu interupsi pada transisi tepi:
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")
Perangkat keras yang sama juga dapat digunakan dalam mode target (slave) melalui machine.I2CTarget untuk mengekspos wilayah memori ke kontroler I²C lainnya:
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 dan DAC¶
P6 adalah satu-satunya pin analog pengguna. Pin ini dapat digunakan sebagai input ADC 12-bit atau keluaran DAC.
ADC — skala penuh pada 3,3 V di pin:
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 — melalui
pyb.DAC. Nilai 8-bit mencakup 0–3,3 V:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
Dalam mode ADC atau DAC, P6 hanya toleran 3,3 V — jangan masukkan 5 V padanya.
PWM¶
Pin |
Timer / saluran |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
Catatan
TIM1 dicadangkan oleh firmware untuk menghasilkan clock piksel sensor kamera, sehingga saluran TIM1 yang secara fisik berada di P0/P1/P2 tidak dapat digunakan untuk PWM pengguna tanpa merusak kamera.
TIM4 dibagikan dengan pyb.Servo — menginstansiasi servo mengkonfigurasi ulang seluruh timer untuk operasi 50 Hz, jadi jangan mencampur machine.PWM pada P7/P8 dengan pyb.Servo dalam skrip yang sama.
Kendalikan salah satunya melalui machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Bus bit-banged perangkat lunak¶
machine.SoftI2C dan machine.SoftSPI bekerja pada GPIO mana pun jika Anda memerlukan bus tambahan.
Sensor termal (eksternal)¶
Firmware menyertakan driver fir --- driver sensor termal (fir == far infrared) untuk imager termal yang dihubungkan secara eksternal:
MLX90621 — array IR 16 × 4
MLX90640 — array IR 32 × 24
MLX90641 — array IR 16 × 12
AMG8833 — array IR 8 × 8
Hubungkan modul ke bus I²C papan dan baca bingkai dengan 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 hanya berkomunikasi dengan sensor melalui I²C 2 — hubungkan modul ke P4 (SCL) dan P5 (SDA).
Timing¶
time¶
Modul time mencakup penundaan pemblokiran, tik monoton, dan pengukuran waktu yang telah berlalu:
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)
Timer virtual¶
machine.Timer menjadwalkan callback periodik atau satu-kali tanpa menggunakan slot timer perangkat keras. Berikan -1 sebagai id untuk menggunakan timer virtual (perangkat lunak):
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"))
Nilai periode dalam milidetik. Panggil deinit() untuk menghentikan dan melepaskan slot.
Real-time clock¶
machine.RTC menyimpan waktu dinding di seluruh 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 mereset papan jika aplikasi hang. Setelah dimulai, tidak dapat dihentikan atau dikonfigurasi ulang — beri makan secara berkala di dalam loop utama Anda:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Info boot dan runtime¶
Jendela bootloader USB¶
Pada setiap power-up, kamera menjalankan bootloader singkat (beberapa detik) yang memungkinkan OpenMV IDE memperbarui firmware tanpa pengguna harus memasuki mode DFU. Setelah jendela berakhir, bootloader menyerahkan kontrol ke boot.py lalu main.py.
Skrip yang berjalan dapat memasuki kembali bootloader sesuai permintaan dengan memanggil machine.bootloader()
import machine
machine.bootloader()
Sistem file dan urutan boot¶
Firmware M4 memasang hingga tiga sistem file saat boot:
Flash internal — selalu dipasang di
/flash. Memuatmain.pydanREADME.txtsecara default; dibuat pada boot pertama kali.Kartu microSD — jika kartu dimasukkan, kartu tersebut dipasang di
/sdcard.ROMFS — sistem file ROMFS yang dipetakan ke memori dan hanya-baca di
/romyang digunakan untuk mengirimkan aset data besar (mis. model AI) yang mendapat manfaat dari akses tanpa salinan. Dipasang secara otomatis oleh MicroPython saat startup, sebelum Python pengguna mana pun berjalan.
Setelah pemasangan, direktori kerja diatur ke /sdcard ketika kartu tersedia, jika tidak ke /flash. Interpreter kemudian menjalankan skrip dari direktori tersebut:
boot.pydijalankan pada setiap soft reset (cold boot,Ctrl‑Ddari REPL, atau setiap kali skrip yang berjalan selesai).main.pydijalankan hanya pada cold boot, segera setelahboot.py. Soft reset berikutnya menjalankan ulangboot.pytetapi langsung ke REPL — untuk menjalankan ulangmain.pyAnda harus mereset papan sepenuhnya.
Menempatkan boot.py atau main.py ke kartu SD menggantikan salinan di flash tanpa mengubahnya — kedua file dicari di direktori boot (/sdcard ketika kartu dipasang, jika tidak /flash).
main.py default yang dikirimkan pada papan yang baru di-flash hanya mengedipkan saluran biru LED RGB pengguna sebagai detak jantung (dua pulsa pendek, jeda pendek), sehingga Anda dapat mengetahui firmware boot dengan bersih tanpa host yang terhubung.
sys.path diperluas untuk menyertakan ketiga sistem file dan subdirektori lib/-nya, sehingga modul yang dapat diimpor dapat berada di /flash/lib, /sdcard/lib, atau /rom/lib.
Untuk memaksa sistem mengabaikan kartu SD yang dimasukkan (misalnya untuk menjalankan main.py flash bahkan dengan kartu yang tersedia), buat file kosong bernama SKIPSD di root /flash.
Saat terhubung melalui USB, sistem file boot (/sdcard jika kartu tersedia, jika tidak /flash) juga dihitung sebagai drive penyimpanan massal USB di host, memungkinkan Anda mengedit boot.py, main.py, dan file lainnya secara langsung. Keluarkan drive sebelum mereset kamera agar host menghapus penulisan cache-nya.
Catatan
Karena OS memperlakukan drive sebagai perangkat blok pasif, file yang dibuat atau dimodifikasi oleh kode yang berjalan di OpenMV Cam tidak akan muncul hingga host me-mount ulang drive tersebut. Jika OS dan OpenMV Cam menulis sistem file yang sama secara bersamaan, OS akan menang dan menimpa perubahan yang dibuat oleh kamera. Gunakan kartu SD untuk data apa pun yang ditulis kembali oleh skrip, dan mount ulang sebelum membaca file-file tersebut dari host.
Catatan
Saluran merah LED RGB pengguna mungkin menyala sebentar saat host membaca atau menulis ke drive penyimpanan massal USB — ini adalah indikator aktivitas yang dikendalikan oleh firmware, bukan kerusakan.
Ukuran penyimpanan¶
M4 dikirimkan dengan:
/flash— sistem file FAT 32 KB, baca/tulis./rom— ROMFS 128 KB yang dipetakan ke memori hanya-baca./sdcard— ukuran penuh dari kartu microSD yang dimasukkan (jika ada), baca/tulis.
Indikator hard-fault¶
Jika LED RGB pengguna bersiklus cepat melalui semua warna — cukup cepat sehingga cenderung terlihat seperti LED putih berkelip daripada warna yang berbeda — firmware telah mengalami hard fault yang tidak dapat dipulihkan. Reflash firmware untuk memulihkan; jika reflashing tidak membantu, papan mungkin rusak secara fisik.
Pustaka perangkat lunak¶
Lihat indeks pustaka untuk daftar lengkap modul — termasuk modul mana yang unik untuk build M4.