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.
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¶
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 |
D21 |
3.3 V |
alias za |
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 pinaVINili 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
+5ViliVIN.
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 |
2 |
INT |
ulaz vanjskog prekida na |
3 |
SCL_EXT |
dijeljeno s površinom |
4 |
SDA_EXT |
dijeljeno s površinom |
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— NRSTJ1‑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 |
|---|---|
|
TIM1 CH1 — glavni takt kamere |
|
TIM1 CH1 (alt) — glavni takt kamere |
|
I²C 3 SDA — dijeljeno s kamerom; sabirnica je upotrebljiva, ali izbjegavajte I²C adresu senzora ( |
|
I²C 3 SCL — dijeljeno s kamerom; sabirnica je upotrebljiva, ali izbjegavajte I²C adresu senzora ( |
|
DCMI HSYNC — također onemogućuje DAC |
|
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 |
|---|---|
|
BOOT pin LoRa modula |
|
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 V — read_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
D1iD6.TIM1 CH2 je na
D2iD14.TIM8 CH3N je na
D0iD1.
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 kamere — D1, 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žimain.pyiREADME.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
/romkoji 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.pyse izvodi pri svakom mekom resetiranju (hladno pokretanje,Ctrl‑Diz REPL-a ili kad god se skripta koja se izvodi vrati).main.pyse izvodi samo pri hladnom pokretanju, neposredno nakonboot.py. Sljedeća meka resetiranja ponovno izvodeboot.py, ali odmah prelaze na REPL — za ponovno izvođenjemain.pymorate 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:
/flash— 11 MB FAT datotečni sustav, za čitanje/pisanje./rom— 4 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.