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

stm32智能颜色送餐小车(openmv二维码识别+颜色识别+oled显示)

大家好啊,我是情谊,今天我们来介绍一下我最近设计的stm32产品,我们在今年七月份的时候参加了光电设计大赛,我们小队使用的就是stm32的智能送餐小车,虽然止步于省赛,但是还是一次成长的经验吧,那么我也来分享一下我们小队这次的产品设计,希望里面的一些模块可以给你们一点的参考建议。

我先说说我的博客文章的设计吧,我准备的是以模块的方式展示代码,但是文章的最后我会附带我们小队设计的stm32小车的完整代码

接下来我再说说我的小车实现的功能:

1二维码识别,使用openmv扫描对应颜色的二维码后,oled屏幕上显示对应的菜品名称,并且小车识别追踪该颜色物体

2压力传感器感知物体重量,当压力传感器的重量超过一定值后小车才会运动,注意!这个功能和上面的二维码识别并不冲突,上面扫码后openmv只能识别到该颜色,但是小车却不能动,只有压力传感器有示数才会运动

3APP点单,我们小组是使用ESP8266wifi模块制作了一个APP来模拟点单

4温度传感器时刻感知环境温度,这个模块的功能其实就是在送餐途中进行保温使用的

5蜂鸣器播报,客户下单后蜂鸣器会进行鸣叫

6红外光管避障,我们小组并未在避障方面进行过多的功能,所以只有简单的避障功能:小车识别到前方有物体,然后停下来,等到前方没有物体后继续运动

以上就是我的产品的全部功能了

注意注意!!!

我文章末尾上传的代码只有功能1和功能2和功能6的代码,功能3我只能负责给你们说说怎么做,如果实在需要代码,请联系我,这部分代码不是免费的,功能4和功能5的代码不在我的电脑上,所以我就不进行讲解了。

器件端

首先声明一下

本次实验的芯片是基于stm32c8t6

本次实验使用的openmv型号为openmvH7

OpenMV开发环境搭建

OpenMV IDE是用于OpenMV Cam的集成开发环境,具有强大的文本编辑器,调试终端和带有直方图显示的帧缓冲区查看器。

官方下载链接:Download – OpenMV,截至本文写作时间,最新版本为v4.2.1。

本次实验接口为串口三

代码端 

openmv

import sensor, image, time
from pyb import UART
from pyb import LEDsensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)# 初始化LED灯
led_red = LED(1)
led_green = LED(2)
led_blue = LED(3)# 初始化UART
uart = UART(3, 9600)clock = time.clock()last_qr_color = Nonewhile True:clock.tick()img = sensor.snapshot()# 寻找二维码qr_codes = img.find_qrcodes()if qr_codes:# 获取第一个二维码的颜色信息qr_color = qr_codes[0].payload()last_qr_color = qr_colorblobs = Noneif qr_color == "green":# 绿色物体识别green_threshold = (0, 100, -12, 11, -108, 34)blobs = img.find_blobs([green_threshold], pixels_threshold=100, area_threshold=100, merge=True)led_green.on()led_red.off()led_blue.off()elif qr_color == "red":# 红色物体识别red_threshold = (0, 80, 30, 127, 30, 127)blobs = img.find_blobs([red_threshold], pixels_threshold=100, area_threshold=100, merge=True)led_green.off()led_red.on()led_blue.off()else:# 其他颜色处理blobs = Noneled_green.off()led_red.off()led_blue.off()else:# 如果没有检测到二维码,则继续识别上次记录的颜色qr_color = last_qr_colorblobs = Noneif qr_color == "green":# 绿色物体识别green_threshold = (30, 100, -64, -8, -32, 32)blobs = img.find_blobs([green_threshold], pixels_threshold=100, area_threshold=100, merge=True)led_green.on()led_red.off()led_blue.off()elif qr_color == "red":# 红色物体识别red_threshold = (0, 80, 30, 127, 30, 127)blobs = img.find_blobs([red_threshold], pixels_threshold=100, area_threshold=100, merge=True)led_green.off()led_red.on()led_blue.off()else:# 其他颜色处理blobs = Noneled_green.off()led_red.off()led_blue.off()if blobs:for blob in blobs:img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())area = blob.w() * blob.h()# 根据颜色修改 area & 0xff 的值if qr_color == "green":area_low_byte = 0x02elif qr_color == "red":area_low_byte = 0x01data_packet = bytearray([0xb3, 0xb3, blob.cx(), blob.cy(), area >> 8, area_low_byte, 0x5b])uart.write(data_packet)print("颜色: %s x:%d y:%d 面积:%d" % (qr_color, blob.cx(), blob.cy(), area))print(clock.fps())

代码讲解:上面的openmv端代码可以识别信息为“红色”二维码与“绿色”二维码,下面为你们粘贴了二维码图,识别到一个二维码后,openmv转变为识别对应颜色,向单片机发送4个数据,但是有用的只有三个数据,你们可以根据需要删除不需要数据。

红色二维码

绿色二维码 

大家可以使用上面的二维码进行实验,也可以修改二维码和openmv识别信息 

接下来在stm32端接受openmv发送的信息

Serial.c

#include "stm32f10x.h"                  
#include <stdio.h>
#include <stdarg.h>int openmv[7];
int16_t Num;          
int16_t theta;          
int16_t rho;
int16_t yanse;
int i;void Usart3_Init(uint32_t Bound)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = Bound;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_Init(USART3,&USART_InitStructure);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);USART_Cmd(USART3,ENABLE);
}void Openmv_Data(void)
{Num=openmv[2];rho=openmv[3];theta =openmv[4];yanse = openmv[5];
}void Openmv_Receive_Data(int16_t data)
{static u8 state = 0;if(state==0&&data==0xb3){state=1;openmv[0]=data;}else if(state==1&&data==0xb3){state=2;openmv[1]=data;}else if(state==2){state=3;openmv[2]=data;}else if(state==3){state = 4;openmv[3]=data;}else if(state==4){state = 5;openmv[4]=data;} else if(state==5){state = 6;openmv[5]=data;} else if(state==6)		{if(data == 0x5B){state = 0;openmv[6]=data;Openmv_Data();}else if(data != 0x5B){state = 0;for(i=0;i<7;i++){openmv[i]=0x00;}           }}    else{state = 0;for(i=0;i<7;i++){openmv[i]=0x00;}}
}void USART_SendByte(USART_TypeDef* USARTx, char  str)
{USART_SendData(USARTx, str);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);}void USART3_IRQHandler(void)                	{u8 com_data;
#if SYSTEM_SUPPORT_OS 		OSIntEnter();    
#endifif(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) {USART_ClearFlag(USART3,USART_FLAG_RXNE);com_data = USART3->DR;Openmv_Receive_Data(com_data);    Openmv_Data();		                	} 
#if SYSTEM_SUPPORT_OS 	OSIntExit();  											 
#endif
} 

上面由于代码注释出现乱码问题,所以笔者还是建议从下方的链接处查看

Serial.h

#ifndef __SERIAL_H
#define __SERIAL_H#include <stdio.h>
#include "sys.h"
#include "stm32f10x.h"                  void Usart3_Init(uint32_t Bound);
#endif

main.c

#include "stm32f10x.h"                 
#include "delay.h"
#include "OLED.h"
#include "Serial.h"
#include "sys.h"              
#include "stdio.h"
#include "HX711.h"
#include "encoder.h"
extern int16_t Num;     //x     
extern int16_t theta;     //size     
extern int16_t rho;				//y
extern int16_t yanse;	static int16_t img_width=160;     //cx
static int16_t img_high=120;      //cy
static int16_t img_size=1000;      //size
//50 32 32055
static uint8_t KeyNum;
void OLED_SHOW(void)
{  if (yanse == 0x01)option = 1;if (yanse == 0x02)option = 2;OLED_Refresh_Gram(); if (option == 1){OLED_ShowChinese(0,0,4,16,1); OLED_ShowChinese(16,0,5,16,1); OLED_ShowChinese(32,0,6,16,1); }else if (option == 2){OLED_ShowChinese(0,0,7,16,1); OLED_ShowChinese(16,0,8,16,1); OLED_ShowChinese(32,0,9,16,1); }}int main(void)
{delay_init(72);         LED_Init();                    LED=0; 0KEY_Init();Usart3_Init(9600);          OLED_Init();KeyNum = Key_GetNum();while (1){Led_Flash(50);OLED_SHOW();}
}

oled端的代码我就不在进行书写,大家可以参照我的另一篇文章里讲解了https://mp.csdn.net/mp_blog/creation/editor/141165560

好了,以上就是openmv二维码识别+颜色识别+oled显示的全部代码了,如果有什么问题,欢迎各位在评论区留言,本人看到一定会回消息的,还有一个问题,代码本身是由程序中截取出来的所以可能会出现部分代码出现错误,所以还是建议根据下方提供的链接查源代码,明天我会更新stm32智能颜色送餐小车(红外光管避障)如果本文章对你有用的话,请给一个小小的赞呗,你的赞就是对我的最大的鼓励!谢谢大家!

代码链接处:链接:链接: https://pan.baidu.com/s/1buk_I9_bZ_rIou1iW9v1jA?pwd=2180 提取码: 2180

最后一个需要注意以下,本代码中的pid参数我全部都置零了,请根据自己的小车进行调节!

mmexport1723541008067

相关文章:

stm32智能颜色送餐小车(openmv二维码识别+颜色识别+oled显示)

大家好啊&#xff0c;我是情谊&#xff0c;今天我们来介绍一下我最近设计的stm32产品&#xff0c;我们在今年七月份的时候参加了光电设计大赛&#xff0c;我们小队使用的就是stm32的智能送餐小车&#xff0c;虽然止步于省赛&#xff0c;但是还是一次成长的经验吧&#xff0c;那…...

对接的广告平台越多,APP广告变现的收益越高?

无论是游戏、社交、工具应用类APP还是泛娱乐类APP&#xff0c;流量变现的方式主要有广告、内购、订阅三种方式。其中&#xff0c;广告变现是门槛最低、适用最广的变现方式。 只要APP有流量&#xff0c;就可以进行广告变现&#xff0c;让APP的流量快速转化为商业价值。作为最常…...

LINUX原始机安装JDK

文章目录 下载 JDK压缩包创建jdk文件夹sftp 远程上传解压缩 tar -zxvf 包名配置环境变量刷新 环境变量验证是否安装成功安装JAVA 依赖yum更新及替换镜像curl 命令下载更新更新yum依赖判断repo文件是否存在生成缓存、启用阿里云镜像 重新下载java依赖再次验证hello world 下载 J…...

MR400D工业级带网口4G DTU:RS232/RS485 TO LTE深度测评

在物联网技术日新月异的今天&#xff0c;数据传输的效率和稳定性成为了各行各业关注的焦点。作为一款集先进性与实用性于一身的物联网设备&#xff0c;工业级带网口的4G DTU&#xff08;数据传输单元&#xff09;以其强大的功能特性和广泛的应用场景&#xff0c;赢得了市场的广…...

第四范式发布AI+5G视频营销产品 助力精准获客与高效转化

产品上新 Product Release 今天&#xff0c;第四范式AI5G视频电话互动营销产品全新发布。 相较于以往销效率低、互动差、转化差的传统电话外呼和短信营销方式&#xff0c;视频电话互动营销基于AI、5G等技术&#xff0c;可让用户接听电话时观看个性化视频广告并实时互动&#xf…...

DVWA-IDS测试(特殊版本)

起因 浏览DVWA历史更新记录发现有版本带有IDS插件&#xff0c;可以用于平时没有相关设备等场景演示用&#xff0c;所以开启本次测试。 下载 官方最新版本是移除了IDS插件&#xff0c;原因是“从不使用”&#xff0c;所以需要下载移除该插件之前的版本。 https://github.com/…...

轻度自闭症的温柔启航:星启帆的康复之旅

在儿童成长的道路上&#xff0c;自闭症作为一种复杂的神经发展障碍&#xff0c;给许多家庭带来了挑战与困扰。轻度自闭症&#xff0c;作为自闭症谱系中的一个类型&#xff0c;其症状表现相对较轻&#xff0c;但同样需要我们的关注与科学的干预。星启帆自闭症儿童康复机构&#…...

一、OpenTK简介

文章目录 一、历史和发展二、功能和优势(一)强大的图形渲染功能(二)跨平台支持(三)与 C# 的紧密集成(四)开源和活跃的社区(五)性能优化三、适用场景(一)游戏开发(二)科学计算可视化(三)虚拟现实和增强现实应用(四)图形用户界面开发(五)教育和培训应用(六)…...

Dom4j详细介绍

Dom4j 1.1 解析概览 将数据存储为XML格式后&#xff0c;程序化地访问这些数据变得至关重要。虽然Java基础的IO操作能够实现这一目标&#xff0c;但这一过程往往既复杂又繁琐&#xff0c;尤其是在处理大型文件或需要频繁读写操作的场景下。为了解决这些问题&#xff0c;开发者…...

thissuper

this&super 一、 this this关键字表示调用的是当前类的成员变量或者成员方法 一般情况下&#xff0c;可以省略this关键字直接调用成员变量以及成员方法但当方法的形参与成员变量同名时&#xff0c;如果要在方法内使用成员变量&#xff0c;必须添加this关键字指明使用的是…...

cv::normalize()

cv::normalize()函数是OpenCV库中用于对矩阵或图像数据进行归一化处理的工具。归一化是图像处理和计算机视觉中常见的预处理步骤&#xff0c;它可以确保数据在一定范围内&#xff0c;从而有助于后续的处理和算法的稳定性和性能。cv::normalize()函数可以将输入矩阵的值缩放到一…...

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧&#xff0c;并将这些帧保存为图像文件。步骤如下&#xff1a; 设置路径和参数&#xff1a; video_path&#xff1a;视频文件的路径。image_folder&#xff1a;保存抽取图像的目录。num_frames_to_extract&#…...

[Linux CMD] 目录与文件相关的命令

. 代表次层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表目前使用者身份所在的家目录 ~account 代表account这个使用者的家目录&#xff08;account是个账号名称&#xff09…...

redis面试(十三)公平锁排队代码剖析

我们来看一下第二种redis分布式锁 第一种锁是可重入锁&#xff0c;非公平可重入锁&#xff0c;所谓的非公平可重入锁是什么意思呢&#xff1f;胡乱的争抢&#xff0c;根本没有任何公平性和顺序性可言 第二种锁&#xff0c;可重入锁&#xff0c;公平锁 通过公平锁&#xff0c…...

冷热数据拆分

订单系统设计方案之如何做历史订单和归档 订单数据越来越多&#xff0c;数据库越来越慢该怎么办&#xff1f; 随着历史订单不断累积&#xff0c;2017年MySQL中订单表数据量已达千万级。之后的订单数据&#xff0c;远远大于亿级 对数据量大的问题&#xff0c;进行了以下优化…...

JavaScript 基础(四)

五、DOM编程 1.常用事件 onload 页面加载后触发事件 onscroll 滚动时触发 onresize 尺寸变化时 onclick 鼠标点击 onmouseover 鼠标悬停 onmouseout 鼠标移出 onmousemove 鼠标移动&#xff0c;会触发多次 onfocus 对象获得光标&#xff08;焦点&#xff09;时&#x…...

《机器学习by周志华》学习笔记-神经网络-01神经元模型

1、背景 本书所谈的「人工神经网络」不是生物学意义的神经网络。这是T.Kohonen 1988年在Neural Networks创刊号上给出的定义。 2、概念 2.1、神经网络 关于「神经网络(neural networks)」的研究很早就已经出现过,今天的「神经网络」已经是一个比较大且多学科交叉的领域,其…...

C#中常用的扩展类

/// <summary>/// 常用扩展/// </summary>public static class UsualExtension{public static string[] chineseNumbers { "零", "一", "二", "三", "四", "五", "六", "七", &…...

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…...

【Unity】有限状态机和抽象类多态

一、介绍 有限状态机是一个用来进行对象状态管理的计算模型。它由一组状态、一个或者多个触发事件以及状态之间的转换条件所组成。 对于任意一个游戏对象&#xff0c;我们可以为其编写一个或者多个状态机&#xff0c;使其能够在不同状态下有不同的决策和运作机制。 核心思想…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...