OpenMV Cam H7 Plus

تجمع OpenMV Cam H7 Plus بين معالج STMicroelectronics STM32H743 (Cortex‑M7 بتردد 480 MHz) وذاكرة SDRAM خارجية بسعة 32 ميجابايت، وذاكرة فلاش QSPI بسعة 32 ميجابايت، ومرمّز JPEG عتادي، ووحدة الكاميرا OV5640 بدقة 5 ميجابكسل على حامل قابل للإزالة. تناسب الذاكرة الإضافية بشكل جيد الالتقاط عالي الدقة ومخازن الصور الكبيرة.

OpenMV Cam H7 Plus

للاطلاع على ورقة البيانات الكاملة والصور والأبعاد، راجع صفحة منتج OpenMV Cam H7 Plus.

أبرز الميزات

  • STMicroelectronics STM32H743 معالج Cortex‑M7 بتردد 480 MHz (1027 DMIPS).

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

  • ذاكرة SDRAM خارجية بسعة 32 ميجابايت (32 بت بتردد 100 MHz، بسرعة 400 ميجابايت/ث) بالإضافة إلى ذاكرة SRAM داخلية بسعة 1 ميجابايت.

  • ذاكرة فلاش داخلية بسعة 2 ميجابايت + ذاكرة فلاش QSPI خارجية بسعة 32 ميجابايت (قراءة بسرعة ~100 ميجابايت/ث).

  • OV5640 مستشعر بمصراع متدحرج بدقة 5 ميجابكسل.

  • USB بالسرعة الكاملة (12 ميجابت/ث) — يظهر كـ VCP ووحدة تخزين USB كبيرة الحجم لدى المضيف.

  • مقبس microSD — بطاقات SD حتى 2 جيجابايت، وSDHC حتى 32 جيجابايت، وSDXC حتى 2 تيرابايت.

  • موصّل بطارية LiPo (لا يوجد شاحن مدمج — استخدم خلية مشحونة أو شغّل اللوحة من VIN/USB).

  • 10 دبابيس I/O، تتحمل 5 فولت بخرج 3.3 فولت، 25 مللي أمبير لكل دبوس (120 مللي أمبير إجمالاً عبر الترويسة)، قادرة على المقاطعة. الدبوس P6 لا يتحمل 5 فولت عند استخدامه في وضع ADC أو DAC.

  • RGB LED للمستخدم واثنان من مصابيح LED بالأشعة تحت الحمراء عالية الطاقة بطول موجي 850 نانومتر للإضاءة النشطة في الرؤية بالإضاءة المنخفضة.

ملاحظة

لا تحتوي H7 Plus على شريحة إدارة طاقة مدمجة: فلا يوجد شاحن بطارية، ولا ADC لقياس جهد البطارية، ولا مصابيح LED لحالة الشحن/الطاقة، ولا زر طاقة عتادي. وصّل بطارية LiPo مشحونة مسبقاً بموصّل JST الخاص بالبطارية أو شغّل اللوحة من USB / VIN.

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

OpenMV Cam H7 Plus OV5640 Pinout

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

اسم الدبوس

الوظيفة

P0

UART1 RX / SPI2 MOSI

P1

UART1 TX / SPI2 MISO

P2

SPI2 SCK / FDCAN2 TX

P3

SPI2 NSS (CS) / FDCAN2 RX

P4

I2C2 SCL / UART3 TX / TIM2 CH3

P5

I2C2 SDA / UART3 RX / TIM2 CH4

P6

ADC / DAC / TIM2 CH1

P7

I2C4 SCL / TIM4 CH1

P8

I2C4 SDA / TIM4 CH2

P9

I/O رقمي

RESET

اسحبه إلى GND لإعادة ضبط اللوحة

SYN

لوحة مزامنة الإطارات — موصّلة بمستشعر الكاميرا فقط

BOOT0

اسحبه إلى 3.3 فولت عند التشغيل للدخول إلى DFU / محمّل إقلاع ROM

LED_RED

القناة الحمراء لـ RGB LED (نشطة عند المنخفض)

LED_GREEN

القناة الخضراء لـ RGB LED (نشطة عند المنخفض)

LED_BLUE

القناة الزرقاء لـ RGB LED (نشطة عند المنخفض)

LED_IR

مصابيح LED بالأشعة تحت الحمراء عالية الطاقة (تُشغّل القناتان معاً)

ملاحظة

لوحة SYN على الترويسة موصّلة مباشرة بخط التشغيل / التعريض لمستشعر الكاميرا — وهي لا تتصل بالمعالج على H7 Plus. شغّلها أو اقرأها خارجياً؛ لا يمكنك تبديل حالتها من MicroPython.

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

  • 3.3V — قضيب 3.3 فولت منظّم. يتوفر حتى 250 مللي أمبير للدروع (أقل إذا كانت بطاقة microSD قيد الاستخدام). على عكس الكاميرات الأحدث، هذا الدبوس ثنائي الاتجاه — راجع التحذير أدناه.

  • VIN — دخل من 3.6 إلى 5 فولت. يغذّي اللوحة عبر المنظّم المدمج.

  • GND — الأرضي المشترك.

يوجد أيضاً موصّل بطارية LiPo بجهد 3.7 فولت، لكن H7 Plus لا تحتوي على شاحن بطارية — وصّل خلية مشحونة مسبقاً، أو استخدم VIN / USB بدلاً من ذلك.

ملاحظة

عند توفر كل من USB وVIN/LiPo، يفوز دخل VIN/LiPo — يختاره مفتاح الطاقة المدمج بدلاً من USB لتغذية اللوحة.

تحذير

موصّل البطارية وVIN موصّلان معاً على H7 Plus. لا توصّل بطارية LiPo وتطبّق VIN في الوقت نفسه — فسيتصارع المصدران ويمكن أن يتلفا البطارية أو اللوحة أو كليهما.

تحذير

يمكنك تشغيل H7 Plus بتغذية 3.3 فولت مباشرة إلى الدبوس 3.3V إذا لم ترغب في المرور عبر المنظّم المدمج. في تلك الحالة، لا تطبّق أيضاً طاقة VIN أو USB في الوقت نفسه — فإن دفع المنظّم عكسياً بينما يكون مصدر آخر نشطاً قد يتلف الكاميرا ويدمّرها بشكل دائم.

نصيحة

استخدم مقدّر عمر البطارية لنمذجة المدة التي ستعمل فيها H7 Plus على البطارية لدورة عمل معيّنة بين النشاط والنوم العميق.

دبابيس الاسترداد والتصحيح

  • RESET — اسحبه إلى GND لإعادة ضبط اللوحة. تحريره يتيح للمعالج بدء التشغيل بشكل طبيعي.

  • BOOT0 — اسحبه إلى 3.3 فولت أثناء تشغيل اللوحة للدخول إلى محمّل إقلاع ROM الخاص بـ STM32 (وضع DFU). يستخدم OpenMV IDE هذا الوضع لإعادة تحميل برنامج المحمّل المدمج.

تعرض اللوحة ترويسة تصحيح SWD (RST / SWCLK / SWDIO / SWO) بجوار ترويسة GPIO، متوافقة مع محولات ST‑LINK وSEGGER J‑Link.

ملاحظة

يُشارك دبوس التتبع SWO خط ساعة SPI لترويسة الكاميرا. لا يمكن استخدام SWO في الوقت نفسه مع أي وحدة كاميرا تتواصل مع المعالج عبر SPI — على سبيل المثال وحدة محول FLIR® Lepton® — اختر أحدهما.

الطرفيات المدمجة

مصابيح LED

تحتوي H7 Plus على RGB LED واحد للمستخدم بالإضافة إلى زوج من مصابيح LED بالأشعة تحت الحمراء عالية الطاقة بطول موجي 850 نانومتر:

  • RGB LED للمستخدم — قابل للتحكم برمجياً، معروض كـ LED_RED وLED_GREEN وLED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • مصابيح LED بالأشعة تحت الحمراء — يُشغّل المصباحان معاً عبر الدبوس LED_IR. الدبوس LED_IR موصّل نشطاً عند المرتفع في العتاد بينما يتعامل البرنامج الثابت مع كل مصباح LED مدمج آخر على أنه نشط عند المنخفض، لذا استخدم low() / high() بدلاً من on() / off() (التي ستعكس المعنى):

    from machine import LED
    
    ir = LED("LED_IR")
    ir.low()    # turn IR illumination ON
    ir.high()   # turn IR illumination OFF
    

مستشعر الكاميرا

يُشغّل مستشعر OV5640 عبر وحدة 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 على ضاغط JPEG مدمج. اضبط csi.CSI.pixformat على csi.JPEG ويُسلّم المستشعر إطارات مضغوطة مباشرة إلى الكاميرا عبر ناقل الكاميرا، مما يجعل الالتقاط عالي الدقة عملياً: حيث تُبث كل من csi.HD (1280×720) وcsi.FHD (1920×1080) ودقة 5 ميجابكسل الكاملة csi.WQXGA2 (2592×1944) بصيغة JPEG. اضبط الضغط باستخدام csi.CSI.quality (0-100، أعلى = إطارات أكبر وتفاصيل أكثر):

cam.pixformat(csi.JPEG)
cam.framesize(csi.WQXGA2)
cam.quality(90)

يقع المستشعر على وحدة قابلة للإزالة — استبدله بأي من وحدات كاميرا OpenMV الأخرى (مصراع شامل، حراري، دقة أعلى، إلخ) دون تغيير بقية اللوحة.

تعلّم الآلة

تشغّل 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()

    # faces is a list of ((x, y, w, h), score, keypoints) tuples
    for r, score, keypoints in model.predict([img]):
        ml.utils.draw_predictions(img, [r], ("face",), ((0, 0, 255),), format=None)

        # keypoints is a ndarray of shape (6, 2)
        # 0 - right eye (x, y)
        # 1 - left eye (x, y)
        # 2 - nose (x, y)
        # 3 - mouth (x, y)
        # 4 - right ear (x, y)
        # 5 - left ear (x, y)
        ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))

    print(clock.fps(), "fps")

بطاقة microSD

عند إدخال بطاقة يتم تركيبها تلقائياً عند /sdcard وتصبح قابلة للاستخدام عبر نظام الملفات العادي:

import os

for entry in os.listdir("/sdcard"):
    print(entry)

مرجع النواقل

GPIO

استخدم machine.Pin لقراءة أو تشغيل أي من الدبابيس المطبوعة على الطباعة الحريرية. المخارج بنظام 3.3 فولت CMOS، تتحمل 5 فولت على جانب الدخل، ويمكنها امتصاص/مصدرة حتى 25 مللي أمبير لكل دبوس (120 مللي أمبير إجمالاً عبر الترويسة بأكملها).

from machine import Pin

out = Pin("P0", Pin.OUT)
out.on()
out.off()
out.value(1)

inp = Pin("P1", Pin.IN, Pin.PULL_UP)
print(inp.value())

يمكن لأي دبوس دخل أيضاً إطلاق مقاطعة عند انتقالات الحافة:

def handler(pin):
    print("triggered:", pin)

Pin("P1", Pin.IN, Pin.PULL_UP).irq(
    handler, Pin.IRQ_FALLING | Pin.IRQ_RISING,
)

UART

الناقل

TX

RX

UART1

P1

P0

UART3

P4

P5

from machine import UART

uart = UART(3, baudrate=115200)
uart.write("hello")
uart.read(5)

I²C

الناقل

SCL

SDA

I2C2

P4

P5

I2C4

P7

P8

from machine import I2C

i2c = I2C(2, freq=400_000)
i2c.scan()
i2c.writeto(0x76, b"hi")

يمكن أيضاً استخدام العتاد نفسه في الوضع الهدف (التابع) عبر machine.I2CTarget لعرض منطقة ذاكرة لمتحكم I²C آخر:

from machine import I2CTarget

buf = bytearray(32)
target = I2CTarget(2, addr=0x42, mem=buf)

SPI

الناقل

MOSI

MISO

SCK

CS

SPI2

P0

P1

P2

P3

from machine import SPI
from machine import Pin

spi = SPI(2, baudrate=10_000_000)
cs = Pin("P3", 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

P2

P3

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 وDAC

الدبوس P6 هو الدبوس التناظري الوحيد المتاح للمستخدم. يمكن استخدامه إما كدخل ADC بدقة 12 بت أو كخرج DAC.

  • ADC — النطاق الكامل عند 3.3 فولت على الدبوس:

    from machine import ADC
    import time
    
    adc = ADC("P6")
    while True:
        voltage = adc.read_u16() * 3.3 / 65535
        print(voltage)
        time.sleep_ms(100)
    
  • DAC — عبر pyb.DAC. تغطي القيمة ذات 8 بت النطاق 0–3.3 فولت:

    from pyb import DAC
    
    dac = DAC("P6")
    voltage = 1.65
    dac.write(int(voltage / 3.3 * 255))
    

في وضع ADC أو DAC، الدبوس P6 يتحمل 3.3 فولت فقط — لا تغذّه بـ 5 فولت.

PWM

الدبوس

المؤقت / القناة

P4

TIM2 CH3

P5

TIM2 CH4

P6

TIM2 CH1

P7

TIM4 CH1

P8

TIM4 CH2

ملاحظة

المؤقت TIM1 محجوز من قبل البرنامج الثابت لتوليد ساعة بكسل مستشعر الكاميرا، لذا لا يمكن استخدام قنوات TIM1 الموجودة فيزيائياً على P0/P1/P2 لـ PWM الخاص بالمستخدم دون تعطيل الكاميرا.

المؤقت TIM4 مشترك مع pyb.Servo — فإنشاء مثيل سيرفو يعيد ضبط المؤقت بأكمله للعمل بتردد 50 Hz، لذا لا تخلط machine.PWM على P7/P8 مع pyb.Servo في البرنامج النصي نفسه.

شغّل أياً منها عبر machine.PWM

from machine import Pin, PWM

pwm = PWM(Pin("P7"), freq=1_000, duty_u16=32768)

النواقل البرمجية المنبضة بالبت

تعمل 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 2 فقط — وصّل الوحدة بـ P4 (SCL) وP5 (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 كمعرّف لاستخدام مؤقت افتراضي (برمجي):

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 على وقت ساعة الحائط عبر عمليات إعادة الضبط:

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

معلومات الإقلاع ووقت التشغيل

نافذة محمّل إقلاع USB

عند كل تشغيل، تشغّل الكاميرا محمّل إقلاع قصيراً (بضع ثوانٍ) يتيح لـ OpenMV IDE تحديث البرنامج الثابت دون اضطرار المستخدم للدخول إلى وضع DFU. بعد انتهاء النافذة، يسلّم محمّل الإقلاع التحكم إلى boot.py ثم main.py.

يمكن لبرنامج نصي قيد التشغيل إعادة الدخول إلى محمّل الإقلاع عند الطلب باستدعاء machine.bootloader()

import machine

machine.bootloader()

نظام الملفات وترتيب الإقلاع

يركّب برنامج H7 Plus الثابت ما يصل إلى ثلاثة أنظمة ملفات عند الإقلاع:

  • الفلاش الداخلي — يُركّب دائماً عند /flash. يحتوي على main.py وREADME.txt افتراضياً؛ يُنشأ عند أول إقلاع على الإطلاق.

  • بطاقة microSD — إذا أُدخلت بطاقة فإنها تُركّب عند /sdcard.

  • ROMFS — نظام ملفات للقراءة فقط معيّن في الذاكرة عند /rom يُستخدم لشحن أصول البيانات الكبيرة (مثل نماذج الذكاء الاصطناعي) التي تستفيد من الوصول بدون نسخ. يُركّب تلقائياً بواسطة MicroPython عند بدء التشغيل، قبل تشغيل أي كود Python خاص بالمستخدم.

بعد التركيب، يُضبط دليل العمل على /sdcard عند وجود البطاقة، وإلا /flash. ثم يشغّل المفسّر البرامج النصية من ذلك الدليل:

  • يُنفَّذ boot.py عند كل إعادة ضبط ناعمة (الإقلاع البارد، أو Ctrl‑D من REPL، أو كلما عاد البرنامج النصي قيد التشغيل).

  • يُنفَّذ main.py فقط عند الإقلاع البارد، مباشرة بعد boot.py. عمليات إعادة الضبط الناعمة اللاحقة تعيد تشغيل boot.py لكنها تنتقل مباشرة إلى REPL — لإعادة تشغيل main.py عليك إعادة ضبط اللوحة بالكامل.

إسقاط ملف boot.py أو main.py على بطاقة SD يتجاوز النسخة الموجودة في الفلاش دون المساس بها — يُبحث عن كلا الملفين في دليل الإقلاع (/sdcard عند تركيب البطاقة، وإلا /flash).

ملف main.py الافتراضي المشحون على لوحة حديثة التحميل يومض فقط بالقناة الزرقاء لـ RGB LED الخاص بالمستخدم كنبضة قلب (نبضتان قصيرتان، فجوة قصيرة)، لتتمكن من معرفة أن البرنامج الثابت أقلع بنجاح دون توصيل أي مضيف.

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

لإجبار النظام على تجاهل بطاقة SD مُدخلة (على سبيل المثال لتشغيل main.py الموجود في الفلاش حتى مع وجود بطاقة)، أنشئ ملفاً فارغاً باسم SKIPSD في جذر /flash.

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

ملاحظة

نظراً لأن نظام التشغيل يتعامل مع المحرك كجهاز كتلي سلبي، فإن الملفات التي أنشأها أو عدّلها الكود الذي يعمل على OpenMV Cam لن تظهر حتى يعيد المضيف تركيب المحرك. وإذا كتب كل من نظام التشغيل وOpenMV Cam على نظام الملفات نفسه في الوقت نفسه، فسيفوز نظام التشغيل ويستبدل التغييرات التي أجرتها الكاميرا. استخدم بطاقة SD لأي بيانات يكتبها البرنامج النصي، وأعد التركيب قبل قراءة تلك الملفات من المضيف.

ملاحظة

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

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

تأتي H7 Plus بـ:

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

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

  • /sdcard — الحجم الكامل لأي بطاقة microSD مُدخلة (عند وجودها)، للقراءة/الكتابة.

مؤشر العطل الجسيم

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

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

راجع فهرس المكتبة للاطلاع على القائمة الكاملة للوحدات — بما في ذلك الوحدات الفريدة لبناء H7 Plus.