Communication série II

Carte d'extension de débogage série OpenMV

La carte d'extension de débogage série d'OpenMV connecte le port série UART3 d'OpenMV à l'ordinateur via la puce cp2104, et la relie à la carte d'extension de débogage série via USB. Vous pouvez voir les données envoyées sur le port série UART3 d'OpenMV.

https://singtown.com/product/49906

OpenMV et la carte d'extension de débogage série sont connectées à l'ordinateur via 2 câbles USB.

Utilisation du module TTL-USB

Si vous n'avez pas de carte d'extension de débogage série OpenMV, vous pouvez également utiliser un module TTL-USB, qui a la même fonction que la carte d'extension de débogage série OpenMV.

Tout d'abord, il faut comprendre que les ports série utilisés par les divers microcontrôleurs (y compris Arduino, OpenMV, esp8266, stm32, 51) sont tous des ports série TTL ! Pas du rs485, pas du rs232 !

La tension du port série TTL est de 3,3V ou 5V, la tension du RS232 est de ±15V, et la tension du RS485 est de 5V, mais les deux lignes de données sont des lignes différentielles, les protocoles sont différents, et ils ne peuvent pas être utilisés de manière interchangeable.

Le module que nous utilisons est un module TTL vers USB (le module cp2104 est recommandé, un peu plus cher mais de bonne qualité) :

Schéma de connexion (notez la masse commune et les connexions RXTX croisées) :

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

Branchez l'extrémité USB du module TTL sur l'ordinateur et un port série apparaîtra.

Assistant de port série Singtown

Téléchargez d'abord l'assistant de port série SingTown :\ https://singtown.com/singtownserialport/

L'assistant de port série Singtown est un assistant de port série open source, simple et facile à utiliser, prenant en charge Windows, MacOS et Linux.

Exécuter le programme

Notez que certains logiciels vous permettent de choisir HEX (hexadécimal) ou ASC (ascii). Vous devez sélectionner ASC pour afficher la chaîne de caractères.

Exécutez le programme uart.write("hello world!") sur OpenMV (voir la section précédente).

L'assistant de port série affichera "Hello world!".

Si vous exécutez le programme suivant :

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

from machine import UART
#from pyb import UART
# Pour que le suivi de couleur fonctionne vraiment bien, vous devriez idéalement
# être dans un environnement très, très, très contrôlé où l'éclairage est constant...
yellow_threshold   = ( 46,  100,  -68,   72,   58,   92)
# Vous devrez peut-être ajuster les réglages ci-dessus pour suivre des objets verts...
# Sélectionnez une zone dans le tampon d'image pour copier les réglages de couleur.

csi0.reset() # Initialise le capteur de la caméra.
csi0.pixformat(csi.RGB565) # utilise RGB565.
csi0.framesize(csi.QQVGA) # utilise QQVGA pour la vitesse.
csi0.snapshot(frames=10) # Laisse les nouveaux réglages prendre effet.
csi0.auto_whitebal(False) # désactive ceci.
clock = time.clock() # Suit le FPS.

# Le UART(3) de l'OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 correspond à P4-TX P5-RX
uart = UART(3, 115200)   # OpenMV RT : commentez cette ligne, utilisez la ligne UART(1) suivante
#uart = UART(1, 115200)  # OpenMV RT : utilisez cette ligne UART(1), commentez la ligne UART(3) précédente
# OpenMV RT ne dispose que du port série UART(1), correspondant à P4-TX P5-RX ; le UART(1) de l'OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 est P0-RX P1-TX

while(True):
    clock.tick() # Suit les millisecondes écoulées entre les snapshot().
    img = csi0.snapshot() # Prend une photo et renvoie l'image.

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        #print('sum : %d'% len(blobs))
        data=[]
        for b in blobs:
            # Dessine un rectangle autour du 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!")

Les coordonnées du centre de tous les blocs de couleur seront envoyées.

L'assistant de port série Singtown affichera les données reçues :

Programme d'analyse Arduino

Comme l'Arduino Uno n'a qu'un seul port série, réservé à la réception, il ne peut pas envoyer les données à l'ordinateur pour affichage. Nous utilisons donc un logiciel pour simuler un port série et effectuer le programme de retransmission série.

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

La logique de retransmission est la suivante : les données provenant d'OpenMV sont envoyées au port série logiciel de l'Arduino Uno, et le port série de l'Arduino est connecté à l'ordinateur et affiche les résultats.

Par conséquent, la logique de l'Arduino Mega est : lire les données (json) depuis softSerial, les analyser dans un tableau, et les envoyer vers Serial(ordinateur).

Code

#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() {
  // placez ici votre code d'initialisation, à exécuter une fois :
  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 ""