OpenMV Cam M4¶
OpenMV Cam M4, 180 MHz hızında çalışan, 256 KB dahili SRAM ve 1 MB dahili flash belleğe sahip STMicroelectronics STM32F427 üzerine kurulu kompakt bir Cortex‑M4 makine görüşü kartıdır. Pakete dahil OV7725 sensörü 320×240 gri tonlama veya RGB565 çerçeveleri yakalar ve 9 pinli kullanıcı başlığı UART, I²C, SPI, CAN, ADC/DAC ve PWM çevre birimlerini dışarı açar.
Not
OV7725, üretim M4 kartlarındaki standart sensördü. M4’ün çok erken varyantları bunun yerine OmniVision OV2640 ile gönderildi — aynı QVGA önizleme hattı, ancak OV2640 ayrıca UXGA (1600×1200) çözünürlüğe kadar JPEG çerçeveleri de yakalayabilir. Her iki sensör de aynı csi — kamera sensörleri API’si üzerinden sürülür.
Eksiksiz veri sayfası, fotoğraflar ve boyutlar için OpenMV Cam M4 ürün sayfasına bakın.
Öne çıkanlar¶
STMicroelectronics STM32F427 180 MHz hızında Cortex‑M4.
256 KB dahili SRAM — harici SDRAM yok.
1 MB dahili flash bellek (harici QSPI flash bellek yok).
OV7725 sensörü (veya çok erken M4 varyantlarında OV2640) — 320×240 8 bit gri tonlama veya RGB565; OV2640 ek olarak UXGA (1600×1200) çözünürlüğe kadar JPEG yakalayabilir.
Tam hızlı USB (12 Mb/s) — ana bilgisayara VCP + USB yığın depolama olarak görünür.
microSD soketi — 2 GB’a kadar SD, 32 GB’a kadar SDHC, 2 TB’a kadar SDXC.
9 G/Ç pini, 3,3 V çıkış ile 5 V toleranslı, pin başına 25 mA (başlık genelinde toplam 120 mA), kesme yeteneğine sahip. P6, ADC veya DAC modunda kullanıldığında 5 V toleranslı değildir.
Düşük ışıklı görüş için aktif aydınlatma sağlayan kullanıcı RGB LED’i ve iki adet yüksek güçlü 850 nm IR LED.
Not
M4’te kart üzerinde güç yönetim çipi yoktur: pil konnektörü, pil şarj cihazı, pil voltajı ADC’si, şarj / güç durumu LED’leri ve donanımsal güç düğmesi bulunmaz. Kartı USB veya VIN üzerinden besleyin.
Pin çıkışı¶
Pin referansı¶
Pin adı |
İşlev |
|---|---|
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 |
kartı sıfırlamak için GND’ye çekin |
BOOT0 |
DFU / ROM önyükleyicisi için güç açılışında 3,3 V’a çekin |
SWCLK |
ARM SWD saati (hata ayıklayıcı erişimi) |
SWDIO |
ARM SWD verisi (hata ayıklayıcı erişimi) |
LED_RED |
RGB LED kırmızı kanalı (aktif düşük) |
LED_GREEN |
RGB LED yeşil kanalı (aktif düşük) |
LED_BLUE |
RGB LED mavi kanalı (aktif düşük) |
LED_IR |
yüksek güçlü IR LED’ler (her iki kanal birlikte sürülür) |
Güç pinleri¶
3.3V — düzenlenmiş 3,3 V hattı. Shield’lar için 250 mA’e kadar mevcuttur (microSD kart kullanımdaysa daha azı). Daha yeni kameraların aksine bu pin çift yönlüdür — aşağıdaki uyarıya bakın.
VIN — 3,6 – 5 V giriş. Kartı kart üzerindeki regülatör aracılığıyla besler.
GND — ortak toprak.
Not
Hem USB hem de VIN mevcut olduğunda, daha yüksek voltaja sahip olan kartı besler — kart üzerindeki diyotlar basitçe daha güçlü hattı seçer.
Uyarı
Kart üzerindeki regülatörden geçmek istemiyorsanız M4’ü doğrudan 3.3V pinine 3,3 V besleyerek çalıştırabilirsiniz. Bu durumda aynı anda ayrıca VIN veya USB gücü uygulamayın — başka bir kaynak aktifken regülatörü geriye doğru sürmek kamerayı kalıcı olarak hasara uğratıp tahrip edebilir.
Tüyo
Belirli bir aktif / derin uyku görev döngüsü için M4’ün bir pil ile ne kadar süre çalışacağını modellemek için pil ömrü tahmin aracını kullanın.
Kurtarma ve hata ayıklama pinleri¶
RESET — kartı sıfırlamak için GND’ye çekin. Bırakıldığında MCU’nun normal şekilde başlamasını sağlar.
BOOT0 — STM32 ROM önyükleyicisine (DFU modu) girmek için kartı beslerken 3,3 V’a çekin. OpenMV IDE, kart üzerindeki önyükleyiciyi yeniden flash’lamak için bu modu kullanır.
SWCLK ve SWDIO, sıradan başlık pinleri olarak dışarı açılır (özel bir SWD konnektörü değil). Kartta hata ayıklamak için RESET, SWCLK, SWDIO, GND ve 3,3 V’ı bir ST‑LINK veya SEGGER J‑Link adaptörüne bağlayın.
Kart üzerindeki çevre birimleri¶
LED’ler¶
M4’te tek bir kullanıcı RGB LED’i ile bir çift yüksek güçlü 850 nm IR LED bulunur:
Kullanıcı RGB LED’i — yazılımla kontrol edilebilir,
LED_RED,LED_GREENveLED_BLUEolarak açığa çıkarılır:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
IR LED’ler — her iki LED de
LED_IRpini üzerinden birlikte sürülür.LED_IRdonanımda aktif yüksek olarak bağlıyken aygıt yazılımı kart üzerindeki diğer her LED’i aktif düşük olarak ele alır, bu yüzdenon()/off()yerine (mantığı tersine çevirirler)low()/high()kullanın:from machine import LED ir = LED("LED_IR") ir.low() # turn IR illumination ON ir.high() # turn IR illumination OFF
Kamera sensörü¶
Pakete dahil sensör (standart kartlarda OV7725, çok erken varyantlarda OV2640) csi — kamera sensörleri modülü üzerinden sürülür:
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()
M4’te sensör karta lehimlenmiştir — değiştirilebilir bir modül üzerinde değildir.
Not
OV7725 kartlarda sensörün FSIN (çerçeve senkronizasyonu) pini MCU’ya bağlıdır ancak buna yönelik aygıt yazılımı desteği henüz eklenmemiştir.
OV2640 kartlarda sensörün STROBE, FREX (çerçeve pozlaması) ve EXPST (pozlama sıfırlama) pinleri MCU’ya bağlıdır ancak bunlara yönelik aygıt yazılımı desteği henüz eklenmemiştir.
Servo başlıkları¶
Kartın arka tarafında, P7 ve P8 için standart 3 pinli servo başlığını (sinyal / VIN / GND) dışarı açan iki adet servo konnektörü lehim pedi bulunur. Sinyal pinleri doğrudan TIM4 kanalları 1 ve 2’ye eşlenir (pyb.Servo tarafından kullanılan kanalların aynısı) ve her başlıktaki V+ pini doğrudan VIN‘e bağlıdır, böylece servolar akımlarını 3,3 V regülatöründen değil giriş hattından çeker.
Pedlere bir çift dik açılı 3 pinli başlık lehimleyin ve bir pan‑and‑tilt montajını sürmek için iki hobi servosu bağlayın:
from pyb import Servo
pan = Servo(1) # P7 — TIM4 CH1
tilt = Servo(2) # P8 — TIM4 CH2
pan.angle(0)
tilt.angle(0)
microSD kart¶
Bir kart takıldığında otomatik olarak /sdcard konumuna bağlanır ve normal dosya sistemi üzerinden kullanılabilir:
import os
for entry in os.listdir("/sdcard"):
print(entry)
Bus referansı¶
GPIO¶
Serigrafi baskılı pinlerin herhangi birini okumak veya sürmek için machine.Pin kullanın. Çıkışlar 3,3 V CMOS’tur, giriş tarafında 5 V toleranslıdır ve pin başına 25 mA’e kadar batırabilir/kaynak sağlayabilir (tüm başlık genelinde toplam 120 mA).
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())
Herhangi bir giriş pini ayrıca kenar geçişlerinde bir kesme tetikleyebilir:
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")
Aynı donanım, başka bir I²C denetleyicisine bir bellek bölgesini açığa çıkarmak için machine.I2CTarget aracılığıyla hedef (slave) modunda da kullanılabilir:
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 ve DAC¶
P6, tek kullanıcı analog pinidir. Hem 12 bit ADC girişi hem de DAC çıkışı olarak kullanılabilir.
ADC — pinde 3,3 V’ta tam ölçek:
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 —
pyb.DACaracılığıyla. 8 bit değer 0–3,3 V aralığını kapsar:from pyb import DAC dac = DAC("P6") voltage = 1.65 dac.write(int(voltage / 3.3 * 255))
ADC veya DAC modunda P6 yalnızca 3,3 V toleranslıdır — ona 5 V vermeyin.
PWM¶
Pin |
Zamanlayıcı / kanal |
|---|---|
P4 |
TIM2 CH3 |
P5 |
TIM2 CH4 |
P6 |
TIM2 CH1 |
P7 |
TIM4 CH1 |
P8 |
TIM4 CH2 |
Not
TIM1, aygıt yazılımı tarafından kamera sensörünün piksel saatini üretmek için ayrılmıştır, bu nedenle P0/P1/P2 üzerinde fiziksel olarak bulunan TIM1 kanalları, kamerayı bozmadan kullanıcı PWM’i için kullanılamaz.
TIM4, pyb.Servo ile paylaşılır — bir servo örneklendirmek tüm zamanlayıcıyı 50 Hz çalışma için yeniden yapılandırır, bu yüzden aynı betikte P7/P8 üzerindeki machine.PWM ile pyb.Servo öğesini karıştırmayın.
Bunların herhangi birini machine.PWM aracılığıyla sürün:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Yazılımla bit‑bang yapılan bus’lar¶
Ekstra bir bus’a ihtiyacınız olursa machine.SoftI2C ve machine.SoftSPI herhangi bir GPIO üzerinde çalışır.
Termal sensör (kart dışı)¶
Aygıt yazılımı, harici olarak bağlanan termal görüntüleyiciler için fir — termal sensör sürücüsü (fir == far infrared) sürücüsünü içerir:
MLX90621 — 16 × 4 IR dizisi
MLX90640 — 32 × 24 IR dizisi
MLX90641 — 16 × 12 IR dizisi
AMG8833 — 8 × 8 IR dizisi
Modülü kartın I²C bus’ına bağlayın ve fir.init() + fir.snapshot() ile çerçeveleri okuyun:
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())
fir sürücüsü sensörle yalnızca I²C 2 üzerinden konuşur — modülü P4 (SCL) ve P5 (SDA) pinlerine bağlayın.
Zamanlama¶
time¶
time modülü engelleyici gecikmeleri, monoton tikleri ve geçen süre ölçümünü kapsar:
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)
Sanal zamanlayıcılar¶
machine.Timer bir donanım zamanlayıcı yuvasını tüketmeden periyodik veya tek seferlik geri çağırmalar zamanlar. Sanal (yazılımsal) bir zamanlayıcı kullanmak için id olarak -1 geçin:
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"))
Periyot değerleri milisaniye cinsindendir. Yuvayı durdurup serbest bırakmak için deinit() çağırın.
Gerçek zamanlı saat¶
machine.RTC sıfırlamalar boyunca duvar saati zamanını korur:
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())
Bekçi köpeği (Watchdog)¶
machine.WDT uygulama askıda kalırsa kartı sıfırlar. Bir kez başlatıldığında durdurulamaz veya yeniden yapılandırılamaz — onu ana döngünüzün içinde periyodik olarak besleyin:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Önyükleme ve çalışma zamanı bilgisi¶
USB önyükleyici penceresi¶
Her güç açılışında kamera, kullanıcının DFU moduna girmek zorunda kalmadan OpenMV IDE’nin aygıt yazılımını güncellemesine olanak tanıyan kısa bir önyükleyici (birkaç saniye) çalıştırır. Pencere sona erdikten sonra önyükleyici denetimi boot.py ve ardından main.py dosyasına devreder.
Çalışan bir betik, machine.bootloader() çağırarak isteğe bağlı olarak önyükleyiciye yeniden girebilir:
import machine
machine.bootloader()
Dosya sistemi ve önyükleme sırası¶
M4 aygıt yazılımı önyüklemede en fazla üç dosya sistemini bağlar:
Dahili flash bellek — her zaman
/flashkonumuna bağlanır. Varsayılan olarakmain.pyveREADME.txtdosyalarını tutar; ilk önyüklemede oluşturulur.microSD kart — bir kart takılıysa
/sdcardkonumuna bağlanır.ROMFS — sıfır kopyalı erişimden faydalanan büyük veri varlıklarını (örneğin yapay zeka modelleri) göndermek için kullanılan,
/romkonumundaki salt okunur, belleğe eşlenmiş dosya sistemi. Herhangi bir kullanıcı Python kodu çalışmadan önce, başlatma sırasında MicroPython tarafından otomatik olarak bağlanır.
Bağlamadan sonra çalışma dizini, kart mevcut olduğunda /sdcard, aksi takdirde /flash olarak ayarlanır. Yorumlayıcı ardından betikleri bu dizinden çalıştırır:
boot.pyher yazılımsal sıfırlamada (soğuk önyükleme, REPL’denCtrl‑Dveya çalışan betik her döndüğünde) çalıştırılır.main.pyyalnızca soğuk önyüklemede,boot.pyhemen ardından çalıştırılır. Sonraki yazılımsal sıfırlamalarboot.pydosyasını yeniden çalıştırır ancak doğrudan REPL’e düşer —main.pydosyasını yeniden çalıştırmak için kartı tamamen sıfırlamanız gerekir.
SD karta bir boot.py veya main.py bırakmak, flash bellekteki kopyaya dokunmadan onu geçersiz kılar — her iki dosya da önyükleme dizininde (kart bağlıyken /sdcard, aksi takdirde /flash) aranır.
Yeni flash’lanmış bir kartla gönderilen varsayılan main.py, yalnızca kullanıcı RGB LED’inin mavi kanalını kalp atışı gibi yanıp söndürür (iki kısa darbe, kısa boşluk), böylece herhangi bir ana bilgisayar bağlı olmadan aygıt yazılımının temiz şekilde önyüklendiğini anlayabilirsiniz.
sys.path, her üç dosya sistemini ve onların lib/ alt dizinlerini içerecek şekilde genişletilir, böylece içe aktarılabilir modüller /flash/lib, /sdcard/lib veya /rom/lib içinde bulunabilir.
Sistemi takılı bir SD kartı yok saymaya zorlamak için (örneğin bir kart mevcut olsa bile flash bellekteki main.py dosyasını çalıştırmak için), /flash kök dizininde SKIPSD adında boş bir dosya oluşturun.
USB üzerinden bağlandığında, önyükleme dosya sistemi (bir kart mevcutsa /sdcard, aksi takdirde /flash) ayrıca ana bilgisayarda bir USB yığın depolama sürücüsü olarak sıralanır ve boot.py, main.py ve diğer dosyaları doğrudan düzenlemenize olanak tanır. Ana bilgisayarın önbelleğe alınmış yazmalarını boşaltması için kamerayı sıfırlamadan önce sürücüyü çıkarın.
Not
İşletim sistemi sürücüyü pasif bir blok aygıtı olarak ele aldığından, OpenMV Cam üzerinde çalışan kod tarafından oluşturulan veya değiştirilen dosyalar, ana bilgisayar sürücüyü yeniden bağlayana kadar görünmez. Hem işletim sistemi hem de OpenMV Cam aynı dosya sistemine aynı anda yazarsa, işletim sistemi kazanır ve kamera tarafından yapılan değişikliklerin üzerine yazar. Betiğin geri yazdığı tüm veriler için SD kartı kullanın ve bu dosyaları ana bilgisayardan okumadan önce yeniden bağlayın.
Not
Ana bilgisayar USB yığın depolama sürücüsünden okuma veya bu sürücüye yazma yaparken kullanıcı RGB LED’inin kırmızı kanalı kısa süreliğine yanabilir — bu, bir arıza değil, aygıt yazılımı tarafından sürülen bir etkinlik göstergesidir.
Depolama boyutları¶
M4 şunlarla gönderilir:
/flash— 32 KB FAT dosya sistemi, okuma/yazma./rom— 128 KB salt okunur belleğe eşlenmiş ROMFS./sdcard— takılı olan microSD kartın tam boyutu (mevcut olduğunda), okuma/yazma.
Donanımsal arıza (hard‑fault) göstergesi¶
Kullanıcı RGB LED’i tüm renkler arasında hızla geçiş yapıyorsa — belirgin tonlardan ziyade parıldayan beyaz bir LED gibi görünecek kadar hızlı — aygıt yazılımı kurtarılamaz bir donanımsal arızaya çarpmış demektir. Kurtarmak için aygıt yazılımını yeniden flash’layın; yeniden flash’lamak yardımcı olmazsa kart fiziksel olarak hasar görmüş olabilir.
Yazılım kütüphaneleri¶
Modüllerin tam listesi için — M4 derlemesine özgü olanlar dahil — kütüphane dizinine bakın.