基于STM32的智能循迹避障小车

【1】研究背景

随着计算机,微电子技术的快速发展,智能化技术的开发越来越快,智能程度也越来越高,应用的范围也得到了极大的扩展。因此,基于嵌入式技术的智能小车应运而生。

近来两年,智能小车在生活中有着广泛的应用,如自动驾驶技术、引导机器人、自动化生产线上的物料陪送机器人等。循迹小车也是智能小车的一种,归属于机器人的范畴。目前,自动驾驶和智能小车的应用也越来越广泛。

基于STM32F103主控板搭建智能小车的控制系统,并采用模块化的设计思想编写控制系统程序,为能够在复杂地形下进行巡检作业的轮式小车研究提供理论依据。

【2】实训环境

(一) 实训环境
Java环境、STM32CubeMX、Keil5、st-link v2驱动安装、Pl2303驱动安装
(二) 环境介绍
(1)Java 环境:
STM32CubeMX环境需要Java支持,所以第一步必须要安装Java
双击Java安装包:~/stm32环境必备/jdk-7u60-windows-x64.exe
注意: 安装过程中,直接选择下一步,请不要更改文件安装路径
检测java是否安装成功:打开cmd(左下角搜索cmd或者windows+r运行内输入cmd),输入java –version,显示如下信息,则说明安装成功,如果安装不成功,查看下页app,进行设置。
Java安装成功显示
(2) STM32CubeMX
1.双击打开文件:~/stm32环境必备/ SetupSTM32CubeMX-4.9.0.exe
2.直接选择下一步即可(注意:不要修改安装路径,安装路径不能有中文)
3.安装成功后,桌面上会有图标
在这里插入图片描述
4.如果图标上面不显示图案,点击图标,右键—属性—更改图标,双击图标,确定即可
5.导入芯片包
5.1.双击图标打开软件,选择Help—Install New Libraries—From…
5.2双击鼠标选择文件:~/stm32环境必备/ stm32cubef1_1.3.1.zip,等待自动加载完成即可
(3) Keil5
1.双击打开文件:~/stm32环境必备/mdk514.exe,按照提示安装,选择默认路径即可,安装时间较长,请耐心等待
2.安装完成之后可能会弹出一个窗口,关闭即可
3.安装芯片包: ~/stm32环境必备/ Keil.STM32F1xx_DFP.1.1.0.pack
(4) st-link v2 驱动安装
st-link v2是我们下载stm32程序的接口,该硬件需要安装驱动,方法如下:
找到驱动文件:~/stm32环境必备/st-link_v2_usbdriver.exe,直接安装即可
检测安装是否成功:右键计算机—属性—设备管理器,如果安装成功则会有如下显示:
STM32 STLINK安装成功显示
如果安装完成之后还是无法下载,再安装如下驱动:
~/stm32环境必备/ST-LINK_V2/stlink_winusb_install.bat
(5) Pl2303 驱动安装
Pl2303是USB转串口上面的主要芯片,它需要安装驱动才能正常工作,安装方法如下:
找到驱动文件:~/stm32环境必备/PL2303Driver/PL-2303 Win7(X32)(X64) Driver Installer.exe,直接安装即可
如果安装完成之后还是无法下载,再安装如下驱动:~/stm32环境必备/PL2303Driver/PL2303_Prolific_DriverInstaller_v1.10.0.exe

【3】项目物联网硬件搭建

本项目利用STM32作为智能小车的主控制器来驱动智能小车的直流电机工作,电机驱动芯片采用L298N微型集成电路电机驱动芯片,配合STM32核心板使用实现四个直流电机运行和PWM软件调速,通过改变直流电机占空比的电压来改变平均电压的数值,从而改变电机的转速变化来驱动小车运行。智能小车行驶的状态有:前进、后退、左转、右转和停止。当智能小车在行驶过程中遇到障碍物,超声波避障检测模块检测周围障碍物,小车自动停止或转向。
硬件系统主要由单片机主控模块、电源模块、三色LED灯模块、电机驱动模块、超声波避障模块和控制终端模块组成。硬件系统框图如图:
硬件系统框图
(1) 主控模块
主控模块采用STM32F103为主控制器,STM32F103属于中低端的32位ARM微控制器,该系列芯片是意法半导体(ST)公司出品,其内核是Cortex-M3。该系列芯片按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。STM32F103可使用keil语言编译,支持ST Link-SWD在线调试,主要用于收集信息、处理数据、协调系统中的每个功能模块预计要完成的任务。
(2) 电源模块
电源模块在小车的运行过程中,需要给单片机、电机、各大模块及传感器供电。
(3) 三色LED灯模块
三色LED灯模块是R,G,B三个管芯的LED。工作原理是:由红绿蓝三基色混色实现七种颜色的变化,采用输出波形的脉宽调制,即调节LED灯导通的占空比,在扫描速度很快的情况下,利用人的视觉惰性达到渐变的效果。
(4) 电机驱动模块
电机驱动模块采用L298N为电机驱动芯片。L298N是ST公司生产的一种高电压、大电流电机驱动芯片。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机,并联时可以驱动四台电机。本次项目将L298N配合STM32核心板无缝对插使用,实现无损扩展并对四个马达进行驱动和PWM调速。
(5) 超声波避障模块
超声波模块超声波测距时序图
原理:在模块上电以后,给Trig管脚一个持续20us以上的高电平,该模块可以开始工作。这时,该模块会自动从这一个“大喇叭”发送8个40KHZ的方波,并将Echo管脚拉高,然后自动检测是否有信号返回。如果返回,Echo管脚便拉低,那么Echo高电平持续的时间就是超声波从发送到接收的时间。我们要做的就是开启超声波模块,然后再通过Echo知道超声波从发送到接收的时间就可以。
(6) 红外感应模块
光电开关又称红外光电传感器,反馈反射型。发射口不间断发射光束,接收器把收到的光能量转换为电流,传输给后面的检测线路
可以正常反射 → 低电平;红外光被吸收 → 高电平。

【4】实训具体任务及内容

1.开机后红灯闪烁3次,黄灯闪烁2次,然后亮绿灯,开始循迹行驶
2.行驶过程需根据轨道能平缓调整方向
3.行驶过程前面20cm范围内有障碍物,需能停止,并亮红灯,障碍物移开后,需亮绿灯并开始前行

【5】实训结果(项目运行说明及截图)

(一)项目运行说明
在Application/User中新建LED.c 、redlight.c 、delay.c 、car.c 四个函数,在四个函数中分别建立相对应的函数,需要用到某个函数直接在主函数里调用,就可以实现功能。
(1) 在LED.c中自定义ChangeLed函数,采用PWM时钟延时使三色LED闪烁,使用 HAL 库中的__HAL_TIM_SetCompare 修改脉冲宽度来修改占空比,在主函数中调用修改3个通道的值可以修改所亮灯的颜色以及亮度。
(2) 在redlight.h中定义HASLEFT、HASLEFTMID、HASMIDDLE、HASRIGHTMID、HASRIGHT、HASNOTHING六个参数值;在redlight.c中自定义ScanRed函数,使用 HAL 库中的HAL_GPIO_ReadPin 判断读取的引脚是最左边、最右边、左中、右中或中间,并返回相应的参数值。在主函数中引入switch…case语句,通过判断HASLEFT等几个参数值,去执行相应的语句,使小车做出相对应的动作。
(3) 在delay.c中,自定义两个延时函数delay_nus和delay_nms,在主函数中调用完成延时。
(4) 在car.c中,自定义ChangeSpeed函数,使用 HAL 库中的__HAL_TIM_SetCompare 修改脉冲宽度来修改占空比,设定两个通道left、right。再自定义left_go、left_stop、left_back、right_go、right_stop、right_back六个函数,使用 HAL 库中的HAL_GPIO_WritePin 读取引脚是RESET或SET,通过改变left、right的速度FULL_Speed或ZeroSpeed,判断小车左右轮前进或后退。
在这里插入图片描述
在这里插入图片描述

【6】实训小结

1.阐述实训过程遇到的难题及解决办法,给自己带来的收获;
(一)难题及解决办法:
(1)STM32CubeMX导入到Keil uVision5中,显示“The ARM C/C++ Compiler 已停止工作,由于出现问题,程序停止正常工作。Windows将关闭程序,并会在有可用的解决方案时通知你。”,找了好多资料,修改中文用户名,配置环境变量等,试了很多种方法,都没有解决。后来问了王老师,安装了另外一个版本的Keil uVision5。
(2)驱动安装成功,但是在设备管理器无法显示,或者就是有一个“!”,安装存在问题,也是安装了另一个版本的ST-LINK_V2驱动。
(3)串口接口接触不良,插头插在电脑上显示设备“USB2.0-Serial”有“!”,无法与小车之间构成连接。
(4)串口连接成功且PL2303显示安装成功,却无法检测到串口。
(5)循迹行驶的时候,小车行驶时的速度快,来不及调整好方向就继续往前走,导致没有沿着黑胶带行驶,且左轮的转速较右轮慢,通过修改速度FULL_Speed以及左右方向调整的延时delay_nms去调整小车整体的循迹方向。
(二)收获:
本学期为期一周的嵌入式实训在不知不觉中结束了,虽说这次实训的时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到了软件开发的趣味,更加认识到了自己在软件编程及学习上的一些不足之处。
此次实训是由西安的华清远见公司的王乐王老师带我们完成的。项目的实施方式是团队分组合作,共同完成,让我们体会到了公司开发项目的氛围。我们一人一台电脑,老师边讲边练。虽然有一些实验,我们之前也都学习了解过,但是大多停留在浅层次,实际做项目却很少。这次实训给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大帮助,深刻体会到了这些技术的实用性。每当自己成功调试一段代码或者通过自己的努力克服一个技术困难,满满的成就感。
没有做实验之前,总是觉得做起来很简单,可是实验过程中,往往会出现很多意料不到的问题,比如,在紧急时刻,电脑突然卡了,写的代码什么的就需要再重新去写。刚开始了解实训题目的时候,感觉很难去完成,经过这几天的学习,一步一步的,发现也没有那么难。它让我学会了如何通过自己的努力去了解一件新事物,更重要的是端正自己的学习态度,只要真正下功夫去学习,才能有收获;学会了如何去分析问题,遇到问题时,不能急躁,要去找出问题的根源,进而去解决。让我深刻意识到“实践出真知”;没有实践,就不会知道实验中会出现什么问题,也就不能从中得到收获。
此次实训最大的收获不是我学到了多少知识而是这几天实训给我的感悟:首先是心态。一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识,不要什么东西都感觉很简单就不去做了或者不屑一顾。有自己的东西自己的付出才会有程序运行成功时的喜悦和小自豪,这样也有助于培养自己的兴趣。要时刻牢记态度决定一切。其次是兴趣。学习工作中兴趣很关键,一个引发人积极性的问题,有了兴趣就自觉了,效率自然就高了。再次要敢于尝试和挑战。不要安于现成,不要害怕失败,在程序调试的过程中这点尤为重要,“发现问题然后解决问题”是一个积累经验的过程,而且很高效。最后要不懈追求。对于源代码进行不断的完善,尽可能的实现项目要求。对于初学者或者开发较少的人来说,大量写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。还可以自己添加一些有意义的功能去实现。当看到自己编写的程序正常运行时,兴趣也会随之而来。
2.阐述此次实训对自己实践能力的影响,对已学专业知识的认识,对将来工作学习方向的影响;
(1)对自己实践能力的影响:
实训是一个有针对性的训练,跟平常上课不太一样,平时上完理论课很少有时间上机或者隔几天才上机联系,等到上机时一些东西就遗忘了,很耗费时间。此次实训,认识到自己的计算机水平还有待提高,要打好基础,才能进一步深入的学习。
(2)对已学专业知识的认识:
嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。学好嵌入式,C语言很重要,基础不太好的有必要再学习积累一下这方面的知识。很多东西的学习不是一帆风顺也是耗时的,嵌入式也不例外,要想学好必须要下大功夫,还要坚持。这次的实训让我明确了:嵌入式系统开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统对于知识面的要求很广,且有一定的深度。
(3)对将来工作学习方向的影响:
一周的实训,感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观便捷的切入主题。在计算机这个神秘的领域,我感觉自己还有好多东西要学,还有好多东西不懂,但是这也再次坚定了我考研深造的决心。

发布了14 篇原创文章 · 获赞 4 · 访问量 2968

猜你喜欢

转载自blog.csdn.net/weixin_44098853/article/details/100554288