При последовательной связи
Плата расширения для отладки последовательного порта OpenMV
Плата расширения отладки последовательного порта OpenMV подключает последовательный порт UART3 OpenMV к компьютеру через микросхему cp2104 и подключается к плате расширения отладки последовательного порта через USB. Вы можете просмотреть данные, отправленные через последовательный порт OpenMV UART3.
https://singtown.com/product/49906
OpenMV и плата расширения отладки последовательного порта подключаются к компьютеру через 2 USB-кабеля.
Использование модуля TTL-USB
Если нет платы расширения отладки последовательного порта OpenMV, вы также можете использовать модуль TTL-USB, который имеет те же функции, что и плата расширения отладки последовательного порта OpenMV.
Первое, что нам нужно понять: все последовательные порты, используемые различными микроконтроллерами (включая Arduino, OpenMV, esp8266, stm32, 51), являются последовательными портами TTL! Не rs485, не rs232!
Напряжение последовательного порта TTL составляет 3,3 В или 5 В, напряжение RS232 — +-15 В, а напряжение RS485 — 5 В. Однако две линии передачи данных являются дифференциальными линиями с разными протоколами и не могут использоваться универсально.
Мы используем модуль TTL-USB (рекомендуется модуль cp2104, немного дороже, но хорошего качества):
Схема подключения(обратите внимание на общее заземление и RXTX шахматное соединение):
OpenMV | FTDI |
---|---|
P4(TX) | RX |
P5(RX) | TX |
GND | GND |
Вставьте USB-конец модуля TTL в компьютер, и появится последовательный порт.
Помощник последовательного порта Singtown
Сначала загрузите помощник последовательного порта Singtown:\ https://singtown.com/singtownserialport/
Singtown Serial Assistant — это простой и удобный в использовании последовательный помощник с открытым исходным кодом, поддерживающий Windows, MacOS и Linux.
Запустить программу
Обратите внимание, что некоторые программы позволяют выбирать HEX (шестнадцатеричный) или ASC (ascii). Для отображения строки необходимо выбрать ASC.
Программа, запускающая uart.write("hello world!") на OpenMV (см. предыдущий раздел).
Помощник последовательного порта отобразит Hello world! характер.
Если вы запустите следующую программу:
import sensor, image, time
import json
from machine import UART
#from pyb import UART
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold = ( 46, 100, -68, 72, 58, 92)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks 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):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([yellow_threshold])
if blobs:
#print('sum : %d'% len(blobs))
data=[]
for b in blobs:
# Draw a rect around the blob.
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 отправляются в программный последовательный порт Arduino Uno, а последовательный порт Arduino подключается к компьютеру и отображает результаты.
Таким образом, логика ArduinoMega такова: прочитать данные softSerial (json), затем проанализировать их в массив и отправить в 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() {
// put your setup code here, to run once:
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];
}
}
}