Sous communication série
Carte d'extension de débogage du port série OpenMV
La carte d'extension de débogage du port série OpenMV connecte le port série OpenMV UART3 à l'ordinateur via la puce cp2104 et se connecte à la carte d'extension de débogage du port série via USB. Vous pouvez voir les données envoyées sur le port série OpenMV UART3.
https://singtown.com/product/49906
OpenMV et la carte d'extension de débogage du port série sont connectés à l'ordinateur via 2 câbles USB.
Utilisation du module TTL-USB
S'il n'y a pas de carte d'extension de débogage du port série OpenMV, vous pouvez également utiliser le module TTL-USB, qui a la même fonction que la carte d'extension de débogage du port série OpenMV.
La première chose que nous devons comprendre est la suivante : les ports série utilisés par divers microcontrôleurs (y compris Arduino, OpenMV, esp8266, stm32, 51) sont tous des ports série TTL ! Pas de RS485, pas de RS232 !
La tension du port série TTL est de 3,3 V ou 5 V, la tension du RS232 est de +-15 V et la tension du RS485 est de 5 V. Cependant, les deux lignes de données sont des lignes différentielles avec des protocoles différents et ne peuvent pas être utilisées universellement.
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 les connexions terre commune et RXTXdécalées) :
OpenMV | FTDI |
---|---|
P4(TX) | RX |
P5(RX) | TX |
GND | GND |
Insérez l'extrémité USB du module TTL dans l'ordinateur et un port série apparaîtra.
Assistant de port sérieSingtown
Téléchargez d'abord l'assistant de port sérieSingtown :\ https://singtown.com/singtownserialport/
Singtown Serial Assistant est un assistant série open source simple et facile à utiliser qui prend en charge Windows, MacOS et Linux.
Exécuter le programme
Notez que certains logiciels vous permettent de sélectionner HEX (hexadécimal) ou ASC (ascii). Vous devez sélectionner ASC pour afficher la chaîne.
Le programme exécutant uart.write("hello world!") sur OpenMV (voir la section précédente).
L'assistant de port série affichera Hello world ! personnage.
Si vous exécutez le programme suivant :
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!")
Les coordonnées centrales de tous les blocs de couleur seront envoyées.
L'assistant de port sérieSingtown affichera les données reçues :
Analyseur Arduino
Étant donné que l'Arduino Uno n'a qu'un seul port série et qu'un seul est utilisé pour recevoir, il n'y a aucun moyen de l'envoyer à l'ordinateur pour l'afficher. Nous utilisons donc un logiciel pour simuler le port série afin d'exécuter le programme de transfert de port série.
OpenMV | Arduino |
---|---|
P4(TX) | 10(RX) |
P5(RX) | 11(TX) |
GND | GND |
La logique de transfert est la suivante : les données OpenMV sont envoyées au port série logiciel de l'Arduino Uno, et le port série Arduino est connecté à l'ordinateur et affiche les résultats.
Par conséquent, la logique dans ArduinoMega est la suivante : lire les données softSerial (json), puis les analyser dans un tableau et les envoyer à Serial(computer).
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() {
// 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];
}
}
}