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 ビルド固有のものも含む) については、ライブラリインデックス を参照してください。