Arduino Giga R1 WiFi

إن Arduino Giga R1 WiFi هي لوحة بقياس 101 × 53 مم وبعامل شكل Mega مبنية حول STMicroelectronics STM32H747XI — وهو نظام على شريحة ثنائي النواة يجمع بين Cortex‑M7 بتردد 480 ميجاهرتز وCortex‑M4 بتردد 240 ميجاهرتز. يعمل برنامج OpenMV الثابت بالكامل على نواة M7. تضيف Giga إلى تخطيط رؤوس Arduino Mega القياسي موصّل كاميرا مرن متوافق مع Arducam بعدد 22 دبوسًا، وموصّل MIPI‑DSI لـ Arduino Giga Display Shield، ومقبس صوت ستيريو بقياس 3.5 مم.

Arduino Giga R1 WiFi

للاطلاع على ورقة البيانات الكاملة والصور والأبعاد، راجع صفحة منتج Arduino Giga R1 WiFi.

أبرز الميزات

  • STMicroelectronics STM32H747XI مزدوج النواة Cortex‑M7 (480 ميجاهرتز) + Cortex‑M4 (240 ميجاهرتز). يعمل برنامج OpenMV الثابت على نواة M7 فقط؛ نواة M4 متاحة من خلال openamp للاتصال بين المعالجات.

  • ذاكرة SDRAM خارجية بسعة 8 ميجابايت بالإضافة إلى ذاكرة فلاش داخلية بسعة 2 ميجابايت وذاكرة فلاش QSPI خارجية بسعة 16 ميجابايت.

  • مشفّر/مفكّك ترميز JPEG بالعتاد.

  • موصّل كاميرا مرن بعدد 22 دبوسًا متوافق مع Arducam (J6) — دعم برمجي للوحدات الاستشعارية OV5640 (5 ميجابكسل) وOV7670 وGC2145 وHM01B0 وHM0360.

  • موصّل شاشة MIPI‑DSI (J5) لـ Arduino Giga Display Shield (لوحة لمس سعوية بدقة 480×800) بالإضافة إلى محرك عرض LTDC RGB للحوامل المتقدمة.

  • مقبس صوت بقياس 3.5 مم مع خرج خط ستيريو ودخل ميكروفون.

  • Wi‑Fi b/g/n (2.4 جيجاهرتز) + Bluetooth LE 5.1 عبر وحدة Murata 1DX (CYW4343W) — تتصل بالهوائي المرفق عبر موصّل U.FL على اللوحة.

  • USB‑C (سرعة كاملة) للطاقة / المنفذ التسلسلي / البرمجة.

  • دخل/خرج للمستخدم على رؤوس نمط Mega — D0D75 (رقمية) وA0A11 (تناظرية) وDAC0/DAC1 (خرجا DAC) وCAN_RX/CAN_TX (FDCAN2) وزوج I²C الداخلي SDA1/SCL1. يتيح رأس SPI1 منفصل بعدد 6 دبابيس في مقدمة اللوحة إخراج CIPO/COPI/SCK (D89/D90/D91).

  • JTAG / SWD متاحة على رأس التصحيح في الجانب العلوي للتصحيح المتقدم.

مخطط الدبابيس

Arduino Giga R1 WiFi Pinout

مرجع الدبابيس

تتيح رؤوس نمط Arduino Mega 76 دبوسًا رقميًا (D0D75) و12 دبوسًا تناظريًا (A0A11) وخرجي DAC (DAC0/DAC1) وزوج I²C ثانوي (SDA1/SCL1) وزوج FDCAN2 (CAN_RX/CAN_TX). يتيح رأس SPI1 منفصل بعدد 6 دبابيس في مقدمة اللوحة إخراج 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 (إشارة camera DCMI VSYNC)

D55

3.3 V

I2C3 SDA (إشارة camera DCMI HSYNC)

D56

3.3 V

TIM3 CH1 / TIM13 CH1 (إشارة camera DCMI PXCLK)

D57

3.3 V

TIM8 CH1N / UART8 RX (ساعة الكاميرا الرئيسية — TIM1 CH3)

D58

3.3 V

TIM8 CH3 (camera DCMI D7)

D59

3.3 V

TIM8 CH2 (camera DCMI D6)

D60

3.3 V

GPIO (camera DCMI D5)

D61

3.3 V

TIM8 CH2N / UART4 RX (camera DCMI D4)

D62

3.3 V

SPI1 SCK (camera DCMI D3)

D63

3.3 V

TIM5 CH2 / I2C4 SCL (I²C الشاشة)

D64

3.3 V

TIM5 CH1 (camera DCMI D1)

D65

3.3 V

TIM12 CH2 (camera 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 (CIPO على رأس SPI الأمامي)

D90

3.3 V

SPI1 MOSI (COPI على رأس SPI الأمامي)

D91

3.3 V

SPI1 SCK (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 (نشطة عند الانخفاض)

ملاحظة

إن A8A11 هي وسادات تناظرية فقط على دبابيس _C في STM32H747 — فهي بلا وظيفة GPIO ولا يمكن قراءتها إلا عبر ADC.

دبابيس الطاقة

دبابيس رأس Mega:

  • VIN — دخل 6–32 فولت. يغذّي اللوحة عبر منظّم الخفض (buck) الموجود على اللوحة.

  • +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 في النظام على الشريحة. اسحبه إلى GND أو اضغط الزر لإعادة الضبط.

تستخدم Giga R1 ميزة الضغط المزدوج لإعادة الضبط القياسية من Arduino للدخول إلى محمّل إقلاع Arduino. اضغط زر RESET مرتين بسرعة — تُعاد إعادة تعداد اللوحة عبر USB كجهاز DFU، ويمكن لـ OpenMV IDE تحميل صورة برنامج ثابت جديدة.

إذا كان محمّل الإقلاع مفقودًا تمامًا، فاضغط مع الاستمرار على زر BOOT0 أثناء الضغط على RESET لإجبار النظام على الشريحة على الدخول في وضع محمّل الإقلاع في ROM.

إشارات SWD الخاصة بـ STM32 مكشوفة على رأس Cortex Debug بعدد 10 دبابيس وبخطوة 1.27 مم في مقدمة اللوحة. وصِّلها عبر SEGGER J‑Link أو ST‑Link أو أي مسبار ARM JTAG/SWD قياسي. جميع إشارات التصحيح مرجعها 3.3 فولت.

الطرفيات الموجودة على اللوحة

مصابيح LED

تحتوي Giga R1 على مصباح RGB LED واحد للمستخدم يمكن التحكم به برمجيًا عبر 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 التالية ولا يمكن استخدامها:

الدبوس

السبب

D54D65

إشارات بيانات + مزامنة DCMI على موصّل الكاميرا المرن

D57

TIM1 CH3 — ساعة الكاميرا الرئيسية

D66

دبوس GPIO لـإعادة ضبط الكاميرا

D67

دبوس GPIO لـإيقاف تشغيل الكاميرا

SDA1 / SCL1

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 لإشارتي مقاطعة وإعادة ضبط لمس GT911، وD68/D69 لإشارتي TE وRESET للوحة DSI.

الميكروفون (Display Shield)

تحمل Arduino Giga Display Shield ميكروفونًا رقميًا موصّلًا بطرفية DFSDM في STM32H747 (ساعة الميكروفون على D75 وبياناته على D73). يُلتقط الميكروفون عبر audio --- وحدة الصوت. يصل كل مخزن مؤقت على شكل bytearray من نوع PCM موقَّع بـ 16 بت، جاهز للتغذية في 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 وحدة قياس بالقصور الذاتي IMU من Bosch من طراز BMI270 بستة محاور (مقياس تسارع ثلاثي الأبعاد + جيروسكوب ثلاثي الأبعاد) على نفس ناقل 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 على اللوحة يقوده مشغّل LED ثلاثي القنوات من 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 المطبوعان بالشاشة الحريرية) هو ناقل Arduino Wire الافتراضي. أما الناقل 4 (SCL1/SDA1) فهو مشترك مع الكاميرا ومتحكم لمس GT911 في Giga Display Shield — يجب على أجهزة المستخدم على هذا الناقل تجنّب العناوين التالية (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 متاح على وسوم COPI/CIPO/SCK المطبوعة بالشاشة الحريرية على D11/D12/D13.

ملاحظة

مخطط دبابيس رأس SPI1 الأمامي بعدد 6 دبابيس (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 اثنتي عشرة قناة ADC بدقة 12 بت على A0–A11، وكلها مرجعها 3.3 فولت — يُرجع read_u16 قيمة 0–65535 عبر النطاق 0–3.3 فولت عند الدبوس. إن 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 موصّل أيضًا بـ دخل الميكروفون على مقبس الصوت TRRS بقياس 3.5 مم — عند توصيل سماعة رأس، يقرأ ADC("A7") إشارة الميكروفون التناظرية مباشرةً.

DAC

تُتاح قناتا DAC بدقة 12 بت على DAC0 وDAC1 عبر pyb.DAC. وكلتاهما موصّلتان بمقبس الصوت TRRS بقياس 3.5 مم كقناتي خرج الخط اليسرى واليمنى:

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 التأخيرات الحاجزة (blocking) والنبضات الرتيبة (monotonic) وقياس الزمن المنقضي:

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 كمعرّف لاستخدام مؤقت افتراضي (برمجي):

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

المراقب (Watchdog)

تعيد 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 لإجبار النظام على الشريحة على الدخول في وضع محمّل الإقلاع في 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 LED للمستخدم كنبضة قلب (نبضتان قصيرتان وفجوة قصيرة)، حتى تتمكن من معرفة أن البرنامج الثابت أقلع بنجاح دون أي مضيف متصل.

تُوسَّع sys.path لتشمل كلا نظامي الملفات وأدلّتهما الفرعية lib/، بحيث يمكن للوحدات القابلة للاستيراد أن تقيم في /flash/lib أو /rom/lib.

عند الاتصال عبر USB، يظهر /flash أيضًا كقرص تخزين USB على المضيف، مما يتيح لك تحرير boot.py وmain.py وأي ملفات أخرى مباشرةً. أخرج القرص قبل إعادة ضبط اللوحة حتى يفرّغ المضيف كتاباته المخزّنة مؤقتًا.

ملاحظة

ولأن نظام التشغيل يعامل القرص كجهاز كتلي سلبي، فإن الملفات التي يُنشئها أو يعدّلها كود يعمل على الكاميرا لن تظهر حتى يعيد المضيف تركيب القرص. وإذا كتب كل من نظام التشغيل والكاميرا على نظام الملفات نفسه في الوقت ذاته، فسينتصر نظام التشغيل ويستبدل التغييرات التي أجرتها الكاميرا.

ملاحظة

قد تضيء قناة اللون الأحمر في مصباح RGB LED للمستخدم لفترة وجيزة بينما يقرأ المضيف من قرص تخزين USB أو يكتب عليه — وهذا مؤشر نشاط يقوده البرنامج الثابت، وليس عطلًا.

أحجام التخزين

تُشحن Giga R1 مع:

  • /flash — نظام ملفات FAT بسعة 11 ميجابايت، قراءة/كتابة.

  • /rom — نظام ملفات ROMFS مُسقَط في الذاكرة للقراءة فقط بسعة 4 ميجابايت، يُستخدم لشحن البرامج النصية ونماذج تعلّم الآلة التي تستفيد من وصول mmap بدون نسخ.

مؤشر العطل الفادح (Hard‑fault)

إذا كان مصباح RGB LED للمستخدم يتنقّل بسرعة عبر جميع الألوان — بسرعة كافية بحيث يبدو غالبًا كـ مصباح LED أبيض متلألئ بدلًا من ألوان متمايزة — فهذا يعني أن البرنامج الثابت قد واجه عطلًا فادحًا غير قابل للاسترداد. أعد تحميل البرنامج الثابت للاسترداد؛ وإذا لم تساعد إعادة التحميل، فقد تكون اللوحة تالفة فيزيائيًا.

المكتبات البرمجية

راجع فهرس المكتبة للحصول على القائمة الكاملة للوحدات — بما في ذلك أي منها فريد لإصدار Giga R1.