OpenMV Cam H7

إن OpenMV Cam H7 لوحة للرؤية الآلية بمعالج Cortex‑M7 مبنية حول شريحة STMicroelectronics STM32H743 التي تعمل بتردد 480 MHz مع 1 MB من ذاكرة SRAM الداخلية، و2 MB من ذاكرة الفلاش الداخلية، ومُرمِّز JPEG عتادي. تُشحن اللوحة بمراجعتين للمستشعر — الطراز H7 المزوّد بمستشعر OV7725 والطراز H7 R2 المزوّد بمستشعر ON Semi MT9M114 — لكن البرنامج الثابت ومخطط الأطراف وواجهة Python API متطابقة.

OpenMV Cam H7

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

أبرز الميزات

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

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

  • 1 MB من ذاكرة SRAM الداخلية — بدون ذاكرة SDRAM خارجية.

  • 2 MB من ذاكرة الفلاش الداخلية (بدون ذاكرة فلاش QSPI خارجية).

  • مستشعر OV7725 (أو MT9M114 في الطراز H7 R2).

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

  • مقبس microSD — يدعم بطاقات SD حتى 2 GB، وSDHC حتى 32 GB، وSDXC حتى 2 TB.

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

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

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

ملاحظة

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

مخطط الأطراف

OpenMV Cam H7 OV7725 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

TIM4 CH3

RESET

اسحبه إلى GND لإعادة تعيين اللوحة

SYN

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

BOOT0

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

LED_RED

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

LED_GREEN

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

LED_BLUE

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

LED_IR

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

ملاحظة

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

أطراف الطاقة

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

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

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

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

ملاحظة

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

تحذير

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

تحذير

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

نصيحة

استخدم أداة تقدير عمر البطارية لنمذجة المدة التي ستعمل خلالها اللوحة H7 على بطارية بناءً على دورة عمل معيّنة من التشغيل النشط / السكون العميق.

أطراف الاسترداد والتصحيح

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

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

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

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

مصابيح LED

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

  • LED RGB للمستخدم — قابل للتحكم برمجياً، مكشوف عبر 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
    

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

يُقاد المستشعر OV7725 (أو MT9M114 في الطراز H7 R2) عبر الوحدة 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()

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

بطاقة microSD

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

import os

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

مرجع الناقل

GPIO

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

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

P9

TIM4 CH3

ملاحظة

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

المؤقت TIM4 مشترك مع pyb.Servo — إنشاء مثيل سيرفو يعيد تهيئة المؤقت بأكمله للعمل بتردد 50 Hz، لذا لا تمزج بين machine.PWM على P7/P8/P9 و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 ما يصل إلى ثلاثة أنظمة ملفات عند الإقلاع:

  • ذاكرة الفلاش الداخلية — مركّبة دائماً عند /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 الافتراضي المشحون على لوحة مُبرمجة حديثاً يومض فقط القناة الزرقاء من LED RGB للمستخدم كنبضة قلب (نبضتان قصيرتان مع فجوة قصيرة)، بحيث يمكنك معرفة أن البرنامج الثابت أقلع بشكل سليم دون أي مضيف متصل.

يُمدَّد 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 لأي بيانات يكتبها البرنامج النصي، وأعد التركيب قبل قراءة تلك الملفات من المضيف.

ملاحظة

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

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

تُشحن اللوحة H7 مع:

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

  • /rom — ذاكرة ROMFS مُسقطة على الذاكرة للقراءة فقط بسعة 128 KB.

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

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

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

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

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