OpenMV Cam M7

إن OpenMV Cam M7 هي لوحة رؤية آلية من فئة Cortex‑M7 مبنية حول معالج STMicroelectronics STM32F765 بتردد 216 MHz مع 512 KB من ذاكرة SRAM الداخلية و2 MB من ذاكرة الفلاش الداخلية. يلتقط المستشعر المرفق OV7725 إطارات بتدرج الرمادي بدقة 640×480 أو إطارات RGB565 بدقة 320×240 بمعدل يصل إلى 150 FPS، ويوفر رأس المستخدم ذو الـ 10 دبابيس طرفيات UART وI²C وSPI وCAN وADC/DAC وPWM.

OpenMV Cam M7

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

أبرز الميزات

  • STMicroelectronics STM32F765 من فئة Cortex‑M7 بتردد 216 MHz.

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

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

  • مستشعر OV7725 — بتدرج الرمادي بدقة 640×480 أو RGB565 بدقة 320×240 بمعدل يصل إلى 150 FPS.

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

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

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

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

ملاحظة

لا تحتوي M7 على شريحة إدارة طاقة على اللوحة: فلا يوجد موصل بطارية، ولا شاحن بطارية، ولا ADC لقياس جهد البطارية، ولا مؤشرات LED لحالة الشحن/الطاقة، ولا زر طاقة عتادي. ادعم اللوحة عبر USB أو VIN.

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

OpenMV Cam M7 OV7725 Pinout

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

اسم الدبوس

الوظيفة

P0

UART1 RX / SPI2 MOSI

P1

UART1 TX / SPI2 MISO

P2

SPI2 SCK / CAN2 TX

P3

SPI2 NSS (CS) / CAN2 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 V عند التشغيل للدخول في وضع DFU / محمّل الإقلاع ROM

LED_RED

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

LED_GREEN

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

LED_BLUE

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

LED_IR

مصابيح IR LED عالية الطاقة (يتم تشغيل كلتا القناتين معاً)

ملاحظة

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

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

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

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

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

ملاحظة

عند وجود كل من USB وVIN، فإن أيهما يحمل الجهد الأعلى يغذي اللوحة — تختار الثنائيات الموجودة على اللوحة الخط الأقوى ببساطة.

تحذير

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

نصيحة

استخدم أداة تقدير عمر البطارية لنمذجة المدة التي ستعمل خلالها M7 على بطارية ما عند دورة عمل معينة من النشاط/السبات العميق.

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

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

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

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

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

مؤشرات LED

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

  • مؤشر RGB LED للمستخدم — قابل للتحكم برمجياً، ويظهر بصيغة LED_RED وLED_GREEN وLED_BLUE

    from machine import LED
    
    LED("LED_RED").on()
    LED("LED_GREEN").on()
    LED("LED_BLUE").on()
    
  • مصابيح IR 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 عبر الوحدة 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()

المستشعر ملحوم باللوحة على M7 — وهو ليس على وحدة قابلة للتبديل.

بطاقة microSD

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

import os

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

مرجع الناقل

GPIO

استخدم machine.Pin لقراءة أو تشغيل أي من الدبابيس المطبوعة بالشاشة الحريرية. تكون المخارج بمنطق CMOS عند 3.3 V، وتتحمل 5 V في جانب الدخل، ويمكنها تصريف/توريد ما يصل إلى 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

الناقل

TX

RX

CAN2

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 V على الدبوس:

    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 V:

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

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

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)

النواقل البرمجية بطريقة bit‑banging

يعمل كل من machine.SoftI2C وmachine.SoftSPI على أي دبوس GPIO إذا احتجت إلى ناقل إضافي.

المستشعر الحراري (خارج اللوحة)

يتضمن البرنامج الثابت برنامج التشغيل fir --- مشغّل المستشعر الحراري (fir == far infrared) لمصوّرات حرارية موصولة خارجياً:

  • MLX90621 — مصفوفة IR بحجم 16 × 4

  • MLX90640 — مصفوفة IR بحجم 32 × 24

  • MLX90641 — مصفوفة IR بحجم 16 × 12

  • AMG8833 — مصفوفة IR بحجم 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())

كلب المراقبة (Watchdog)

يعيد 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()

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

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

  • الفلاش الداخلي — مركّب دائماً عند /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 كبير السعة أو يكتب إليه — وهذا مؤشر نشاط يقوده البرنامج الثابت، وليس عطلاً.

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

تُشحن M7 مع:

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

  • /rom — نظام ملفات ROMFS مُسقَط في الذاكرة للقراءة فقط بسعة 256 KB.

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

مؤشر العطل الجسيم (Hard‑fault)

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

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

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