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

基于STM32F103C8T6的循迹避障小车完整制作过程

本文适合小白观看
由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程中也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。
我自己也算是一个小白,之前有做过arduino的循迹避障小车,对于stm32也只是看过一点视频,还不算很熟练,这次制作也相当于学习stm32了,所以本文适合刚入门的同学参考,也虚心接受各大神的指导。

如果你一点基础都没有,建议先看下原子哥F1开发板的视频,他们的资料都是开源的,看完你才有基础可以做这个小车。
资料链接: 正点原子资料下载.

话不多说,下面开始制作小车了

**我的讲解的流程是:
//第123点是基本的设置;第456点是做循迹小车;第789点是做避障小车。
1,罗列需要的硬件
2,如何使用STM32F103C8T6(编写和烧录程序)
3,如何使电机动起来(使车子前进后退和转弯)

4,如何通过pwm调整电机的转速(调节小车的快慢)
5,如何设置IO口读取循迹模块的信号(检测黑线)
6,完成循迹小车的制作(编写循迹主函数)

7,如何用使用pwm让舵机旋转到相应的角度
8,如何配置定时器使用超声波模块测距
9,完成避障小车的制作
**

我这一周差不多每天花一点时间挨个解决这些问题,就完成了小车的制作,还是很轻松的

一,制作小车需要的硬件

1STM32F103C8T6最小系统板
24个轮子的智能小车底板
3L298N电机驱动模块
4舵机SG90云台和超声波模块HC-SR04
52节18650电池
6TCRT5000循迹模块
7面包板和杜邦线若干
8jlink ob下载器
95v转3.3v DC-DC模块
100.96寸 iic通信的oled屏幕(可选)

以上就是我制作小车所用到的硬件了,当然其它的一些工具像电烙铁,胶枪啥的都是必备品我就不说了
它们大概长这样(淘宝都搜得到):
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

二,如何使用STM32F103C8T6(编写和烧录程序)

拿到这块最小系统板,怎么用MDK来给它写程序驱动,因为我也是第一次实践用stm32,在用这块板子时也走了一些弯路,下面说说我遇到的几个问题,一般解决了这几个问题,正常的编写和烧录程序是没有问题的。

1,keil4编写的工程在MDK5上编写警告

就是用老版本写的工程在MDK5上打开会有这么个提示:
在这里插入图片描述
解决方法很简单,根据上面的提示来做就行了。我是直接下载了Legacy Support这个支持包,安装完就可以直接用MDK5编程了,具体操作可以参考下面这位博主的介绍:
链接: ARM-IDE MDK5不兼容MDK工程.

2,如何使用SWD模式下载程序

我们可以看到,手上的这块F1最小系统板有4根向外支出来的引脚:SWIO,SWCLK,3V3,GND(可能引脚的名字被简化成了IO,CLK,G,V3,他们是一样的)。使用SWD 模式下载程序,只需要SWIO,SWCLK这两根线就可以完成程序下载了,很方便。
我们将最小系统板的这4个引脚连接到jlink ob下载器对应的这4个引脚这里,再通过下载器与电脑连接,再在MDK5上进行相应的设置就可以下载了。
就像下面这样连接,usb口接上电脑就行。
在这里插入图片描述
在MDK上需要进行以下设置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击上图的Settings进入下图的选项:
此时要把板子连接上电脑才看得到界面。
在这里插入图片描述
在这里插入图片描述

3,STM32F103C8T6设置跳线帽为FLASH模式

把程序下载到flash是为了掉电再上电后程序任然可以运行。
在这里插入图片描述
我是将两个跳线帽都放到了0这边,设置为FLASH模式。

好了,到此为止你应该可以正常的编写和下载程序了,最开始编写程序最好拿一个卖家给的测试工程改写,因为你拿别的工程可能一编译就出现一大堆错误,很打击自信心。你可以先尝试写一个将某个IO口拉高的程序,下载进板子里,再用万用表测一下那个引脚的电平看是不是3.6v左右,如果是的话,就说明你已经会用这块板子了,可以进行下一步的程序编写了。
比如这段程序:

 int main(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIO的外设时钟

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;//选择要用的GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推免输出模式						 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速度为50MHZ         
    GPIO_Init(GPIOA, &GPIO_InitStructure);//调用库函数,初始化GPIO		
	GPIO_SetBits(GPIOA,GPIO_Pin_1);   //将GPIOA1拉高
}

编译后烧录到板子上,测试A1引脚的电压为3.6V就ok。
我这里上传了卖家给的最小系统板测试资料:
链接: https://download.csdn.net/download/weixin_43924857/11647457.

三,如何使电机动起来(使车子前进后退和转弯)

要想让电机动起来,就需要电机驱动了,如下:
在这里插入图片描述

我这里只讲一下这个驱动怎么接线,以及它的工作方式和使用方法等,会用就行,要看更详细的介绍可以看这位博主的博客:链接: https://blog.csdn.net/singular_man/article/details/87285597.

1,这个驱动怎么用呢?

我们只需要做以下操作即可:
1,12v输入和电源地接2节18650供电
2,单片机IO控制输入接最小系统版的4个IO口,待会我们再写程序控制这几个IO口
3,OUT1和OUT2是一对,分别接小车一侧电机两级,至于电机的两级具体该怎么接,等后面我们设置完程序运行后,要使它们转动的方向一直就行了。OUT3和OUT4同理。
4,我们通过IN1,IN2,IN3,IN4分别控制OUT1,OUT2,OUT3,OUT4。其中IN1,IN2,IN3,IN4与单片机连接,设置他们的高低电平即可完成对电机驱动简单的控制。

它的工作方法是这样的:
首先我们将OU1和OUT2分别接电机的两极,这时我们控制单片机使输入端IN1接入高电平,则相应的OUT1端也就变为高电平;将IN2接入低电平后相应的OUT2也就变为低电平,OUT1和OUT2间有了电位差,这样电机就能转起来了,很简单。

2,如何写程序使小车前进后退和转弯呢?

设计思路就是设置4个IO口的高低电平
我的IO口与电机驱动是这样连接的:A1–IN1;A2–IN2;A3–IN3;A4–IN4;
再看下面这个代码,我简单的写了一个前进和一个左转函数

void car_go(void);
void car_left(void);
 int main(void)
{
	
    GPIO_InitTypeDef  GPIO_InitStructure;	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIO的外设时钟

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//选择要用的GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推免输出模式						 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速度为50MHZ         
    GPIO_Init(GPIOA,&GPIO_InitStructure);//调用库函数,初始化GPIO
	
	car_go();//前进

}


void car_go(void)  //前进
{
    GPIO_SetBits(GPIOA,GPIO_Pin_1);   //控制左边轮胎
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_3);    //控制右边轮胎
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}

void car_left(void)  //左转
{
    GPIO_SetBits(GPIOA,GPIO_Pin_1);   //控制左边轮胎
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_3); //控制右边轮胎
	GPIO_SetBits(GPIOA,GPIO_Pin_4);   
	
}

由于主函数里调用的是car_go函数,这个代码编译下载后车子就会向前走,如果你的轮子转反了的话,简单的方法就是把电机的正负极换个位置接就行了。

好了,这篇文章已经很长了,今天就先码到这里,整个完整过程会分为上中下三篇,剩下两篇过两天慢慢码完再发。

下面是我所制作的小车成品图,因为模块都是独立的,所以线比较多。

在这里插入图片描述

下面是我写的已经测试完成了的工程,主函数里有两个循环,分别是循迹和避障循环,他们是单独工作的,引用掉一个再打开另一个就行。
https://download.csdn.net/download/weixin_43924857/11650617
当然循迹和避障的策略都是我自己为了完成任务写的,比较简单,能够实现循迹避障功能,到后面你已经会操作各个模块后,自己写个更好的循迹避障策略是完全没有问题的,或者是用我的工程,里面的各模块函数也都写好了,直接调用就行。

下面是中篇地址:
基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----中篇(第456点)

工程文件已经放到百度网盘:
链接:https://pan.baidu.com/s/1VSRC418Tz8uLCF8cjrIY1g
提取码:7m9y

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页