التواصل التسلسلي الثاني

لوحة تصحيح المنفذ التسلسلي الموسعة لـ OpenMV

تقوم لوحة تصحيح المنفذ التسلسلي الموسعة الخاصة بـ OpenMV بتوصيل المنفذ التسلسلي UART3 الخاص بـ OpenMV بالحاسوب عبر شريحة cp2104، وتوصيله بلوحة تصحيح المنفذ التسلسلي عبر USB. يمكنك رؤية البيانات المُرسلة على المنفذ التسلسلي UART3 الخاص بـ OpenMV.

https://singtown.com/product/49906

يتم توصيل OpenMV ولوحة تصحيح المنفذ التسلسلي بالحاسوب عبر كابلي USB.

استخدام وحدة TTL-USB

إذا لم تكن لديك لوحة تصحيح المنفذ التسلسلي الخاصة بـ OpenMV، يمكنك أيضًا استخدام وحدة TTL-USB، والتي لها نفس وظيفة لوحة تصحيح المنفذ التسلسلي الخاصة بـ OpenMV.

بدايةً، يجب أن نفهم أن المنافذ التسلسلية المستخدمة في مختلف المتحكمات الدقيقة (بما فيها Arduino و OpenMV و esp8266 و stm32 و 51) هي جميعها منافذ تسلسلية TTL! ليست rs485 وليست rs232!

جهد المنفذ التسلسلي TTL هو 3.3 فولت أو 5 فولت، وجهد RS232 هو ±15 فولت، وجهد RS485 هو 5 فولت، لكن خطي البيانات فيه تفاضليان (differential)، والبروتوكولات مختلفة، ولا يمكن استخدامها بالتبادل.

الوحدة التي نستخدمها هي وحدة تحويل TTL إلى USB (يُنصح بوحدة cp2104، وهي أغلى قليلاً ولكن ذات جودة جيدة):

مخطط التوصيل (لاحظ الأرضي المشترك (common ground) وتوصيلات RXTX المتقاطعة):

OpenMV FTDI
P4(TX) RX
P5(RX) TX
GND GND

قم بتوصيل طرف USB الخاص بوحدة TTL بالحاسوب وسيظهر منفذ تسلسلي.

مساعد المنفذ التسلسلي من Singtown

أولاً قم بتنزيل مساعد المنفذ التسلسلي من Singtown:\ https://singtown.com/singtownserialport/

مساعد المنفذ التسلسلي من Singtown هو مساعد منفذ تسلسلي مفتوح المصدر بسيط وسهل الاستخدام ويدعم Windows وMacOS وLinux.

تشغيل البرنامج

لاحظ أن بعض البرامج تتيح لك اختيار HEX (نظام ست عشري) أو ASC (ascii). يجب عليك اختيار ASC لعرض النص (string).

قم بتشغيل برنامج uart.write("hello world!") على OpenMV (راجع القسم السابق).

سيعرض مساعد المنفذ التسلسلي "Hello world!".

إذا قمت بتشغيل البرنامج التالي:

import csi, image, time
import json
csi0 = csi.CSI()

from machine import UART
#from pyb import UART
# لكي يعمل تتبع اللون بشكل جيد حقًا، يجب أن تكون من الناحية المثالية في بيئة
# محكومة جدًا جدًا جدًا حيث تكون الإضاءة ثابتة...
yellow_threshold   = ( 46,  100,  -68,   72,   58,   92)
# قد تحتاج إلى ضبط الإعدادات أعلاه لتتبع أشياء خضراء...
# حدد منطقة في 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).

# منفذ UART(3) في OpenMV4 H7 Plus وOpenMV4 H7 وOpenMV3 M7 وOpenMV2 M4 هو P4-TX P5-RX
uart = UART(3, 115200)   # في OpenMV RT قم بتعليق (comment) هذا السطر، واستخدم السطر التالي 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):
    clock.tick() # تتبع الوقت بالمللي ثانية المنقضي بين اللقطات (snapshots()).
    img = csi0.snapshot() # التقاط صورة وإعادتها.

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        #print('sum : %d'% len(blobs))
        data=[]
        for b in blobs:
            # رسم مستطيل حول الكتلة اللونية.
            img.draw_rectangle(b.rect) # rect
            img.draw_cross((b.cx, b.cy)) # cx, cy
            data.append((b.cx,b.cy))

        #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
        data_out = json.dumps(set(data))
        uart.write(data_out +'\n')
        print('you send:',data_out)
    else:
        print("not found!")

سيتم إرسال إحداثيات مراكز جميع الكتل اللونية.

سيعرض مساعد المنفذ التسلسلي من Singtown البيانات المستقبلة:

برنامج التحليل الخاص بـ Arduino

نظرًا لأن Arduino Uno يحتوي على منفذ تسلسلي واحد فقط، مخصص للاستقبال، فلا يمكنه الإرسال إلى الحاسوب للعرض. لذلك نستخدم برمجية لمحاكاة منفذ تسلسلي لتنفيذ برنامج إعادة توجيه المنفذ التسلسلي.

OpenMV Arduino
P4(TX) 10(RX)
P5(RX) 11(TX)
GND GND

منطق إعادة التوجيه كالتالي: تُرسل البيانات من OpenMV إلى المنفذ التسلسلي البرمجي (soft serial) الخاص بـ Arduino Uno، ويكون المنفذ التسلسلي لـ Arduino متصلاً بالحاسوب ويعرض النتائج.

لذلك، منطق Arduino Mega هو: قراءة البيانات (json) من softSerial، وتحليلها إلى مصفوفة، وإرسالها إلى Serial(الحاسوب).

الكود

#include <SoftwareSerial.h>

SoftwareSerial softSerial(10, 11); // RX, TX
typedef struct
{
  int data[50][2] = {{0,0}};
  int len = 0;
}List;
List list;

void setup() {
  // ضع كود الإعداد هنا، ليتم تشغيله مرة واحدة:
  softSerial.begin(115200);
  Serial.begin(115200);
}

void loop() {
  if(softSerial.available())
  {
    getList();
    for (int i=0; i<list.len; i++)
    {
      Serial.print(list.data[i][0]);
      Serial.print('\t');
      Serial.println(list.data[i][1]);
    }
    Serial.println("============");
    clearList();
  }

}


String detectString()
{
  while(softSerial.read() != '{');
  return(softSerial.readStringUntil('}'));
}
void clearList()
{
  memset(list.data, sizeof(list.data),0);
  list.len = 0;
}
void getList()
{
  String s = detectString();
  String numStr = "";
  for(int i = 0; i<s.length(); i++)
  {
    if(s[i]=='('){
      numStr = "";
    }
    else if(s[i] == ','){
      list.data[list.len][0] = numStr.toInt();
      numStr = "";
    }
    else if(s[i]==')'){
      list.data[list.len][1] = numStr.toInt();
      numStr = "";
      list.len++;
    }
    else{
      numStr += s[i];
    }
  }
}

results matching ""

    No results matching ""