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.

OpenMV Pure Thermal

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)

OpenMV Pure Thermal pin çıkışı

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_GREEN ve LED_BLUE olarak 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_WHITE donanı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 nedenle on() / off() (mantığı tersine çevirir) yerine low() / 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)
    
  • DACpyb.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 /flash konumuna bağlıdır. Varsayılan olarak main.py ve README.txt dosyalarını tutar; ilk açılışta oluşturulur.

  • microSD kart — bir kart takılıysa /sdcard konumuna 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, /rom konumundaki 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:

  • /flash24 MB FAT dosya sistemi, okuma/yazma.

  • /rom8 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 VBAT olarak 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.