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 製品ページ を参照してください。
主な特徴#
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)、OV7670、GC2145、HM01B0、HM0360 センサーモジュールをドライバでサポート。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 スタイルのヘッダ上に
D0–D75(デジタル)、A0–A11(アナログ)、DAC0/DAC1(DAC 出力)、CAN_RX/CAN_TX(FDCAN2)、および内側列のSDA1/SCL1I²C ペアを備えています。基板前面の独立した 6 ピン SPI1 ヘッダにはCIPO/COPI/SCK(D89/D90/D91) が引き出されています。JTAG / SWD — 高度なデバッグ用に上面のデバッグヘッダに引き出されています。
ピン配置#
ピンリファレンス#
Arduino Mega スタイルのヘッダには、76 本のデジタルピン (D0–D75)、12 本のアナログピン (A0–A11)、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 ヘッダの |
D90 | 3.3 V | SPI1 MOSI (前面 SPI ヘッダの |
D91 | 3.3 V | SPI1 SCK (前面 SPI ヘッダの |
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 の青チャンネル (アクティブロー) |
注釈
A8–A11 は 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 ヘッダのピンはファームウェアによって占有され、使用できません:
ピン | 理由 |
|---|---|
| カメラ用フレックスコネクタ上の DCMI データ + 同期信号 |
| TIM1 CH3 — カメラマスタークロック |
| カメラの リセット GPIO |
| カメラの パワーダウン GPIO |
| 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)#
J5 は Arduino 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 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— 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 |
|
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)#
バス | 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 を返します。A8–A11 は 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 を通じて DAC0 と DAC1 に公開されています。どちらも 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 のみのピン — D1、D10、D11、D12 — は、カメラがアクティブな間 PWM 駆動できません。その他の一覧されたピンはすべて TIM1 以外の代替を持っています。
注釈
いくつかのピンはタイマーチャンネルを共有しています:
TIM2 CH4 は
D2およびD20にあります。TIM2 CH1 は
D83/A7およびD85/A13にあります。TIM3 CH1 は
D7、D56、およびD68にあります。TIM3 CH2 は
D5およびD15にあります。TIM4 CH2 は
D0およびD6にあります。TIM5 CH1 は
D64およびD83/A7にあります。TIM5 CH4 は
D2およびD69にあります。TIM8 CH1 は
D4、D54、およびD68にあります。TIM8 CH1N は
D5、D16、D57、およびD85/A13にあります。TIM8 CH2 は
D11、D15、D37、およびD59にあります。TIM8 CH2N は
D12、D38、D61、およびD78/A2にあります。TIM8 CH3 は
D48およびD58にあります。TIM8 CH3N は
D10、D46、およびD79/A3にあります。TIM15 CH1 は
D3およびD51にあります。TIM15 CH2 は
D2およびD40にあります。
タイマーチャンネルごとに 1 つのコンシューマを選んでください。
ソフトウェアビットバンギングバス#
追加のバスが必要な場合、machine.SoftI2C と machine.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.pyとREADME.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.py、main.py、その他のファイルを直接編集できます。基板をリセットする前にドライブを取り出してください。これにより、ホストがキャッシュされた書き込みをフラッシュします。
注釈
OS はドライブをパッシブなブロックデバイスとして扱うため、カメラ上で実行されるコードによって作成または変更されたファイルは、ホストがドライブを再マウントするまで表示されません。OS とカメラの両方が同じファイルシステムに同時に書き込むと、OS が優先され、カメラによって行われた変更が上書きされます。
注釈
ホストが USB マスストレージドライブから読み取りまたは書き込みを行っている間、ユーザー RGB LED の 赤 チャンネルが短時間点灯することがあります。これはファームウェアによるアクティビティインジケータであり、故障ではありません。
ストレージサイズ#
Giga R1 には以下が同梱されています:
/flash— 11 MB の FAT ファイルシステム、読み書き可能。/rom— 4 MB の読み取り専用メモリマップド ROMFS。ゼロコピーの mmap アクセスから恩恵を受けるスクリプトや ML モデルの同梱に使用されます。
ハードフォルトインジケータ#
ユーザー RGB LED がすべての色を高速に巡回している場合 — 個別の色合いというよりも きらめく白色 LED のように見えるほど高速な場合 — ファームウェアは回復不能なハードフォルトに陥っています。回復するにはファームウェアを再書き込みしてください。再書き込みで解決しない場合は、基板が物理的に損傷している可能性があります。
ソフトウェアライブラリ#
モジュールの完全な一覧 (Giga R1 ビルド固有のものも含む) については、ライブラリインデックス を参照してください。