image_transfer_raw_as_the_remote_device.py

# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# نقل الصور - كجهاز بعيد
#
# صُمم هذا السكربت ليعمل مع كاميرا OpenMV أخرى تشغّل "image_transfer_raw_as_the_controller_device.py"
#
# يوضح هذا السكربت كيفية نقل ذاكرة الإطار المؤقتة من كاميرا OpenMV إلى أخرى.

import rpc
import csi
import struct

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)

# مكتبة RPC أعلاه مثبَّتة على كاميرا OpenMV الخاصة بك وتوفر عدة أصناف من أجل
# مما يتيح التحكم في كاميرا OpenMV عبر CAN أو I2C أو SPI أو UART أو LAN/WLAN.

################################################################
# اختر الواجهة التي ترغب في التحكم بكاميرا OpenMV من خلالها.
################################################################

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر CAN.
#
# * message_id - رسالة CAN المستخدمة لنقل البيانات على ناقل CAN (11-بت).
# * bit_rate - معدل بتات CAN.
# * sample_point - نسبة Tseg1/Tseg2. عادةً 75%. (50.0، 62.5، 75.0، 87.5، إلخ)
#
# ملاحظة: يجب أن تتطابق معرّفات الرسائل ومعدلات بتات CAN بين الجهاز الرئيسي والتابع. قم بتوصيل can high للجهاز الرئيسي بـ
# can high للجهاز التابع وcan low للجهاز الرئيسي بـ can low للجهاز التابع. يجب إنهاء ناقل can بمقاومة 120 أوم.
#
# interface = rpc.rpc_can_slave(message_id=0x7FF, bit_rate=1000000, sample_point=75.0)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر I2C.
#
# * slave_addr - عنوان I2C.
#
# ملاحظة: يجب أن تتطابق عناوين الجهاز الرئيسي والتابع. قم بتوصيل scl للجهاز الرئيسي بـ scl للجهاز التابع وsda للجهاز الرئيسي
# بـ sda للجهاز التابع. يجب استخدام مقاومات سحب (pull ups) خارجية. وأخيرًا، يجب أن يشترك الجهازان في نفس الأرضي (ground).
#
# interface = rpc.rpc_i2c_slave(slave_addr=0x12)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر SPI.
#
# * cs_pin - دبوس اختيار الجهاز التابع (Slave Select).
# * clk_polarity - مستوى الساعة في وضع الخمول (0 أو 1).
# * clk_phase - أخذ عينة البيانات عند الحافة الأولى (0) أو الثانية (1) للساعة.
#
# ملاحظة: يجب أن تتطابق إعدادات الجهاز الرئيسي والتابع. قم بتوصيل CS وSCLK وMOSI وMISO بـ CS وSCLK وMOSI وMISO.
# وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
interface = rpc.rpc_spi_slave(cs_pin="P3", clk_polarity=1, clk_phase=0)

# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر UART.
#
# * baudrate - معدل البود التسلسلي (Serial Baudrate).
#
# ملاحظة: يجب أن تتطابق معدلات البود بين الجهاز الرئيسي والتابع. قم بتوصيل tx للجهاز الرئيسي بـ rx للجهاز التابع وrx للجهاز الرئيسي بـ
# tx للجهاز التابع. وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
# interface = rpc.rpc_uart_slave(baudrate=7500000)

################################################################
# دوال رد النداء (Call Backs)
################################################################
img = None
img_ba = None
img_mv = None


# عند استدعائها، تقوم بضبط صيغة البكسل وحجم الإطار، وتلتقط صورة
# ثم تُرجع شكل ذاكرة الإطار المؤقتة لتخزين الصورة فيها.
#
# البيانات هي 4 بايتات لصيغة البكسل و4 بايتات لحجم الإطار.
def raw_image_snapshot(data):
    global img, img_ba, img_mv
    pixformat, framesize = struct.unpack("<II", data)
    csi0.pixformat(pixformat)
    csi0.framesize(framesize)
    img = csi0.snapshot()
    img_ba = img.bytearray()
    img_mv = memoryview(img_ba)
    return struct.pack(
        "<IIII", csi0.width(), csi0.height(), csi0.pixformat(), img.size()
    )


def raw_image_read_cb():
    interface.put_bytes(img_ba, 5000)  # المهلة الزمنية


# قراءة البيانات من ذاكرة الإطار المؤقتة بإعطاء إزاحة وحجم.
# إذا كانت البيانات فارغة، تتم جدولة عملية نقل بعد انتهاء استدعاء RPC.
#
# البيانات هي 4 بايتات للحجم و4 بايتات للإزاحة.
def raw_image_read(data):
    if not len(data):
        interface.schedule_callback(raw_image_read_cb)
        return bytes()
    else:
        offset, size = struct.unpack("<II", data)
        return img_mv[offset:offset + size]


# تسجيل دوال رد النداء (call backs).

interface.register_callback(raw_image_snapshot)
interface.register_callback(raw_image_read)

# بمجرد تسجيل جميع دوال رد النداء، يمكننا البدء
# بمعالجة الأحداث البعيدة. لا تُرجع interface.loop() قيمة.

interface.loop()

results matching ""

    No results matching ""