OpenMV: 23 portas seriais para enviar dados


Esta seção explica como usar o OpenMV para enviar dados pela porta serial

O OpenMV pode enviar strings diretamente pela porta serial.

Por que usar uma porta serial? Como as informações precisam ser transmitidas para outros MCUs (microcomputadores de chip único) quando necessário, a porta serial é simples e universal e basicamente todo MCU terá uma porta serial.

Uma porta serial TTL requer pelo menos 3 fios: TXD,RXD,GND. TXD是发送端, RXD是接收端, GND是地线. Ao conectar, é necessário 把OpenMV的RXD连到另一个MCU的TXD,TXD连到RXD,GND与GND相连. Gráfico:

insira a descrição da imagem aqui

Basicamente todos os MCUs possuem portas seriais, então podemos usar as portas seriais do OpenMV para transmitir informações para qualquer outro MCU ou dispositivo

Se precisarmos visualizar as informações da porta serial no OpenMV , precisamos de equipamentos adicionais (osciloscópio ou USB para módulo de porta serial)

OpenMV tem uma placa de expansão --> placa de expansão de depuração de porta serial , que pode transmitir dados diretamente para o computador através deste USB


produtos

insira a descrição da imagem aqui

Abra a página detalhada, há um software nele 星瞳串口助手, precisamos baixá-lo, somente depois de instalar este software podemos visualizar os dados acima

insira a descrição da imagem aqui
Conectamos o OpenMV à placa de expansão , devendo ser conectado o cabo de dados USB da porta serial ao computador , e o cabo de dados do OpenMV também deve ser conectado ao computador


Olá Mundo

Execute o exemplo de porta serial

# UART 控制
#
# 这个例子展示了如何使用OpenMV的串口。连接P4到 USB转串口模块 的RX。
# 会显示"Hello World!"

import time
from pyb import UART

# 先实例化一个19200波特率的串口3,然后调用write方法就可以了。
	# OpenMV上P4,P5对应的串口3
	# 第二个参数是波特率。用来更精细的控制
uart = UART(3, 19200, timeout_char=1000)# 

while(True):
    uart.write("Hello World!\r")# OpenMV 是可以直接通过串口发送字符串的。
    time.sleep_ms(1000)

ou

from pyb import UART

uart = UART(3, 9600)

string = "hello string!"

uart.write(string)

Abra星瞳串口助手 , selecione a porta serial , observe que a taxa de transmissão neste momento deve ser consistente com o código
insira a descrição da imagem aqui
. Sempre que houver entrada de dados, a luz do OpenMV piscará uma vez


envio de dados simples

Mas às vezes você não deseja transferir muitos dados. Por exemplo: eu só quero transmitir as coordenadas do centro x, y do bloco de cores com a maior área.

Se você deseja transmitir quaisquer dados, construa um pedaço de dados.

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

Tome como exemplo a localização do maior bloco de cores , retorne o centro cx(), cy() do maior bloco de cores

# 色块检测 与 串口通信
import sensor, image, time

# 导入串口类
from pyb import UART
import json
# 为了使颜色跟踪工作得很好,理想情况下,你应该在一个周围因素(亮度等)受控的环境中,那里的照明是恒定的。。。
#
yellow_threshold   = (65, 100, -10, 6, 24, 51)  # 此处是一个黄色的阈值,我们可以用这个黄色阈值来查找色块
# 您可以按照不同的需要调整以上设置以跟踪其他颜色的内容
# 在帧缓冲区中选择一个区域以复制颜色设置。

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.

# 实例化一个串口对象,设置对应的串口号,设置波特率
uart = UART(3, 115200)

# 在视野中找到最大的一个色块
def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:# blob.pixels()返回从属于色块(int)一部分的像素数量。
            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   把数据(最大色块的中心xy坐标)拼成一个字符串
        #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
        print('you send:',output_str)
        
        # 调用uart.write()把"字符串"传输出去
        uart.write(output_str+'\r\n')
    else:
        print('not found!')

Resultado: sumrepresenta a bolinha no campo de visão, you sende o conteúdo é cx e cy da maior bolinha

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

código arduino

void setup() {
    
    
   // put your setup code here, to run once:
   Serial.begin(115200);
   Serial.println("来点代码");
 }
 
 void loop() {
    
    
   if(Serial.available())
   {
    
    
      //if(Serial.read()=='[')
      char data = Serial.read() ;
      Serial.print(data);
      
      if(Serial.read()==',')
        Serial.print(',');
      
      if(Serial.read()==']')
        Serial.println();
   }
 }

Acho que você gosta

Origin blog.csdn.net/m0_59466249/article/details/125381223
Recomendado
Clasificación