Arduino Giga R1 WiFi

Arduino Giga R1 WiFi 是一塊 101 × 53 mm 的 Mega 規格主機板,以 STMicroelectronics STM32H747XI 為核心建構——這是一顆雙核心 SoC,結合了運行於 480 MHz 的 Cortex‑M7 與運行於 240 MHz 的 Cortex‑M4。OpenMV 韌體完全運行於 M7 核心上。Giga 在標準的 Arduino Mega 排針配置之上,增加了一個 22 接腳的 Arducam 相機軟排線連接器、一個用於 Arduino Giga Display Shield 的 MIPI‑DSI 連接器,以及一個 3.5 mm 立體聲音訊插孔。

Arduino Giga R1 WiFi

如需完整的規格書、照片與尺寸資訊,請參閱 Arduino Giga R1 WiFi 產品頁面

重點特色

  • STMicroelectronics STM32H747XI 雙核心 Cortex‑M7(480 MHz)+ Cortex‑M4(240 MHz)。OpenMV 韌體僅運行於 M7 核心上;M4 核心透過 openamp 對外提供,用於處理器間通訊。

  • 8 MB 外部 SDRAM 外加 2 MB 內部 flash 以及 16 MB 外部 QSPI flash

  • 硬體 JPEG 編碼器/解碼器

  • 22 接腳 Arducam 相容相機軟排線連接器J6)——驅動程式支援 OV5640(5MP)、OV7670GC2145HM01B0HM0360 感測器模組。

  • MIPI‑DSI 顯示器連接器J5)用於 Arduino Giga Display Shield(480×800 電容式觸控面板),並附帶一個供進階載板使用的 LTDC RGB 顯示引擎。

  • 3.5 mm 音訊插孔,具備立體聲 line‑out 與麥克風輸入。

  • Wi‑Fi b/g/n(2.4 GHz)+ Bluetooth LE 5.1,透過 Murata 1DX(CYW4343W)模組提供——經由板載 U.FL 連接器 連接至隨附的天線。

  • USB‑C(全速)用於供電/序列通訊/燒錄。

  • 使用者 I/O 位於 Mega 樣式排針上——D0D75(數位)、A0A11(類比)、DAC0/DAC1(DAC 輸出)、CAN_RX/CAN_TX(FDCAN2),以及內排的 SDA1/SCL1 I²C 接腳對。主機板正面另有一個獨立的 6 接腳 SPI1 排針,引出 CIPO/COPI/SCKD89/D90/D91)。

  • JTAG / SWD 引出於頂面除錯排針上,供進階除錯使用。

接腳配置圖

Arduino Giga R1 WiFi 接腳配置圖

接腳參考

Arduino Mega 樣式排針引出 76 個數位接腳(D0D75)、12 個類比接腳(A0A11)、兩個 DAC 輸出(DAC0/DAC1)、一組次要 I²C 接腳對(SDA1/SCL1),以及一組 FDCAN2 接腳對(CAN_RX/CAN_TX)。主機板正面另有一個獨立的 6 接腳 SPI1 排針,引出 CIPO/COPI/SCKD89/D90/D91)。

接腳名稱

參考

功能

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)

D55

3.3 V

I2C3 SDA(相機 DCMI HSYNC)

D56

3.3 V

TIM3 CH1 / TIM13 CH1(相機 DCMI PXCLK)

D57

3.3 V

TIM8 CH1N / UART8 RX(相機主時脈——TIM1 CH3)

D58

3.3 V

TIM8 CH3(相機 DCMI D7)

D59

3.3 V

TIM8 CH2(相機 DCMI D6)

D60

3.3 V

GPIO(相機 DCMI D5)

D61

3.3 V

TIM8 CH2N / UART4 RX(相機 DCMI D4)

D62

3.3 V

SPI1 SCK(相機 DCMI D3)

D63

3.3 V

TIM5 CH2 / I2C4 SCL(顯示器 I²C)

D64

3.3 V

TIM5 CH1(相機 DCMI D1)

D65

3.3 V

TIM12 CH2(相機 DCMI D0)

D66

3.3 V

GPIO(相機 reset——相機作用時被占用)

D67

3.3 V

GPIO(相機 power‑down——相機作用時被占用)

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 麥克風資料)

D74

3.3 V

GPIO(顯示器背光——被 Giga Display Shield 占用)

D75

3.3 V

SPI2 SCK(Display Shield DFSDM 麥克風時脈)

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(音訊插孔麥克風輸入)

A8

3.3 V

ADC3 IN0(僅類比)

A9

3.3 V

ADC3 IN1(僅類比)

A10

3.3 V

ADC12 IN1(僅類比)

A11

3.3 V

ADC12 IN0(僅類比)

DAC0 / A12 / D84

3.3 V

DAC1 OUT1 / ADC12 IN18(音訊插孔 line‑out L)

DAC1 / A13 / D85

3.3 V

DAC1 OUT2 / TIM2 CH1 / SPI1 SCK / ADC12 IN19(音訊插孔 line‑out R)

D89

3.3 V

SPI1 MISO(正面 SPI 排針上的 CIPO

D90

3.3 V

SPI1 MOSI(正面 SPI 排針上的 COPI

D91

3.3 V

SPI1 SCK(正面 SPI 排針上的 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(顯示器觸控/相機控制匯流排)

SCL1 / D101

3.3 V

I2C4 SCL(顯示器觸控/相機控制匯流排)

RESET

3.3 V

按下板載 RESET 按鈕或拉至 GND 以重置

LED_RED

3.3 V

RGB LED 紅色通道(低電位有效)

LED_GREEN

3.3 V

RGB LED 綠色通道(低電位有效)

LED_BLUE

3.3 V

RGB LED 藍色通道(低電位有效)

備註

A8A11 是 STM32H747 的 _C 接腳上的 僅類比 焊盤——它們沒有 GPIO 功能,只能透過 ADC 讀取。

電源接腳

Mega 排針接腳:

  • VIN —— 6–32 V 輸入。透過板載降壓穩壓器為主機板供電。

  • +5V —— 由 USB 經二極體供電,或由板載降壓穩壓器供電的 5 V 電軌。

  • +3V3 —— 主要的 3.3 V 電軌。

  • IOREF —— 反映主機板的 I/O 電壓(3.3 V)。

  • AREF —— ADC 接腳的類比電壓參考。預設為 3.3 V;可由外部驅動以使用不同的參考電壓。

  • OFF —— 拉至 GND 以關閉 +3.3 V 電軌並使系統關機。

  • VRTC —— 3.0 V 鈕扣電池輸入(最高 3.3 V),在主機板其餘部分關機時,仍能保持晶片內 RTC 運行。

  • GND —— 共同接地。

Giga R1 可透過下列任一路徑供電:

  • USB‑C —— 為板載降壓穩壓器提供 5 V。

  • VIN 接腳 —— 直接輸入經穩壓的 6–32 V 電源。

小訣竅

使用 電池續航力估算器 來推估在給定的作用/深度睡眠占空比下,Giga R1 以電池供電可運行多久。

復原與除錯接腳

  • RESET —— 同時以電源排針上的引出接腳與主機板頂部的瞬時開關形式存在,兩者皆連接至 SoC 的 NRST 線。拉至 GND 或按下按鈕即可重置。

Giga R1 採用 Arduino 標準的 雙擊重置 來進入 Arduino 的 bootloader。快速按下 RESET 按鈕兩次——主機板便會以 DFU 裝置的形式透過 USB 重新列舉,OpenMV IDE 即可燒錄新的韌體映像檔。

如果 bootloader 完全遺失,可在按下 RESET 的同時按住 BOOT0 按鈕,強制 SoC 進入 ROM bootloader 模式。

STM32 的 SWD 訊號引出於主機板正面的 10 接腳 1.27 mm Cortex Debug 排針 上。可透過 SEGGER J‑Link、ST‑Link 或任何標準的 ARM JTAG/SWD 探針連接。所有除錯訊號皆以 3.3 V 為參考電位

板載周邊裝置

LED

Giga R1 具有一顆使用者 RGB LED,可透過 machine.LED 以軟體控制::

from machine import LED

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

主機板上另有一顆獨立的 電源 LED,只要 +3.3 V 電軌啟動就會亮起,使用者無法控制。

相機連接器(J6)

J6 是一個 22 接腳的 Arducam 相容相機軟排線連接器。插入任一受支援的感測器模組後,韌體便會透過 csi --- 相機感測器 模組自動探測它們::

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

受支援的感測器:

  • OV5640 —— 5 MP 彩色,最高可達 QSXGA(2592 × 1944)。

  • OV7670 —— 0.3 MP 彩色,最高可達 VGA(640 × 480)。

  • GC2145 —— 2 MP 彩色,最高可達 UXGA(1600 × 1200)。

  • HM01B0 —— 320 × 320 單色。

  • HM0360 —— VGA(640 × 480)單色。

警告

相機初始化後,下列 Mega 排針接腳會被韌體占用,無法使用

接腳

原因

D54D65

相機軟排線連接器上的 DCMI 資料 + 同步訊號

D57

TIM1 CH3 —— 相機主時脈

D66

相機 reset GPIO

D67

相機 power‑down GPIO

SDA1 / SCL1

I²C 4 —— 與相機共用;匯流排可用,但須避開感測器的 I²C 位址

機器學習

ml --- 機器學習 使用 CMSIS‑NN 核心在 Cortex‑M7 上運行量化過的 TFLite 模型——足夠快到能讓精簡型偵測器達到每秒數幀。位於唯讀 /rom 檔案系統上的模型可直接從 flash 載入,無需複製到 RAM。以下是一個 128×128 的 BlazeFace 偵測器,在每一影格上疊加所偵測到的臉部及其六個關鍵點::

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 核心

Cortex‑M4 核心透過 openamp 對外提供,用於處理器間通訊。OpenMV 韌體僅運行於 M7 上;M4 本身沒有自己的 MicroPython 執行環境,因此要使用它就必須建構一個獨立的 C 韌體映像檔,並透過 openamp.RemoteProc 從檔案系統載入。一個實作虛擬 UART 端點的預先建構範例韌體可在 openamp_vuart 儲存庫中取得——依照其 README 來建構 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)

實務上,這項支援最好視為 openamp 介面的示範,而非可運作的雙核心平台——M4 無法獨立於 M7 進行重置,因此停止 M4 會強制整個系統重新開機。

顯示器(J5)

J5 是一個用於 Arduino Giga Display Shield 的 MIPI‑DSI 連接器——這是一塊 480 × 800 電容式觸控面板,以 ST7701 面板驅動器與 GT911 觸控控制器為核心建構。兩個驅動程式皆隨韌體凍結內建。使用 display --- 顯示器驅動程式 來推送影格緩衝區,並使用 gt911.GT911 處理觸控輸入。

下方範例將相機影像鏡像至一個直向的 800 × 480 顯示視窗,並將每個觸控接觸點疊加為一個彩色圓圈::

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

警告

Giga Display Shield 與相機共用相同的 I²C 4 匯流排(SDA1/SCL1),使用 D74 控制 LCD 背光啟用、使用 D70/D71 處理 GT911 觸控 IRQ 與 reset,並使用 D68/D69 處理 DSI 面板的 TE 與 RESET 訊號。

麥克風(Display Shield)

Arduino Giga Display Shield 搭載一顆數位麥克風,連接至 STM32H747 的 DFSDM 周邊裝置(麥克風時脈在 D75,麥克風資料在 D73)。麥克風透過 audio --- 音訊模組 擷取。每個緩衝區以帶符號 16 位元 PCM bytearray 的形式抵達,可直接饋入 ulab/numpy 進行 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 搭載一顆 Bosch BMI270 6 軸 IMU(3D 加速度計 + 3D 陀螺儀),位於同一條 I²C 4 匯流排上,位址為 0x68。使用社群的 micropython_bmi270 驅動程式來讀取它::

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)

完整的暫存器對應表收錄於 BMI270 規格書 中。

RGB LED(Display Shield)

Arduino Giga Display Shield 搭載一顆板載 RGB LED,由一顆 ISSI IS31FL3197 3 通道 LED 驅動器驅動,位於同一條 I²C 4 匯流排上。該驅動器的 AD 接腳連接至 GND,因此其 I²C 位址為 0x50。使用社群的 IS31FL3197 驅動程式來控制這顆 LED::

from machine import I2C
from is31fl3197 import IS31FL3197

led = IS31FL3197(I2C(4, freq=400_000))
led.set_color(255, 0, 0)   # full red

完整的暫存器對應表收錄於 IS31FL3197 規格書 中。

Wi‑Fi

板載的 Murata 1DX(CYW4343W)透過 network --- 網路設定 以 station 介面形式對外提供。在啟動無線電之前,請先將隨附的天線連接至板載 U.FL 連接器::

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

同一顆 Murata 1DX 也提供 Bluetooth LE 5.1。使用 aioble --- 非同步 BLE 來進行對 asyncio 友善的 BLE——例如,以周邊裝置身分廣播並等待 central 連線::

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

匯流排參考

GPIO

使用 machine.Pin 來讀取或驅動任一絲印標示的接腳。輸出為 3.3 V CMOS,每個接腳可吸入/輸出最高 20 mA(整條排針合計 140 mA)。

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

任何輸入接腳也可在邊緣轉態時觸發中斷::

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

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

UART

匯流排

TX

RX

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

匯流排

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

匯流排 2(D20/D21,即絲印標示的 SCL/SDA)是預設的 Arduino Wire 匯流排。匯流排 4(SCL1/SDA1)與相機及 Giga Display Shield 的 GT911 觸控控制器共用——此匯流排上的使用者裝置必須避開下列位址(7 位元):

  • 0x3C —— OV5640 / GC2145

  • 0x24 —— HM01B0 / HM0360

  • 0x21 —— OV7670

  • 0x5D —— GT911 觸控控制器(Giga Display Shield)

同一套硬體也可透過 machine.I2CTarget 以目標(從)模式運作,將一塊記憶體區域對另一個 I²C 控制器公開::

from machine import I2CTarget

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

SPI

匯流排

MOSI

MISO

SCK

SPI1

D90

D89

D91

SPI5

D11

D12

D13

SPI1 引出於主機板正面的一個專用 6 接腳排針上。SPI5 引出於 D11/D12/D13 上絲印標示的 COPI/CIPO/SCK 標籤上。

備註

正面 6 接腳 SPI1 排針(J7)的接腳配置:

接腳

訊號

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)

匯流排

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 在 A0–A11 上引出十二個 12 位元 ADC 通道,全部以 3.3 V 為參考電位——read_u16 在接腳上 0–3.3 V 的範圍內回傳 0–65535。A8A11 是僅類比的 _C 焊盤,沒有 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)

備註

A7 也連接至 3.5 mm TRRS 音訊插孔上的 麥克風輸入——當耳麥插入時,ADC("A7") 會直接讀取類比麥克風訊號。

DAC

兩個 12 位元 DAC 通道透過 pyb.DACDAC0DAC1 上引出。兩者皆連接至 3.5 mm TRRS 音訊插孔,作為左右 line‑out 通道::

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

接腳

計時器/通道

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

透過 machine.PWM 驅動其中任一個::

from machine import Pin, PWM

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

警告

TIM1 在透過 csi --- 相機感測器 初始化相機時,會保留作為 相機主時脈。唯一 PWM 功能位於 TIM1 上的接腳——D1D10D11D12——在相機作用期間無法以 PWM 驅動。其他列出的接腳全都有非 TIM1 的替代通道。

備註

有數個接腳共用計時器通道:

  • TIM2 CH4 位於 D2 D20

  • TIM2 CH1 位於 D83/A7 D85/A13

  • TIM3 CH1 位於 D7D56 D68

  • TIM3 CH2 位於 D5 D15

  • TIM4 CH2 位於 D0 D6

  • TIM5 CH1 位於 D64 D83/A7

  • TIM5 CH4 位於 D2 D69

  • TIM8 CH1 位於 D4D54 D68

  • TIM8 CH1N 位於 D5D16D57 D85/A13

  • TIM8 CH2 位於 D11D15D37 D59

  • TIM8 CH2N 位於 D12D38D61 D78/A2

  • TIM8 CH3 位於 D48 D58

  • TIM8 CH3N 位於 D10D46 D79/A3

  • TIM15 CH1 位於 D3 D51

  • TIM15 CH2 位於 D2 D40

每個計時器通道只能挑選一個使用者。

軟體位元拍打(bit‑banged)匯流排

machine.SoftI2Cmachine.SoftSPI 可在任何 GPIO 上運作,供您需要額外匯流排時使用。

熱感測器(板外)

韌體內含 fir --- 熱感測器驅動程式 (fir == far infrared,遠紅外線) 驅動程式,供外接的熱成像儀使用:

  • MLX90621 —— 16 × 4 紅外線陣列

  • MLX90640 —— 32 × 24 紅外線陣列

  • MLX90641 —— 16 × 12 紅外線陣列

  • AMG8833 —— 8 × 8 紅外線陣列

將模組接線至主機板的 I²C 匯流排,並以 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())

fir 驅動程式只透過 I²C 1 與感測器通訊——請將模組接線至 D8(SCL)與 D9(SDA)。

計時

time

time 模組涵蓋阻塞式延遲、單調遞增滴答計數,以及經過時間的量測::

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)

虛擬計時器

machine.Timer 可排程週期性或單次回呼函式,而不會占用硬體計時器槽位。將 -1 作為 id 傳入即可使用虛擬(軟體)計時器::

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

週期值的單位為毫秒。呼叫 deinit() 可停止並釋放該槽位。

即時時鐘

machine.RTC 可在多次重置之間——以及在 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())

看門狗

machine.WDT 會在應用程式當機時重置主機板。一旦啟動就無法停止或重新設定——請在主迴圈內定期餵食它::

from machine import WDT

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

開機與執行階段資訊

韌體更新(DFU)

Giga R1 採用 Arduino 標準的 雙擊重置 來進入 Arduino 的 bootloader。快速按下 RESET 按鈕兩次——主機板便會以 DFU 裝置的形式透過 USB 重新列舉,OpenMV IDE 即可燒錄新的韌體映像檔。如果 bootloader 完全遺失,可在按下 RESET 的同時按住 BOOT0 按鈕,強制 SoC 進入 ROM bootloader 模式。

執行中的指令碼可呼叫 machine.bootloader() 來隨時重新進入 bootloader::

import machine

machine.bootloader()

檔案系統與開機順序

Giga R1 韌體在開機時最多掛載兩個檔案系統:

  • 內部 flash —— 一律掛載於 /flash。預設存放 main.pyREADME.txt;於最初次開機時建立。

  • ROMFS —— 唯讀、記憶體映射的檔案系統,位於 /rom,由 MicroPython 在啟動時自動掛載。

掛載完成後,工作目錄會被設定為 /flash。直譯器接著會從該目錄執行指令碼:

  • boot.py 會在 每一次 軟重置時執行(冷開機、從 REPL 按下 Ctrl‑D,或執行中的指令碼返回時)。

  • main.py 僅在冷開機時 執行,緊接在 boot.py 之後。後續的軟重置會重新執行 boot.py,但會直接進入 REPL——若要重新執行 main.py,必須完全重置主機板。

剛燒錄完畢的主機板上隨附的預設 main.py,只會閃爍使用者 RGB LED 的 藍色 通道作為心跳訊號(兩次短脈衝、短暫間隔),如此一來即使沒有連接任何主機端,您也能判斷韌體已順利開機。

sys.path 會被擴充以納入兩個檔案系統及其 lib/ 子目錄,因此可匯入的模組可放在 /flash/lib/rom/lib 中。

透過 USB 連接時,/flash 也會在主機端列舉為一個 USB 大容量儲存磁碟,讓您可以直接編輯 boot.pymain.py 及任何其他檔案。在重置主機板前請先退出該磁碟,以便主機端寫回其快取的寫入內容。

備註

由於作業系統將該磁碟視為被動的區塊裝置,相機上執行的程式碼所建立或修改的檔案,在主機端重新掛載磁碟之前並不會顯示出來。若作業系統與相機同時寫入同一個檔案系統,作業系統將勝出,並覆寫相機所做的變更。

備註

當主機端正從 USB 大容量儲存磁碟讀取或寫入時,使用者 RGB LED 的 紅色 通道可能會短暫亮起——這是韌體驅動的活動指示,並非故障。

儲存容量

Giga R1 隨附:

  • /flash —— 11 MB FAT 檔案系統,可讀寫。

  • /rom —— 4 MB 唯讀記憶體映射 ROMFS,用於隨附那些可受益於零複製 mmap 存取的指令碼與 ML 模型。

硬故障(hard‑fault)指示

如果使用者 RGB LED 正快速地循環顯示所有色彩——快到看起來像一顆 閃爍的白色 LED 而非各自分明的色調——表示韌體遭遇了無法復原的硬故障。請重新燒錄韌體以復原;若重新燒錄仍無效,主機板可能已實體損壞。

軟體函式庫

完整的模組清單請參閱 函式庫索引——其中包括哪些模組是 Giga R1 版本所獨有的。