Arduino Giga R1 WiFi#
O Arduino Giga R1 WiFi é uma placa no formato Mega de 101 × 53 mm, construída em torno do STMicroelectronics STM32H747XI — um SoC de núcleo duplo que combina um Cortex‑M7 a 480 MHz com um Cortex‑M4 a 240 MHz. O firmware OpenMV corre exclusivamente no núcleo M7. O Giga adiciona um conector flex para câmara Arducam de 22 pinos, um conector MIPI‑DSI para o Arduino Giga Display Shield, e uma ficha de áudio estéreo de 3,5 mm ao layout padrão de cabeçalhos Arduino Mega.
Para a ficha técnica completa, fotos e dimensões, consulte a página do produto Arduino Giga R1 WiFi.
Destaques#
STMicroelectronics STM32H747XI dual Cortex‑M7 (480 MHz) + Cortex‑M4 (240 MHz). O firmware OpenMV corre apenas no núcleo M7; o núcleo M4 é exposto através de openamp para comunicação entre processadores.
8 MB de SDRAM externa mais 2 MB de flash interna e 16 MB de flash QSPI externa.
Codificador/descodificador JPEG por hardware.
Conector flex para câmara compatível com Arducam de 22 pinos (
J6) — suporte de controlador para módulos de sensor OV5640 (5 MP), OV7670, GC2145, HM01B0 e HM0360.Conector de ecrã MIPI‑DSI (
J5) para o Arduino Giga Display Shield (painel táctil capacitivo de 480×800) mais um motor de ecrã RGB LTDC para portadoras avançadas.Ficha de áudio de 3,5 mm com saída de linha estéreo e entrada de microfone.
Wi‑Fi b/g/n (2,4 GHz) + Bluetooth LE 5.1 via módulo Murata 1DX (CYW4343W) — liga‑se à antena fornecida através de um conector U.FL na placa.
USB‑C (velocidade máxima) para alimentação / série / programação.
E/S de utilizador nos cabeçalhos no estilo Mega —
D0–D75(digital),A0–A11(analógico),DAC0/DAC1(saídas DAC),CAN_RX/CAN_TX(FDCAN2), e o par I²CSDA1/SCL1na fila interior. Um cabeçalho SPI1 de 6 pinos na frente da placa disponibilizaCIPO/COPI/SCK(D89/D90/D91).JTAG / SWD disponível no cabeçalho de depuração no topo da placa para depuração avançada.
Diagrama de pinos#
Referência de pinos#
Os cabeçalhos no estilo Arduino Mega expõem 76 pinos digitais (D0–D75), 12 pinos analógicos (A0–A11), duas saídas DAC (DAC0/DAC1), um par I²C secundário (SDA1/SCL1) e um par FDCAN2 (CAN_RX/CAN_TX). Um cabeçalho SPI1 de 6 pinos na frente da placa disponibiliza CIPO/COPI/SCK (D89/D90/D91).
Nome do pino | Referência | Função |
|---|---|---|
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 (DCMI VSYNC da câmara) |
D55 | 3,3 V | I2C3 SDA (DCMI HSYNC da câmara) |
D56 | 3,3 V | TIM3 CH1 / TIM13 CH1 (DCMI PXCLK da câmara) |
D57 | 3,3 V | TIM8 CH1N / UART8 RX (relógio principal da câmara — TIM1 CH3) |
D58 | 3,3 V | TIM8 CH3 (DCMI D7 da câmara) |
D59 | 3,3 V | TIM8 CH2 (DCMI D6 da câmara) |
D60 | 3,3 V | GPIO (DCMI D5 da câmara) |
D61 | 3,3 V | TIM8 CH2N / UART4 RX (DCMI D4 da câmara) |
D62 | 3,3 V | SPI1 SCK (DCMI D3 da câmara) |
D63 | 3,3 V | TIM5 CH2 / I2C4 SCL (I²C do ecrã) |
D64 | 3,3 V | TIM5 CH1 (DCMI D1 da câmara) |
D65 | 3,3 V | TIM12 CH2 (DCMI D0 da câmara) |
D66 | 3,3 V | GPIO (reset da câmara — ocupado quando a câmara está activa) |
D67 | 3,3 V | GPIO (power‑down da câmara — ocupado quando a câmara está activa) |
D68 | 3,3 V | TIM3 CH1 / TIM8 CH1 / USART6 TX (DSI RESET do Display Shield) |
D69 | 3,3 V | TIM5 CH4 (DSI TE do Display Shield) |
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 (dados do microfone DFSDM do Display Shield) |
D74 | 3,3 V | GPIO (retroiluminação do ecrã — ocupado pelo Giga Display Shield) |
D75 | 3,3 V | SPI2 SCK (relógio do microfone DFSDM do Display Shield) |
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 (entrada de microfone da ficha de áudio) |
A8 | 3,3 V | ADC3 IN0 (apenas analógico) |
A9 | 3,3 V | ADC3 IN1 (apenas analógico) |
A10 | 3,3 V | ADC12 IN1 (apenas analógico) |
A11 | 3,3 V | ADC12 IN0 (apenas analógico) |
DAC0 / A12 / D84 | 3,3 V | DAC1 OUT1 / ADC12 IN18 (saída de linha L da ficha de áudio) |
DAC1 / A13 / D85 | 3,3 V | DAC1 OUT2 / TIM2 CH1 / SPI1 SCK / ADC12 IN19 (saída de linha R da ficha de áudio) |
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 (bus de controlo táctil do ecrã / câmara) |
SCL1 / D101 | 3,3 V | I2C4 SCL (bus de controlo táctil do ecrã / câmara) |
RESET | 3,3 V | prima o botão RESET na placa ou ligue ao GND para reiniciar |
LED_RED | 3,3 V | Canal vermelho do LED RGB (activo a nível baixo) |
LED_GREEN | 3,3 V | Canal verde do LED RGB (activo a nível baixo) |
LED_BLUE | 3,3 V | Canal azul do LED RGB (activo a nível baixo) |
Nota
A8–A11 são pinos apenas analógicos nos pinos _C do STM32H747 — não têm função GPIO e só podem ser lidos através do ADC.
Pinos de alimentação#
Pinos do cabeçalho Mega:
VIN — entrada de 6–32 V. Alimenta a placa através do regulador buck integrado.
+5V — rail de 5 V fornecido por USB através de um díodo ou pelo regulador buck integrado.
+3V3 — rail principal de 3,3 V.
IOREF — reflecte a tensão de E/S da placa (3,3 V).
AREF — referência de tensão analógica para os pinos ADC. Por defeito é 3,3 V; pode ser conduzida externamente para usar uma referência diferente.
OFF — ligue ao GND para desligar o rail +3,3 V e desligar o sistema.
VRTC — entrada de pilha de botão de 3,0 V (máx. 3,3 V) que mantém o RTC do chip a funcionar enquanto o restante da placa está desligado.
GND — terra comum.
O Giga R1 pode ser alimentado por qualquer um destes caminhos:
USB‑C — fornece 5 V ao regulador buck integrado.
Pino VIN — ligue directamente uma fonte regulada de 6–32 V.
Dica
Use o estimador de autonomia da bateria para modelar quanto tempo o Giga R1 funcionará com uma bateria para um determinado ciclo de actividade / sono profundo.
Pinos de recuperação e depuração#
RESET — tanto um pino exposto no cabeçalho de alimentação como um comutador momentâneo no topo da placa, ligado à linha NRST do SoC. Ligue ao GND ou prima o botão para reiniciar.
O Giga R1 usa o reset de duplo toque padrão do Arduino para entrar no bootloader do Arduino. Prima rapidamente o botão RESET duas vezes — a placa re‑enumera sobre USB como dispositivo DFU e o OpenMV IDE pode instalar uma nova imagem de firmware.
Se o bootloader estiver completamente em falta, mantenha premido o botão BOOT0 enquanto prime RESET para forçar o SoC a entrar no modo bootloader ROM.
Os sinais SWD do STM32 estão expostos no cabeçalho de depuração Cortex de 10 pinos a 1,27 mm na frente da placa. Ligue‑os via SEGGER J‑Link, ST‑Link ou qualquer sonda JTAG/SWD ARM padrão. Todos os sinais de depuração são referenciados a 3,3 V.
Periféricos integrados#
LEDs#
O Giga R1 possui um único LED RGB de utilizador, controlável por software através de machine.LED
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
Um LED de alimentação separado na placa acende sempre que o rail +3,3 V está activo e não é controlável pelo utilizador.
Conector de câmara (J6)#
J6 é um conector flex para câmara compatível com Arducam de 22 pinos. Ligue qualquer um dos módulos de sensor suportados e o firmware detecta‑os automaticamente através do módulo csi — sensores de câmara
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()
Sensores suportados:
OV5640 — 5 MP cor, até QSXGA (2592 × 1944).
OV7670 — 0,3 MP cor, até VGA (640 × 480).
GC2145 — 2 MP cor, até UXGA (1600 × 1200).
HM01B0 — 320 × 320 monocromático.
HM0360 — VGA (640 × 480) monocromático.
Aviso
Enquanto a câmara está inicializada, os seguintes pinos do cabeçalho Mega estão ocupados pelo firmware e não podem ser utilizados:
Pino | Motivo |
|---|---|
| Dados DCMI + sinais de sincronização no conector flex da câmara |
| TIM1 CH3 — relógio principal da câmara |
| GPIO de reset da câmara |
| GPIO de power‑down da câmara |
| I²C 4 — partilhado com a câmara; o bus é utilizável, mas evite o endereço I²C do sensor |
Aprendizagem automática#
ml — Machine Learning executa modelos TFLite quantizados no Cortex‑M7 com kernels CMSIS‑NN — rápido o suficiente para detectores compactos a alguns fotogramas por segundo. Os modelos no sistema de ficheiros somente de leitura /rom carregam directamente da flash sem copiar para RAM. Aqui está um detector BlazeFace de 128×128 que sobrepõe a face detectada e os seus seis pontos de referência em cada fotograma:
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")
Núcleo M4#
O núcleo Cortex‑M4 é exposto através de openamp para comunicação entre processadores. O firmware OpenMV corre apenas no M7; o M4 não tem runtime MicroPython próprio, pelo que utilizá‑lo implica construir uma imagem de firmware C separada e carregá‑la do sistema de ficheiros via openamp.RemoteProc. O firmware de exemplo pré‑compilado que implementa um endpoint UART virtual está disponível no repositório openamp_vuart — siga o README para compilar 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)
Na prática, este suporte é mais adequado como demonstração da interface openamp do que como plataforma de núcleo duplo funcional — o M4 não pode ser reiniciado independentemente do M7, pelo que parar o M4 força um reinício completo do sistema.
Ecrã (J5)#
J5 é um conector MIPI‑DSI para o Arduino Giga Display Shield — um painel táctil capacitivo de 480 × 800 construído em torno do controlador de painel ST7701 e do controlador táctil GT911. Ambos os controladores estão incluídos no firmware. Use display — controlador de ecrã para enviar buffers de fotograma e gt911.GT911 para entrada táctil.
O exemplo abaixo reflecte a câmara numa janela de ecrã retrato de 800 × 480 e sobrepõe cada contacto táctil como um círculo colorido:
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())
Aviso
O Giga Display Shield usa o mesmo bus I²C 4 (SDA1/SCL1) que a câmara, D74 para a activação da retroiluminação LCD, D70/D71 para o IRQ e reset táctil GT911, e D68/D69 para os sinais TE e RESET do painel DSI.
Microfone (Display Shield)#
O Arduino Giga Display Shield incorpora um microfone digital ligado ao periférico DFSDM do STM32H747 (relógio do microfone em D75, dados do microfone em D73). O microfone é capturado através de audio — Módulo de Áudio. Cada buffer chega como bytearray PCM com sinal de 16 bits, pronto para alimentar ulab/numpy para processamento de sinal:
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)#
O Arduino Giga Display Shield incorpora um IMU Bosch BMI270 de 6 eixos (acelerómetro 3D + giroscópio 3D) no mesmo bus I²C 4, no endereço 0x68. Use o controlador comunitário micropython_bmi270 para o ler:
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)
O mapa de registos completo está na ficha técnica do BMI270.
LED RGB (Display Shield)#
O Arduino Giga Display Shield incorpora um LED RGB integrado controlado por um controlador LED de 3 canais ISSI IS31FL3197 no mesmo bus I²C 4. O pino AD do controlador está ligado ao GND, ficando no endereço I²C 0x50. Use o controlador comunitário IS31FL3197 para controlar o LED:
from machine import I2C
from is31fl3197 import IS31FL3197
led = IS31FL3197(I2C(4, freq=400_000))
led.set_color(255, 0, 0) # full red
O mapa de registos completo está na ficha técnica do IS31FL3197.
Wi‑Fi#
O Murata 1DX (CYW4343W) integrado é exposto via network — configuração de rede como interface de estação. Ligue a antena fornecida ao conector U.FL na placa antes de activar o rádio:
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#
O mesmo Murata 1DX também expõe Bluetooth LE 5.1. Use aioble — BLE Assíncrono para BLE compatível com asyncio — por exemplo, anuncie como periférico e aguarde que um central se ligue:
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())
Referência de barramento#
GPIO#
Use machine.Pin para ler ou controlar qualquer um dos pinos serigrafados. As saídas são CMOS a 3,3 V e podem absorver/fornecer até 20 mA por pino (140 mA no total em todo o cabeçalho).
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())
Qualquer pino de entrada também pode disparar uma interrupção em transições de flanco:
def handler(pin):
print("triggered:", pin)
Pin("D3", Pin.IN, Pin.PULL_UP).irq(
handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)
UART#
Bus | TX | RX | Nome Arduino |
|---|---|---|---|
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#
Bus | 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")
O Bus 2 (D20/D21, os pinos serigrafados SCL/SDA) é o bus Wire padrão do Arduino. O Bus 4 (SCL1/SDA1) é partilhado com a câmara e o controlador táctil GT911 do Giga Display Shield — os dispositivos do utilizador neste bus devem evitar os seguintes endereços (7 bits):
0x3C— OV5640 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— controlador táctil GT911 (Giga Display Shield)
O mesmo hardware também pode ser utilizado em modo alvo (escravo) através de machine.I2CTarget para expor uma região de memória a outro controlador I²C:
from machine import I2CTarget
buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)
SPI#
Bus | MOSI | MISO | SCK |
|---|---|---|---|
SPI1 | D90 | D89 | D91 |
SPI5 | D11 | D12 | D13 |
O SPI1 está exposto num cabeçalho dedicado de 6 pinos na frente da placa. O SPI5 está exposto nas etiquetas serigrafadas COPI/CIPO/SCK em D11/D12/D13.
Nota
Diagrama do cabeçalho frontal de 6 pinos SPI1 (J7):
Pino | Sinal |
|---|---|
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)#
Bus | 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#
O Giga R1 expõe doze canais ADC de 12 bits em A0–A11, todos referenciados a 3,3 V — read_u16 devolve 0–65535 para 0–3,3 V no pino. A8–A11 são pads _C apenas analógicos sem periférico GPIO:
from machine import ADC
import time
adc = ADC("A0")
while True:
voltage = adc.read_u16() * 3.3 / 65535
print(voltage)
time.sleep_ms(100)
Nota
A7 também está ligado à entrada de microfone na ficha de áudio TRRS de 3,5 mm — quando um auricular está ligado, ADC("A7") lê directamente o sinal analógico do microfone.
DAC#
Dois canais DAC de 12 bits estão expostos em DAC0 e DAC1 através de pyb.DAC. Ambos estão ligados à ficha de áudio TRRS de 3,5 mm como canais de saída de linha esquerdo e direito:
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#
Pino | Temporizador / canal |
|---|---|
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 |
Controle qualquer um deles através de machine.PWM
from machine import Pin, PWM
pwm = PWM(Pin("D2"), freq=1_000, duty_u16=32768)
Aviso
TIM1 está reservado para o relógio principal da câmara quando a câmara é inicializada através de csi — sensores de câmara. Os pinos cuja única função PWM é no TIM1 — D1, D10, D11, D12 — não podem ser controlados por PWM enquanto a câmara está activa. Os restantes pinos listados têm alternativas não TIM1.
Nota
Vários pinos partilham canais de temporizador:
TIM2 CH4 está em
D2eD20.TIM2 CH1 está em
D83/A7eD85/A13.TIM3 CH1 está em
D7,D56, eD68.TIM3 CH2 está em
D5eD15.TIM4 CH2 está em
D0eD6.TIM5 CH1 está em
D64eD83/A7.TIM5 CH4 está em
D2eD69.TIM8 CH1 está em
D4,D54, eD68.TIM8 CH1N está em
D5,D16,D57, eD85/A13.TIM8 CH2 está em
D11,D15,D37, eD59.TIM8 CH2N está em
D12,D38,D61, eD78/A2.TIM8 CH3 está em
D48eD58.TIM8 CH3N está em
D10,D46, eD79/A3.TIM15 CH1 está em
D3eD51.TIM15 CH2 está em
D2eD40.
Escolha um único utilizador por canal de temporizador.
Buses emulados por software#
machine.SoftI2C e machine.SoftSPI funcionam em qualquer GPIO se precisar de um bus adicional.
Sensor térmico (externo)#
O firmware inclui o controlador fir — driver de sensor térmico (fir == infravermelho longínquo) para sensores térmicos ligados externamente:
MLX90621 — array de infravermelhos 16 × 4
MLX90640 — array de infravermelhos 32 × 24
MLX90641 — array de infravermelhos 16 × 12
AMG8833 — array de infravermelhos 8 × 8
Ligue o módulo ao bus I²C da placa e leia fotogramas com 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())
O controlador fir comunica com o sensor apenas por I²C 1 — ligue o módulo a D8 (SCL) e D9 (SDA).
Temporização#
time#
O módulo time cobre atrasos bloqueantes, contagens monótonas e medição de tempo decorrido:
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)
Temporizadores virtuais#
machine.Timer agenda callbacks periódicos ou únicos sem consumir um slot de temporizador de hardware. Passe -1 como id para usar um temporizador virtual (por software):
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"))
Os valores de período são em milissegundos. Chame deinit() para parar e libertar o slot.
Relógio em tempo real#
machine.RTC mantém a hora do relógio entre reinícios — e entre desligamentos completos quando uma pilha de botão está ligada ao pino 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())
Watchdog#
machine.WDT reinicia a placa se a aplicação ficar bloqueada. Uma vez iniciado não pode ser parado ou reconfigurado — alimente‑o periodicamente dentro do seu loop principal:
from machine import WDT
wdt = WDT(timeout=5_000) # 5 second window
while True:
# ...do work...
wdt.feed()
Informação de arranque e runtime#
Actualização de firmware (DFU)#
O Giga R1 usa o reset de duplo toque padrão do Arduino para entrar no bootloader do Arduino. Prima rapidamente o botão RESET duas vezes — a placa re‑enumera sobre USB como dispositivo DFU e o OpenMV IDE pode instalar uma nova imagem de firmware. Se o bootloader estiver completamente em falta, mantenha premido o botão BOOT0 enquanto prime RESET para forçar o SoC a entrar no modo bootloader ROM.
Um script em execução pode reentrar no bootloader a pedido chamando machine.bootloader()
import machine
machine.bootloader()
Sistema de ficheiros e ordem de arranque#
O firmware do Giga R1 monta até dois sistemas de ficheiros no arranque:
Flash interna — montada sempre em
/flash. Contémmain.pyeREADME.txtpor defeito; criada no primeiro arranque.ROMFS — sistema de ficheiros somente de leitura mapeado em memória em
/rom, montado automaticamente pelo MicroPython no arranque.
Após a montagem, o directório de trabalho é definido para /flash. O interpretador executa então scripts desse directório:
boot.pyé executado em cada reset suave (arranque a frio,Ctrl‑Da partir do REPL, ou sempre que o script em execução termina).main.pyé executado apenas no arranque a frio, imediatamente apósboot.py. Os resets suaves subsequentes re‑executamboot.pymas vão directamente ao REPL — para re‑executarmain.pyé necessário reiniciar completamente a placa.
O main.py padrão fornecido numa placa recém‑instalada faz piscar o canal azul do LED RGB do utilizador como batimento (dois pulsos curtos, pausa curta), para que se possa verificar que o firmware arrancou correctamente sem nenhum anfitrião ligado.
sys.path é estendido para incluir ambos os sistemas de ficheiros e os seus subdirectórios lib/, pelo que os módulos importáveis podem estar em /flash/lib ou /rom/lib.
Quando ligado por USB, /flash também é enumerado como uma unidade de armazenamento de massa USB no anfitrião, permitindo editar boot.py, main.py e quaisquer outros ficheiros directamente. Ejeccte a unidade antes de reiniciar a placa para que o anfitrião descarregue as suas gravações em cache.
Nota
Como o sistema operativo trata a unidade como um dispositivo de bloco passivo, os ficheiros criados ou modificados pelo código em execução na câmara não aparecerão enquanto o anfitrião não remontar a unidade. Se tanto o sistema operativo como a câmara escreverem no mesmo sistema de ficheiros ao mesmo tempo, o sistema operativo prevalecerá e substituirá as alterações feitas pela câmara.
Nota
O canal vermelho do LED RGB do utilizador pode acender brevemente enquanto o anfitrião lê ou escreve na unidade de armazenamento de massa USB — isto é um indicador de actividade gerido pelo firmware, não uma falha.
Tamanhos de armazenamento#
O Giga R1 é fornecido com:
/flash— sistema de ficheiros FAT de 11 MB, leitura/escrita./rom— ROMFS de 4 MB somente de leitura mapeado em memória, utilizado para fornecer scripts e modelos de ML que beneficiam de acesso mmap sem cópia.
Indicador de falha grave#
Se o LED RGB do utilizador estiver a ciclar rapidamente por todas as cores — rápido o suficiente para parecer um LED branco a cintilar em vez de matizes distintos — o firmware encontrou uma falha grave irrecuperável. Reinstale o firmware para recuperar; se a reinstalação não ajudar, a placa pode estar fisicamente danificada.
Bibliotecas de software#
Consulte o índice da biblioteca para a lista completa de módulos — incluindo quais são exclusivos da versão Giga R1.