Arduino Giga R1 WiFi

Arduino Giga R1 WiFi は、STMicroelectronics の STM32H747XI を中心に構成された 101 × 53 mm の Mega フォームファクタ基板です。STM32H747XI は、480 MHz の Cortex‑M7 と 240 MHz の Cortex‑M4 を組み合わせたデュアルコア SoC です。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 の内蔵フラッシュ16 MB の外部 QSPI フラッシュ

  • ハードウェア JPEG エンコーダ/デコーダ

  • 22 ピンの Arducam 互換カメラ用フレックスコネクタ (J6) — OV5640 (5MP)、OV7670GC2145HM01B0HM0360 センサーモジュールをドライバでサポート。

  • MIPI‑DSI ディスプレイコネクタ (J5) — Arduino Giga Display Shield (480×800 静電容量式タッチパネル) 用。加えて、高度なキャリア向けの LTDC RGB ディスプレイエンジンを搭載。

  • 3.5 mm オーディオジャック — ステレオライン出力とマイク入力に対応。

  • 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/SCK (D89/D90/D91) が引き出されています。

  • JTAG / SWD — 高度なデバッグ用に上面のデバッグヘッダに引き出されています。

ピン配置

Arduino Giga R1 WiFi ピン配置

ピンリファレンス

Arduino Mega スタイルのヘッダには、76 本のデジタルピン (D0D75)、12 本のアナログピン (A0A11)、2 本の DAC 出力 (DAC0/DAC1)、セカンダリ I²C ペア (SDA1/SCL1)、および FDCAN2 ペア (CAN_RX/CAN_TX) が公開されています。基板前面の独立した 6 ピン SPI1 ヘッダには CIPO/COPI/SCK (D89/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 (カメラリセット — カメラがアクティブなときに占有されます)

D67

3.3 V

GPIO (カメラパワーダウン — カメラがアクティブなときに占有されます)

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 (オーディオジャックのライン出力 L)

DAC1 / A13 / D85

3.3 V

DAC1 OUT2 / TIM2 CH1 / SPI1 SCK / ADC12 IN19 (オーディオジャックのライン出力 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 の電源を直接駆動します。

Tip

バッテリー寿命推定ツール を使用すると、特定のアクティブ / ディープスリープのデューティサイクルにおいて、Giga R1 がバッテリーでどれくらいの時間動作するかをモデル化できます。

リカバリおよびデバッグ用ピン

  • RESET — 電源ヘッダ上に引き出されたピンと、基板上面のモーメンタリスイッチの両方があり、SoC の NRST ラインに接続されています。GND に引き下げるか、ボタンを押してリセットします。

Giga R1 は、Arduino のブートローダに入るために Arduino 標準の ダブルタップリセット を使用します。RESET ボタンを素早く 2 回押すと、基板が USB 上で DFU デバイスとして再列挙され、OpenMV IDE が新しいファームウェアイメージを書き込めるようになります。

ブートローダが完全に失われている場合は、BOOT0 ボタンを押しながら RESET を押して、SoC を強制的に ROM ブートローダモードにします。

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

カメラの リセット GPIO

D67

カメラの パワーダウン GPIO

SDA1 / SCL1

I²C 4 — カメラと共有されています。バスは使用可能ですが、センサーの I²C アドレスは避けてください

機械学習

ml --- 機械学習 は、CMSIS‑NN カーネルを使用して Cortex‑M7 上で量子化された TFLite モデルを実行します。コンパクトな検出器を数フレーム毎秒で動かすのに十分な速度です。読み取り専用の /rom ファイルシステム上のモデルは、RAM にコピーすることなくフラッシュから直接ロードされます。以下は、検出された顔とその 6 つのランドマークを各フレームにオーバーレイする 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)

J5Arduino Giga Display Shield 用の MIPI‑DSI コネクタです。これは ST7701 パネルドライバと GT911 タッチコントローラを中心に構成された 480 × 800 の静電容量式タッチパネルです。両方のドライバはファームウェアに凍結された状態で同梱されています。フレームバッファをプッシュするには 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) を使用し、LCD バックライトの有効化には D74 を、GT911 タッチの IRQ とリセットには D70/D71 を、DSI パネルの TE および RESET 信号には D68/D69 を使用します。

マイク (Display Shield)

Arduino Giga Display Shield は、STM32H747 の DFSDM ペリフェラルに配線されたデジタルマイクを搭載しています (マイククロックは D75、マイクデータは D73)。マイクは audio --- オーディオモジュール を通じてキャプチャされます。各バッファは符号付き 16 ビット PCM の bytearray として届き、DSP 用に ulab/numpy に直接渡す準備が整っています:

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 は、同じ I²C 4 バス上の ISSI IS31FL3197 3 チャンネル LED ドライバによって駆動される基板上の RGB LED を搭載しています。ドライバの AD ピンは GND に接続されているため、I²C アドレス 0x50 に位置します。LED を制御するには、コミュニティ製の IS31FL3197 ドライバを使用してください:

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 --- ネットワーク構成 を通じてステーションインターフェースとして公開されています。無線を起動する前に、付属アンテナを基板上の 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 も公開しています。asyncio に適した BLE には aioble --- 非同期 BLE を使用してください。例えば、ペリフェラルとしてアドバタイズし、セントラルの接続を待ちます:

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 個の 12 ビット ADC チャンネルを公開しており、すべて 3.3 V 基準 です。read_u16 は、ピンでの 0–3.3 V にわたって 0–65535 を返します。A8A11 は GPIO ペリフェラルを持たないアナログ専用の _C パッドです:

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

2 つの 12 ビット DAC チャンネルが pyb.DAC を通じて DAC0DAC1 に公開されています。どちらも 3.5 mm TRRS オーディオジャックの左右の ライン出力 チャンネルとして配線されています:

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 CH4D2 および D20 にあります。

  • TIM2 CH1D83/A7 および D85/A13 にあります。

  • TIM3 CH1D7D56および D68 にあります。

  • TIM3 CH2D5 および D15 にあります。

  • TIM4 CH2D0 および D6 にあります。

  • TIM5 CH1D64 および D83/A7 にあります。

  • TIM5 CH4D2 および D69 にあります。

  • TIM8 CH1D4D54および D68 にあります。

  • TIM8 CH1ND5D16D57および D85/A13 にあります。

  • TIM8 CH2D11D15D37および D59 にあります。

  • TIM8 CH2ND12D38D61および D78/A2 にあります。

  • TIM8 CH3D48 および D58 にあります。

  • TIM8 CH3ND10D46および D79/A3 にあります。

  • TIM15 CH1D3 および D51 にあります。

  • TIM15 CH2D2 および D40 にあります。

タイマーチャンネルごとに 1 つのコンシューマを選んでください。

ソフトウェアビットバンギングバス

追加のバスが必要な場合、machine.SoftI2Cmachine.SoftSPI は任意の GPIO で動作します。

サーマルセンサー (オフボード)

ファームウェアには、外部に配線されたサーマルイメージャー用の fir --- 熱センサードライバー(fir == 遠赤外線) ドライバが含まれています:

  • MLX90621 — 16 × 4 IR アレイ

  • MLX90640 — 32 × 24 IR アレイ

  • MLX90641 — 16 × 12 IR アレイ

  • AMG8833 — 8 × 8 IR アレイ

モジュールを基板の 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 は、ハードウェアタイマースロットを消費することなく、周期的またはワンショットのコールバックをスケジュールします。仮想 (ソフトウェア) タイマーを使用するには、id として -1 を渡します:

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 標準の ダブルタップリセット を使用します。RESET ボタンを素早く 2 回押すと、基板が USB 上で DFU デバイスとして再列挙され、OpenMV IDE が新しいファームウェアイメージを書き込めるようになります。ブートローダが完全に失われている場合は、BOOT0 ボタンを押しながら RESET を押して、SoC を強制的に ROM ブートローダモードにします。

実行中のスクリプトは、machine.bootloader() を呼び出すことで、必要に応じてブートローダに再び入ることができます:

import machine

machine.bootloader()

ファイルシステムとブート順序

Giga R1 ファームウェアは、起動時に最大 2 つのファイルシステムをマウントします:

  • 内蔵フラッシュ — 常に /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 の チャンネルを点滅させるだけです (2 回の短いパルス、短い間隔)。これにより、ホストを接続しなくてもファームウェアが正常に起動したことが分かります。

sys.path は両方のファイルシステムとそれらの lib/ サブディレクトリを含むように拡張されているため、インポート可能なモジュールは /flash/lib または /rom/lib に置くことができます。

USB 経由で接続されると、/flash はホスト上で USB マスストレージドライブとしても列挙され、boot.pymain.py、その他のファイルを直接編集できます。基板をリセットする前にドライブを取り出してください。これにより、ホストがキャッシュされた書き込みをフラッシュします。

注釈

OS はドライブをパッシブなブロックデバイスとして扱うため、カメラ上で実行されるコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS とカメラの両方が同じファイルシステムに同時に書き込むと、OS が優先され、カメラによって行われた変更が上書きされます。

注釈

ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED の チャンネルが短時間点灯することがあります。これはファームウェアによるアクティビティインジケータであり、故障ではありません。

ストレージサイズ

Giga R1 には以下が同梱されています:

  • /flash11 MB の FAT ファイルシステム、読み書き可能。

  • /rom4 MB の読み取り専用メモリマップド ROMFS。ゼロコピーの mmap アクセスから恩恵を受けるスクリプトや ML モデルの同梱に使用されます。

ハードフォルトインジケータ

ユーザー RGB LED がすべての色を高速に巡回している場合 — 個別の色合いというよりも きらめく白色 LED のように見えるほど高速な場合 — ファームウェアは回復不能なハードフォルトに陥っています。回復するにはファームウェアを再書き込みしてください。再書き込みで解決しない場合は、基板が物理的に損傷している可能性があります。

ソフトウェアライブラリ

モジュールの完全な一覧 (Giga R1 ビルド固有のものも含む) については、ライブラリインデックス を参照してください。