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.
أبرز الميزات¶
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.
مخطط الأطراف¶
مرجع الأطراف¶
اسم الدبوس |
الوظيفة |
|---|---|
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_BLUEfrom 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.