Comunicación serie II
Placa de expansión de depuración por puerto serie de OpenMV
La placa de expansión de depuración por puerto serie de OpenMV conecta el puerto serie UART3 de OpenMV al ordenador a través del chip cp2104, y lo conecta a la placa de expansión de depuración por puerto serie mediante USB. Puede ver los datos enviados por el puerto serie UART3 de OpenMV.
https://singtown.com/product/49906
OpenMV y la placa de expansión de depuración por puerto serie se conectan al ordenador mediante 2 cables USB.
Uso del módulo TTL-USB
Si no dispone de la placa de expansión de depuración por puerto serie de OpenMV, también puede usar un módulo TTL-USB, que tiene la misma función que la placa de expansión de depuración por puerto serie de OpenMV.
En primer lugar, debemos entender que los puertos serie utilizados por los distintos microcontroladores (incluyendo Arduino, OpenMV, esp8266, stm32, 51) son todos puertos serie TTL. ¡No son rs485 ni rs232!
El voltaje del puerto serie TTL es de 3.3V o 5V, el voltaje de RS232 es de ±15V, y el voltaje de RS485 es de 5V, pero las dos líneas de datos son líneas diferenciales, los protocolos son distintos, y no se pueden usar indistintamente.
El módulo que utilizamos es un módulo TTL a USB (se recomienda el módulo cp2104, que es un poco más caro pero de buena calidad):

Diagrama de conexión(observe la masa común y las conexiones cruzadas de RX/TX):
| OpenMV | FTDI |
|---|---|
| P4(TX) | RX |
| P5(RX) | TX |
| GND | GND |

Conecte el extremo USB del módulo TTL al ordenador y aparecerá un puerto serie.
Singtown Serial Port Assistant
Primero descargue SingTown Serial Port Assistant:\ https://singtown.com/singtownserialport/
Singtown Serial Port Assistant es un asistente de puerto serie de código abierto, sencillo y fácil de usar, compatible con Windows, MacOS y Linux.
Ejecutar el programa
Tenga en cuenta que algunos programas permiten elegir entre HEX (hexadecimal) o ASC (ascii). Debe seleccionar ASC para mostrar la cadena de texto.
Ejecute el programa uart.write("hello world!") en OpenMV (vea la sección anterior).
El asistente de puerto serie mostrará "Hello world!".
Si ejecuta el siguiente programa:
import csi, image, time
import json
csi0 = csi.CSI()
from machine import UART
#from pyb import UART
# Para que el seguimiento de color funcione realmente bien, lo ideal es estar en un
# entorno muy, muy controlado donde la iluminación sea constante...
yellow_threshold = ( 46, 100, -68, 72, 58, 92)
# Puede que necesite ajustar los valores anteriores para rastrear objetos verdes...
# Seleccione un área en el Framebuffer para copiar los ajustes de color.
csi0.reset() # Inicializa el sensor de la cámara.
csi0.pixformat(csi.RGB565) # usa RGB565.
csi0.framesize(csi.QQVGA) # usa QQVGA por velocidad.
csi0.snapshot(frames=10) # Deja que los nuevos ajustes surtan efecto.
csi0.auto_whitebal(False) # desactívalo.
clock = time.clock() # Registra los FPS.
# El UART(3) de OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 es P4-TX P5-RX
uart = UART(3, 115200) #OpenMV RT: comente esta línea y use la siguiente línea UART(1)
#uart = UART(1, 115200) #OpenMV RT: use esta línea UART(1) y comente la línea anterior UART(3)
# OpenMV RT solo tiene el puerto serie UART(1), que corresponde a P4-TX P5-RX; el UART(1) de OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 es P0-RX P1-TX
while(True):
clock.tick() # Registra los milisegundos transcurridos entre snapshots().
img = csi0.snapshot() # Toma una foto y devuelve la imagen.
blobs = img.find_blobs([yellow_threshold])
if blobs:
#print('sum : %d'% len(blobs))
data=[]
for b in blobs:
# Dibuja un rectángulo alrededor del 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!")

Se enviarán las coordenadas centrales de todos los bloques de color.
El Singtown Serial Port Assistant mostrará los datos recibidos:

Programa de análisis para Arduino
Como el Arduino Uno solo tiene un puerto serie, uno para recepción, no puede enviar datos al ordenador para su visualización. Por eso usamos software para simular el puerto serie y realizar el programa de reenvío por puerto serie.
| OpenMV | Arduino |
|---|---|
| P4(TX) | 10(RX) |
| P5(RX) | 11(TX) |
| GND | GND |

La lógica de reenvío es la siguiente: los datos de OpenMV se envían al puerto serie por software del Arduino Uno, y el puerto serie del Arduino está conectado al ordenador y muestra los resultados.
Por lo tanto, la lógica del Arduino Mega es: leer los datos (json) desde softSerial, analizarlos y convertirlos en un arreglo, y enviarlos a Serial(computer).
Código
#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];
}
}
}

</content>