STM32循迹避障小车制作代码详解(简单实现版)
感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持
这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主main函数里的,是通过外部流程来传参给CPU的,节省了CPU的占用率,因此可以跑很快的。如果有问题代码细节可以私信讨论喔,如果我看到有时间的话也会和大家积极交流的。
如果你是XD的,哈哈哈哈哈,代码直接可用,把线连接好就行啦!~~~~如果没啥变化的话!!!~~~四轮和自由轮很像,稍加修改就可以完成,相信大家可以的
代码链接: 循迹避障小车进阶版代码 || https://download.csdn.net/download/VCA821/13203358
写在最前:最近由于需要制作了一个循迹避障小车,制作比较简单但是还是出现了很多bug,因此在博客中记录一下,希望对后期需要制作的能有所帮助,小车由PWM信号+L293D驱动。(二轮驱动,第三轮为自由轮)
要求:小车要求循迹避障,有两种避障策略,在循迹黑线上遇到障碍物停车,循迹黑线外遇到障碍物要避障(左转,右转,后退均可),循迹过程中要求不能出黑线之外。
循迹原理:(红外探头+信号处理板)
我们在车头前加有3个红外探头板,分别在左中右三个位置,循迹原理很简单代码也十分容易理解好写,红外探头在光滑地板上会收到发射出去后反射的红外信号,如果探头在黑线上,则无法收到(黑线吸收红外光),当探头收到时,对应的信号调整板对应位置的led会亮,同时TTL输出端会给一个低电平,相反当某个探头在黑线上,对应位置led会灭,TTL输出端会给一个高电平,因此通过这种方式我们就知道任意一个探头是否在线上。
因此我们举个例子,两边灯亮,中间灯灭,说明小车前端中间探头在线上,这时候是正向,因此我们在代码中要求小车直行,若左灯灭,中间灯和右灯都亮,说明左探头在线上,小车现在是斜向右方,因此我们需要小车左转来实现方向回正,下面配个图来说明例子(途中只有左右两个探头,但不影响理解)
若仅仅实现循迹,代码要求就十分简单了(这里我们不再说小车前进等代码,只说明策略)
当左灯灭,TTL给1,车身右斜,循环左转至中间灯灭两边灯亮(即正向)后直行,否则就一直摆正,右向同样如此。
/***LED_1,LED_2,LED_3分别对应左中右三个红外探头***/if(LED_1==1&&LED_3==0) //左方黑线亮,左转直到正向
{while(1){ CarLeft();if(LED_1==0&&LED_3==0&&LED_2==1)break;}
}else if(LED_1==0&&LED_3==1) 右方黑线亮,右转直到正向
{while(1){CarRight();if(LED_1==0&&LED_3==0&&LED_2==1)break;}
}else CarGo();
避障原理:(超声波探头)
驱动代码是我直接从网上复制,借鉴的代码,在此附上链接,讲解非常详细,感谢作者。
探头驱动:基于stm32和HC-SR04超声波测距驱动
但是笔者在使用驱动中也遇到了只收到一个非常小的数,即使已经按照上面链接中的要求更正,但还是收到一个非常小的数字,对此笔者对其测距代码进行了小小改动,对定时器测距进行小延时,去除小值数据,请对比上述链接中代码~在中间加了一个Delay_Us(10);问题解决。其实笔者试过,Delay_Us(1);同样可以解决问题。
float Hcsr04GetLength(void ){u32 t = 0;int i = 0;float lengthTemp = 0;float sum = 0;while(i!=5){//TRIG_Send = 1; //发送口高电平输出GPIO_SetBits(GPIOA, GPIO_Pin_5); // AliasDelay_Us(15);//TRIG_Send = 0;GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Alias//while(ECHO_Reci == 0); //等待接收口高电平输出while(0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))OpenTimerForHc(); //打开定时器i = i + 1;//while(ECHO_Reci == 1);while(1 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))Delay_Us(10); //延时,去除小数值CloseTimerForHc(); //关闭定时器t = GetEchoTimer(); //获取时间,分辨率为1USlengthTemp = ((float)t/58.0);//cmsum = lengthTemp + sum ;}lengthTemp = sum/5.0;return lengthTemp;}
在测距驱动和循迹策略都有的情况下,笔者将代码合二为一,实现要求功能(以下为while函数中代码)
if(LED_1==0&&LED_3==0&&LED_2==0){length = Hcsr04GetLength();if(length<=20.00){while(1){for(cnt1=0;cnt1 <= 60;cnt1++)for(cnt=0;cnt <= 8000;cnt++)CarBack();for(cnt1=0;cnt1 <= 60;cnt1++)for(cnt=0;cnt <= 8000;cnt++)CarRight();length = Hcsr04GetLength();if(length>=40.00)break;}}else CarGo();}else{length = Hcsr04GetLength();if(length<=20.00)CarStop();else{ /***********路径判断***********/if(LED_1==1&&LED_3==0) //左方黑线亮,左转直到正向{while(1){length = Hcsr04GetLength();//这个判断很重要,否则转弯过程中if(length<=20.00) //会被判断为线外,会后退右转CarStop();else CarLeft();if(LED_1==0&&LED_3==0&&LED_2==1)break;}}else if(LED_1==0&&LED_3==1) 右方黑线亮,右转直到正向{while(1){length = Hcsr04GetLength();if(length<=20.00)CarStop();else CarRight();if(LED_1==0&&LED_3==0&&LED_2==1)break;}}else CarGo(); //其实这里并不严谨,笔者后期有改动。}}
}
以上代码和驱动没有问题,但是有个很严重的问题就是
车子不能走太快,若直行左右转过程中遇到障碍物,有可能会出现线外避障,后期作者代码有改动。
原因是该代码中测距是由定时器计数,在此cpu参与计数,单片机是单核运行,因此大概一半以上时间都带等数据返回,如果速度太快小车在循迹中灯闪时却在等待数据,则直接冲出线外,解决方案(定时器捕获测距),CPU不参与计数,大大提高了检测速率。
此代码为简单版,并不严谨,但完全可以完成任务,笔者后期已经更新一次代码(博客头上有链接),这次小车速度很快(我啪的就说,很快啊)而且代码比较严谨
有问题欢迎留言~
文章头已经添加工程源码,大家看到了可以自取,感谢大家一直的支持,后续会继续努力
STM32循迹避障小车制作代码详解(简单实现版)相关推荐
- STM32蓝牙控制循迹避障小车——2.循迹模块
STM32蓝牙控制循迹避障小车源代码--2.循迹模块 注意-所需模块: 接线:四个循迹模块(从左到右分别为1,2,3,4) B4–第1个循迹模块的D0 B5–第2个循迹模块的D0 B6–第3个循迹模块 ...
- STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制
STM32蓝牙控制循迹避障小车源代码--4.蓝牙控制 注意-所需模块: 蓝牙模块 接线: 串口通信 A2–RX A3–TX 所有的代码都是直接从工程里面复制的,实测是没有问题的. 蓝牙控制原理: 设计 ...
- 基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)
基于STM32F103C8T6的循迹避障小车完整制作过程 本文适合小白观看 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程中也参考了很多大神分享的资料,学到 ...
- STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块
STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...
- 基于STM32的智能循迹避障小车实验(小车运动部分)
写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...
- STM32蓝牙控制循迹避障小车源代码——5.最终程序
STM32蓝牙控制循迹避障小车源代码--5.最终程序 将前面4讲的内容整合一起.主函数里用switch函数或者if语句来判断接收到的数据,改变小车的运动. 注意要将控制循迹和避障的参数单独定义一个.否 ...
- 基于STC12C5616AD芯片智能循迹避障小车完整制作过程(详细教程)
前言:本篇文章适合小白阅读,其中有很基础的Keil 5的使用教程等.大多网友知道如何使用,因此大家可以看目录,对于自己而言比较基础的可以不用阅读,重点关注一些迷茫的部分. 智能循迹避障小车教程目录 智 ...
- 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)
基于STM32F103的红外循迹避障小车设计 红外循迹及红外避障实现较简单,无论是51单片机还是STM32单片机,其例程随处可见.但是完全可以运行的Proteus仿真,开源的并不多,更不要说基于STM ...
- c语言智能车跑道检测程序,基于单片机的智能循迹避障小车(附电路原理图,程序清单)...
基于单片机的智能循迹避障小车(附电路原理图,程序清单)(论文10000字) 摘要:目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论.智 ...
最新文章
- 【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
- win10计算机无法启动mfc7450,解决联想M7650,7600,M7450,7400驱动WIN10系统下不能用固件...
- 用html通过python调用mysql_HTTP协议与使用Python获取数据并写入MySQL
- (转)LinqToSql的连接字符串自动调用配置文件中的连接字符串
- 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...
- 李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》
- linux libstdc 怎样升级,linux 更新libstdc++.so.6
- Java定时器quartz停止
- CentOS下搭建docker+.net core
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
- 性能优化系列(四)电量性能优化
- DSP存储器与寄存器管理
- Python使用quote、unquote、urlencode、urldecode对url编码解码
- Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计
- codeforces CF487E Tourists 边双连通分量 树链剖分
- 代码坏味道 之 17 狎昵关系 inappropriate intimacy
- AppStore发布流程(从证书创建到app发布一站式)
- Python 百天读书笔记 | Python语言进阶 16-20day
- C++中UTF-8, Unicode, GB2312转换及有无BOM相关问题
- java代码设置路由
热门文章
- MySQL Innodb存储引擎 Table does not support optimize, doing recreate + analyze instead 解决方案
- 【20保研】上海交通大学“2019软件学院优才夏令营”暨“2020级研究生优秀生源选拔”的通知...
- 上海交大软件工程专业不读,跑去井冈山大学?
- 免费刷大学粗c语言题库的软件,51CTO题库-可以免费刷题的小程序
- error: Failed dependencies libcrypto.so.10()(64bit) is needed, libssl.so.10()(64bit) is needed解决办法
- 美美的圣诞树画出来-CoCube
- 将PPT中的excel表变成柱状图
- SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用
- matlab实现cqt频谱,基于音乐识别的频谱转换算法——CQT
- 【RuoYi优化】调整JVM启动内存