Comunicação serial II

Placa de expansão de depuração serial da OpenMV

A placa de expansão de depuração serial da OpenMV conecta a porta serial UART3 da OpenMV ao computador através do chip cp2104, e se conecta à placa de expansão de depuração serial via USB. Você pode ver os dados enviados na porta serial UART3 da OpenMV.

https://singtown.com/product/49906

A OpenMV e a placa de expansão de depuração serial são conectadas ao computador através de 2 cabos USB.

Usando o módulo TTL-USB

Se você não tiver a placa de expansão de depuração serial da OpenMV, também pode usar um módulo TTL-USB, que tem a mesma função que a placa de expansão de depuração serial da OpenMV.

Primeiro, precisamos entender que as portas seriais usadas por vários microcontroladores (incluindo Arduino, OpenMV, esp8266, stm32, 51) são todas portas seriais TTL! Não são RS485, nem RS232!

A tensão da porta serial TTL é de 3,3V ou 5V, a tensão do RS232 é de ±15V, e a tensão do RS485 é de 5V, mas as duas linhas de dados são linhas diferenciais, os protocolos são diferentes, e não podem ser usados de forma intercambiável.

O módulo que usamos é um módulo TTL para USB (recomenda-se o módulo cp2104, um pouco mais caro, mas de boa qualidade):

Diagrama de conexão (observe o terra comum e as conexões RXTX cruzadas):

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

Conecte a extremidade USB do módulo TTL ao computador e uma porta serial irá aparecer.

Singtown Serial Port Assistant

Primeiro baixe o Singtown Serial Port Assistant:\ https://singtown.com/singtownserialport/

O Singtown Serial Port Assistant é um assistente de porta serial de código aberto, simples e fácil de usar, que suporta Windows, MacOS e Linux.

Execute o programa

Note que alguns softwares permitem escolher HEX (hexadecimal) ou ASC (ascii). Você deve selecionar ASC para exibir a string.

Execute o programa uart.write("hello world!") na OpenMV (veja a seção anterior).

O assistente de porta serial exibirá "Hello world!".

Se você executar o seguinte programa:

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

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.

csi0.reset() # Initialize the camera sensor.
csi0.pixformat(csi.RGB565) # use RGB565.
csi0.framesize(csi.QQVGA) # use QQVGA for speed.
csi0.snapshot(frames=10) # Let new settings take affect.
csi0.auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.

# O UART(3) da OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 é P4-TX P5-RX
uart = UART(3, 115200)   # Na OpenMV RT, comente esta linha e use a linha UART(1) abaixo
#uart = UART(1, 115200)  # Na OpenMV RT, use esta linha UART(1) e comente a linha UART(3) acima
# A OpenMV RT possui apenas a porta serial UART(1), correspondente a P4-TX P5-RX; o UART(1) da OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 é P0-RX P1-TX

while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = csi0.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!")

As coordenadas centrais de todos os blocos de cor serão enviadas.

O Singtown Serial Port Assistant exibirá os dados recebidos:

Programa de análise para Arduino

Como o Arduino Uno possui apenas uma porta serial, usada para recepção, ele não consegue enviar dados ao computador para exibição. Por isso, usamos software para simular uma porta serial e executar o programa de encaminhamento da porta serial.

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

A lógica de encaminhamento é a seguinte: os dados da OpenMV são enviados para a porta serial por software do Arduino Uno, e a porta serial do Arduino é conectada ao computador e exibe os resultados.

Portanto, a lógica do Arduino Mega é: ler os dados (json) da softSerial, analisá-los em um array, e enviá-los para a Serial (computador).

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];
    }
  }
}

results matching ""

    No results matching ""