Communication série I

Tutoriel vidéo 27 - Communication série, envoi de données :

https://singtown.com/learn/50235/

Tutoriel vidéo 28 - Communication série, réception de données :

https://singtown.com/learn/50240/

Introduction

Pourquoi utiliser le port série ? Parce que parfois vous devez envoyer des informations à un autre MCU, le port série est simple et universel, pratiquement tous les microcontrôleurs disposent d'un port série.

Le TTL série nécessite au moins trois fils : TXD, RXD, GND ; TXD est l'extrémité d'envoi, RXD est l'extrémité de réception, et GND est le fil de masse. Lors de la connexion, vous devez relier RXD d'OpenMV au TXD de l'autre MCU, et relier TXD à RXD. Comme illustré sur l'image :

import time
from machine import UART
#from pyb import UART

# Le UART(3) de l'OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 correspond à P4-TX P5-RX
uart = UART(3, 19200)   # OpenMV RT : commentez cette ligne, utilisez la ligne UART(1) suivante
#uart = UART(1, 19200)  # 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):
    uart.write("Hello World!\r")
    time.sleep_ms(1000)

Instanciez d'abord un port série avec un débit en bauds de 19200, puis appelez la méthode write.

Remarque : OpenMV RT ne dispose que du port série UART(1), correspondant à P4-TX P5-RX.

Le port série UART(1) de l'OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 est P0-RX P1-TX.

Le port série UART(3) de l'OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 est P4-TX P5-RX

Transmettre des données complexes

Dans la section précédente, nous avons parlé des chaînes json.

# Détection de blob et transmission uart
import csi, image, time
csi0 = csi.CSI()

#from pyb import UART
from machine import UART
import json
# 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   = (65, 100, -10, 6, 24, 51)
# 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):
    img = csi0.snapshot() # Prend une photo et renvoie l'image.

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        print('sum :', len(blobs))
        output_str = json.dumps(blobs)
        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

        print('you send:',output_str)
        uart.write(output_str+'\n')
    else:
        print('not found!')

Le résultat obtenu est :

sum : 1
you send: [{x:17, y:23, w:37, h:12, pixels:178, cx:40, cy:29, rotation:3.060313, code:1, count:1}]
sum : 2
you send: [{x:34, y:24, w:19, h:13, pixels:149, cx:45, cy:30, rotation:3.120370, code:1, count:1}, {x:23, y:30, w:8, h:2, pixels:17, cx:27, cy:30, rotation:0.046378, code:1, count:1}]

Cela enverra tous les blobs.

Rationaliser les données

Mais parfois, vous ne voulez pas transmettre beaucoup de données. Par exemple, je veux seulement transmettre les coordonnées du centre x et y du plus grand bloc de couleur.\ Construisez les données que vous voulez transmettre.

Écrivez une boucle for, puis écrivez une fonction find_max().

# Détection de blob et transmission uart
import csi, image, time
csi0 = csi.CSI()

#from pyb import UART
from machine import UART
import json
# 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   = (65, 100, -10, 6, 24, 51)
# 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

def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels > max_size:
            max_blob=blob
            max_size = blob.pixels
    return max_blob

while(True):
    img = csi0.snapshot() # Prend une photo et renvoie l'image.

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        max_blob=find_max(blobs)
        print('sum :', len(blobs))
        img.draw_rectangle(max_blob.rect)
        img.draw_cross((max_blob.cx, max_blob.cy))

        output_str="[%d,%d]" % (max_blob.cx,max_blob.cy) # méthode 1
        #output_str=json.dumps([max_blob.cx,max_blob.cy]) # méthode 2
        print('you send:',output_str)
        uart.write(output_str+'\r\n')
    else:
        print('not found!')

Résultat :

sum : 6
you send: [63,45]
sum : 2
you send: [60,50]
sum : 1
you send: [61,51]

Dans le code ci-dessus,

output_str="[%d,%d]" % (max_blob.cx,max_blob.cy) # méthode 1

et

output_str=json.dumps([max_blob.cx,max_blob.cy]) # méthode 2

Le résultat est identique, car la structure est simple, vous pouvez utiliser la fonction de formatage de chaîne de Python ou la fonction de conversion de JSON.

Dans le résultat, même si plusieurs blocs de couleur sont trouvés, seules les coordonnées du plus grand bloc de couleur sont envoyées.

results matching ""

    No results matching ""