Arduino Giga R1 WiFi¶
Arduino Giga R1 WiFi — это плата форм‑фактора Mega размером 101 × 53 мм, построенная на базе STMicroelectronics STM32H747XI — двухъядерной SoC, объединяющей Cortex‑M7 на частоте 480 МГц с Cortex‑M4 на частоте 240 МГц. Прошивка OpenMV работает целиком на ядре M7. По сравнению со стандартной раскладкой разъёмов Arduino Mega Giga добавляет 22‑контактный гибкий разъём для камеры Arducam, разъём MIPI‑DSI для Arduino Giga Display Shield и 3,5‑мм стереофонический аудиоразъём.
Полную спецификацию, фотографии и размеры смотрите на странице продукта Arduino Giga R1 WiFi.
Ключевые особенности¶
STMicroelectronics STM32H747XI — двухъядерный Cortex‑M7 (480 МГц) + Cortex‑M4 (240 МГц). Прошивка OpenMV работает только на ядре M7; ядро M4 доступно через openamp для межпроцессорного обмена.
8 МБ внешней SDRAM плюс 2 МБ внутренней флеш‑памяти и 16 МБ внешней QSPI‑флеш‑памяти.
Аппаратный кодер/декодер JPEG.
22‑контактный гибкий разъём для камеры, совместимый с Arducam (
J6) — поддержка драйверов для модулей датчиков OV5640 (5 МП), OV7670, GC2145, HM01B0 и HM0360.Разъём дисплея MIPI‑DSI (
J5) для Arduino Giga Display Shield (ёмкостная сенсорная панель 480×800) плюс движок RGB‑дисплея LTDC для продвинутых плат‑носителей.3,5‑мм аудиоразъём со стереофоническим линейным выходом и микрофонным входом.
Wi‑Fi b/g/n (2,4 ГГц) + Bluetooth LE 5.1 через модуль Murata 1DX (CYW4343W) — подключается к прилагаемой антенне через расположенный на плате разъём U.FL.
USB‑C (full‑speed) для питания / последовательной связи / программирования.
Пользовательский ввод/вывод на разъёмах в стиле Mega —
D0–D75(цифровые),A0–A11(аналоговые),DAC0/DAC1(выходы DAC),CAN_RX/CAN_TX(FDCAN2) и пара I²CSDA1/SCL1во внутреннем ряду. Отдельный 6‑контактный разъём SPI1 в передней части платы выводитCIPO/COPI/SCK(D89/D90/D91).JTAG / SWD выведены на отладочный разъём с верхней стороны для продвинутой отладки.
Распиновка¶
Справочник по выводам¶
Разъёмы в стиле Arduino Mega предоставляют 76 цифровых выводов (D0–D75), 12 аналоговых выводов (A0–A11), два выхода 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 (VSYNC DCMI камеры) |
D55 |
3.3 V |
I2C3 SDA (HSYNC DCMI камеры) |
D56 |
3.3 V |
TIM3 CH1 / TIM13 CH1 (PXCLK DCMI камеры) |
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 (DSI RESET для Display Shield) |
D69 |
3.3 V |
TIM5 CH4 (DSI TE для 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 (данные микрофона DFSDM для Display Shield) |
D74 |
3.3 V |
GPIO (подсветка дисплея — занят Giga Display Shield) |
D75 |
3.3 V |
SPI2 SCK (тактовый сигнал микрофона DFSDM для 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 (микрофонный вход аудиоразъёма) |
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 ( |
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 (шина управления сенсором дисплея / камерой) |
SCL1 / D101 |
3.3 V |
I2C4 SCL (шина управления сенсором дисплея / камерой) |
RESET |
3.3 V |
нажмите расположенную на плате кнопку RESET или подтяните к GND для сброса |
LED_RED |
3.3 V |
красный канал RGB‑светодиода (активный низкий уровень) |
LED_GREEN |
3.3 V |
зелёный канал RGB‑светодиода (активный низкий уровень) |
LED_BLUE |
3.3 V |
синий канал RGB‑светодиода (активный низкий уровень) |
Примечание
A8–A11 — это только аналоговые контактные площадки на выводах _C STM32H747, у них нет функции GPIO, и их можно считывать только через ADC.
Выводы питания¶
Выводы разъёма Mega:
VIN — вход 6–32 В. Питает плату через расположенный на плате понижающий стабилизатор.
+5V — шина 5 В, питаемая от USB через диод или расположенный на плате понижающий стабилизатор.
+3V3 — основная шина 3,3 В.
IOREF — отражает напряжение ввода/вывода платы (3,3 В).
AREF — опорное аналоговое напряжение для выводов ADC. По умолчанию 3,3 В; подайте внешнее напряжение, чтобы использовать другое опорное значение.
OFF — подтяните к GND, чтобы отключить шину +3,3 В и выключить систему.
VRTC — вход для батарейки‑таблетки 3,0 В (максимум 3,3 В), который поддерживает работу встроенного RTC, пока остальная часть платы обесточена.
GND — общая земля.
Giga R1 может питаться любым из этих способов:
USB‑C — подаёт 5 В на расположенный на плате понижающий стабилизатор.
Вывод VIN — подайте стабилизированное питание 6–32 В напрямую.
Совет
Используйте оценщик времени работы от батареи, чтобы смоделировать, как долго Giga R1 проработает от батареи при заданном рабочем цикле активности / глубокого сна.
Выводы восстановления и отладки¶
RESET — это как выведенный контакт на разъёме питания, так и кнопка мгновенного действия в верхней части платы, подключённая к линии NRST SoC. Подтяните к GND или нажмите кнопку для сброса.
Giga R1 использует стандартный двойной сброс нажатием Arduino для входа в загрузчик Arduino. Быстро нажмите кнопку RESET дважды — плата заново перечислится по USB как устройство DFU, и OpenMV IDE сможет прошить новый образ прошивки.
Если загрузчик полностью отсутствует, удерживайте кнопку BOOT0, нажимая RESET, чтобы принудительно перевести SoC в режим ROM‑загрузчика.
Сигналы SWD STM32 выведены на 10‑контактный отладочный разъём Cortex Debug с шагом 1,27 мм в передней части платы. Подключите их через SEGGER J‑Link, ST‑Link или любой стандартный зонд ARM JTAG/SWD. Все отладочные сигналы привязаны к опорному уровню 3,3 В.
Встроенные периферийные устройства¶
Светодиоды¶
У Giga R1 есть один пользовательский RGB‑светодиод, программно управляемый через machine.LED:
from machine import LED
LED("LED_RED").on()
LED("LED_GREEN").on()
LED("LED_BLUE").on()
Отдельный светодиод питания на плате загорается всякий раз, когда поднята шина +3,3 В, и не управляется пользователем.
Разъём камеры (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 МП, цветной, до QSXGA (2592 × 1944).
OV7670 — 0,3 МП, цветной, до VGA (640 × 480).
GC2145 — 2 МП, цветной, до UXGA (1600 × 1200).
HM01B0 — 320 × 320, монохромный.
HM0360 — VGA (640 × 480), монохромный.
Предупреждение
Пока камера инициализирована, следующие выводы разъёма Mega заняты прошивкой и не могут использоваться:
Вывод |
Причина |
|---|---|
|
Сигналы данных + синхронизации DCMI на гибком разъёме камеры |
|
TIM1 CH3 — тактовый сигнал камеры |
|
GPIO сброса камеры |
|
GPIO отключения питания камеры |
|
I²C 4 — общая с камерой; шина пригодна для использования, но избегайте I²C‑адреса датчика |
Машинное обучение¶
ml — Машинное обучение выполняет квантованные модели TFLite на Cortex‑M7 с ядрами CMSIS‑NN — достаточно быстро для компактных детекторов с несколькими кадрами в секунду. Модели в файловой системе /rom, доступной только для чтения, загружаются прямо из флеш‑памяти без копирования в RAM. Вот детектор BlazeFace 128×128, накладывающий обнаруженное лицо и его шесть ориентиров на каждый кадр:
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 — это разъём MIPI‑DSI для Arduino Giga Display Shield — ёмкостной сенсорной панели 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 для IRQ и сброса сенсора GT911, а D68/D69 для сигналов TE и RESET панели DSI.
Микрофон (Display Shield)¶
Arduino Giga Display Shield несёт цифровой микрофон, подключённый к периферийному устройству DFSDM STM32H747 (тактовый сигнал микрофона на D75, данные микрофона на D73). Микрофон захватывается через audio — Модуль Audio. Каждый буфер поступает в виде знакового 16‑битного PCM bytearray, готового для передачи в 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 несёт 6‑осевой IMU Bosch BMI270 (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‑светодиод (Display Shield)¶
Arduino Giga Display Shield несёт расположенный на плате RGB‑светодиод, управляемый 3‑канальным драйвером светодиодов ISSI IS31FL3197 на той же шине I²C 4. Вывод AD драйвера привязан к GND, поэтому он находится по I²C‑адресу 0x50. Используйте драйвер сообщества 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. Используйте aioble — асинхронный BLE для удобной работы с BLE через asyncio — например, рекламируйте плату как периферийное устройство и ожидайте подключения центрального устройства:
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 В CMOS и могут принимать/отдавать до 20 мА на вывод (140 мА суммарно по всему разъёму).
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) — это используемая по умолчанию шина Wire Arduino. Шина 4 (SCL1/SDA1) общая с камерой и контроллером сенсора GT911 на Giga Display Shield — пользовательские устройства на этой шине должны избегать следующих адресов (7‑битных):
0x3C— OV5640 / GC21450x24— HM01B0 / HM03600x21— OV76700x5D— контроллер сенсора GT911 (Giga Display Shield)
То же оборудование можно использовать и в режиме целевого устройства (slave) через 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 выведен на обозначенные на шелкографии метки COPI/CIPO/SCK на D11/D12/D13.
Примечание
Распиновка переднего 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 предоставляет двенадцать 12‑битных каналов ADC на A0–A11, все привязаны к опорному уровню 3,3 В — read_u16 возвращает 0–65535 в диапазоне 0–3,3 В на выводе. A8–A11 — это только аналоговые контактные площадки _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‑мм аудиоразъёме TRRS — когда подключена гарнитура, ADC("A7") считывает аналоговый сигнал микрофона напрямую.
DAC¶
Два 12‑битных канала DAC выведены на DAC0 и DAC1 через pyb.DAC. Оба подключены к 3,5‑мм аудиоразъёму 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.
Выбирайте по одному потребителю на канал таймера.
Программно эмулируемые (bit‑banged) шины¶
machine.SoftI2C и machine.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. Быстро нажмите кнопку RESET дважды — плата заново перечислится по USB как устройство DFU, и OpenMV IDE сможет прошить новый образ прошивки. Если загрузчик полностью отсутствует, удерживайте кнопку BOOT0, нажимая RESET, чтобы принудительно перевести SoC в режим ROM‑загрузчика.
Работающий скрипт может повторно войти в загрузчик по запросу, вызвав machine.bootloader():
import machine
machine.bootloader()
Файловая система и порядок загрузки¶
Прошивка Giga R1 монтирует при загрузке до двух файловых систем:
Внутренняя флеш‑память — всегда монтируется в
/flash. По умолчанию содержитmain.pyиREADME.txt; создаётся при самой первой загрузке.ROMFS — файловая система только для чтения с отображением в память в
/rom, автоматически монтируемая MicroPython при запуске.
После монтирования рабочим каталогом устанавливается /flash. Затем интерпретатор запускает скрипты из этого каталога:
boot.pyвыполняется при каждом программном сбросе (холодная загрузка,Ctrl‑Dиз REPL или всякий раз, когда работающий скрипт завершается).main.pyвыполняется только при холодной загрузке, сразу послеboot.py. Последующие программные сбросы повторно запускаютboot.py, но сразу переходят к REPL — чтобы повторно запуститьmain.py, нужно полностью сбросить плату.
main.py, поставляемый по умолчанию на свежепрошитой плате, просто мигает синим каналом пользовательского RGB‑светодиода как сигнал работоспособности (два коротких импульса, короткая пауза), так что вы можете определить, что прошивка загрузилась корректно, без подключения какого‑либо хоста.
sys.path расширяется, чтобы включить обе файловые системы и их подкаталоги lib/, поэтому импортируемые модули могут находиться в /flash/lib или /rom/lib.
При подключении по USB /flash также перечисляется на хосте как USB‑накопитель, позволяя вам редактировать boot.py, main.py и любые другие файлы напрямую. Извлеките накопитель перед сбросом платы, чтобы хост сбросил свои кэшированные записи.
Примечание
Поскольку ОС обращается с накопителем как с пассивным блочным устройством, файлы, созданные или изменённые кодом, работающим на камере, не появятся, пока хост не перемонтирует накопитель. Если и ОС, и камера записывают в одну и ту же файловую систему одновременно, ОС победит и перезапишет изменения, сделанные камерой.
Примечание
Красный канал пользовательского RGB‑светодиода может кратковременно загораться, пока хост читает с USB‑накопителя или записывает на него — это управляемый прошивкой индикатор активности, а не неисправность.
Объёмы хранилища¶
Giga R1 поставляется с:
/flash— файловая система FAT объёмом 11 МБ, для чтения/записи./rom— отображаемая в память ROMFS объёмом 4 МБ только для чтения, используется для поставки скриптов и моделей ML, которым выгоден доступ через mmap без копирования.
Индикатор аппаратного сбоя (hard fault)¶
Если пользовательский RGB‑светодиод быстро перебирает все цвета — достаточно быстро, чтобы это выглядело как мерцающий белый светодиод, а не как отдельные оттенки — прошивка столкнулась с неустранимым аппаратным сбоем. Перепрошейте прошивку для восстановления; если перепрошивка не помогает, плата может быть физически повреждена.
Программные библиотеки¶
Полный список модулей — включая те, что уникальны для сборки Giga R1 — смотрите в индексе библиотек.