在众多电子竞赛和项目开发中,图像识别技术扮演着越来越重要的角色。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视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇