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.

Arduino Giga R1 WiFi

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 — D0D75 (digitala), A0A11 (analoga), DAC0/DAC1 (DAC-utgångar), CAN_RX/CAN_TX (FDCAN2) samt I²C-paret SDA1/SCL1 i den inre raden. En separat 6-stifts SPI1-stiftlist på kortets framsida bryter ut CIPO/COPI/SCK (D89/D90/D91).

  • JTAG / SWD är utbrutet på felsökningsstiftlisten på ovansidan för avancerad felsökning.

Stiftschema

Stiftschema för Arduino Giga R1 WiFi

Stiftreferens

Stiftlisterna i Arduino Mega-stil exponerar 76 digitala stift (D0D75), 12 analoga stift (A0A11), 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 (CIPO på den främre SPI-stiftlisten)

D90

3,3 V

SPI1 MOSI (COPI på den främre SPI-stiftlisten)

D91

3,3 V

SPI1 SCK (SCK på den främre SPI-stiftlisten)

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

A8A11 ä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

D54D65

DCMI-data- + synksignaler på kameraflexkontakten

D57

TIM1 CH3 — kamerans huvudklocka

D66

GPIO för kamera-reset

D67

GPIO för kamerans avstängning

SDA1 / SCL1

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 / GC2145

  • 0x24 — HM01B0 / HM0360

  • 0x21 — OV7670

  • 0x5D — 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/SCKD11/D12/D13.

Anteckning

Stiftschema för den främre 6-stifts SPI1-stiftlisten (J7):

Stift

Signal

1

D89 (CIPO)

2

+5V

3

D91 (SCK)

4

D90 (COPI)

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-refereraderead_u16 returnerar 0–65535 över 0–3,3 V vid stiftet. A8A11 ä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å D2 och D20.

  • TIM2 CH1 finns på D83/A7 och D85/A13.

  • TIM3 CH1 finns på D7, D56 och D68.

  • TIM3 CH2 finns på D5 och D15.

  • TIM4 CH2 finns på D0 och D6.

  • TIM5 CH1 finns på D64 och D83/A7.

  • TIM5 CH4 finns på D2 och D69.

  • TIM8 CH1 finns på D4, D54 och D68.

  • TIM8 CH1N finns på D5, D16, D57 och D85/A13.

  • TIM8 CH2 finns på D11, D15, D37 och D59.

  • TIM8 CH2N finns på D12, D38, D61 och D78/A2.

  • TIM8 CH3 finns på D48 och D58.

  • TIM8 CH3N finns på D10, D46 och D79/A3.

  • TIM15 CH1 finns på D3 och D51.

  • TIM15 CH2 finns på D2 och D40.

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åller main.py och README.txt som standard; skapas vid allra första uppstarten.

  • ROMFS — skrivskyddat, minnesmappat filsystem på /rom som monteras automatiskt av MicroPython vid uppstart.

Efter monteringen sätts arbetskatalogen till /flash. Tolken kör sedan skript från den katalogen:

  • boot.py körs vid varje mjuk återställning (kallstart, Ctrl‑D från REPL:en, eller närhelst det körande skriptet returnerar).

  • main.py körs endast vid kallstart, omedelbart efter boot.py. Efterföljande mjuka återställningar kör om boot.py men hoppar direkt till REPL:en — för att köra om main.py må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:

  • /flash11 MB FAT-filsystem, läs/skriv.

  • /rom4 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.