Arduino Portenta H7

Arduino Portenta H7 je industrijska razvojna ploča dimenzija 66 × 25 mm izgrađena oko STMicroelectronics STM32H747XI — dvojezgrenog SoC-a koji kombinira Cortex‑M7 na 400 MHz s Cortex‑M4 na 200 MHz. OpenMV ugrađeni program (firmware) izvodi se u potpunosti na jezgri M7 i osmišljen je za uporabu s Portenta Vision Shield štitom (Ethernet ili LoRa izdanje), koji osnovnoj ploči Portenta H7 dodaje Himax HM01B0 / HM0360 kameru, dva PDM mikrofona i microSD utor.

Arduino Portenta H7

Za potpunu tehničku dokumentaciju, fotografije i dimenzije pogledajte stranicu proizvoda Arduino Portenta H7.

Istaknute značajke

  • STMicroelectronics STM32H747XI dvojni Cortex‑M7 (400 MHz) + Cortex‑M4 (200 MHz). OpenMV ugrađeni program (firmware) izvodi se samo na jezgri M7; jezgra M4 izložena je putem openamp za međuprocesorsku komunikaciju.

  • 8 MB vanjske SDRAM memorije uz 2 MB interne flash memorije i 16 MB vanjske QSPI flash memorije.

  • Hardverski JPEG koder/dekoder.

  • Wi‑Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 putem modula Murata 1DX (CYW4343W) — povezuje se na priloženu antenu putem ugrađenog U.FL konektora.

  • Brzi USB‑C (480 Mb/s).

  • 22 korisnička I/O pina na gornjim priključcima u stilu Arduino MKR — D0–D14 (digitalni) plus A0–A6 (analogni).

  • Dva 80‑pinska konektora visoke gustoće na donjoj strani izlažu cijelu strukturu STM32H747 — DCMI, DSI, Ethernet RMII, FDCAN, SDIO, SAI/I²S, UART-e, dodatne SPI/I²C/mjerače vremena i tako dalje. Štitovi poput Vision Shielda spajaju se na te konektore.

  • JTAG / SWD izveden na donjim HD konektorima za napredno otklanjanje pogrešaka.

  • Podrška za bateriju — JST konektor za 3,7 V Li‑Po uz ugrađeni punjač i nadzornik baterije.

Raspored pinova

Raspored pinova Arduino Portenta H7

Referenca pinova

22 korisnička pina izložena su na gornjim rubnim priključcima u stilu Arduino MKR — 15 digitalnih (D0-D14) plus 7 analognih (A0-A6). Mnogo više SoC pinova dostupno je putem donjih 80‑pinskih konektora visoke gustoće za rad sa štitovima; pogledajte Arduinov potpuni PDF s rasporedom pinova za to mapiranje.

Naziv pina

Referenca

Funkcija

D0

3.3 V

TIM8 CH3N

D1

3.3 V

TIM1 CH1 / SPI5 NSS

D2

3.3 V

TIM1 CH2 / SPI5 MISO

D3

3.3 V

GPIO

D4

3.3 V

TIM3 CH2 / TIM8 CH2 / USART6 RX

D5

3.3 V

TIM3 CH1 / TIM8 CH1 / USART6 TX

D6

3.3 V

TIM1 CH1 / I2C3 SCL

D7

3.3 V

TIM5 CH4 / SPI2 NSS

D8

3.3 V

SPI2 MOSI (dijeljeno s A3 / A5)

D9

3.3 V

SPI2 SCK

D10

3.3 V

SPI2 MISO (dijeljeno s A2 / A4)

D11

3.3 V

I2C3 SDA

D12

3.3 V

I2C3 SCL

D13

3.3 V

USART1 RX / TIM1 CH3

D14

3.3 V

USART1 TX / TIM1 CH2

A0

3.3 V

ADC12 IN0 (samo analogno)

A1

3.3 V

ADC12 IN1 (samo analogno)

A2

3.3 V

ADC123 IN12 (samo analogno; dijeljeno s D10)

A3

3.3 V

ADC12 IN13 (samo analogno; dijeljeno s D8)

A4

3.3 V

ADC123 IN12 (dijeljeno s D10)

A5

3.3 V

ADC12 IN13 (dijeljeno s D8)

A6

3.3 V

DAC1 OUT1 / ADC12 IN18

A7

3.3 V

TIM3 CH1 / ADC12 IN3 (nije izloženo na priključcima)

D20

3.3 V

alias za D8 / A3 / A5

D21

3.3 V

alias za A6 — DAC1 OUT1

RESET

3.3 V

pritisnite ugrađeni prekidač ili spojite na GND za resetiranje

LED_RED

3.3 V

crveni kanal RGB LED-a (aktivan na niskoj razini)

LED_GREEN

3.3 V

zeleni kanal RGB LED-a (aktivan na niskoj razini)

LED_BLUE

3.3 V

plavi kanal RGB LED-a (aktivan na niskoj razini)

Napomena

A0-A3 su isključivo analogne površine na STM32H747 bez GPIO funkcije — tretirajte ih samo kao ADC ulaze. A2/A4 i A3/A5 dijele svoje fizičke pinove s D10 odnosno D8, pa na njima ne možete pokretati PWM ili SPI dok ih očitavate kao analogne. A7 se nalazi na donjim HD konektorima.

Pinovi napajanja

Pinovi MKR priključka:

  • VIN — glavna sustavska sabirnica prema ugrađenom PMIC-u. Napaja se putem diode iz sabirnice +5V, MKR pina VIN ili donjih 80‑pinskih HD konektora.

  • +5V — sabirnica od 5 V napajana iz USB-a, ESLOV konektora ili samog MKR pina +5V.

  • +3V3 — glavna sabirnica od 3,3 V (izlaz prekidačkog regulatora PMIC-a).

  • AREF — analogna naponska referenca za ADC pinove. Zadano 3,3 V; pokrenite je izvana za uporabu drukčije reference.

  • GND — zajednička masa.

Ulaz za bateriju:

  • Li‑Po JST na prednjoj strani ploče prihvaća 3,7 V Li‑Po ćeliju. PMIC je puni kad god je prisutan +5V ili VIN.

Portenta H7 može se napajati putem bilo kojeg od ovih puteva:

  • USB‑C — dovodi 5 V ugrađenom PMIC-u.

  • ESLOV konektor — do 5 V na VESLOV (vidi ESLOV konektor).

  • VIN pin — izravno dovedite regulirano napajanje od 5 V.

  • Li‑Po baterija — spojite na JST na prednjoj strani.

ESLOV konektor

Na bočnoj strani ploče nalazi se 5‑pinski ESLOV konektor bez lemljenja:

Pin

Naziv

Funkcija

1

VESLOV

izlaz napajanja od 5 V (ista sabirnica kao +5V na MKR priključku)

2

INT

ulaz vanjskog prekida na D7

3

SCL_EXT

dijeljeno s površinom D12 na MKR priključku — ista I²C 3 sabirnica kao i korisnički priključak

4

SDA_EXT

dijeljeno s površinom D11 na MKR priključku — ista I²C 3 sabirnica kao i korisnički priključak

5

GND

zajednička masa

ESLOV-ovi SCL_EXT/SDA_EXT i D12/D11 na MKR priključku isti su pinovi — jedna I²C 3 sabirnica izložena na dva konektora.

Savjet

Upotrijebite procjenitelj trajanja baterije za modeliranje koliko će dugo Portenta H7 raditi na bateriji za zadani omjer aktivnog rada i dubokog mirovanja.

Pinovi za oporavak i otklanjanje pogrešaka

  • RESET — i izloženi pin na gornjem priključku i trenutačni prekidač na bočnoj strani ploče, povezani s NRST linijom SoC-a. Spojite na GND ili pritisnite gumb za resetiranje.

Portenta H7 koristi Arduinov standardni dvostruki dodir za reset za ulazak u Arduinov pokretač (bootloader). Brzo dvaput pritisnite gumb za reset — ploča se ponovno prijavljuje putem USB-a kao DFU uređaj, a OpenMV IDE može učitati novu sliku ugrađenog programa (firmware).

STM32 SWD signali izloženi su na donjem HD konektoru J1:

  • J1‑73 — NRST

  • J1‑75 — SWDIO (PA13)

  • J1‑77 — SWCLK (PA14)

  • J1‑79 — SWO (PB3)

Spojite ih putem Portenta Breakouta, službenog Arduino adaptera za otklanjanje pogrešaka ili prilagođenog nosača s priključkom razmaka 1,27 mm. Svi signali za otklanjanje pogrešaka referencirani su na 3,3 V.

Napomena

Kad je priključen Portenta Vision Shield, isti SWD/JTAG signali usmjereni su na standardni 20‑pinski ARM Cortex Debug JTAG priključak na štitu (razmak 1,27 mm / 0,05″).

Ugrađene periferije

LED diode

Portenta H7 ima jedan korisnički RGB LED, programski upravljiv putem machine.LED

from machine import LED

LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()

Zasebni narančasti LED za punjenje pokraj JST-a baterije svijetli kad ugrađeni punjač dovodi struju u spojeni Li‑Po; njime se ne može korisnički upravljati.

Senzor kamere (Vision Shield)

Kad je priključen Portenta Vision Shield (Ethernet ili LoRa izdanje), Himax senzorom se upravlja putem modula csi — senzori kamere

import csi

cam = csi.CSI()
cam.reset()
cam.pixformat(csi.GRAYSCALE)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000)       # let auto‑exposure settle

while True:
    img = cam.snapshot()

Podržane su dvije revizije Vision Shielda:

  • HM01B0 — 320 × 320 monokromatski.

  • HM0360 — 640 × 480 monokromatski.

Upozorenje

Dok je kamera Vision Shielda inicijalizirana, sljedeće pinove MKR priključka preuzima ugrađeni program (firmware) i ne mogu se koristiti:

MKR pin

Razlog

D1

TIM1 CH1 — glavni takt kamere

D6

TIM1 CH1 (alt) — glavni takt kamere

D11

I²C 3 SDA — dijeljeno s kamerom; sabirnica je upotrebljiva, ali izbjegavajte I²C adresu senzora (0x24)

D12

I²C 3 SCL — dijeljeno s kamerom; sabirnica je upotrebljiva, ali izbjegavajte I²C adresu senzora (0x24)

A6 / D21

DCMI HSYNC — također onemogućuje DAC

A7

DCMI PXCLK

Strojno učenje

ml — Strojno učenje izvodi kvantizirane TFLite modele na Cortex‑M7 s CMSIS‑NN jezgrama — dovoljno brzo za kompaktne detektore pri nekoliko sličica u sekundi. Modeli na datotečnom sustavu samo za čitanje /rom učitavaju se izravno iz flash memorije bez kopiranja u RAM. Evo 128×128 BlazeFace detektora koji preklapa otkriveno lice i njegovih šest orijentira na svaku sličicu iz kamere Vision Shielda:

import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace

# Initialize the sensor.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
csi0.window((240, 240))

# 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)
        ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))

    print(clock.fps(), "fps")

Jezgra M4

Jezgra Cortex‑M4 izložena je putem openamp za međuprocesorsku komunikaciju. OpenMV ugrađeni program (firmware) izvodi se samo na M7; M4 nema vlastito MicroPython izvršno okruženje, pa njegova uporaba znači izgradnju zasebne C slike ugrađenog programa i njezino učitavanje iz datotečnog sustava putem openamp.RemoteProc. Unaprijed izgrađeni primjer ugrađenog programa koji implementira virtualnu UART krajnju točku dostupan je u repozitoriju openamp_vuart — slijedite njegov README za izgradnju vuart.elf

import openamp
import time

def ept_recv_callback(src_addr, data):
    print("Received:", data.decode())

ept = openamp.Endpoint("vuart-channel", callback=ept_recv_callback)

rproc = openamp.RemoteProc("vuart.elf")
rproc.start()

count = 0
while True:
    if ept.is_ready():
        ept.send("Hello World %d!" % count, timeout=1000)
        count += 1
    time.sleep_ms(1000)

U praksi je ovu podršku najbolje tretirati kao demonstraciju openamp sučelja, a ne kao funkcionalnu dvojezgrenu platformu — M4 se ne može resetirati neovisno o M7, pa zaustavljanje M4 prisiljava potpuno ponovno pokretanje sustava.

Mikrofon (Vision Shield)

Vision Shield nosi dva PDM mikrofona koji se snimaju putem audio — Audio modul preko SAI4 periferije STM32-a. Svaki međuspremnik stiže kao predznakovni 16‑bitni PCM bytearray, spreman za prosljeđivanje u ulab/numpy za DSP — na primjer, jednostavan detektor glasnoće:

import audio
from ulab import numpy as np

def loudness(pcmbuf):
    samples = np.array(np.frombuffer(pcmbuf, dtype=np.int16), dtype=np.float)
    rms = np.sqrt(np.mean(samples ** 2))
    if rms > 10000:
        print("Loud!", int(rms))

audio.init(channels=1, frequency=16000, gain_db=24)
audio.start_streaming(loudness)

while True:
    pass

Proslijedite channels=2 u audio.init za primanje isprepletenih uzoraka s oba mikrofona.

Mjerač potrošnje baterije

Maxim MAX17262 ModelGauge m5 mjerač potrošnje prati napon, struju, temperaturu i stanje napunjenosti Li‑Po baterije. Nalazi se na I²C 1 na adresi 0x36.

MAX17262 ima interno mjerenje struje, pa registar struje očitava izravno u mikroamperima bez vanjskog Rsense faktora koji bi trebalo primijeniti. Očitavanje mjerača potrošnje je bezopasno — ne isporučuje se nikakav upravljački program, ali registri dokumentirani u tehničkoj dokumentaciji MAX17262 mogu se izravno očitati:

import time
import struct
from machine import I2C

FUEL_GAUGE = 0x36   # MAX17262

def read_reg(bus, addr, reg):
    return struct.unpack("<H", bus.readfrom_mem(addr, reg, 2))[0]

def read_signed(bus, addr, reg):
    v = read_reg(bus, addr, reg)
    return v - 0x10000 if v & 0x8000 else v

bus = I2C(1)

while True:
    # 0x05 RepCap — remaining capacity, raw × 0.5 mAh
    rep_cap   = read_reg(bus, FUEL_GAUGE, 0x05) * 0.5
    # 0x06 RepSOC — state of charge, raw / 256 %
    soc       = read_reg(bus, FUEL_GAUGE, 0x06) / 256
    # 0x08 Temp — die temperature, signed, raw / 256 °C
    temp      = read_signed(bus, FUEL_GAUGE, 0x08) / 256
    # 0x09 VCell — battery voltage, raw × 78.125 µV
    vcell     = read_reg(bus, FUEL_GAUGE, 0x09) * 78.125 / 1_000_000
    # 0x0A Current — signed, raw × 156.25 µA
    current   = read_signed(bus, FUEL_GAUGE, 0x0A) * 156.25 / 1000
    # 0x0B AvgCurrent — averaged current
    avg_curr  = read_signed(bus, FUEL_GAUGE, 0x0B) * 156.25 / 1000
    # 0x10 FullCapRep — learned full capacity, raw × 0.5 mAh
    full_cap  = read_reg(bus, FUEL_GAUGE, 0x10) * 0.5
    # 0x11 TTE — time-to-empty (valid while discharging), raw × 5.625 s
    tte_s     = read_reg(bus, FUEL_GAUGE, 0x11) * 5.625
    # 0x20 TTF — time-to-full   (valid while charging),  raw × 5.625 s
    ttf_s     = read_reg(bus, FUEL_GAUGE, 0x20) * 5.625
    # 0x17 Cycles — charge-cycle counter, 1% per LSB
    cycles    = read_reg(bus, FUEL_GAUGE, 0x17) / 100

    print("V:        %.3f V" % vcell)
    print("Capacity: %.1f / %.1f mAh (%.1f %%)" % (rep_cap, full_cap, soc))
    print("Temp:     %.1f C" % temp)
    print("Current:  %.1f mA  (avg %.1f mA)" % (current, avg_curr))
    print("TTE:      %.0f s   TTF: %.0f s" % (tte_s, ttf_s))
    print("Cycles:   %.2f" % cycles)
    print()
    time.sleep_ms(1000)

Current je predznakovni dvojni komplement: pozitivan tijekom punjenja, negativan tijekom pražnjenja. TTE je smislen samo kad je struja negativna; TTF samo kad je struja pozitivna.

Integrirani sklop za upravljanje napajanjem

NXP PF1550 PMIC upravlja svakim regulatorom na Portenta H7 — glavnom sabirnicom +3V3, sabirnicom +1V8 za jezgru / I/O SoC-a i Li‑Po punjačem. Nalazi se na I²C 1 na adresi 0x08.

Upozorenje

Očitavanje PMIC registara je u redu; pisanje u njih je opasno. Pogrešno konfiguriranje postavke buck regulatora ili punjača može trajno oštetiti ploču, bateriju ili oboje. Tretirajte PMIC kao samo za čitanje osim ako točno znate što radite.

Najkorisnija stvar koju vam PMIC govori, a koju mjerač potrošnje ne može, jest stroj stanja punjača — radi li ploča trenutačno na USB / ESLOV / VIN, u kojoj je fazi ciklusa punjenja Li‑Po, te je li punjač u toplinskom ili watchdog kvaru. Registri punjača nalaze se na pomaku 0x80 u glavnom I²C adresnom prostoru PF1550 (vidi §22.2 tehničke dokumentacije PF1550), pa se na primjer CHG_INT_OK na adresi punjača 0x04 čita iz PMIC registra 0x84

import time
from machine import I2C

PMIC = 0x08

# Charger state machine (low nibble of CHG_SNS, register 0x87)
CHG_STATES = {
    0x0: "precharge",
    0x1: "fast charge (constant current)",
    0x2: "fast charge (constant voltage)",
    0x3: "end of charge",
    0x4: "done",
    0x6: "timer fault",
    0x7: "thermistor suspend",
    0x8: "off — input invalid or charger disabled",
    0x9: "battery overvoltage",
    0xA: "thermal shutdown",
    0xC: "linear mode (not charging)",
}

bus = I2C(1)

while True:
    # 0x84 CHG_INT_OK — single-bit indicators
    ok = bus.readfrom_mem(PMIC, 0x84, 1)[0]
    vbus_ok = bool(ok & (1 << 5))   # bit 5 — VBUS valid (USB/VIN)
    bat_ok  = bool(ok & (1 << 2))   # bit 2 — battery OK
    chg_ok  = bool(ok & (1 << 3))   # bit 3 — charger actively charging
    thm_ok  = bool(ok & (1 << 7))   # bit 7 — thermistor in normal range

    # 0x87 CHG_SNS — charger state + thermal regulation flag
    chg_sns = bus.readfrom_mem(PMIC, 0x87, 1)[0]
    state   = CHG_STATES.get(chg_sns & 0x0F, "reserved")
    treg    = bool(chg_sns & (1 << 7))   # thermal regulation active

    print("VBUS valid:         ", vbus_ok)
    print("battery OK:         ", bat_ok)
    print("charger active:     ", chg_ok)
    print("thermistor normal:  ", thm_ok)
    print("thermal reg active: ", treg)
    print("state:              ", state)
    print()
    time.sleep_ms(1000)

Drugi registri samo za čitanje koje vrijedi pogledati u tehničkoj dokumentaciji (svi na pomaku punjača 0x80): 0x80 CHG_INT (zaštićeni prekidi punjača — zastavice kvarova), 0x86 VBUS_SNS (višebitno stanje VBUS-a uključujući OVLO / UVLO / DPM) i 0x88 BATT_SNS (prisutnost baterije i stanje prekomjerne struje).

Wi‑Fi

Ugrađeni Murata 1DX (CYW4343W) izložen je putem network — konfiguracija mreže kao stanično sučelje. Prije uključivanja radija spojite priloženu antenu na ugrađeni U.FL konektor

import network, time

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
while not wlan.isconnected():
    time.sleep(1)
print("Wi‑Fi IP:", wlan.ipconfig("addr4")[0])

Bluetooth

Isti Murata 1DX također izlaže Bluetooth LE 5.1. Upotrijebite aioble — Asinkroni BLE za BLE prilagođen asyncio-u — na primjer, oglašavajte se kao periferija i čekajte da se središnji uređaj poveže:

import asyncio
import aioble

async def run():
    while True:
        conn = await aioble.advertise(250_000, name="Portenta-H7")
        print("Connected:", conn.device)
        await conn.disconnected()

asyncio.run(run())

LoRa (Vision Shield)

LoRa izdanje Vision Shielda dodaje Murata CMWX1ZZABZ LoRaWAN modul spojen na Portenta H7 preko UART-a. Modul lora obuhvaća ugrađeni program s AT‑naredbama i podržava OTAA ili ABP pridruživanje, uplink i downlink:

from lora import Lora
from lora import BAND_EU868
from lora import LoraErrorTimeout

lora = Lora(band=BAND_EU868, poll_ms=60000)
print("Device EUI:", lora.get_device_eui())

appEui = "1234567890123456"
appKey = "12345678901234567890123456789012"

try:
    lora.join_OTAA(appEui, appKey)
except LoraErrorTimeout as e:
    print("Join timed out — try moving near a window:", e)

lora.set_port(3)
lora.send_data("HeLoRA world!", True)

while True:
    if lora.available():
        data = lora.receive_data()
        if data:
            print("Port:", data["port"], "Data:", data["data"])
    lora.poll()

Upotrijebite BAND_US915 / BAND_AS923 / BAND_AU915 itd. za regije izvan EU-a i prebacite se na lora.Lora.join_ABP() ako vaš mrežni poslužitelj koristi ABP aktivaciju.

Upozorenje

Dok je LoRa modul u uporabi, upravljački program preuzima sljedeće pinove MKR priključka kao upravljačke linije za Murata CMWX1ZZABZ — oni se ne mogu koristiti:

MKR pin

Razlog

D3

BOOT pin LoRa modula

D5

RST pin LoRa modula

Ethernet (Vision Shield)

Ethernet izdanje Vision Shielda dodaje RJ45 utičnicu s magnetikom spojenu na 10/100 Ethernet MAC STM32H747 preko RMII. Uključite Ethernet kabel i PHY se pojavljuje kao LAN sučelje; DHCP se pokreće automatski čim veza proradi:

import network
import time

lan = network.LAN()
lan.active(True)
while not lan.isconnected():
    time.sleep(1)
print("Ethernet IP:", lan.ipconfig("addr4")[0])

microSD kartica (Vision Shield)

Kad se kartica umetne, automatski se montira na /sdcard i upotrebljiva je putem uobičajenog datotečnog sustava:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

Referenca sabirnica

GPIO

Upotrijebite machine.Pin za očitavanje ili pokretanje bilo kojeg pina označenog na sitotisku. Izlazi su 3,3 V CMOS i mogu primati/dovoditi do 20 mA po pinu (140 mA ukupno na cijelom priključku).

from machine import Pin

out = Pin("D0", Pin.OUT)
out.on()
out.off()
out.value(1)

inp = Pin("D1", Pin.IN, Pin.PULL_UP)
print(inp.value())

Bilo koji ulazni pin može također aktivirati prekid pri prijelazima ruba:

def handler(pin):
    print("triggered:", pin)

Pin("D1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

Sabirnica

TX

RX

UART1

D14

D13

UART6

D5

D4

from machine import UART

uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

Sabirnica

SCL

SDA

I2C3

D12

D11

from machine import I2C

i2c = I2C(3, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

Površine D11/D12 na MKR priključku i pinovi SDA_EXT/SCL_EXT na ESLOV konektoru spadaju na istu I²C 3 sabirnicu — vidi ESLOV konektor gore za ESLOV raspored pinova.

Isti hardver može se također koristiti u ciljnom (slave) načinu rada putem machine.I2CTarget za izlaganje memorijskog područja drugom I²C upravljaču:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(3, addr=0x42, mem=buf)

SPI

Sabirnica

MOSI

MISO

SCK

CS

SPI2

D8

D10

D9

D7

from machine import SPI
from machine import Pin

spi = SPI(2, baudrate=10_000_000)
cs = Pin("D7", Pin.OUT, value=1)   # CS is not driven by the SPI peripheral

cs.value(0)
spi.write(b"hello")
cs.value(1)

ADC

Portenta H7 izlaže osam 12‑bitnih ADC kanala na A0–A7. Svi su referencirani na 3,3 Vread_u16 vraća 0–65535 kroz 0–3,3 V na pinu:

from machine import ADC
import time

adc = ADC("A0")
while True:
    voltage = adc.read_u16() * 3.3 / 65535
    print(voltage)
    time.sleep_ms(100)

DAC

Jedan 12‑bitni DAC kanal izložen je na DAC1 (A6 / D21) putem pyb.DAC

from pyb import DAC

dac = DAC("DAC1")
dac.write(int(0.5 * 255))   # 8‑bit output, ~1.65 V

PWM

Pin

Mjerač vremena / kanal

D0

TIM8 CH3N

D1

TIM1 CH1, TIM8 CH3N

D2

TIM1 CH2, TIM8 CH2N

D4

TIM3 CH2, TIM8 CH2

D5

TIM3 CH1, TIM8 CH1

D6

TIM1 CH1

D7

TIM5 CH4

D13

TIM1 CH3

D14

TIM1 CH2

A7

TIM3 CH1

Pokrenite bilo koji od njih putem machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("D4"), freq=1_000, duty_u16=32768)

Napomena

Nekoliko pinova dijeli kanale mjerača vremena:

  • TIM1 CH1 je na D1 i D6.

  • TIM1 CH2 je na D2 i D14.

  • TIM8 CH3N je na D0 i D1.

Odaberite jednog potrošača po kanalu mjerača vremena.

Upozorenje

TIM1 je rezerviran za glavni takt kamere kada se Vision Shield inicijalizira putem csi — senzori kamereD1, D2, D6, D13 i D14 ne mogu se pokretati PWM-om dok je kamera aktivna.

Softverski bit‑banged sabirnice

machine.SoftI2C i machine.SoftSPI rade na bilo kojem GPIO-u ako vam treba dodatna sabirnica.

Toplinski senzor (izvan ploče)

Ugrađeni program (firmware) uključuje upravljački program fir — upravljački program termalnog senzora (fir == daleko infracrveno) za izvana spojene toplinske kamere:

  • MLX90621 — IR polje 16 × 4

  • MLX90640 — IR polje 32 × 24

  • MLX90641 — IR polje 16 × 12

  • AMG8833 — IR polje 8 × 8

Spojite modul na I²C sabirnicu ploče i očitajte sličice s 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())

Upravljački program fir komunicira sa senzorom samo preko I²C 3 — spojite modul na D12 (SCL) i D11 (SDA).

Mjerenje vremena

time

Modul time pokriva blokirajuća odgađanja, monotone otkucaje i mjerenje proteklog vremena:

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)

Virtualni mjerači vremena

machine.Timer raspoređuje periodične ili jednokratne povratne pozive bez trošenja utora hardverskog mjerača vremena. Proslijedite -1 kao id za uporabu virtualnog (softverskog) mjerača vremena:

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"))

Vrijednosti perioda su u milisekundama. Pozovite deinit() za zaustavljanje i otpuštanje utora.

Sat stvarnog vremena

machine.RTC čuva stvarno vrijeme kroz resetiranja. HD konektor također izlaže COINCELL površinu koja može napajati RTC iz CR2032 baterije tijekom nestanka napajanja:

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 resetira ploču ako se aplikacija zaglavi. Jednom pokrenut ne može se zaustaviti ni ponovno konfigurirati — povremeno ga hranite unutar svoje glavne petlje:

from machine import WDT

wdt = WDT(timeout=5_000)   # 5 second window
while True:
    # ...do work...
    wdt.feed()

Informacije o pokretanju i izvođenju

Ažuriranje ugrađenog programa (DFU)

Portenta H7 koristi Arduinov standardni dvostruki dodir za reset za ulazak u Arduinov pokretač (bootloader). Brzo dvaput pritisnite gumb za reset — ploča se ponovno prijavljuje putem USB-a kao DFU uređaj, a OpenMV IDE može učitati novu sliku ugrađenog programa (firmware).

Skripta koja se izvodi može na zahtjev ponovno ući u pokretač (bootloader) pozivom machine.bootloader()

import machine

machine.bootloader()

Datotečni sustav i redoslijed pokretanja

Ugrađeni program Portenta H7 montira do tri datotečna sustava pri pokretanju:

  • Interna flash memorija — uvijek montirana na /flash. Zadano sadrži main.py i README.txt; stvorena pri prvom pokretanju.

  • microSD kartica — ako je priključen Vision Shield i umetnuta kartica, montira se na /sdcard.

  • ROMFS — datotečni sustav samo za čitanje, mapiran u memoriju, na /rom koji MicroPython automatski montira pri pokretanju.

Nakon montiranja, radni direktorij postavlja se na /sdcard kad je kartica prisutna, inače na /flash. Interpreter zatim izvodi skripte iz tog direktorija:

  • boot.py se izvodi pri svakom mekom resetiranju (hladno pokretanje, Ctrl‑D iz REPL-a ili kad god se skripta koja se izvodi vrati).

  • main.py se izvodi samo pri hladnom pokretanju, neposredno nakon boot.py. Sljedeća meka resetiranja ponovno izvode boot.py, ali odmah prelaze na REPL — za ponovno izvođenje main.py morate u potpunosti resetirati ploču.

Postavljanje datoteke boot.py ili main.py na SD karticu nadjačava kopiju u flash memoriji bez njezina mijenjanja — obje datoteke traže se u direktoriju za pokretanje (/sdcard kad je kartica montirana, inače /flash).

Zadani main.py isporučen na svježe učitanoj ploči samo trepće plavim kanalom korisničkog RGB LED-a kao otkucaj srca (dva kratka pulsa, kratka stanka), pa možete prepoznati da se ugrađeni program uredno pokrenuo bez ijednog priključenog hosta.

sys.path je proširen tako da uključuje sva tri datotečna sustava i njihove lib/ poddirektorije, pa se moduli koji se mogu uvoziti mogu nalaziti u /flash/lib, /sdcard/lib ili /rom/lib.

Da biste prisilili sustav da zanemari umetnutu SD karticu (na primjer za izvođenje main.py iz flash memorije čak i kad je kartica prisutna), stvorite praznu datoteku naziva SKIPSD u korijenu /flash.

Kad je povezan putem USB-a, datotečni sustav za pokretanje (/sdcard ako je kartica prisutna, inače /flash) također se prijavljuje kao USB uređaj za masovnu pohranu na hostu, što vam omogućuje izravno uređivanje boot.py, main.py i svih ostalih datoteka. Izbacite pogon prije resetiranja ploče kako bi host ispraznio svoje predmemorirane upise.

Napomena

Budući da OS tretira pogon kao pasivni blok uređaj, datoteke koje stvori ili izmijeni kod koji se izvodi na kameri neće se pojaviti dok host ponovno ne montira pogon. Ako i OS i kamera istovremeno pišu u isti datotečni sustav, OS će pobijediti i prebrisati promjene koje je napravila kamera. Upotrijebite SD karticu za sve podatke koje skripta zapisuje natrag i ponovno montirajte prije čitanja tih datoteka s hosta.

Napomena

Crveni kanal korisničkog RGB LED-a može nakratko zasvijetliti dok host čita s USB pogona za masovnu pohranu ili piše na njega — to je indikator aktivnosti vođen ugrađenim programom, a ne kvar.

Veličine pohrane

Portenta H7 isporučuje se s:

  • /flash11 MB FAT datotečni sustav, za čitanje/pisanje.

  • /rom4 MB ROMFS samo za čitanje, mapiran u memoriju, koristi se za isporuku skripti i ML modela koji imaju koristi od mmap pristupa bez kopiranja.

  • /sdcard — pune veličine bilo koje microSD kartice umetnute u Vision Shield (kad je prisutna), za čitanje/pisanje.

Indikator teškog kvara

Ako korisnički RGB LED brzo prolazi kroz sve boje — dovoljno brzo da obično izgleda kao treperava bijela LED dioda umjesto zasebnih nijansi — ugrađeni program naišao je na nepopravljiv teški kvar. Ponovno učitajte ugrađeni program za oporavak; ako ponovno učitavanje ne pomogne, ploča je možda fizički oštećena.

Softverske biblioteke

Pogledajte indeks biblioteka za potpuni popis modula — uključujući one jedinstvene za Portenta H7 build.