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