前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)[通俗易懂]

2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-09-27 07:17:27
发布于 2022-09-27 07:17:27
2.1K10
代码可运行
举报
运行总次数:0
代码可运行

2021全国大学生电子设计竞赛F题智能送药小车

前提:本篇文章重在分享自己的心得与感悟,我们把最重要的部分,摄像头循迹,摄像头数字识别问题都解决了,有两种方案一种是openARTmini摄像头进行数字识别加寻迹,即融合代码。另一种是使用openmv4进行数字识别(使用的是模板匹配),然后利用灰度传感器进行寻迹。因为当时python用得不算很熟,最终我们选择了第二种方案使open MV4实现数字识别,灰度传感器寻迹,在控制智能车运动调试的过程中更加简单。当然赛后我们也尝试了使用open ARTmini的方案,同样操作容易。其次我们下来也做了方案三K210数字识别,数字识别率可达97.8%,使用openmv寻迹。

人们常常希望向成功者获取经验,可是生活中哪有那么多成功者,我想只有失败者才最有发言权,最有经验可以分享吧。因为某些原因我们无缘国奖,但我不甘是失败者,我们为此付出了多少,坚持了多少,只有我们自己知道,只要全力以赴就无所谓失败,也许多年后再回过头来看,想起来这些热血我依然能够热泪盈眶,那就无悔了。 追求卓越,成功才会在不经意见追上你!

目录: 一、题目分析 二、分工以及小车的搭建 三、摄像头部分 四、控制部分 五、联调 六、随谈 七、工程代码

备注: 只需要工程代码的同学(如下是此次电赛过程中所有的代码),建议先看完正文 openMV4模板匹配数字识别方案,本次电赛所有工程代码包括论文报告 https://download.csdn.net/download/cubejava/79012510 openmv巡线代码: https://download.csdn.net/download/cubejava/41873305 stm32HAL库keil工程(配置freeRTOS,巡线,自动返回,定点停车): https://download.csdn.net/download/cubejava/41871669 openARTmini巡线和数字识别的融合代码: https://download.csdn.net/download/cubejava/79012645 小车底板AD原理图和pcb工程: https://download.csdn.net/download/cubejava/42512528

(可私聊提供技术支持,代码注释完善,若有不懂的可手把手教学)

正文

一、题目

我们是做测控方向的,当时在4号早上7:30左右题目就出来了,随即就有人发在了群里。

看了一下测控方向除了无人机能选的也就D题和F题了,D题是基于互联网的摄像测量系统(D题),我们对这方面的了解不多,没有什么把握,就没敢选,后来听说选D题的在GitHub上能够找到源码,做到后面车调不动时倒有点小后悔,哈哈。

F题经典小车题目,但与往年不同的是今年识别和控制都是重点,必须要先能做到识别,你才能谈接下来的循迹和运动控制。 谈到识别就需要用到摄像头,但之前我们对于摄像头并没有太重视,循迹一般用的都是红外对管,灰度传感器,或者线性CCD就足够了,但是这次的赛到元素存在十字,黑白色块,还要求能自动返回,使用普通的循迹模块就比较吃力了。在电赛备赛期间就做过线性CCD寻迹的智能车,使用的stm32f4,HAL库,cube MX配置的。采取了二值化,动态阈值算法,将CCD采集的值滤波,导入PID,再加入速度环,实现串级PID。也算是练了练手。

工程链接:https://download.csdn.net/download/cubejava/79012959

二、分工以及小车的搭建

我们组三人都没有玩过摄像头,要立马开始现学,我们一开始准备使用openmv进行循迹和数字识别,后来发现我们的openmv的版本不能训练神经网络,必须要openmvplus(可是没有,买又来不急送到),就很难受。 于是我们想采用openARTMiNi进行数字识别加循迹,但由于python用得不熟,当时没有足够的把握能够实现。所以我们采取了折中的办法,即文章开头说的,openMV使用模板匹配识别数字,寻迹使用灰度传感器。 其中一位学长着手完成openMV模板匹配识别数字,另和我则负责stm32f4的工程创建小车的底层代码和运动控制,使用的HAL库。 由于之前备赛准备的东西比较充分,所以当天上午就把车给搭建好了,使用平衡小车,加了一个万向轮,转弯差速控制。

小车硬件: STM32F411CEU6,TB6612,车模(自带霍尔编码器减速电机),LM2596,MPU6050,航模电池,openMV,K210 使用AD画小车底板。原理图和PCB如下

小车软件: 使用的HAL库建立工程,在cubeMX中配置freeRTOS操作系统,

KEIL工程程序代码:

串口重定向printf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*串口重定向printf*/
int fputc(int ch, FILE *f)
{ 
   
  HAL_UART_Transmit(&huart6, (uint8_t *)&ch, 1, 1000);
  return ch;
}

编码器模式取值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*编码器模式取值*/
int Read_Encoder(uint8_t TIMX)           
{ 
   
   int Encoder_TIM;    
   switch(TIMX)
	 { 
   
	   case 1:  Encoder_TIM= (short)TIM1 -> CNT;  TIM1 -> CNT=0;break;
		 case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;	
		 
		 default:  Encoder_TIM=0;
	 }
		return Encoder_TIM;
}

判断mpu6050初始化是否成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void Mpu6050_Init()
{ 
   
	while(w_mpu_init() != mpu_ok)           
	{ 
   
		printf("0x%x (ID_ERROR)\r\n", w_mpu_init());
		HAL_Delay(10);
	}
	/*DMP初始化*/
	dmp_init();     
}

初始化程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(void)
{ 
   
	/*开启编码器计数*/
	HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
	HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
	/*开启电机PWM输出*/
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
	/*开启舵机的PWM输出*/
	HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_3);
	HAL_TIM_PWM_Start(&htim5,TIM_CHANNEL_4);
	/*Enable the USART1 Interrupt*/
	HAL_UART_Receive_IT(&huart1,(uint8_t *)&usart6_rxbuff,1);
	/*临时*/
	Temporary();
	Mpu6050_Init();
	/*使能定时器4中断*/
	HAL_TIM_Base_Start_IT(&htim4);
	HAL_UART_Transmit(&huart6, (uint8_t *)&cc, 1,0xFFF);
// TIM3 ->CCR1 = 400;
// TIM3 ->CCR2 = 400;
  /* USER CODE END 2 */

  /* Call init function for freertos objects (in freertos.c) */
    MX_FREERTOS_Init();
	HAL_UART_Transmit(&huart6, (uint8_t *)&cc, 1,0xFFF);
  /* Start scheduler */
    osKernelStart();
   while (1)
  { 
   
    /* USER CODE END WHILE */
// printf("-------------\r\n");
// HAL_Delay(500);
    /* USER CODE BEGIN 3 */
		
		
  }
  /* USER CODE END 3 */
}

freeRTOS.C文件中的代码

巡线和功能实现代码均放在freeRTOS.C中

三、摄像头部分

有关摄像头部分,我们在第一天尝试过单使用openMV寻迹,但神经网络训练不了就弃置了。 在openmv中处理好数据,可以寻红线,识别十字,识别黑白色块, 传回来的数据: 左右线传回为模拟量,传入单片机,进行pid控制

openMV模板匹配识别数字:

可实现一排识别多个数字。

四、控制部分

控制部分,巡线使用的PD控制

首先速度闭环,PI控制,让小车保持在一个稳定的速度

在速度环上叠加一层方向环,PD控制,巡线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int track_control(float collect_openmv)
{ 
   
	static float last_bias,Bias,kp=0.75,Kd=0.25;//0.5的效果还行
	float Turn;     	  
	Bias=-(collect_openmv-60);
	Turn=-Bias*kp-Kd*(Bias-last_bias);
	last_bias = Bias;
	//printf("\r\nt:%.1f\r\n",Turn);
	return Turn;
}

小车的自动返回,和判定十字转弯,黑白色块停车使用了标志位,定义数组,根据出栈入栈原理,记录去回的方向。

五、联调

openmv和K210的数据传入单片机 打开串口中断,注意需要写好摄像头和单片机之间的通信协议,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)    //串口中断,遥控部分。
{ 
   
	uint16_t tem;
	if(huart->Instance == USART1)	// 判断是由哪个串口触发的中断
	{ 
   

		//printf("ok");
		tem = usart6_rxbuff;
		printf("%x\r\n",tem);
		if(RxState==0&&tem==0x79)
		{ 
   
			RxState=1;
			RxBuffer1[RxCounter1++]=tem;
		}
		else if(RxState==1)
		{ 
   
			RxBuffer1[RxCounter1++]=tem;
			if(RxCounter1>=10||tem == 0x85)       //RxBuffer1接受满了,接收数据结束
			{ 
   
				RxState=2;
			}
		 }
		 else if(RxState==2)		//检测是否接受到结束标志
		 { 
   
				if(RxBuffer1[RxCounter1-1] == 0x85)
				{ 
   
						if(RxBuffer1[1] == 0xaa)//识别
						{ 
   
							Flag = Flag + 1;
		
							JG=RxBuffer1[RxCounter1-2];
							Turn = RxBuffer1[RxCounter1-3];
							if(Flag>3)
							{ 
   
								if(JG>0&&FS==0) { 
   FS = JG;}
								printf("\r\n Turn:%d FS:%d \r\n",Turn,FS);
							}

						}
						if(RxBuffer1[1] == 0xbb)//搜线
						{ 
   
							printf("\r\n___sou xian___\r\n");
							printf("\r\n Cx:%d, STOP:%d \r\n",Cx,STOP);
							Cx=RxBuffer1[RxCounter1-2];

							STOP=RxBuffer1[RxCounter1-3];
						}
						


							RxCounter1 = 0;
							RxState = 0;
						
				}
				else   //接收错误
				{ 
   
							RxState = 0;
							RxCounter1=0;
							for(i=0;i<10;i++)
							{ 
   
									RxBuffer1[i]=0x00;      //将存放数据数组清零
							}
							printf("接收错误\r\n");
				}
			}
		 if(state==2)
		 { 
   
			 if(STOP == 0)
			 { 
   
				 state = 0;
			 }
		 }
		 if(state==4)
		 { 
   
			 if(STOP == 0)
			 { 
   
				 state = 0;
			 }
		 }
	}
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&usart6_rxbuff, 1); 
}

六、随谈

我们是在结束的前一天晚上完成好的数字识别,离调车整个程序的逻辑就只有一天的时间,说真的,程序写少了,这个程序逻辑真的很难想出来,尤其是在当时已经连续三天每天只睡2个小时左右,头脑非常混沌,呆滞。 还是要多写程序,练习自己写程序的逻辑思维。

结尾:第一次参加国赛,也是第一次参加电赛,本来应该是大一结束就开始了的,电赛延期拖到了大二开学后的一段时间,自己需要学的内容还有很多,好好学习,提升自己的技术,明年省赛继续冲!

七、 工程代码:

openMV4模板匹配数字识别方案,本次电赛所有工程代码包括论文报告 https://download.csdn.net/download/cubejava/79012510 openmv巡线代码: https://download.csdn.net/download/cubejava/41873305 stm32HAL库keil工程(配置freeRTOS,巡线,自动返回,定点停车): https://download.csdn.net/download/cubejava/41871669 openARTmini巡线和数字识别的融合代码: https://download.csdn.net/download/cubejava/79012645 小车底板AD原理图和pcb工程: https://download.csdn.net/download/cubejava/42512528

备注:这些都是我们没日没夜熬出来的程序代码,花费了很多精力,所以没有免费开源(望理解),设置了付费,不过在博客里也写了相关的思路,可以参考借鉴一些经验,来年省赛加油!!! 现在电赛越来越趋向于视觉和人工智能了,一定要好好学习摄像头,视觉,神经网络。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183738.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
博主写的很详细,我写了 STM32+openmv手把手开发的教程欢迎大家一起交流:这是文章:https://blog.csdn.net/qq_46187594/article/details/138110155?spm=1001.2014.3001.5502 这个是视频:https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click
博主写的很详细,我写了 STM32+openmv手把手开发的教程欢迎大家一起交流:这是文章:https://blog.csdn.net/qq_46187594/article/details/138110155?spm=1001.2014.3001.5502 这个是视频:https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
基于OpenCV实现找圆与亚像素测量
首先看一下流程,然后再看一下各个步骤的输出与最终结果。本例是基于OpenMV实现演示与导出。
OpenCV学堂
2023/09/11
4750
基于OpenCV实现找圆与亚像素测量
「学习笔记」OpenMV 与 MicroPython
大一时参加2017年全国大学生电子设计竞赛时,当时第一次接触 Python 和 OpenMV,这是当时写下的学习笔记。后来随着硬盘损坏,这份笔记文档也消失了,幸得队友替我收藏了这份笔记。现在把这份笔记放到公众号这里,方便日后查阅,同时也分享给所有有兴趣的人。
悠风
2019/08/28
4.3K0
「学习笔记」OpenMV 与 MicroPython
[Vision Board创客营]--使用openmv识别阿尼亚
🚀🚀Vision-Board 开发板是 RT-Thread 推出基于瑞萨 Cortex-M85 架构 RA8D1 芯片,为工程师们提供了一个灵活、全面的开发平台,助力开发者在机器视觉领域获得更深层次的体验。
小点点
2024/05/12
2190
[Vision Board创客营]--使用openmv识别阿尼亚
openmv中用最小二乘法拟合轨迹实现代码分析.1
在openmv中有一个巡线的功能,在我刨根问底以后发现是一段C++的函数完成的这个功能,看完源码准备写Python的实现。
云深无际
2021/04/14
1.2K0
openmv中用最小二乘法拟合轨迹实现代码分析.1
Arduino智能小车——循迹篇
  相信大家都在网上看到过类似下图这样的餐厅服务机器人,或者仓库搬运机器人,但是你们有没有注意到图片中地上的那条黑线?没错,他们都是沿着这条黑线来行进的,在这一篇将教大家怎么用小车实现类似的循迹功能。
全栈程序员站长
2022/09/06
3.9K0
Arduino智能小车——循迹篇
地心一号-超迷你自平衡小车(二)
时间当时是2016年,网上大部分的方案是STM32+MPU6050,也有一些用arduino做的。Arduino的问题我稍后再说,当时想的是:随大流!既然32的案例多,那么资料就多,出于稳妥,先买个样机玩玩吧。
MCU起航
2020/06/29
6550
OpenMV IDE 自带demo分析.Ar_i2c_slave
#OpenMV Cam Master I2C数据(P5)-Arduino Uno数据(A4)
云深无际
2020/12/03
7570
OpenMV IDE 自带demo分析.Ar_i2c_slave
stm32循迹小车详细制作过程(附加完全版代码)「建议收藏」
3、电源 12v锂电池组、配套充电器(推荐下图这种,方便,好接线,12v!12v! 12v!)
全栈程序员站长
2022/11/08
10K3
stm32循迹小车详细制作过程(附加完全版代码)「建议收藏」
实验大师C++工作流引擎SDK开发指南
基于OpenCV实验大师工具套件设计的算法流程支持保存为*.vm格式的算法设计文件,该文件通过对应的OpenCV实验大师工作流引擎 C++ SDK可以完成单独部署与执行,帮助学生完成课程设计,提升编程能力与动手能力,解决实际工程问题,做到学以致用。OpenCV实验大师工作流引擎 C++ SDK 与OpenCV实验大师工作流设计软件的关系与应用场景如下:
OpenCV学堂
2024/04/01
5690
实验大师C++工作流引擎SDK开发指南
基于LDC1000的自动循迹小车
大三上学期课程设计的题目选了做小车,需要使用的是TI公司的LDC1000或者LDC1314,题目如下:
全栈程序员站长
2022/06/26
8020
基于LDC1000的自动循迹小车
Openmv新新手入门方法
openmv作为一个比较成完善的模块,在各种需要用到视觉的方面,比如做项目和参加比赛,都是常用到的一种。它是一个将摄像头和单片机处理器结合在一起的一种系统,且它的开发包简单易懂并且全面,在各种视觉处理方法选择中是比较好上手的一种,相当于单片机中的arduion,不过我并不常使用openmv来做我项目视觉的解决方法,因为觉得它封装的越好越显得low。。。不过仅是我个人看法。
周旋
2020/06/04
1.5K0
Openmv新新手入门方法
OpenMV-源码细读.1
最近在看OpenMV的源码,和往前一样,经常会卡住,还是对C不够了解,一知半解的,这些文章不以读源码为主,但是会写一下我日常不见的东西。
云深无际
2022/11/29
1.4K1
OpenMV-源码细读.1
基于stm32的智能小车(远程控制、避障、循迹)
学完stm32,总是想做点东西“大显身手”一下,智能小车就成了首选项目,其核心只是就是PWM输出,I/O口引脚电平判断。
全栈程序员站长
2022/11/02
3.6K1
Python热门文章推荐Top10
编译 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 4 月 Python 热门文章推荐 1、用 Python 实现区块链的实用介绍 原文链接: http://ad
用户1737318
2018/06/05
1.6K3
电赛 | 循迹小车(省电赛一等奖作品)
刚入职的时候,公司组织参观,参观的时候看到了公司的AGV循迹小车,用于搬运物料。看到这些小车的时候,感觉很熟悉,这让我想起了16年TI杯电子设计竞赛,当时我们做的就是一个循迹小车。
全栈程序员站长
2022/09/06
2.4K0
电赛 | 循迹小车(省电赛一等奖作品)
基于OpenMV的自动驾驶智能小车模拟系统
基于机器视觉模块OpenMV采集车道、红绿灯、交通标志等模拟路况信息,实现一辆能车道保持、红绿灯识别、交通标志识别、安全避障以及远程WiFi控制的多功能无人驾驶小车。
芯动大师
2023/10/13
1.1K0
基于OpenMV的自动驾驶智能小车模拟系统
2016TI杯——寻迹小车
B题:自动循迹小车 1.任务 设计制作一个自动循迹小车。小车采用一片 TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。
全栈程序员站长
2022/06/26
6630
2016TI杯——寻迹小车
智能小车设计规划_智能循迹避障小车设计
该课题主要基于单片机的循迹、避障、WiFi、蓝牙等功能的智能小车,在一些特殊环境下有着特殊的意义。硬件控制以arduino为控制核心。采用超声波避障和红外避障传感器共同完成寻迹、避障功能,并将相关信号传送给单片机,经单片机控制系统分析判断后控制驱动芯片驱动直流电机实现小车前进、后退、左转、右转,停止。软件采用移植性较好的c语言编写,通过手机蓝牙App实现对智能小车的控制。通过TCP/UD协议以及WiFi无线操作系统完成远距离通过终端控制,并将所扫描的信息路线传输给服务器,终端图形界面通过Qt设计实现。通过多次测试使小车能无线遥控、避障、循迹功能。
全栈程序员站长
2022/11/02
2.2K0
智能小车设计规划_智能循迹避障小车设计
圆曾经的小车梦,造一台智能小车(三)之小车前进后退左右转基本框架
这节,终于让我们的小车成功的驱动起来了,能够实现基本功能:前进、后退、左转、右转,完成这一步,剩下的也就不难了,本节采用的是Wifi通信的方式来进行控制。
杨源鑫
2020/05/21
2.2K0
树莓派综合项目2:智能小车(六)黑线循迹
树莓派综合项目2:智能小车(二)tkinter图形界面控制,实现了本地图形界面控制小车的前进后退、转向和原地转圈。
张国平
2021/02/26
4.2K0
树莓派综合项目2:智能小车(六)黑线循迹
相关推荐
基于OpenCV实现找圆与亚像素测量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验