Sotto comunicazione seriale
Scheda di espansione di debug della porta seriale OpenMV
La scheda di espansione di debug della porta seriale OpenMV collega la porta seriale UART3 di OpenMV al computer tramite il chip cp2104 e si collega alla scheda di espansione di debug della porta seriale tramite USB. È possibile visualizzare i dati inviati sulla porta seriale di OpenMV UART3.
https://singtown.com/product/49906
OpenMV e la scheda di espansione di debug della porta seriale sono collegati al computer tramite 2 cavi USB.
Utilizzando il modulo TTL-USB
Se non è presente alcuna scheda di espansione di debug della porta seriale OpenMV, è anche possibile utilizzare il modulo TTL-USB, che ha la stessa funzione della scheda di espansione di debug della porta seriale OpenMV.
La prima cosa che dobbiamo capire è: le porte seriali utilizzate dai vari microcontrollori (inclusi Arduino, OpenMV, esp8266, stm32, 51) sono tutte porte seriali TTL!Non RS485, non RS232!
La tensione della porta seriale TTL è 3,3 V o 5 V, la tensione di RS232 è +-15 V e la tensione di RS485 è 5 V. Tuttavia, le due linee dati sono linee differenziali con protocolli diversi e non possono essere utilizzate universalmente.
Il modulo che utilizziamo è un modulo TTL to USB (si consiglia il modulo cp2104, un po' più costoso, ma di buona qualità):
Schema di collegamento(notare la terra comune e le connessioni RXTXsfalsate):
OpenMV | FTDI |
---|---|
P4(TX) | RX |
P5(RX) | Tx |
GND | GND |
Inserisci l'estremità USB del modulo TTL nel computer e apparirà una porta seriale.
Assistente per la porta seriale Singtown
Per prima cosa scarica l'assistente per la porta seriale Singtown:\ https://singtown.com/singtownserialport/
Singtown Serial Assistant è un assistente seriale open source semplice e facile da usare che supporta Windows, MacOS e Linux.
Esegui il programma
Tieni presente che alcuni software consentono di selezionare HEX (esadecimale) o ASC (ascii). È necessario selezionare ASC per visualizzare la stringa.
Il programma che esegue uart.write("hello world!") su OpenMV (vedere la sezione precedente).
L'assistente della porta seriale visualizzerà Hello world!carattere.
Se esegui il seguente programma:
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!")
Verranno inviate le coordinate centrali di tutti i blocchi di colore.
L'assistente per la porta seriale di Singtown visualizzerà i dati ricevuti:
Analizzatore di Arduino
Poiché Arduino Uno ha solo una porta seriale e una viene utilizzata per ricevere, non è possibile inviarla al computer per la visualizzazione.Quindi utilizziamo il software per simulare la porta seriale per eseguire il programma di inoltro della porta seriale.
OpenMV | Arduino |
---|---|
P4(TX) | 10(RX) |
P5(RX) | 11(TX) |
GND | GND |
La logica di inoltro è la seguente: i dati OpenMV vengono inviati alla porta seriale soft di Arduino Uno e la porta seriale Arduino è collegata al computer e visualizza i risultati.
Pertanto, la logica in ArduinoMega è: leggere i dati softSerial (json), quindi analizzarli in un array e inviarli a Serial(computer).
codice
#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];
}
}
}