OpenMV与STM32通信实现数字识别及OLED显示

在众多电子竞赛和项目开发中,图像识别技术扮演着越来越重要的角色。OpenMV作为一款功能强大的视觉处理模块,与STM32单片机的结合使用,能够实现复杂的图像处理和数据分析任务。本文将详细介绍如何通过串口通信,将OpenMV识别的数字信息传输到STM32,并在OLED屏幕上实时显示。

OpenMV与STM32通信基础

通信原理

OpenMV与STM32之间的通信主要依赖于串口(UART)。通过硬件上的接线连接和软件上的配置,可以实现两者之间的数据传输。

硬件连接

  • 将OpenMV的TX(发送)端口连接到STM32的RX(接收)端口。
  • 将OpenMV的RX(接收)端口连接到STM32的TX(发送)端口。

软件配置

在OpenMV端,使用以下代码初始化串口:

uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)

在STM32端,通过CubeMx配置串口参数,并开启中断服务:

/* USER CODE BEGIN PV */
uint8_t usart1_Rxbuff;
/* USER CODE END PV */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  if(huart->Instance==UART1) {
    // 处理接收到的数据
  }
  HAL_UART_Receive_IT(&huart1,(void *)&usart1_Rxbuff,1);
}

实现数字识别及OLED显示

OpenMV端代码

首先,设置OpenMV的摄像头参数,并初始化串口通信:

from pyb import UART
import sensor, image, time

sensor.reset()  # Reset and initialize the sensor.
sensor.set_pixformat(sensor.GRAYSCALE)  # Set pixel format to GRAYSCALE
sensor.set_framesize(sensor.QQVGA)  # Set frame size to QQVGA (160x120)
sensor.skip_frames(time = 2000)  # Wait for settings to take effect.

uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)

接着,编写数字识别的代码,并将识别结果通过串口发送到STM32:

while(True):
    img = sensor.snapshot()  # Take a picture and return the image.
    blobs = img.find_blobs([(10, 200, 50, 200)])  # Find blobs.
    for blob in blobs:
        if blob.w * blob.h > 300:  # If blob is large enough.
            x, y, w, h = blob.rect()
            img.draw_rectangle((x, y, x+w, y+h))  # Draw rectangle around blob.
            # Send data packet to STM32
            data_packet = bytearray([0x2C, 0x12, x, y, w, h, 0x5B])
            uart.write(data_packet)

STM32端代码

在STM32端,编写串口接收中断服务程序,解析接收到的数据,并在OLED上显示识别结果:

#include "stm32f1xx_hal.h"
#include "usart.h"
#include "oled.h"

uint8_t display_buf[20];
uint8_t received_data[6];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  if(huart->Instance == UART1) {
    // Copy received data to buffer
    for(int i = 0; i < 6; i++) {
      received_data[i] = usart1_Rxbuff[i];
    }
    // Process and display data on OLED
    OLED_ShowNum(0, 0, received_data[2], 1, 16);  // Display x coordinate
    OLED_ShowNum(0, 10, received_data[3], 1, 16); // Display y coordinate
    OLED_ShowString(0, 20, "Data Received", 16);
    HAL_UART_Receive_IT(&huart1, (void *)&usart1_Rxbuff, 6);
  }
}

结语

通过上述步骤,我们可以实现OpenMV与STM32之间的数字识别信息传输,并在OLED屏幕上实时显示识别结果。这种技术在智能车竞赛、工业自动化等领域有着广泛的应用前景。希望本文能够帮助读者更好地理解并应用OpenMV与STM32的通信技术。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式杂谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值