popular_features_as_the_controller_device.py
# هذا العمل مرخص بموجب ترخيص MIT.
# حقوق النشر (c) 2013-2023 OpenMV LLC. جميع الحقوق محفوظة.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# التحكم عن بعد - كجهاز تحكم
#
# يقوم هذا السكربت بتهيئة كاميرا OpenMV للتحكم عن بعد بكاميرا OpenMV أخرى باستخدام مكتبة
# RPC. يمكن تشغيل هذا السكربت بواسطة أي لوحة micropython تنفّذ وحدة pyb من أجل
# التحكم عن بعد بكاميرا OpenMV.
#
# صُمم هذا السكربت ليعمل مع "popular_features_as_the_remote_device.py".
import json
import rpc
import struct
# مكتبة RPC أعلاه مثبَّتة على كاميرا OpenMV الخاصة بك وتوفر عدة أصناف من أجل
# مما يتيح لكاميرا OpenMV التحكم عبر CAN أو I2C أو SPI أو UART.
##############################################################
# اختر الواجهة التي ترغب في التحكم بكاميرا OpenMV من خلالها.
##############################################################
# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر CAN.
#
# * message_id - رسالة CAN المستخدمة لنقل البيانات على ناقل CAN (11-بت).
# * bit_rate - معدل بتات CAN.
# * sample_point - نسبة Tseg1/Tseg2. عادةً 75%. (50.0، 62.5، 75، 87.5، إلخ)
#
# ملاحظة: يجب أن تتطابق معرّفات الرسائل ومعدلات بتات CAN بين الجهاز الرئيسي والتابع. قم بتوصيل can high للجهاز الرئيسي بـ
# can high للجهاز التابع وcan low للجهاز الرئيسي بـ can low للجهاز التابع. يجب إنهاء ناقل can بمقاومة 120 أوم.
#
# interface = rpc.rpc_can_master(message_id=0x7FF, bit_rate=250000, sample_point=75)
# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر I2C.
#
# * slave_addr - عنوان I2C.
# * rate - تردد ساعة ناقل I2C.
#
# ملاحظة: يجب أن تتطابق عناوين الجهاز الرئيسي والتابع. قم بتوصيل scl للجهاز الرئيسي بـ scl للجهاز التابع وsda للجهاز الرئيسي
# بـ sda للجهاز التابع. يجب استخدام مقاومات سحب (pull ups) خارجية. وأخيرًا، يجب أن يشترك الجهازان في نفس الأرضي (ground).
#
# interface = rpc.rpc_i2c_master(slave_addr=0x12, rate=100000)
# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر SPI.
#
# * cs_pin - دبوس اختيار الجهاز التابع (Slave Select).
# * freq - تردد ساعة ناقل SPI.
# * clk_polarity - مستوى الساعة في وضع الخمول (0 أو 1).
# * clk_phase - أخذ عينة البيانات عند الحافة الأولى (0) أو الثانية (1) للساعة.
#
# ملاحظة: يجب أن تتطابق إعدادات الجهاز الرئيسي والتابع. قم بتوصيل CS وSCLK وMOSI وMISO بـ CS وSCLK وMOSI وMISO.
# وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
# interface = rpc.rpc_spi_master(cs_pin="P3", freq=10000000, clk_polarity=1, clk_phase=0)
# قم بإلغاء التعليق عن السطر أدناه لإعداد كاميرا OpenMV للتحكم بها عبر UART.
#
# * baudrate - معدل البود التسلسلي (Serial Baudrate).
#
# ملاحظة: يجب أن تتطابق معدلات البود بين الجهاز الرئيسي والتابع. قم بتوصيل tx للجهاز الرئيسي بـ rx للجهاز التابع وrx للجهاز الرئيسي بـ
# tx للجهاز التابع. وأخيرًا، يجب أن يشترك الجهازان في أرضي مشترك.
#
interface = rpc.rpc_uart_master(baudrate=115200)
##############################################################
# معالجات دوال رد النداء (Call Back Handlers)
##############################################################
def exe_face_detection():
result = interface.call("face_detection")
if result is not None and len(result):
print(
"Largest Face Detected [x=%d, y=%d, w=%d, h=%d]"
% struct.unpack("<HHHH", result)
)
def exe_qrcode_detection():
result = interface.call("qrcode_detection")
if result is not None and len(result):
print(bytes(result).decode())
def exe_all_qrcode_detection():
result = interface.call("all_qrcode_detection")
if result is not None and len(result):
print("QR Codes Detected:")
for obj in json.loads(result):
print(obj)
def exe_apriltag_detection():
result = interface.call("apriltag_detection")
if result is not None and len(result):
print(
"Largest Tag Detected [cx=%d, cy=%d, id=%d, rot=%d]"
% struct.unpack("<HHHH", result)
)
def exe_all_apriltag_detection():
result = interface.call("all_apriltag_detection")
if result is not None and len(result):
print("Tags Detected:")
for obj in json.loads(result):
print(obj)
def exe_datamatrix_detection():
result = interface.call("datamatrix_detection")
if result is not None and len(result):
print(bytes(result).decode())
def exe_all_datamatrix_detection():
result = interface.call("all_datamatrix_detection")
if result is not None and len(result):
print("Data Matrices Detected:")
for obj in json.loads(result):
print(obj)
def exe_barcode_detection():
result = interface.call("barcode_detection")
if result is not None and len(result):
print(bytes(result).decode())
def exe_all_barcode_detection():
result = interface.call("all_barcode_detection")
if result is not None and len(result):
print("Bar Codes Detected:")
for obj in json.loads(result):
print(obj)
def exe_color_detection():
thresholds = (30, 100, 15, 127, 15, 127) # عتبات لون أحمر عامة
# thresholds = (30, 100, -64, -8, -32, 32) # عتبات لون أخضر عامة
# thresholds = (0, 30, 0, 64, -128, 0) # عتبات لون أزرق عامة
result = interface.call("color_detection", struct.pack("<bbbbbb", *thresholds))
if result is not None and len(result):
print("Largest Color Detected [cx=%d, cy=%d]" % struct.unpack("<HH", result))
number = 0
def exe_jpeg_snapshot():
global number
result = interface.call("jpeg_snapshot")
if result is not None:
name = "snapshot-%05d.jpg" % number
print("Writing jpeg %s..." % name)
with open(name, "wb") as snap:
snap.write(result)
number += 1
# تنفيذ الدوال البعيدة في حلقة. يرجى اختيار وإلغاء التعليق عن دالة بعيدة واحدة أدناه.
# قد يعمل تنفيذ عدة دوال في نفس الوقت ببطء إذا احتاجت الكاميرا لتغيير أوضاعها
# في كل تنفيذ.
while True:
exe_face_detection() # يجب أن يكون الوجه على بعد حوالي قدمين.
# exe_qrcode_detection() # ضع رمز الاستجابة السريعة على بعد حوالي قدمين.
# exe_all_qrcode_detection() # ضع رمز الاستجابة السريعة على بعد حوالي قدمين.
# exe_apriltag_detection()
# exe_all_apriltag_detection()
# exe_datamatrix_detection() # ضع رمز Datamatrix على بعد حوالي قدمين.
# exe_all_datamatrix_detection() # ضع رمز Datamatrix على بعد حوالي قدمين.
# exe_barcode_detection() # ضع الرمز الشريطي على بعد حوالي قدمين.
# exe_all_barcode_detection() # ضع الرمز الشريطي على بعد حوالي قدمين.
# exe_color_detection()
# exe_jpeg_snapshot()