OpenMV Pure Thermal¶
OpenMV Pure Thermal; STMicroelectronics STM32H743 (Cortex‑M7 @ 480 MHz) etrafında inşa edilmiş, 64 MB harici SDRAM, 32 MB QSPI flash bellek, donanımsal bir JPEG kodlayıcı, 4,3” 800×480 IPS kapasitif dokunmatik ekran, bir HDMI çıkışı, bir FLIR® Lepton® termal soketi ve 5MP’lik bir OV5640 görünür ışık kamerası içeren tam sistemli bir termal görüntüleme kartıdır. Ayrıca Wi‑Fi, bir microSD soketi, bir lazer mesafe ölçer, bir buzzer ve yüksek güçlü beyaz bir aydınlatıcı barındırır.
Tam veri sayfası, fotoğraflar ve boyutlar için OpenMV Pure Thermal ürün sayfasına bakın.
Öne çıkan özellikler¶
STMicroelectronics STM32H743XI 480 MHz’de Cortex‑M7.
Donanımsal JPEG kodlayıcı/kod çözücü.
64 MB harici SDRAM (~400 MB/s) artı 1 MB dahili SRAM.
2 MB dahili flash bellek + 32 MB harici QSPI flash bellek (~50 MB/s okuma).
OV5640 5MP rolling‑shutter görünür ışık sensörü.
FLIR® Lepton® soketi — radyometrik veya radyometrik olmayan, piksel başına Celsius derecesi cinsinden sıcaklık veren herhangi bir Lepton 1/2/2.5/3/3.5 modülünü kabul eder.
4,3” 800×480 IPS kapasitif dokunmatik ekran (24‑bit renk @ 60 Hz), 5 noktaya kadar hareket (gesture) desteğiyle.
TFP410 DVI seri dönüştürücü üzerinden HDMI çıkışı — 1280×720 @ 60 Hz’e kadar.
WINC1500 üzerinden Wi‑Fi; RTSP üzerinden MJPEG kutudan çıktığı gibi desteklenir.
Tam hızlı USB‑C (12 Mb/s, 900 mA akım sınırlı) — ana bilgisayara VCP + USB yığın depolama olarak görünür, ayrıca şarjı da yönetir.
microSD soketi — SD 2 GB’a kadar, SDHC 32 GB’a kadar, SDXC 2 TB’a kadar.
VL53L1CX lazer mesafe ölçer (~4 m’ye kadar).
Yazılımdan kontrol edilen ses seviyesi / frekans ile buzzer.
Kullanıcı RGB durum LED’ine ek olarak yüksek güçlü beyaz LED aydınlatıcı.
USB ile 500 mA şarj sağlayan LiPo pil konnektörü.
10 G/Ç pini, 5 V toleranslı, 3,3 V çıkışlı, pin başına 25 mA (toplam 120 mA), kesme yeteneğine sahip. P6, ADC veya DAC modunda kullanıldığında 5 V toleranslı değildir.
ST‑LINK / J‑Link hata ayıklaması için ARM 10 pinli SWD konnektörü.
I²C çevre birimleri için Qwiic konnektörü.
Not
Kartın sol alt kenarında, isteğe bağlı bir ¼”–20 tripod somunu için bir yuva bulunur. Fabrikadan takılı gelmez — kartı standart bir kamera tripoduna monte etmek istiyorsanız yuvaya bir tane lehimleyin.
Pin çıkışı (pinout)¶
Pin referansı¶
Pin adı |
İşlev |
|---|---|
P0 |
UART1 RX / SPI2 MOSI |
P1 |
UART1 TX / SPI2 MISO |
P2 |
SPI2 SCK / FDCAN2 TX |
P3 |
SPI2 NSS (CS) / FDCAN2 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 |
dijital G/Ç |
RESET |
kartı sıfırlamak için GND’ye çekin |
SYN |
çerçeve senkronizasyon pedi (frame‑sync) — bağlı değil |
VIN |
shield VIN pedi — bağlı değil |
BOOT0 |
DFU / ROM önyükleyicisi (bootloader) için güç verilirken 3,3 V’a çekin |
BUZZER |
kart üzerindeki piezo buzzer (TIM2/PWM ile sürülür) |
LED_RED |
RGB durum LED’i kırmızı kanal (aktif düşük) |
LED_GREEN |
RGB durum LED’i yeşil kanal (aktif düşük) |
LED_BLUE |
RGB durum LED’i mavi kanal (aktif düşük) |
LED_WHITE |
yüksek güçlü beyaz aydınlatıcı LED |
Not
Shield/header üzerindeki SYN ve VIN pedlerinin Pure Thermal’da hiçbir elektriksel bağlantısı yoktur — yalnızca header uyumluluğu için oradadırlar. Bunun yerine kartı USB‑C veya kart üzerindeki LiPo pil konnektörü üzerinden besleyin (aşağıdaki Güç pinleri bölümüne bakın). Ayrıca VIN pedinin kart üzerinde VBAT olarak serigrafi baskılandığını unutmayın (bir etiketleme hatası) — konum standart OpenMV‑header VIN pinidir ve her iki durumda da bağlı değildir.
Güç pinleri¶
3.3V — regüle edilmiş 3,3 V hattı. Shield’lar için 250 mA’e kadar mevcuttur.
GND — ortak toprak.
Pure Thermal, USB‑C veya kart üzerindeki LiPo pil konnektörü üzerinden beslenir. USB‑C portu toplamda 900 mA ile akım sınırlıdır ve ayrıca 500 mA‘de LiPo şarjını da yönetir, dolayısıyla USB ile birlikte bir pil takmak desteklenir.
Kart üzerindeki güç düğmesi sistem güç hatlarını açıp kapatır ve kartın USB’den mi yoksa LiPo’dan mı beslendiğine bakılmaksızın çalışır. Durumu değiştirmek için düğmeyi birkaç saniye basılı tutun — kazara kapanmayı önlemek için hızlı bir dokunuş yok sayılır.
Kaynak seçimi iki basit kurala uyar:
Pil yalnızca gerilimi 3 V’un üzerindeyken kartı besler. Bu eşiğin altında kart üzerindeki PMIC, aşırı deşarjdan korumak için pili devre dışı bırakır.
USB mevcut olduğunda, kartı USB besler ve takılı LiPo arka planda şarj olur.
LiPo konnektörü ayrıca ters gerilim korumasına da sahiptir, bu nedenle pili ters takmak karta zarar vermez.
Not
Kart ayrıca pil gerilimi ve bir pil akımı algılama sinyalini MCU ADC kanallarına geri yönlendirir, ancak bunların hiçbiri için aygıt yazılımı (firmware) desteği henüz eklenmemiştir.
Kurtarma ve hata ayıklama pinleri¶
RESET — kartı sıfırlamak için GND’ye çekin. Pure Thermal’da ayrıca aynı işi yapan, karta özel bir RESET düğmesi de bulunur.
BOOT0 — STM32 ROM önyükleyicisine (DFU modu) girmek için karta güç verilirken 3,3 V’a çekin. OpenMV IDE, kart üzerindeki önyükleyiciyi yeniden flash’lamak için bu modu kullanır. Kart üzerindeki özel bir BOOT0 düğmesi de aynı işi yapar — güç verilirken basılı tutun.
Kart, GPIO header’ının yanında, ST‑LINK ve SEGGER J‑Link adaptörleriyle uyumlu bir SWD hata ayıklama header’ı (RST / SWCLK / SWDIO / SWO) sunar. Ayrıca ayrı bir ARM 10 pinli SWD konnektörü de takılıdır — aynı SWD sinyallerini taşır (tam JTAG yok) ancak standart 0,05” 10 pinli form faktöründe.
Not
SWO iz (trace) pini, kart üzerindeki FLIR® Lepton®’un SPI saatiyle paylaşılır. SWO, Lepton ile aynı anda kullanılamaz — birini veya diğerini seçin.
Kart üzerinde üçüncü bir PURE Modules Debug konnektörü takılıdır. Yardımcı modüller takmak için hata ayıklamaya yönelik birkaç sinyali (SWCLK, SWDIO, RST, SPI2_MISO, SPI2_MOSI, VBUS, 3,3 V, GND ve iki GPIO pini) dışarı çıkarır. Bu konnektördeki iki GPIO pini, bir donanım çevre birimi yerine dahili bir bit‑banged I²C veri yolu tarafından sürülür.
Üç hata ayıklama konnektörünün tümü (satır içi SWD header’ı, ARM 10 pinli SWD konnektörü ve PURE Modules Debug konnektörü) 3,3 V‘a referanslıdır — bağlantı yapmadan önce hata ayıklama adaptörünüzün 3,3 V mantık için yapılandırıldığından emin olun.
Kart üzerindeki çevre birimleri¶
LED’ler¶
Pure Thermal’da kart üzerinde üç LED bulunur:
Kullanıcı RGB LED’i — yazılımdan kontrol edilebilir,
LED_RED,LED_GREENveLED_BLUEolarak sunulur:from machine import LED LED("LED_RED").on() LED("LED_GREEN").on() LED("LED_BLUE").on()
Beyaz aydınlatıcı —
LED_WHITEüzerinden sürülür.LED_WHITEdonanımda aktif yüksek olarak bağlanmıştır, oysa aygıt yazılımı diğer tüm kart üzeri LED’leri aktif düşük olarak ele alır, bu nedenleon()/off()(mantığı tersine çevirir) yerinelow()/high()kullanın:from machine import LED light = LED("LED_WHITE") light.low() # turn the white LED ON light.high() # turn the white LED OFF
Şarj LED’i — doğrudan kart üzerindeki güç yönetimi donanımı tarafından sürülür, yazılım kontrolü yoktur. Sistem güç hatları açık veya kapalı olsun (yani güç düğmesi her iki konumdayken de) çalışır.
Renk
Anlamı
Mavi
şarj oluyor — errata’ya bakın: şarj tamamlandığında kapanmayabilir
Yeşil
şarj tamamlandı — errata’ya bakın: güvenilir şekilde tetiklenmeyebilir
Kırmızı
düşük pil (≤ 3,2 V, yalnızca aktif olarak şarj olmadığında)
Buzzer¶
Kart üzerindeki piezo buzzer bir zamanlayıcı kanalına bağlanmıştır — yazılımdan kontrol edilen frekans (perde) ve görev döngüsü (ses seviyesi) ile tonlar için onu machine.PWM ile sürün:
import time
from machine import Pin, PWM
beep = PWM(Pin("BUZZER"), freq=2_000, duty_u16=32768) # ~50% duty
time.sleep_ms(500) # sound for 0.5 s
beep.deinit()
Kamera sensörü¶
OV5640, Pure Thermal’daki birincil CSI’dır — onu açıkça adreslemek için cid=csi.OV5640 geçirin:
import csi
cam = csi.CSI(cid=csi.OV5640)
cam.reset(hard=True)
cam.pixformat(csi.RGB565)
cam.framesize(csi.WVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
OV5640, kart üzerinde bir JPEG sıkıştırıcıya sahiptir. csi.CSI.pixformat‘ı csi.JPEG olarak ayarlayın; sensör sıkıştırılmış çerçeveleri kamera veri yolu üzerinden doğrudan kameraya iletir, bu da yüksek çözünürlüklü yakalamaları pratik hale getirir: csi.HD (1280×720), csi.FHD (1920×1080) ve tam 5MP csi.WQXGA2 (2592×1944) hepsi JPEG olarak akış sağlar. Sıkıştırmayı csi.CSI.quality (0-100, daha yüksek = daha büyük çerçeveler, daha fazla ayrıntı) ile ayarlayın:
cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)
OV5640, ses bobini aktüatörlü (voice‑coil) bir otomatik odaklama lensine sahiptir. csi.IOCTL_TRIGGER_AUTO_FOCUS ile csi.CSI.ioctl aracılığıyla tek bir otomatik odaklama geçişini tetikleyin — sensör odaklama motorunu bir kez tarar ve önündeki neyse ona kilitlenir:
cam.ioctl(csi.IOCTL_TRIGGER_AUTO_FOCUS)
Sahne her değiştiğinde ioctl’i yeniden çağırın — otomatik odaklama sürekli değil, tek seferliktir.
Not
OV5640’ın STROBE çıkışı (senkronize flaş / IR aydınlatması için kullanılır) Pure Thermal’da MCU’ya bağlanmıştır, ancak bunun için aygıt yazılımı desteği henüz eklenmemiştir.
Termal Kamera Sensörü¶
FLIR® Lepton® soketi, aynı csi — kamera sensörleri API’sinde ikinci bir CSI olarak görünür. Onu adreslemek için cid=csi.LEPTON geçirin ve donanım sıfırlamasını atlayın:
import csi
lepton = csi.CSI(cid=csi.LEPTON)
lepton.reset(hard=False)
lepton.pixformat(csi.GRAYSCALE)
lepton.framesize(csi.QVGA)
while True:
img = lepton.snapshot()
Not
Lepton’un VSYNC çıkışı (termal çerçeve başına bir darbe) Pure Thermal’da MCU’ya bağlanmıştır, ancak bunun için aygıt yazılımı desteği henüz eklenmemiştir.
Her iki CSI de yan yana çalışabilir. Aşağıdaki örnek, OV5640’tan renkli bir çerçeve ve Lepton’dan termal bir çerçeve çeker, ardından bir Ironbow paleti ve düşük yoğunlukta saydamlığa kaybolan bir alfa maskesi kullanarak Lepton’u renkli çerçevenin üzerine bindirir:
import csi
import image
import math
alpha_pal = image.Image(256, 1, image.GRAYSCALE)
for i in range(256):
alpha_pal[i] = int(math.pow((i / 255), 2) * 255)
csi0 = csi.CSI()
csi0.reset(hard=True)
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.WVGA)
csi1 = csi.CSI(cid=csi.LEPTON)
csi1.reset(hard=False)
csi1.pixformat(csi.GRAYSCALE)
csi1.framesize(csi.QVGA)
img1 = image.Image(csi1.width(), csi1.height(), csi1.pixformat())
while True:
img0 = csi0.snapshot()
csi1.snapshot(blocking=False, image=img1)
img0.draw_image(
img1, 0, 0,
color_palette=image.PALETTE_IRONBOW,
alpha_palette=alpha_pal,
hint=image.BILINEAR,
)
Makine öğrenmesi¶
ml — Makine Öğrenmesi, Cortex‑M7 üzerinde CMSIS‑NN çekirdekleriyle nicemlenmiş (quantised) TFLite modelleri çalıştırır — saniyede birkaç çerçeve hızında kompakt tespit ediciler için yeterince hızlıdır. Salt okunur /rom dosya sistemindeki modeller, RAM’e kopyalanmadan doğrudan flash bellekten yüklenir. İşte görünür ışık kamerasından gelen her çerçeveye, tespit edilen yüzü ve onun altı yer işaretini bindiren 128×128’lik bir BlazeFace tespit edici:
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
# Load built-in face detection model
model = ml.Model("/rom/blazeface_front_128.tflite", postprocess=BlazeFace(threshold=0.4))
print(model)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# faces is a list of ((x, y, w, h), score, keypoints) tuples
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
# keypoints is a ndarray of shape (6, 2)
# 0 - right eye (x, y)
# 1 - left eye (x, y)
# 2 - nose (x, y)
# 3 - mouth (x, y)
# 4 - right ear (x, y)
# 5 - left ear (x, y)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
Lazer mesafe ölçer¶
Kart üzerindeki ST VL53L1CX uçuş zamanı (time‑of‑flight) mesafe ölçeri I²C veri yolu 2‘ye bağlıdır. ~4 m’ye kadar mesafe okumaları almak için dondurulmuş vl53l1x — VL53L1X ToF mesafe sensörü sürücüsü sürücüsünü kullanın:
import time
from machine import I2C
import vl53l1x
bus = I2C(2)
tof = vl53l1x.VL53L1X(bus)
while True:
print("Distance:", tof.read(), "mm")
time.sleep_ms(100)
LCD çıkışı¶
4,3” kart üzeri LCD 800 × 480 (WVGA) çözünürlüğündedir ve display — ekran sürücüsü modülünün RGB ekran arabirimi üzerinden sürülür — yerel çözünürlüğüyle eşleşmesi için framesize=display.FWVGA geçirin:
import display
lcd = display.RGBDisplay(framesize=display.FWVGA, refresh=60)
lcd.backlight(True) # turn the LCD backlight on
lcd.write(img)
Arka aydınlatma bir GPIO’ya bağlıdır, dolayısıyla backlight(), True / False (veya 0–100 arası herhangi bir değer, 0 kapalı ve sıfır olmayan herhangi bir şey açık) kabul eder:
lcd.backlight(False) # turn the backlight off
lcd.backlight(True) # back on
Dokunmatik ekran¶
Kapasitif dokunmatik denetleyicisi FT5X06’dır; çoklu dokunuş konumları ve hareket olayları ft5x06 — Dokunmatik Ekran Sürücüsü üzerinden sunulur. Dokunuşlara tepki vermek için bir geri çağırma (callback) kaydedin ve aktif noktaları içinde okuyun:
import ft5x06
touch = ft5x06.FT5X06()
def on_touch(n):
for i in range(n):
x = touch.get_point_x(i)
y = touch.get_point_y(i)
print("touch", i, "at", x, y)
gesture = touch.get_gesture()
if gesture != ft5x06.GESTURE_NONE:
print("gesture:", gesture)
touch.touch_callback(on_touch)
HDMI çıkışı¶
Aygıt yazılımı ayrıca LCD çerçeve arabelleğini kart üzerindeki tfp410 — DVI/HDMI Denetleyicisi HDMI seri dönüştürücüsüne dağıtır, böylece harici bir monitör LCD’dekini yansıtır. HDMI çıkışını etkinleştirmek için tfp410.TFP410 örneği oluşturun:
import tfp410
hdmi = tfp410.TFP410()
Yalnızca HDMI çıkışı istiyorsanız ve kart üzeri LCD’yi umursamıyorsanız, arka aydınlatmayı kapatın ve çerçeve arabelleği çözünürlüğünü WVGA’nın üzerine çıkarın. TFP410 1280×720 @ 60 Hz‘e kadar destekler, örneğin:
lcd = display.RGBDisplay(framesize=display.HD, refresh=60)
lcd.backlight(False) # the on‑board LCD can't render HD
hdmi = tfp410.TFP410()
Kart üzerindeki panel 800×480’de sabittir, dolayısıyla WVGA’nın üzerindeki herhangi bir şey yalnızca harici HDMI monitöründe anlamlıdır.
Bir HDMI monitörünün ne zaman takıldığını veya çıkarıldığını bilmek için TFP410 üzerine bir sıcak takma (hot‑plug) geri çağırması kaydedin. Geri çağırma takıldığında True ve çıkarıldığında False ile tetiklenir:
def on_hotplug(connected):
print("HDMI", "connected" if connected else "disconnected")
hdmi.hotplug_callback(on_hotplug)
Bağlantı durumunu istediğiniz zaman isconnected() ile de yoklayabilirsiniz (yalnızca kayıtlı bir geri çağırma olmadığında).
HDMI portu ayrıca class DisplayData – Ekran Verisi sınıfı üzerinden sunulan DDC (ekran verisi) ve CEC (tüketici elektroniği kontrolü) kanallarını da taşır. Onu, takılı monitörün EDID bloğunu okumak için (böylece yerel çözünürlüğüne / yenileme hızına uyum sağlayabilirsiniz) veya aynı kablodaki diğer HDMI cihazlarını kontrol etmek üzere CEC çerçeveleri göndermek/almak için kullanın:
from display import DisplayData
dd = DisplayData(cec=True, ddc=True)
edid = dd.display_id() # EDID bytes from the monitor
print(len(edid), "byte EDID")
# Send a CEC "image view on" command (opcode 0x04) from address 1 to address 0
dd.send_frame(0, 1, b"\x04")
# ...or wait for an incoming CEC frame addressed to us (logical address 1)
src, data = dd.receive_frame(1, timeout=5_000)
print("CEC from", src, ":", data)
Wi‑Fi¶
Wi‑Fi, class WINC – WiFi shield sürücüsü arabirimi üzerinden sunulan bir Microchip WINC1500 modülü üzerinden çalışır:
import network, time
wlan = network.WINC()
wlan.connect("ssid", "password")
while not wlan.isconnected():
time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])
Not
Parça kıtlığı nedeniyle, bazı Pure Thermal birimleri WINC1500 modülü takılmadan sevk edildi. network.WINC bir hata verirse veya hiç bağlanmazsa, kartta eksik bir Wi‑Fi modülü olup olmadığını kontrol edin — kameranın geri kalanı onsuz da tamamen aynı şekilde çalışır.
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)
Veri yolu referansı¶
GPIO¶
Serigrafi baskılı pinlerden 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 (tüm header genelinde toplam 120 mA) çekebilir/sağlayabilir.
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¶
Veri yolu |
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¶
Veri yolu |
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")
Aynı donanım, başka bir I²C denetleyicisine bir bellek bölgesi sunmak için machine.I2CTarget üzerinden hedef (slave) modunda da kullanılabilir:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
Kart üzerindeki Qwiic konnektörü, tak‑çalıştır modüller için bu I²C veri yollarından birini dışarı çıkarır. Qwiic hattı, açık drenajlı (open‑drain) transistörler aracılığıyla 5 V’a seviye dönüştürülür, dolayısıyla veri yolu yalnızca standart mod (100 kHz) ve hızlı mod (400 kHz) ile sınırlıdır — Qwiic header’ı üzerinden fast‑mode‑plus veya daha yüksek hızları çalıştırmaya kalkışmayın.
Qwiic konnektörü, takılı modülleri beslemek için 5 V çıkışı verir; Pure Thermal’ın kendisini beslemek için kullanılamaz — bunun yerine kartı USB‑C veya LiPo pil konnektörü üzerinden besleyin.
SPI¶
Veri yolu |
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 (FDCAN)¶
Veri yolu |
TX |
RX |
|---|---|---|
FDCAN2 |
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.DACüzerinden. 8‑bit değer 0–3,3 V’u 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, dolayısıyla 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 örneği oluşturmak tüm zamanlayıcıyı 50 Hz çalışma için yeniden yapılandırır, bu nedenle aynı betikte P7/P8 üzerindeki machine.PWM‘i pyb.Servo ile karıştırmayın.
Bunlardan herhangi birini machine.PWM üzerinden sürün:
from machine import Pin, PWM
pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)
Yazılımsal bit‑banged veri yolları¶
Ekstra bir veri yoluna ihtiyacınız varsa machine.SoftI2C ve machine.SoftSPI herhangi bir GPIO üzerinde çalışır.
Termal sensör (kart dışı)¶
Kart üzerindeki FLIR Lepton’a ek olarak, aygıt yazılımı harici olarak bağlanan I²C termal görüntüleyiciler için fir — termal sensör sürücüsü (fir == far infrared) sürücüsünü de 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 veri yoluna 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)’ya bağlayın.
Zamanlama¶
time¶
import time
time.sleep(1)
time.sleep_ms(500)
time.sleep_us(10)
start = time.ticks_ms()
elapsed = time.ticks_diff(time.ticks_ms(), start)
Sanal zamanlayıcılar¶
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ı durdurmak ve serbest bırakmak için deinit() çağırın.
Gerçek zamanlı saat¶
from machine import RTC
rtc = RTC()
rtc.datetime((2026, 4, 30, 4, 12, 0, 0, 0))
print(rtc.datetime())
Bir LiPo pil bağlıysa, RTC sistem güç hatları kapalıyken bile (kart üzerindeki güç düğmesiyle kapatılmış) zamanı tutar. Yalnızca USB takılıyken güç düğmesine basmak RTC’nin de gücünü keser — dolayısıyla pil takılı olmadan duvar saati zamanı bir güç döngüsünden sağ çıkmaz.
Bekçi köpeği (Watchdog)¶
from machine import WDT
wdt = WDT(timeout=5_000)
while True:
# ...do work...
wdt.feed()
Önyükleme ve çalışma zamanı bilgileri¶
USB önyükleyici penceresi¶
Her açılışta kamera, kullanıcının DFU moduna girmesine gerek 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 süresi dolduktan sonra önyükleyici denetimi boot.py‘ye ve ardından main.py‘ye devreder.
Çalışan bir betik, machine.bootloader() çağırarak isteğe bağlı olarak önyükleyiciye yeniden girebilir.
Dosya sistemi ve önyükleme sırası¶
Pure Thermal aygıt yazılımı, önyüklemede en fazla üç dosya sistemini bağlar:
Dahili flash bellek — her zaman
/flashkonumuna bağlıdır. Varsayılan olarakmain.pyveREADME.txtdosyalarını tutar; ilk açılışta oluşturulur.microSD kart — bir kart takılıysa
/sdcardkonumuna bağlanır.ROMFS — sıfır kopya (zero‑copy) erişimden yararlanan büyük veri varlıklarını (örneğin AI modelleri) sevk etmek için kullanılan,
/romkonumundaki salt okunur, belleğe eşlenmiş dosya sistemi. MicroPython tarafından başlangıçta, herhangi bir kullanıcı Python’u çalışmadan önce otomatik olarak bağlanır.
Bağlandıktan sonra, kart mevcutsa çalışma dizini /sdcard, aksi takdirde /flash olarak ayarlanır. Yorumlayıcı daha sonra betikleri o dizinden çalıştırır:
boot.py, her yazılımsal sıfırlamada yürütülür.main.py,boot.py‘den hemen sonra yalnızca soğuk önyüklemede yürütülür.
SD karta bir boot.py veya main.py bırakmak, flash bellekteki kopyaya dokunmadan onu geçersiz kılar.
USB üzerinden bağlandığında, önyükleme dosya sistemi (bir kart mevcutsa /sdcard, aksi takdirde /flash) ana bilgisayarda bir USB yığın depolama sürücüsü olarak da numaralandırılı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
OpenMV Cam üzerinde çalışan kod tarafından oluşturulan veya değiştirilen dosyalar, sürücü yeniden bağlanana kadar ana bilgisayarda görünmez. Betiğin geri yazdığı herhangi bir veri için SD kartı kullanın ve bu dosyaları ana bilgisayardan okumadan önce yeniden bağlayın.
Depolama boyutları¶
Pure Thermal şunlarla birlikte gelir:
/flash— 24 MB FAT dosya sistemi, okuma/yazma./rom— 8 MB salt okunur, belleğe eşlenmiş ROMFS; sıfır kopya mmap erişiminden yararlanan betikleri ve ML modellerini sevk etmek için kullanılır./sdcard— takılı olan microSD kartın tam boyutu (mevcut olduğunda), okuma/yazma.
Donanımsal hata (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ım hatasına (hard fault) takılmış demektir. Kurtarmak için aygıt yazılımını yeniden flash’layın.
Donanım errata’sı¶
Birkaç kart düzeyi tuhaflık Pure Thermal donanım errata’sında belgelenmiştir. Dikkat edilmesi gereken başlıca maddeler:
Pil konnektörü girişimi — PCB üzerindeki bileşenler doğrudan LiPo pil konnektörünün altında bulunur ve pil kablosunun fişindeki çıkıntılı kama, kablo çıkarılırken bunlara takılabilir, bazen karttan parçaları söker. İlk kullanımdan önce kablo fişindeki kamayı yan keskiyle kesip alın.
Kart kapalıyken RTC durur — 32 kHz kristaldeki (Y2) yük kapasitansı çok yüksektir. C96 ve C97’yi (STM32’nin yanındaki kristali çevreleyen çift) çıkarmak, RTC’nin yedek güçte çalışmaya devam etmesini sağlar. Çoğu kart bu kapasitörler zaten çıkarılmış olarak sevk edilir; RTC’niz fişten çekildiğinde zamanı kaybediyorsa bu konumları kontrol edin. Tam tartışma için #1536 ve #1600 GitHub sorunlarına bakın.
Şarj gösterge LED’i mavi kalıyor — şarj cihazı, göstergeyi maviden (şarj oluyor) yeşile (şarjlı) çevirmeden 4,15 V ile 4,19 V arasında herhangi bir yerde şarj döngüsünü sonlandırabilir. Bu durumda pil yine de tam şarjlıdır; LED’e değil, bir gerilim ölçümüne güvenin.
Serigrafi VIN’i VBAT olarak yanlış etiketliyor — standart OpenMV‑header VIN konumundaki ped, Pure Thermal’da
VBATolarak serigrafi baskılanmıştır. Etiket yanlıştır, ancak pratikte önemi yoktur çünkü pedin her iki durumda da hiçbir elektriksel bağlantısı yoktur.
Yazılım kütüphaneleri¶
Modüllerin tam listesi için — Pure Thermal yapısına özgü olanlar dahil — kütüphane dizinine bakın.