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.
أبرز الميزات¶
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 —
D0–D75(رقمية) وA0–A11(تناظرية) وDAC0/DAC1(خرجا DAC) وCAN_RX/CAN_TX(FDCAN2) وزوج I²C الداخليSDA1/SCL1. يتيح رأس SPI1 منفصل بعدد 6 دبابيس في مقدمة اللوحة إخراج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). يتيح رأس 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 ( |
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 (نشطة عند الانخفاض) |
LED_GREEN |
3.3 V |
قناة اللون الأخضر لمصباح RGB LED (نشطة عند الانخفاض) |
LED_BLUE |
3.3 V |
قناة اللون الأزرق لمصباح RGB LED (نشطة عند الانخفاض) |
ملاحظة
إن A8–A11 هي وسادات تناظرية فقط على دبابيس _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 التالية ولا يمكن استخدامها:
الدبوس |
السبب |
|---|---|
|
إشارات بيانات + مزامنة 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 لإشارتي مقاطعة وإعادة ضبط لمس 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 / 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 متاح على وسوم COPI/CIPO/SCK المطبوعة بالشاشة الحريرية على D11/D12/D13.
ملاحظة
مخطط دبابيس رأس SPI1 الأمامي بعدد 6 دبابيس (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 اثنتي عشرة قناة ADC بدقة 12 بت على 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 موصّل أيضًا بـ دخل الميكروفون على مقبس الصوت 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.