基于STM32以及CUBEMX的项目分享(一)。
本人从接触单片机一直到到现在走了不少的弯路,也无人去引导,所以学习的深度仍然不够深刻,所以这些项目中可能会包含一些错误的见解,还请各位佬可以不吝赐教,谢谢大家,下面开始我的分享内容了。
一、关于准备电赛第一步,复刻21年电赛送药小车
我参加21年电赛时是个菜鸟,当时也没能帮上学长的忙,因此自己也心存遗憾,于是在备战23年电赛时我选择完成当年的遗憾。
对于21年电赛的内容我就不做过多的讲解,赛题可以在网上找到的哈,大家可以看看哈,当然要是不想找,我也给出地址供大家查看哈:
下面说一下我对于21年电赛的思路吧,这个思路适合能力一般的同学哈,大佬们的方案更快更稳,但是同时也对于知识的要求更加严格,我选择的是“编码器定脉冲“的思路,也是就为赛道量身定做一套行驶的函数,因为21年的送药小车的赛道距离是固定的,那么我们只需要保证我们函数运行距离的准确性即可,其实做到最后也就是调参啦。
那么说完了我们的车该怎么跑,下面说说各个病房要怎么去吧:
1.对于近端病房
近端病房位置是固定的,我们大可不必耗费时间以及摄像头的算力去进行计算,大可以直接写死程序,简单、明了、迅速。对于能力一般的同学来说这就是最优解,那我们来说说怎么做吧,第一步:给摄像头看1或者2的数字,第二步:直行到第一个十字路口,第三步:是1就左拐是2就右拐,第四步:走到终点后停下。这便是去的思路,回来时啊也是走固定的距离,但是你可以选择倒车回来也可以选择原地打转180度都是可以的,我这里是直接倒车,当然我的队友选择MPU6050转向环直接准确180度回旋,走的结果是一样的,但是很明显转向环更加漂亮。这便是我的思路。
2.对于中、远端病房
中端和远端的方法我就放在一起讲了,因为前面小车行进的方法已经说的很明白了哈,剩下的就看看摄像头啦! 先说摄像头哈,我个人专注C的程序,我的队友偏向于搞K210这些,当然我用的是OPENMV,两者可以说是一样的哈,废话不说,我直接告诉大家我的数字识别思路,就是模板匹配,多个模板匹配也就是ctrl+c然后ctrl+v哈,给各位看看openmv的模板匹配的代码。【这里不给大家讲这个OPENMV的编程方法了嗷,奉上官方教程更加的权威:book.openmv cc/image/template-match.html】 - template = image.Image("/template.pgm")//下面说一些关键的代码
复制代码- r = img.find_template(template, 0.70, step=4, search=SEARCH_EX)
复制代码 也就是说啊,我们只需要录入模板即可实现数字识别啦,但是啊这个不是特别稳定,最好还是能训练一下模型去运行这样识别的精准度会很好,关于如何训练的问题,网上有很多讲解的,但是有一点就是,我更加推荐K210使用训练的模型,因为它的算力比较高运行起来也更好。在文章的末尾我会给出我的openmv代码给大家参考的。 3.openmv与stm32的通信
openmv也是STM32啦其实,所以效果是一样的,我们先来说说openmv该怎么发送数据给STM32吧:
我们定义一个openmv的串口发送函数: - def sending_data(cx,cy,x_flag,y_flag):
- global uart;
- data = bytearray([0x2C,0x12,cx,cy,x_flag,y_flag,0x5B])#这个函数可以将我们的数据打包成16进制的一帧数据包,也是十分的方便哈
- uart.write(data) #这个函数就是串口发送函数了
复制代码 那既然openmv发了数据,接下来就看看STM32怎么去接收吧: 1.首先定义一个函数,然后这个函数的特性就是一个字节一个字节的处理 2.进行一些自己定义的规则判断
串口的处理其实并不困难,大家拿到代码认真分析即可明白其中的意思,这个代码我也将放置在文末。 二、总结 我是这样打算的,我分几期和大家分享这些内容,这个作为第一期吧,主要分享21年电赛送药小车的思路以及一些源码哈,大家等我后面更新吧,大家对于我分享的代码有疑问的话可以在评论区提出来哈,或者有更好的思路,都可以提出,大家一起进步,志同道合的人总会走到一起的! 不多说,我先奉上我的代码了【恰点黑币啦,嘻嘻】。 |