الاتصال التسلسلي الأول
درس الفيديو 27 - الاتصال التسلسلي: إرسال البيانات:
https://singtown.com/learn/50235/
درس الفيديو 28 - الاتصال التسلسلي: استقبال البيانات:
https://singtown.com/learn/50240/
مقدمة
لماذا نستخدم الاتصال التسلسلي؟ لأنك أحيانًا تحتاج إلى إرسال معلومات إلى وحدة تحكم دقيقة (MCU) أخرى، والاتصال التسلسلي بسيط وعام الاستخدام، وتقريبًا كل وحدة تحكم دقيقة تدعم الاتصال التسلسلي.
يحتاج الاتصال التسلسلي TTL إلى ثلاثة خطوط على الأقل: TXD وRXD وGND؛ حيث TXD هو طرف الإرسال، وRXD هو طرف الاستقبال، وGND هو خط التأريض (الأرضي). عند التوصيل، يجب توصيل RXD الخاص بـ OpenMV بـ TXD الخاص بوحدة التحكم الدقيقة الأخرى، وتوصيل TXD بـ RXD، كما هو موضح في الصورة:

import time
from machine import UART
#from pyb import UART
# في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 وOpenMV2 M4، المنفذ UART(3) هو P4-TX وP5-RX
uart = UART(3, 19200) # في OpenMV RT علّق هذا السطر، واستخدم السطر التالي UART(1)
#uart = UART(1, 19200) # في OpenMV RT استخدم سطر UART(1) هذا، وعلّق السطر السابق UART(3)
# في OpenMV RT يوجد منفذ تسلسلي واحد فقط هو UART(1)، ويقابل P4-TX وP5-RX؛ أما في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 فإن UART(1) هو P0-RX وP1-TX
while(True):
uart.write("Hello World!\r")
time.sleep_ms(1000)
أولًا نقوم بإنشاء كائن منفذ تسلسلي بمعدل نقل بيانات (baud rate) قدره 19200، ثم نستدعي التابع (method) write.
ملاحظة: يحتوي OpenMV RT على منفذ تسلسلي واحد فقط وهو UART(1)، المقابل لـ P4-TX وP5-RX.
المنفذ التسلسلي UART(1) في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 هو P0-RX وP1-TX.
المنفذ التسلسلي UART(3) في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 وOpenMV2 M4 هو P4-TX وP5-RX
إرسال بيانات معقدة
في القسم السابق تحدثنا عن سلاسل JSON.
# الكشف عن الكتل (Blob) والإرسال عبر UART
import csi, image, time
csi0 = csi.CSI()
#from pyb import UART
from machine import UART
import json
# لكي يعمل تتبع الألوان بشكل جيد جدًا، يُفضّل أن تكون في بيئة محكومة جدًا جدًا جدًا
# يكون فيها الإضاءة ثابتة...
yellow_threshold = (65, 100, -10, 6, 24, 51)
# قد تحتاج إلى ضبط الإعدادات أعلاه لتتبع الأشياء الخضراء...
# حدد منطقة في إطار الصورة (Framebuffer) لنسخ إعدادات اللون.
csi0.reset() # تهيئة مستشعر الكاميرا.
csi0.pixformat(csi.RGB565) # استخدام RGB565.
csi0.framesize(csi.QQVGA) # استخدام QQVGA من أجل السرعة.
csi0.snapshot(frames=10) # للسماح للإعدادات الجديدة بأخذ مفعولها.
csi0.auto_whitebal(False) # إيقاف تشغيل هذا الخيار.
clock = time.clock() # تتبّع عدد الإطارات في الثانية (FPS).
# في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 وOpenMV2 M4، المنفذ UART(3) هو P4-TX وP5-RX
uart = UART(3, 115200) # في OpenMV RT علّق هذا السطر، واستخدم السطر التالي UART(1)
#uart = UART(1, 115200) # في OpenMV RT استخدم سطر UART(1) هذا، وعلّق السطر السابق UART(3)
# في OpenMV RT يوجد منفذ تسلسلي واحد فقط هو UART(1)، ويقابل P4-TX وP5-RX؛ أما في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 فإن UART(1) هو P0-RX وP1-TX
while(True):
img = csi0.snapshot() # التقاط صورة وإرجاعها.
blobs = img.find_blobs([yellow_threshold])
if blobs:
print('sum :', len(blobs))
output_str = json.dumps(blobs)
for b in blobs:
# رسم مستطيل حول الكتلة.
img.draw_rectangle(b.rect) # rect
img.draw_cross((b.cx, b.cy)) # cx, cy
print('you send:',output_str)
uart.write(output_str+'\n')
else:
print('not found!')
الناتج الذي نحصل عليه هو:
sum : 1
you send: [{x:17, y:23, w:37, h:12, pixels:178, cx:40, cy:29, rotation:3.060313, code:1, count:1}]
sum : 2
you send: [{x:34, y:24, w:19, h:13, pixels:149, cx:45, cy:30, rotation:3.120370, code:1, count:1}, {x:23, y:30, w:8, h:2, pixels:17, cx:27, cy:30, rotation:0.046378, code:1, count:1}]
سيؤدي هذا إلى إرسال جميع الكتل.
تبسيط البيانات
لكن أحيانًا لا ترغب في إرسال كمية كبيرة من البيانات. على سبيل المثال، أريد فقط إرسال إحداثيات المركز x وy لأكبر كتلة لونية.\ قم ببناء البيانات التي تريد إرسالها.
اكتب حلقة for ثم اكتب دالة find_max().
# الكشف عن الكتل (Blob) والإرسال عبر UART
import csi, image, time
csi0 = csi.CSI()
#from pyb import UART
from machine import UART
import json
# لكي يعمل تتبع الألوان بشكل جيد جدًا، يُفضّل أن تكون في بيئة محكومة جدًا جدًا جدًا
# يكون فيها الإضاءة ثابتة...
yellow_threshold = (65, 100, -10, 6, 24, 51)
# قد تحتاج إلى ضبط الإعدادات أعلاه لتتبع الأشياء الخضراء...
# حدد منطقة في إطار الصورة (Framebuffer) لنسخ إعدادات اللون.
csi0.reset() # تهيئة مستشعر الكاميرا.
csi0.pixformat(csi.RGB565) # استخدام RGB565.
csi0.framesize(csi.QQVGA) # استخدام QQVGA من أجل السرعة.
csi0.snapshot(frames=10) # للسماح للإعدادات الجديدة بأخذ مفعولها.
csi0.auto_whitebal(False) # إيقاف تشغيل هذا الخيار.
clock = time.clock() # تتبّع عدد الإطارات في الثانية (FPS).
# في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 وOpenMV2 M4، المنفذ UART(3) هو P4-TX وP5-RX
uart = UART(3, 115200) # في OpenMV RT علّق هذا السطر، واستخدم السطر التالي UART(1)
#uart = UART(1, 115200) # في OpenMV RT استخدم سطر UART(1) هذا، وعلّق السطر السابق UART(3)
# في OpenMV RT يوجد منفذ تسلسلي واحد فقط هو UART(1)، ويقابل P4-TX وP5-RX؛ أما في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 فإن UART(1) هو P0-RX وP1-TX
def find_max(blobs):
max_size=0
for blob in blobs:
if blob.pixels > max_size:
max_blob=blob
max_size = blob.pixels
return max_blob
while(True):
img = csi0.snapshot() # التقاط صورة وإرجاعها.
blobs = img.find_blobs([yellow_threshold])
if blobs:
max_blob=find_max(blobs)
print('sum :', len(blobs))
img.draw_rectangle(max_blob.rect)
img.draw_cross((max_blob.cx, max_blob.cy))
output_str="[%d,%d]" % (max_blob.cx,max_blob.cy) # الطريقة 1
#output_str=json.dumps([max_blob.cx,max_blob.cy]) # الطريقة 2
print('you send:',output_str)
uart.write(output_str+'\r\n')
else:
print('not found!')
النتيجة:
sum : 6
you send: [63,45]
sum : 2
you send: [60,50]
sum : 1
you send: [61,51]
في الكود أعلاه،
output_str="[%d,%d]" % (max_blob.cx,max_blob.cy) # الطريقة 1
و
output_str=json.dumps([max_blob.cx,max_blob.cy]) # الطريقة 2
النتيجة واحدة؛ ولأن البنية بسيطة، يمكنك استخدام دالة تنسيق النصوص في Python أو دالة التحويل الخاصة بـ JSON.
في النتيجة، حتى لو تم العثور على عدة كتل لونية، يتم إرسال إحداثيات أكبر كتلة لونية فقط.