感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持

这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主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循迹避障小车制作代码详解(简单实现版)相关推荐

  1. STM32蓝牙控制循迹避障小车——2.循迹模块

    STM32蓝牙控制循迹避障小车源代码--2.循迹模块 注意-所需模块: 接线:四个循迹模块(从左到右分别为1,2,3,4) B4–第1个循迹模块的D0 B5–第2个循迹模块的D0 B6–第3个循迹模块 ...

  2. STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制

    STM32蓝牙控制循迹避障小车源代码--4.蓝牙控制 注意-所需模块: 蓝牙模块 接线: 串口通信 A2–RX A3–TX 所有的代码都是直接从工程里面复制的,实测是没有问题的. 蓝牙控制原理: 设计 ...

  3. 基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

    基于STM32F103C8T6的循迹避障小车完整制作过程 本文适合小白观看 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程中也参考了很多大神分享的资料,学到 ...

  4. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  5. 基于STM32的智能循迹避障小车实验(小车运动部分)

    写在前面 这个实验是关于智能小车的实验,现在的想法就是先做出一个循迹和避障功能,后续可能会再添加一些其他的模块. 我在做这个实验之前基本了解了F1系列开发板的大部分模块,如果没有学习之前的模块,建议先 ...

  6. STM32蓝牙控制循迹避障小车源代码——5.最终程序

    STM32蓝牙控制循迹避障小车源代码--5.最终程序 将前面4讲的内容整合一起.主函数里用switch函数或者if语句来判断接收到的数据,改变小车的运动. 注意要将控制循迹和避障的参数单独定义一个.否 ...

  7. 基于STC12C5616AD芯片智能循迹避障小车完整制作过程(详细教程)

    前言:本篇文章适合小白阅读,其中有很基础的Keil 5的使用教程等.大多网友知道如何使用,因此大家可以看目录,对于自己而言比较基础的可以不用阅读,重点关注一些迷茫的部分. 智能循迹避障小车教程目录 智 ...

  8. 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)

    基于STM32F103的红外循迹避障小车设计 红外循迹及红外避障实现较简单,无论是51单片机还是STM32单片机,其例程随处可见.但是完全可以运行的Proteus仿真,开源的并不多,更不要说基于STM ...

  9. c语言智能车跑道检测程序,基于单片机的智能循迹避障小车(附电路原理图,程序清单)...

    基于单片机的智能循迹避障小车(附电路原理图,程序清单)(论文10000字) 摘要:目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论.智 ...

最新文章

  1. 【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
  2. win10计算机无法启动mfc7450,解决联想M7650,7600,M7450,7400驱动WIN10系统下不能用固件...
  3. 用html通过python调用mysql_HTTP协议与使用Python获取数据并写入MySQL
  4. (转)LinqToSql的连接字符串自动调用配置文件中的连接字符串
  5. 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...
  6. 李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》
  7. linux libstdc 怎样升级,linux 更新libstdc++.so.6
  8. Java定时器quartz停止
  9. CentOS下搭建docker+.net core
  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总
  11. 性能优化系列(四)电量性能优化
  12. DSP存储器与寄存器管理
  13. Python使用quote、unquote、urlencode、urldecode对url编码解码
  14. Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计
  15. codeforces CF487E Tourists 边双连通分量 树链剖分
  16. 代码坏味道 之 17 狎昵关系 inappropriate intimacy
  17. AppStore发布流程(从证书创建到app发布一站式)
  18. Python 百天读书笔记 | Python语言进阶 16-20day
  19. C++中UTF-8, Unicode, GB2312转换及有无BOM相关问题
  20. java代码设置路由

热门文章

  1. MySQL Innodb存储引擎 Table does not support optimize, doing recreate + analyze instead 解决方案
  2. 【20保研】上海交通大学“2019软件学院优才夏令营”暨“2020级研究生优秀生源选拔”的通知...
  3. 上海交大软件工程专业不读,跑去井冈山大学?
  4. 免费刷大学粗c语言题库的软件,51CTO题库-可以免费刷题的小程序
  5. error: Failed dependencies libcrypto.so.10()(64bit) is needed, libssl.so.10()(64bit) is needed解决办法
  6. 美美的圣诞树画出来-CoCube
  7. 将PPT中的excel表变成柱状图
  8. SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用
  9. matlab实现cqt频谱,基于音乐识别的频谱转换算法——CQT
  10. 【RuoYi优化】调整JVM启动内存