当前位置: 首页 > news >正文

基于OpenMV与STM32的数据通信项目(代码开源)

在当今的智能硬件开发领域,计算机视觉和微控制器的结合应用日益广泛。OpenMV作为一款集成了多种视觉算法的模块,与STM32这类高性能微控制器的结合,可以产生强大的协同效应。本文将详细介绍如何通过UART串口实现OpenMV与STM32的数据通信,并展示一个简单的数字识别和显示的项目实例。

一、项目概述

本项目使用OpenMV进行图像处理和数字识别,通过UART将识别结果发送到STM32微控制器。STM32接收到数据后,将其传输给0.96寸OLED显示屏,从而实现数字的可视化展示。项目硬件包括OpenMV、STM32F103C8T6、OLED显示屏以及必要的连接线。

二、硬件准备

  • OpenMV开发板
  • STM32F103C8T6微控制器
  • 0.96寸OLED显示屏
  • 杜邦线若干

三、系统设计

3.1 OpenMV配置

OpenMV需要配置为灰度图像输入,并设置合适的窗口大小以匹配识别需求。在本项目中,使用MNIST数据集进行数字识别。

3.2 STM32配置

STM32需要配置UART串口以接收OpenMV发送的数据,并配置I2C接口以驱动OLED显示屏。

四、通信协议设计

为了确保数据的准确性和完整性,设计了简单的通信协议,包括帧头、数据内容、帧尾和校验码。

  • 帧头:0xFE
  • 数据内容:识别的数字
  • 帧尾:0xEF
  • 校验码:数据内容的ASCII码和

五、代码实现

5.1 OpenMV端代码

OpenMV端的代码主要负责图像的采集和数字的识别,并将结果通过UART发送出去。

import sensor, image, time, os, tf
from pyb import UARTsensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((240, 240))
sensor.skip_frames(time=2000)# 初始化UART
uart = UART(3, 115200)def send_data(num):# 构造数据包data_packet = bytearray([0xFE, num, 0xEF])# 发送数据包uart.write(data_packet)while(True):img = sensor.snapshot()result = img.find_features(image.TEMPLATE_FIND_METHOD_LBP)for r in result:if r.max_val > 0.8:num = r.id()send_data(num)
5.2 STM32端代码

STM32端的代码负责接收UART数据,并解析出数字信息,然后通过I2C发送给OLED显示屏。

#include "stm32f1xx_hal.h"
#include "usart.h"
#include "i2c.h"
#include "oled.h"// 接收缓冲区
uint8_t rxBuffer[10];
uint8_t index = 0;// UART接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if (huart->Instance == USART1) {// 解析接收到的数据parse_data(rxBuffer, huart->RxXferSize);// 重新启动接收中断HAL_UART_Receive_IT(huart, rxBuffer, sizeof(rxBuffer));}
}// 数据解析函数
void parse_data(uint8_t *data, uint16_t size) {for (int i = 0; i < size; i++) {if (data[i] == 0xFE) {index = 0;} else if (data[i] == 0xEF && index == 1) {display_number(data[index]);index = 0;} else {rxBuffer[index++] = data[i];}}
}// 显示数字的函数
void display_number(uint8_t num) {// 将数字转换为OLED可以显示的格式char num_str[10] = {0};sprintf(num_str, "%d", num);OLED_ShowString(0, 0, num_str, 16, 1);
}

六、项目测试

在完成硬件连接和代码编写后,需要对整个系统进行测试。首先测试OpenMV的图像识别功能,确保其能够准确识别数字。然后测试STM32的UART接收和OLED显示功能,确保数字能够被正确显示。

七、总结

本文详细介绍了基于OpenMV和STM32的UART通信项目,从硬件选择到软件编程,再到通信协议的设计和代码实现,最后进行项目测试。这种结合了计算机视觉和微控制器的项目结构,可以广泛应用于智能硬件领域,如智能监控、机器人导航等。

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

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

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

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

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

点击领取更多详细资料

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙HarmonyOS开发:常用布局及实用技巧
  • MYSQL必知必会 - (一)了解sql + (二)MySQL简介
  • 《RT-DETR》论文笔记
  • 手写mybatis拦截器自动填充数据
  • Midjourney进阶-创建与管理自己的专属参数
  • vscode 目录管理
  • (南京观海微电子)——示波器使用介绍
  • Linux-Haproxy搭建Web群集
  • Android SurfaceFlinger——Vsync监听逻辑(五十三)
  • 重启人生计划-大梦方醒
  • lsync+nfs+rsync
  • TCP回显服务器
  • docker安装redis单机部署的redis.conf配置
  • 形态学处理方法
  • C++11中的Lambda表达式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • CSS 三角实现
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript 基本功--面试宝典
  • JAVA多线程机制解析-volatilesynchronized
  • java取消线程实例
  • Mybatis初体验
  • Python学习笔记 字符串拼接
  • Redis 懒删除(lazy free)简史
  • tensorflow学习笔记3——MNIST应用篇
  • Vue全家桶实现一个Web App
  • 从零开始学习部署
  • 使用common-codec进行md5加密
  • 数组的操作
  • 算法-插入排序
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 说说我为什么看好Spring Cloud Alibaba
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​力扣解法汇总946-验证栈序列
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #VERDI# 关于如何查看FSM状态机的方法
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)jdk与jre的区别
  • (轉)JSON.stringify 语法实例讲解
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net Redis的秒杀Dome和异步执行
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /bin/rm: 参数列表过长"的解决办法
  • ?.的用法
  • @Autowired 和 @Resource 区别的补充说明与示例