Arduino Giga R1 WiFi¶
Arduino Giga R1 WiFi är ett 101 × 53 mm-kort i Mega-formfaktor byggt kring STMicroelectronics STM32H747XI — en tvåkärnig SoC som kombinerar en Cortex‑M7 på 480 MHz med en Cortex‑M4 på 240 MHz. OpenMV-firmware körs helt och hållet på M7-kärnan. Giga lägger till en 22-stifts Arducam-kameraflexkontakt, en MIPI‑DSI-kontakt för Arduino Giga Display Shield samt ett 3,5 mm stereoljuduttag till den vanliga Arduino Mega-stiftlistlayouten.
För fullständigt datablad, foton och dimensioner se produktsidan för Arduino Giga R1 WiFi.
Höjdpunkter¶
STMicroelectronics STM32H747XI dubbla Cortex‑M7 (480 MHz) + Cortex‑M4 (240 MHz). OpenMV-firmware körs endast på M7-kärnan; M4-kärnan exponeras via openamp för kommunikation mellan processorer.
8 MB externt SDRAM plus 2 MB internt flashminne och 16 MB externt QSPI-flashminne.
Hårdvarubaserad JPEG-kodare/avkodare.
22-stifts Arducam-kompatibel kameraflexkontakt (
J6) — drivrutinsstöd för sensormodulerna OV5640 (5MP), OV7670, GC2145, HM01B0 och HM0360.MIPI‑DSI-displaykontakt (
J5) för Arduino Giga Display Shield (480×800 kapacitiv pekskärm) plus en LTDC RGB-displaymotor för avancerade bärkort.3,5 mm ljuduttag med stereo line‑out och mikrofoningång.
Wi‑Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 via Murata 1DX-modulen (CYW4343W) — ansluts till den medföljande antennen via en inbyggd U.FL-kontakt.
USB‑C (full‑speed) för ström / seriell kommunikation / programmering.
Användar-I/O på stiftlisterna i Mega-stil —
D0–D75(digitala),A0–A11(analoga),DAC0/DAC1(DAC-utgångar),CAN_RX/CAN_TX(FDCAN2) samt I²C-paretSDA1/SCL1i den inre raden. En separat 6-stifts SPI1-stiftlist på kortets framsida bryter utCIPO/COPI/SCK(D89/D90/D91).JTAG / SWD är utbrutet på felsökningsstiftlisten på ovansidan för avancerad felsökning.
Stiftschema¶
Stiftreferens¶
Stiftlisterna i Arduino Mega-stil exponerar 76 digitala stift (D0–D75), 12 analoga stift (A0–A11), två DAC-utgångar (DAC0/DAC1), ett sekundärt I²C-par (SDA1/SCL1) och ett FDCAN2-par (CAN_RX/CAN_TX). En separat 6-stifts SPI1-stiftlist på kortets framsida bryter ut CIPO/COPI/SCK (D89/D90/D91).
Stiftnamn |
Referens |
Funktion |
|---|---|---|
D0 |
3,3 V |
USART1 RX (Serial1) / TIM4 CH2 |
D1 |
3,3 V |
USART1 TX (Serial1) / TIM1 CH2 |
D2 |
3,3 V |
TIM2 CH4 / TIM5 CH4 / USART2 RX |
D3 |
3,3 V |
TIM2 CH3 / TIM5 CH3 / USART2 TX |
D4 |
3,3 V |
TIM8 CH1 / UART8 TX |
D5 |
3,3 V |
TIM3 CH2 / SPI1 MOSI / SPI6 MOSI |
D6 |
3,3 V |
TIM4 CH2 |
D7 |
3,3 V |
TIM3 CH1 / SPI1 MISO / SPI3 MISO / SPI6 MISO |
D8 |
3,3 V |
TIM4 CH3 / I2C1 SCL / I2C4 SCL / UART4 RX |
D9 |
3,3 V |
TIM4 CH4 / I2C1 SDA / I2C4 SDA / UART4 TX |
D10 |
3,3 V |
TIM1 CH1 / TIM8 CH3N |
D11 |
3,3 V |
TIM8 CH2 / SPI5 MOSI |
D12 |
3,3 V |
TIM8 CH2N / SPI5 MISO |
D13 |
3,3 V |
TIM12 CH1 / SPI5 SCK |
D14 |
3,3 V |
USART6 TX (Serial2) / SPI6 MOSI |
D15 |
3,3 V |
USART6 RX (Serial2) / TIM3 CH2 / TIM8 CH2 |
D16 |
3,3 V |
UART4 TX (Serial3) / TIM8 CH1N |
D17 |
3,3 V |
UART4 RX (Serial3) |
D18 |
3,3 V |
USART2 TX (Serial4) |
D19 |
3,3 V |
USART2 RX (Serial4) / SPI3 MOSI |
D20 |
3,3 V |
I2C2 SDA / TIM2 CH4 / USART3 RX |
D21 |
3,3 V |
I2C2 SCL |
D22 |
3,3 V |
GPIO |
D23 |
3,3 V |
GPIO / SPI6 SCK |
D24 |
3,3 V |
GPIO / SPI6 MISO |
D25 |
3,3 V |
GPIO |
D26 |
3,3 V |
GPIO |
D27 |
3,3 V |
GPIO |
D28 |
3,3 V |
GPIO |
D29 |
3,3 V |
GPIO |
D30 |
3,3 V |
GPIO |
D31 |
3,3 V |
GPIO |
D32 |
3,3 V |
GPIO |
D33 |
3,3 V |
GPIO |
D34 |
3,3 V |
GPIO |
D35 |
3,3 V |
GPIO |
D36 |
3,3 V |
GPIO |
D37 |
3,3 V |
TIM8 CH2 |
D38 |
3,3 V |
TIM8 CH2N |
D39 |
3,3 V |
GPIO |
D40 |
3,3 V |
TIM15 CH2 / SPI4 MOSI |
D41 |
3,3 V |
GPIO |
D42 |
3,3 V |
GPIO |
D43 |
3,3 V |
GPIO |
D44 |
3,3 V |
GPIO |
D45 |
3,3 V |
GPIO |
D46 |
3,3 V |
TIM8 CH3N |
D47 |
3,3 V |
SPI3 MOSI |
D48 |
3,3 V |
TIM8 CH3 / SPI5 SCK |
D49 |
3,3 V |
GPIO |
D50 |
3,3 V |
GPIO |
D51 |
3,3 V |
TIM15 CH1 / SPI4 MISO |
D52 |
3,3 V |
GPIO |
D53 |
3,3 V |
GPIO |
D54 |
3,3 V |
TIM8 CH1 (kamera DCMI VSYNC) |
D55 |
3,3 V |
I2C3 SDA (kamera DCMI HSYNC) |
D56 |
3,3 V |
TIM3 CH1 / TIM13 CH1 (kamera DCMI PXCLK) |
D57 |
3,3 V |
TIM8 CH1N / UART8 RX (kamerans huvudklocka — TIM1 CH3) |
D58 |
3,3 V |
TIM8 CH3 (kamera DCMI D7) |
D59 |
3,3 V |
TIM8 CH2 (kamera DCMI D6) |
D60 |
3,3 V |
GPIO (kamera DCMI D5) |
D61 |
3,3 V |
TIM8 CH2N / UART4 RX (kamera DCMI D4) |
D62 |
3,3 V |
SPI1 SCK (kamera DCMI D3) |
D63 |
3,3 V |
TIM5 CH2 / I2C4 SCL (display-I²C) |
D64 |
3,3 V |
TIM5 CH1 (kamera DCMI D1) |
D65 |
3,3 V |
TIM12 CH2 (kamera DCMI D0) |
D66 |
3,3 V |
GPIO (kameraåterställning — reserveras när kameran är aktiv) |
D67 |
3,3 V |
GPIO (kamerans avstängning — reserveras när kameran är aktiv) |
D68 |
3,3 V |
TIM3 CH1 / TIM8 CH1 / USART6 TX (Display Shield DSI RESET) |
D69 |
3,3 V |
TIM5 CH4 (Display Shield DSI TE) |
D70 |
3,3 V |
SPI2 SCK |
D71 |
3,3 V |
TIM8 CH4 / SPI2 MISO |
D72 |
3,3 V |
SPI2 MOSI |
D73 |
3,3 V |
ADC123 IN11 (Display Shield DFSDM mikrofondata) |
D74 |
3,3 V |
GPIO (displaybakgrundsbelysning — reserveras av Giga Display Shield) |
D75 |
3,3 V |
SPI2 SCK (Display Shield DFSDM mikrofonklocka) |
A0 / D76 |
3,3 V |
ADC12 IN4 |
A1 / D77 |
3,3 V |
ADC12 IN8 |
A2 / D78 |
3,3 V |
ADC12 IN9 / TIM3 CH3 / TIM8 CH2N |
A3 / D79 |
3,3 V |
ADC12 IN5 / TIM3 CH4 / TIM8 CH3N |
A4 / D80 |
3,3 V |
ADC12 IN13 / SPI2 MOSI |
A5 / D81 |
3,3 V |
ADC123 IN12 / SPI2 MISO |
A6 / D82 |
3,3 V |
ADC123 IN10 |
A7 / D83 |
3,3 V |
ADC1 IN16 / TIM2 CH1 / TIM5 CH1 (mikrofoningång på ljuduttaget) |
A8 |
3,3 V |
ADC3 IN0 (endast analog) |
A9 |
3,3 V |
ADC3 IN1 (endast analog) |
A10 |
3,3 V |
ADC12 IN1 (endast analog) |
A11 |
3,3 V |
ADC12 IN0 (endast analog) |
DAC0 / A12 / D84 |
3,3 V |
DAC1 OUT1 / ADC12 IN18 (line‑out L på ljuduttaget) |
DAC1 / A13 / D85 |
3,3 V |
DAC1 OUT2 / TIM2 CH1 / SPI1 SCK / ADC12 IN19 (line‑out R på ljuduttaget) |
D89 |
3,3 V |
SPI1 MISO ( |
D90 |
3,3 V |
SPI1 MOSI ( |
D91 |
3,3 V |
SPI1 SCK ( |
CAN_RX / D93 |
3,3 V |
FDCAN2 RX / TIM3 CH2 / UART5 RX |
CAN_TX / D94 |
3,3 V |
FDCAN2 TX / SPI2 SCK / UART5 TX |
SDA1 / D102 |
3,3 V |
I2C4 SDA (display-pekskärm / kamerans styrbuss) |
SCL1 / D101 |
3,3 V |
I2C4 SCL (display-pekskärm / kamerans styrbuss) |
RESET |
3,3 V |
tryck på den inbyggda RESET-knappen eller dra till GND för att återställa |
LED_RED |
3,3 V |
RGB-LED:ns röda kanal (aktiv låg) |
LED_GREEN |
3,3 V |
RGB-LED:ns gröna kanal (aktiv låg) |
LED_BLUE |
3,3 V |
RGB-LED:ns blå kanal (aktiv låg) |
Anteckning
A8–A11 är endast analoga kontaktytor på STM32H747:ns _C-stift — de har ingen GPIO-funktion och kan endast läsas via ADC:n.
Strömstift¶
Stift på Mega-stiftlisten:
VIN — 6–32 V ingång. Driver kortet via den inbyggda step-down-regulatorn.
+5V — 5 V-skena matad från USB via en diod eller den inbyggda step-down-regulatorn.
+3V3 — huvudskena på 3,3 V.
IOREF — återspeglar kortets I/O-spänning (3,3 V).
AREF — analog spänningsreferens för ADC-stiften. Är som standard 3,3 V; driv externt för att använda en annan referens.
OFF — dra till GND för att stänga av +3,3 V-skenan och stänga ned systemet.
VRTC — 3,0 V knappcellsingång (max 3,3 V) som håller den inbyggda RTC:n igång medan resten av kortet är avstängt.
GND — gemensam jord.
Giga R1 kan strömförsörjas via någon av dessa vägar:
USB‑C — matar 5 V till den inbyggda step-down-regulatorn.
VIN-stift — driv en reglerad 6–32 V-matning direkt.
Tips
Använd batteritidsberäknaren för att modellera hur länge Giga R1 kan köra på batteri för en given arbetscykel mellan aktivt läge och djupsömn.
Återställnings- och felsökningsstift¶
RESET — både ett utbrutet stift på strömstiftlisten och en tillfällig brytare på kortets ovansida, kopplade till SoC:ns NRST-linje. Dra till GND eller tryck på knappen för att återställa.
Giga R1 använder Arduinos standardmetod dubbeltryck på reset för att gå in i Arduinos startladdare. Tryck snabbt på RESET-knappen två gånger — kortet räknas upp på nytt över USB som en DFU-enhet och OpenMV IDE kan flasha en ny firmware-image.
Om startladdaren saknas helt, håll in BOOT0-knappen samtidigt som du trycker på RESET för att tvinga SoC:n in i ROM-startladdarläget.
STM32:ns SWD-signaler är utbrutna på den 10-stifts 1,27 mm Cortex Debug-stiftlisten på kortets framsida. Koppla in dem via en SEGGER J‑Link, ST‑Link eller annan vanlig ARM JTAG/SWD-probe. Alla felsökningssignaler är 3,3 V-refererade.
Inbyggd kringutrustning¶
LED:ar¶
Giga R1 har en enda RGB-användar-LED, mjukvarustyrbar via machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
En separat power-LED på kortet lyser så snart +3,3 V-skenan är uppe och är inte användarstyrbar.
Kamerakontakt (J6)¶
J6 är en 22-stifts Arducam-kompatibel kameraflexkontakt. Anslut någon av de stödda sensormodulerna så känner firmware av dem automatiskt via modulen csi — kamerasensorer
import csi
cam = csi.CSI()
cam.reset()
cam.pixformat(csi.RGB565)
cam.framesize(csi.QVGA)
cam.snapshot(time=2000) # let auto‑exposure settle
while True:
img = cam.snapshot()
Stödda sensorer:
OV5640 — 5 MP färg, upp till QSXGA (2592 × 1944).
OV7670 — 0,3 MP färg, upp till VGA (640 × 480).
GC2145 — 2 MP färg, upp till UXGA (1600 × 1200).
HM01B0 — 320 × 320 monokrom.
HM0360 — VGA (640 × 480) monokrom.
Varning
Medan kameran är initierad reserveras följande stift på Mega-stiftlisten av firmware och kan inte användas:
Stift |
Orsak |
|---|---|
|
DCMI-data- + synksignaler på kameraflexkontakten |
|
TIM1 CH3 — kamerans huvudklocka |
|
GPIO för kamera-reset |
|
GPIO för kamerans avstängning |
|
I²C 4 — delas med kameran; bussen är användbar men undvik sensorns I²C-adress |
Maskininlärning¶
ml — Maskininlärning kör kvantiserade TFLite-modeller på Cortex‑M7 med CMSIS‑NN-kärnor — snabbt nog för kompakta detektorer vid ett par bildrutor per sekund. Modeller på det skrivskyddade /rom-filsystemet laddas direkt från flashminnet utan att kopieras till RAM. Här är en 128×128 BlazeFace-detektor som lägger det detekterade ansiktet och dess sex landmärken som överlägg på varje bildruta:
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()
for r, score, keypoints in model.predict([img]):
ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
print(clock.fps(), "fps")
M4-kärna¶
Cortex‑M4-kärnan exponeras via openamp för kommunikation mellan processorer. OpenMV-firmware körs endast på M7; M4 har ingen egen MicroPython-körmiljö, så att använda den innebär att bygga en separat C-firmware-image och ladda den från filsystemet via openamp.RemoteProc. Förbyggd exempel-firmware som implementerar en virtuell UART-ändpunkt finns i förrådet openamp_vuart — följ dess README för att bygga 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)
I praktiken bör detta stöd snarare betraktas som en demonstration av openamp-gränssnittet än som en fungerande tvåkärnig plattform — M4 kan inte återställas oberoende av M7, så att stoppa M4 framtvingar en fullständig omstart av systemet.
Display (J5)¶
J5 är en MIPI‑DSI-kontakt för Arduino Giga Display Shield — en 480 × 800 kapacitiv pekskärm byggd kring panelens drivrutin ST7701 och pekstyrenheten GT911. Båda drivrutinerna levereras infrysta med firmware. Använd display — display-drivrutin för att skicka bildbuffertar och gt911.GT911 för pekinmatning.
Exemplet nedan speglar kameran till ett 800 × 480 displayfönster i porträttläge och lägger varje pekkontakt som överlägg i form av en färgad cirkel:
import csi
import time
import image
import display
from gt911 import GT911
from machine import I2C
IMG_OFFSET = 80
touch_detected = False
points_colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255),
(0, 255, 255), (255, 255, 0))
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
lcd = display.DSIDisplay(
framesize=display.FWVGA,
portrait=True,
refresh=60,
controller=display.ST7701(),
)
# Pass pin names (not Pin objects) so the driver can flip
# the reset pin's direction during start-up.
touch = GT911(
I2C(4, freq=400_000),
reset_pin="D71",
irq_pin="D70",
touch_points=5,
refresh_rate=240,
reverse_x=True,
touch_callback=lambda pin: globals().update(touch_detected=True),
)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
if touch_detected:
n, points = touch.read_points()
for i in range(n):
img.draw_circle(
(points[i][0] - IMG_OFFSET,
points[i][1],
points[i][2] * 3),
color=points_colors[points[i][3]],
thickness=2,
)
touch_detected = False
lcd.write(img, y=IMG_OFFSET, hint=image.TRANSPOSE | image.VFLIP)
print(clock.fps())
Varning
Giga Display Shield använder samma I²C 4-buss (SDA1/SCL1) som kameran, D74 för att aktivera LCD-bakgrundsbelysningen, D70/D71 för GT911-pekens IRQ och reset, samt D68/D69 för DSI-panelens TE- och RESET-signaler.
Mikrofon (Display Shield)¶
Arduino Giga Display Shield har en digital mikrofon kopplad till STM32H747:ns DFSDM-kringutrustning (mikrofonklocka på D75, mikrofondata på D73). Mikrofonen fångas via audio — Ljudmodul. Varje buffert anländer som signerad 16-bitars PCM bytearray, klar att matas in i ulab/numpy för DSP:
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
IMU (Display Shield)¶
Arduino Giga Display Shield har en Bosch BMI270 6-axlig IMU (3D-accelerometer + 3D-gyroskop) på samma I²C 4-buss på adress 0x68. Använd communitydrivrutinen micropython_bmi270 för att läsa den:
import time
from machine import I2C
from micropython_bmi270 import bmi270
sensor = bmi270.BMI270(I2C(4, freq=400_000))
sensor.load_config_file()
while True:
ax, ay, az = sensor.acceleration # m/s²
gx, gy, gz = sensor.gyro
print(ax, ay, az, gx, gy, gz)
time.sleep_ms(100)
Den fullständiga registerkartan finns i databladet för BMI270.
RGB-LED (Display Shield)¶
Arduino Giga Display Shield har en inbyggd RGB-LED som drivs av en ISSI IS31FL3197 3-kanals LED-drivrutin på samma I²C 4-buss. Drivrutinens AD-stift är kopplat till GND, så den sitter på I²C-adress 0x50. Använd communitydrivrutinen IS31FL3197 för att styra LED:n:
from machine import I2C
from is31fl3197 import IS31FL3197
led = IS31FL3197(I2C(4, freq=400_000))
led.set_color(255, 0, 0) # full red
Den fullständiga registerkartan finns i databladet för IS31FL3197.
Wi‑Fi¶
Den inbyggda Murata 1DX (CYW4343W) exponeras via network — nätverkskonfiguration som ett stationsgränssnitt. Anslut den medföljande antennen till den inbyggda U.FL-kontakten innan du startar radion:
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¶
Samma Murata 1DX exponerar också Bluetooth LE 5.1. Använd aioble — Asynkron BLE för asyncio-vänlig BLE — annonsera till exempel som en kringenhet och vänta på att en central ska ansluta:
import asyncio
import aioble
async def run():
while True:
conn = await aioble.advertise(250_000, name="Giga-R1")
print("Connected:", conn.device)
await conn.disconnected()
asyncio.run(run())
Bussreferens¶
GPIO¶
Använd machine.Pin för att läsa eller driva något av de silktryckta stiften. Utgångarna är 3,3 V CMOS och kan sänka/källa upp till 20 mA per stift (140 mA totalt över hela stiftlisten).
from machine import Pin
out = Pin("D2", Pin.OUT)
out.on()
out.off()
out.value(1)
inp = Pin("D3", Pin.IN, Pin.PULL_UP)
print(inp.value())
Vilket ingångsstift som helst kan också utlösa ett avbrott vid flankövergångar:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART¶
Buss |
TX |
RX |
Arduino-namn |
|---|---|---|---|
UART1 |
D1 |
D0 |
Serial1 |
UART6 |
D14 |
D15 |
Serial2 |
UART4 |
D16 |
D17 |
Serial3 |
UART2 |
D18 |
D19 |
Serial4 |
from machine import UART
uart = UART(1, baudrate=115200)
uart.write("hello")
uart.read(5)
I²C¶
Buss |
SCL |
SDA |
|---|---|---|
I2C2 |
D21 |
D20 |
I2C1 |
D8 |
D9 |
I2C4 |
SCL1 |
SDA1 |
from machine import I2C
i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")
Buss 2 (D20/D21, de silktryckta SCL/SDA) är Arduinos standard-Wire-buss. Buss 4 (SCL1/SDA1) delas med kameran och GT911-pekstyrenheten på Giga Display Shield — användarenheter på denna buss måste undvika följande adresser (7-bitars):
0x3C— OV5640 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— GT911-pekstyrenhet (Giga Display Shield)
Samma hårdvara kan också användas i målläge (slavläge) via machine.I2CTarget för att exponera ett minnesområde mot en annan I²C-styrenhet:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI¶
Buss |
MOSI |
MISO |
SCK |
|---|---|---|---|
SPI1 |
D90 |
D89 |
D91 |
SPI5 |
D11 |
D12 |
D13 |
SPI1 exponeras på en dedikerad 6-stifts stiftlist på kortets framsida. SPI5 exponeras på de silktryckta etiketterna COPI/CIPO/SCK på D11/D12/D13.
Anteckning
Stiftschema för den främre 6-stifts SPI1-stiftlisten (J7):
Stift |
Signal |
|---|---|
1 |
|
2 |
+5V |
3 |
|
4 |
|
5 |
NRST |
6 |
GND |
from machine import SPI
from machine import Pin
spi = SPI(5, baudrate=10_000_000)
cs = Pin("D10", Pin.OUT, value=1) # CS is not driven by the SPI peripheral
cs.value(0)
spi.write(b"hello")
cs.value(1)
CAN (FDCAN)¶
Buss |
TX |
RX |
|---|---|---|
FDCAN2 |
D94 |
D93 |
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¶
Giga R1 exponerar tolv 12-bitars ADC-kanaler på A0–A11, alla 3,3 V-refererade — read_u16 returnerar 0–65535 över 0–3,3 V vid stiftet. A8–A11 är endast analoga _C-kontaktytor utan GPIO-kringutrustning:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 3.3 / 65535
print(voltage)
time.sleep_ms(100)
Anteckning
A7 är också kopplad till mikrofoningången på 3,5 mm TRRS-ljuduttaget — när ett headset är inkopplat läser ADC("A7") den analoga mikrofonsignalen direkt.
DAC¶
Två 12-bitars DAC-kanaler exponeras på DAC0 och DAC1 via pyb.DAC. Båda är kopplade till 3,5 mm TRRS-ljuduttaget som vänster och höger line‑out-kanal:
from pyb import DAC
left = DAC("DAC0")
right = DAC("DAC1")
left.write(int(0.5 * 255)) # 8‑bit, ~1.65 V
right.write(int(0.5 * 255))
PWM¶
Stift |
Timer / kanal |
|---|---|
D0 |
TIM4 CH2 / TIM17 CH1N |
D1 |
TIM1 CH2 |
D2 |
TIM2 CH4 / TIM5 CH4 / TIM15 CH2 |
D3 |
TIM2 CH3 / TIM5 CH3 / TIM15 CH1 |
D4 |
TIM1 CH3N / TIM8 CH1 |
D5 |
TIM1 CH1N / TIM3 CH2 / TIM8 CH1N / TIM14 CH1 |
D6 |
TIM4 CH2 |
D7 |
TIM3 CH1 |
D8 |
TIM4 CH3 / TIM16 CH1 |
D9 |
TIM4 CH4 / TIM17 CH1 |
D10 |
TIM1 CH1 / TIM8 CH3N |
D11 |
TIM1 CH2N / TIM8 CH2 |
D12 |
TIM1 CH2 / TIM8 CH2N |
D13 |
TIM12 CH1 |
D15 |
TIM3 CH2 / TIM8 CH2 |
D16 |
TIM8 CH1N |
D20 |
TIM2 CH4 |
D37 |
TIM8 CH2 |
D38 |
TIM8 CH2N |
D40 |
TIM15 CH2 |
D46 |
TIM8 CH3N |
D48 |
TIM1 CH1N / TIM8 CH3 |
D51 |
TIM15 CH1 |
D54 |
TIM8 CH1 |
D56 |
TIM3 CH1 / TIM13 CH1 |
D57 |
TIM1 CH3 / TIM8 CH1N |
D58 |
TIM8 CH3 |
D59 |
TIM8 CH2 |
D61 |
TIM8 CH2N |
D63 |
TIM5 CH2 |
D64 |
TIM5 CH1 |
D65 |
TIM12 CH2 |
D68 |
TIM3 CH1 / TIM8 CH1 |
D69 |
TIM5 CH4 |
D71 |
TIM8 CH4 |
D78 / A2 |
TIM1 CH2N / TIM3 CH3 / TIM8 CH2N |
D79 / A3 |
TIM1 CH3N / TIM3 CH4 / TIM8 CH3N |
D83 / A7 |
TIM2 CH1 / TIM5 CH1 |
D85 / A13 |
TIM2 CH1 / TIM8 CH1N |
Driv någon av dem via machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D2"), freq=1_000, duty_u16=32768)
Varning
TIM1 är reserverad för kamerans huvudklocka när kameran initieras via csi — kamerasensorer. Stift vars enda PWM-funktion ligger på TIM1 — D1, D10, D11, D12 — kan inte PWM-drivas medan kameran är aktiv. De övriga listade stiften har alla alternativ som inte är TIM1.
Anteckning
Flera stift delar timerkanaler:
TIM2 CH4 finns på
D2ochD20.TIM2 CH1 finns på
D83/A7ochD85/A13.TIM3 CH1 finns på
D7,D56ochD68.TIM3 CH2 finns på
D5ochD15.TIM4 CH2 finns på
D0ochD6.TIM5 CH1 finns på
D64ochD83/A7.TIM5 CH4 finns på
D2ochD69.TIM8 CH1 finns på
D4,D54ochD68.TIM8 CH1N finns på
D5,D16,D57ochD85/A13.TIM8 CH2 finns på
D11,D15,D37ochD59.TIM8 CH2N finns på
D12,D38,D61ochD78/A2.TIM8 CH3 finns på
D48ochD58.TIM8 CH3N finns på
D10,D46ochD79/A3.TIM15 CH1 finns på
D3ochD51.TIM15 CH2 finns på
D2ochD40.
Välj en förbrukare per timerkanal.
Mjukvarubaserade bit-bangade bussar¶
machine.SoftI2C och machine.SoftSPI fungerar på vilken GPIO som helst om du behöver en extra buss.
Värmesensor (extern)¶
Firmware inkluderar drivrutinen fir — drivrutin för värmesensor (fir == far infrared) för externt kopplade värmekameror:
MLX90621 — 16 × 4 IR-array
MLX90640 — 32 × 24 IR-array
MLX90641 — 16 × 12 IR-array
AMG8833 — 8 × 8 IR-array
Koppla modulen till kortets I²C-buss och läs bildrutor med 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())
Drivrutinen fir kommunicerar med sensorn endast över I²C 1 — koppla modulen till D8 (SCL) och D9 (SDA).
Tidtagning¶
time¶
Modulen time täcker blockerande fördröjningar, monotona klocktick och mätning av förfluten tid:
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)
Virtuella timers¶
machine.Timer schemalägger periodiska eller engångsåteranrop utan att förbruka en hårdvarutimerplats. Skicka -1 som id för att använda en virtuell (mjukvarubaserad) timer:
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"))
Periodvärden anges i millisekunder. Anropa deinit() för att stoppa och frigöra platsen.
Realtidsklocka¶
machine.RTC håller väggklockstid över återställningar — och över fullständig avstängning när en knappcell är ansluten till stiftet VRTC
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())
Vakthund¶
machine.WDT återställer kortet om applikationen hänger sig. När den väl är startad kan den inte stoppas eller omkonfigureras — mata den periodiskt inuti din huvudloop:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Boot- och körtidsinformation¶
Firmware-uppdatering (DFU)¶
Giga R1 använder Arduinos standardmetod dubbeltryck på reset för att gå in i Arduinos startladdare. Tryck snabbt på RESET-knappen två gånger — kortet räknas upp på nytt över USB som en DFU-enhet och OpenMV IDE kan flasha en ny firmware-image. Om startladdaren saknas helt, håll in BOOT0-knappen samtidigt som du trycker på RESET för att tvinga SoC:n in i ROM-startladdarläget.
Ett körande skript kan gå in i startladdaren på begäran genom att anropa machine.bootloader()
import machine
machine.bootloader()
Filsystem och bootordning¶
Giga R1-firmware monterar upp till två filsystem vid uppstart:
Internt flashminne — alltid monterat på
/flash. Innehållermain.pyochREADME.txtsom standard; skapas vid allra första uppstarten.ROMFS — skrivskyddat, minnesmappat filsystem på
/romsom monteras automatiskt av MicroPython vid uppstart.
Efter monteringen sätts arbetskatalogen till /flash. Tolken kör sedan skript från den katalogen:
boot.pykörs vid varje mjuk återställning (kallstart,Ctrl‑Dfrån REPL:en, eller närhelst det körande skriptet returnerar).main.pykörs endast vid kallstart, omedelbart efterboot.py. Efterföljande mjuka återställningar kör omboot.pymen hoppar direkt till REPL:en — för att köra ommain.pymåste du återställa kortet fullständigt.
Standard-main.py som levereras på ett nyflashat kort blinkar bara den blå kanalen på RGB-användar-LED:n som en hjärtslagsindikator (två korta pulser, kort paus), så att du kan se att firmware startade rent utan någon ansluten värd.
sys.path utökas till att inkludera båda filsystemen och deras lib/-underkataloger, så importerbara moduler kan ligga i /flash/lib eller /rom/lib.
När kortet är anslutet över USB räknas /flash även upp som en USB-masslagringsenhet på värden, så att du kan redigera boot.py, main.py och andra filer direkt. Mata ut enheten innan du återställer kortet så att värden tömmer sina cachade skrivningar.
Anteckning
Eftersom operativsystemet behandlar enheten som en passiv blockenhet visas inte filer som skapats eller ändrats av kod som körs på kameran förrän värden monterar om enheten. Om både operativsystemet och kameran skriver till samma filsystem samtidigt vinner operativsystemet och skriver över ändringar som gjorts av kameran.
Anteckning
Den röda kanalen på RGB-användar-LED:n kan kortvarigt tändas medan värden läser från eller skriver till USB-masslagringsenheten — detta är en firmwarestyrd aktivitetsindikator, inte ett fel.
Lagringsstorlekar¶
Giga R1 levereras med:
/flash— 11 MB FAT-filsystem, läs/skriv./rom— 4 MB skrivskyddat minnesmappat ROMFS, används för att leverera skript och ML-modeller som drar nytta av zero-copy mmap-åtkomst.
Indikator för allvarligt fel (hard fault)¶
Om RGB-användar-LED:n snabbt växlar genom alla färger — så snabbt att det tenderar att se ut som en tindrande vit LED snarare än distinkta nyanser — har firmware drabbats av ett oåterhämtbart allvarligt fel (hard fault). Flasha om firmware för att återhämta dig; om omflashning inte hjälper kan kortet vara fysiskt skadat.
Programvarubibliotek¶
Se biblioteksindexet för den fullständiga listan över moduler — inklusive vilka som är unika för Giga R1-bygget.