Zur seriellen Kommunikation

Video-Tutorial 27 – Daten über serielle Kommunikation senden:

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

Video-Tutorial 28 – Serielle Kommunikation zum Empfangen von Daten:

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

einführen

Warum einen seriellen Port verwenden? Weil es notwendig ist, bei Bedarf Informationen an andere MCUs zu übertragen. Der serielle Port ist grundsätzlich einfach und universell.

Ein serieller TTL-Anschluss erfordert mindestens drei Drähte: TXD, RXD und GND. TXD ist das Sendeende, RXD ist das Empfangsende und GND ist das Erdungskabel. Beim Herstellen einer Verbindung müssen Sie den RXD von OpenMV mit dem TXD einer anderen MCU und den TXD mit dem RXD verbinden. Illustration:

import time
from machine import UART
#from pyb import UART

# OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 的UART(3)是P4-TX P5-RX
uart = UART(3, 19200)   #OpenMV RT 注释掉这一行,用下一行UART(1)
#uart = UART(1, 19200)  #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):
    uart.write("Hello World!\r")
    time.sleep_ms(1000)

Instanziieren Sie zunächst eine serielle Schnittstelle mit einer Baudrate von 19200 und rufen Sie dann die Schreibmethode auf.

Hinweis: OpenMV RT verfügt nur über die serielle Schnittstelle UART(1), entsprechend P4-TX P5-RX.

Der serielle Port UART(1) von OpenMV4 H7 Plus, OpenMV4 H7 und OpenMV3 M7 ist P0-RX P1-TX.

Der serielle Port UART(3) von OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 ist P4-TX P5-RX

Komplexe Daten übertragen

Wie im vorherigen Abschnitt erwähnt, JSON-String.

# Blob Detection and uart transport
import sensor, image, time
#from pyb import UART
from machine import UART
import json
# 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   = (65, 100, -10, 6, 24, 51)
# 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):
    img = sensor.snapshot() # Take a picture and return the image.

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

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

Die resultierende Ausgabe ist:

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

Auf diese Weise werden die gesamten Blobs versendet.

Reduzierte Daten

Aber manchmal möchte man nicht viele Daten übertragen. Beispiel: Ich möchte nur die x- und y-Mittelkoordinaten des Farbblocks mit der größten Fläche übertragen. \ Konstruieren Sie alle Daten, die Sie übertragen möchten.

Schreiben Sie eine for-Schleife und dann eine find_max()-Funktion.

# Blob Detection and uart transport
import sensor, image, time
#from pyb import UART
from machine import UART
import json
# 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   = (65, 100, -10, 6, 24, 51)
# 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

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 = sensor.snapshot() # Take a picture and return the 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()) #方式1
        #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
        print('you send:',output_str)
        uart.write(output_str+'\r\n')
    else:
        print('not found!')

Ergebnis:

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

Im obigen Code,

output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #方式1

Und

output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2

Das Ergebnis ist das gleiche. Da die Struktur einfach ist, können Sie die String-Formatierungsfunktion von Python oder die Konvertierungsfunktion von JSON verwenden.

Selbst wenn mehrere Farbfelder gefunden werden, werden im Ergebnis nur die Koordinaten des größten Farbfelds gesendet.

results matching ""

    No results matching ""