基于STM32+Openmv的追小球(颜色追踪)小车— — 1篇解决所有基本问题

      最近看到openmv有一个追小球小车的例程,秉承着学习的态度(主要是觉得买openmv现成的小车模块直接下载代码实现功能不能学到知识),想着将代码移植到stm32上实现追小球的功能,觉得单纯的比买openmv的小车模块和openmv组装成小车直接下载代码实现功能要学到很多,对于我来说收获最大的是学会了串口通信中的数据打包和解析,与pid算法的简单理解和应用,其实之前有很多追小球的文章,但是我看过之后大部分写的是关于串口通信数据打包和解析的问题,或者是没有彻底的按照openmv的官方例程的原理进行移植,官方例程是小车可以追踪指定颜色的小球,同时当小球和车距离过近时,小车可以后退,这里用到了2次pid;而有些文章只是实现了可以追小球,不能实现当小车和球距离过近时小车可以后退的功能,他们用的是openmv的测距功能,当小车和小球距离达到他们设定的距离时,小车便自己停下来,当小球远离到大于设置的距离后小车再追上去。不是说他们不好,只是自己觉得没有官方实现方式丝滑(只是个人觉得,大佬勿喷),所以特地写一个和官方实现原理相同的文章。

一,所需物品

(1)openmv摄像头一个

(2)正点原子stm32精英板一个(作者自己用的板子,当然也可以是其它型号的单片机)

(3)一个TB6612电机驱动模块

(4)车模一个(作者买的是自带两个带编码器的直流电机的车模)

(5)电池2组(作者就不贴图片了,应该很好找到)

         第一组电池:一个12V电池(电池盒里装3个4V电池),作用:为了给TB6612模块供电。

         第二组电池:一个5V的锂电池,作用:给单片机单独供电。

(6)杜邦线若干

二,功能实现基本思路:(如果还没有看过openmv官方追小球小车教学视频和资料的同学,请先去openmv官网进行学习,了解大概思路,否则你很难理解下面这段文字)

(1)首先是openmv端,通过直接调用openmv自带的颜色识别函数,识别你自己设置的颜色(摄像头通过识别你设置的颜色的阈值来实现识别颜色的功能,阈值的设置方法Openmv官方颜色识别教程视频里面有,大家可自行观看学习),识别到指定颜色后openmv通过串口通信的方式,将目标颜色物体的横坐标x和物体宽w和高度h发给stm32。

(2)stm32端,通过串口接受标志的判断,判断是否接收到openmv发来的数据,当收到openmv发来的数据后,将横坐标x减去图像一半的长度,作为误差利用pid算法算出输出值output_x;将目标物体的宽度w和高度h相乘得到物体的色块面积,物体色块面积减去你设置的目标色块面积作为误差,利用pid算法计算出输出值output_y;算出之后得到左右电机pwm值,左边电机pwm值:-output_y+output_x;右边电机pwm值:-putout_y-output_x。将pwm值代入电机控制函数实现追踪小球的功能。

注:如果还没有看过openmv官方追小球小车教学视频和资料的同学,请先去openmv网站进行学习,了解大概思路,否则你很难理解上述文字(先去看,再来看这里说不定你会豁然开朗哦)。

三,功能实现代码

(1)openmv端

       每行代码后面我已经标写了中文注释,方便大家理解,其中最值得注意的是串口数据通信,我采用的是数据打包方式进行发送,因为我们采用串口通信大部分时候并不一定是一次只发送一个数据,而是发送很多数据,上述代码中我们实际想要发送3个数据(目标物体中心横坐标,目标物体宽度,目标物体高度);而且正点原子的串口每接受到一个数据就要产生一次中断,如果想要接受完我们要发的数据就要产生3次中断;所以为了防止处理数据出错,和提高处理数据的准确性,我们在这三个数据之前先发2个数据,之后再发送一个数据,一次发送6个数据,前面两个叫帧头,后面一个叫帧尾,单片机通过判断帧头和帧尾数据来判断数据是否正确,这就叫数据打包,这6个数据组成的一个数据集就叫一帧,只是简单给大家说一下,详细的同学们可以自己去了解。

(2)stm32端

a,串口部分(进行数据解析)

     第一个 函数是串口初始化函数,第二个函数是串口中断函数,第三个函数是串口数据解析函数,通过串口数据解析函数得到正确的数据,当收到的结果正确时,把串口接受完成标志位赋值1,main函数通过判断串口接受完成标志位来判断是否接收到一帧数据,并启用Pid算法。

b.main函数部分

这部分代码相信大家都能看懂,在此就不赘述了。

关于本项目完整代码(电机驱动,Pid等)大家可以私信,我发给大家。 

  • 63
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 57
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值