Na comunicação série

Tutorial em vídeo 27 - Comunicação série para envio de dados:

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

Tutorial em vídeo 28 - Dados de recepção de comunicação série:

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

introduzir

Porquê usar porta serial? Como a informação precisa de ser transmitida para outros MCUs quando necessário, a porta série é simples e universal.

Uma porta série TTL requer pelo menos 3 fios: TXD, RXD e GND. TXD é a extremidade de transmissão, RXD é a extremidade de recepção e GND é o fio de terra. Ao ligar, precisa de ligar o RXD do OpenMV ao TXD de outro MCU e ligar o TXD ao RXD. Ilustração:

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)

Primeiro instancie uma porta série com uma taxa de transmissão de 19200 e depois chame o método write.

Nota: O OpenMV RT apenas possui a porta série UART(1), correspondente ao P4-TX P5-RX.

A porta série UART(1) do OpenMV4 H7 Plus, OpenMV4 H7 e OpenMV3 M7 é P0-RX P1-TX.

A porta série UART(3) do OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 é P4-TX P5-RX

Transferir dados complexos

Como referido na secção anterior, a string json.

# 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!')

A saída resultante é:

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

Desta forma, todos os blobs são enviados.

Dados reduzidos

Mas, por vezes, não deseja transferir muitos dados. Por exemplo: apenas pretendo transmitir as coordenadas centrais x, y do bloco de cor com a maior área.\ Construa quaisquer dados que pretenda transmitir.

Escreva um ciclo for e, em seguida, escreva uma função find_max().

# 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!')

resultado:

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

No código acima,

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

e

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

O resultado é o mesmo. Como a estrutura é simples, pode utilizar a função de formatação de strings do python ou a função de conversão do json.

No resultado, mesmo que sejam encontradas várias amostras de cor, apenas serão enviadas as coordenadas da maior amostra de cor.

results matching ""

    No results matching ""