声明在前:本系列以程序设计为主,适用于刚学会32,想完成一个基本项目却不知道怎么上手的小伙伴。想学习硬件方面如:电路、画板等内容的朋友请不要在本系列耽误您的时间,关闭即可。
眼瞅着日子一天天地过去,学校却迟迟不传来开学的消息,不知道有多少小伙伴因疫情宅家而无缘赛场:_( 本人就是其中之一,这时候我本应该看着已经会学习的车自己在赛道上驰骋,和队友吃着火锅唱着歌,再抽时间调调参/doge。
正值五一假期,在这个充满了活力的第一天,我决定把我曾经参加过的第一个比赛拿出来与各位一起分享,分享我当初完成这个项目的全过程与心得体会,供小伙伴们参考,接下来,进入正文:
目录
任务需求
赛道如图:让小车按照顺时针或逆时针完成赛道一周。
其中:
- 蓝色圆点为铺在黑线旁边的磁铁
- 红色矩形为放置在赛道上的障碍物
- 绿色区域为停车区,也是小车出发前放置在内的区域,
要求小车在能够完成赛道一周的基础上,检测到场地内的磁铁并做出反应、顺利避开障碍物并回归赛道,检测到停止线后在指定区域内停车
任务分析
在明确了任务需求以后,我们来分析一下,想要用STM32做出来这个车,我们需要准备哪些材料与相关知识
材料
- STM32:本系列教程选用经济实惠好上手的stm32f103系列,并且是引脚非常多的zet6
- 红外模块:5到8个或者更多
- 电机×2 + 舵机 或者 电机×4 再或者单电机车模等等(没必要用这么贵的)
- 电机驱动,根据电机的数量选择2路×1,×2或者4路
- 干簧管——检测磁铁;蜂鸣器——作出响应
- 以及其他所有搭车、焊电路所需的材料,包括但不限于洞洞板、降压模块、电池电池盒、螺栓螺母、有能力的自己画个PCB等等等等
- (想用摄像头寻迹的、或者编码器测速的,给个/doge自己体会,这样的水平还是不要再出来欺负其他同学了 /斜眼笑)
分析
- 首要任务是寻迹,所以要用到红外模块——能够区分黑白色的模块,来判断赛道情况。
- 在寻迹的过程中,我们要用电机使小车前进,再用舵机转向,或者4个电机利用差速转向。
- 避障:若是想省点经费的话,可以把朝下的红外模块掰成朝前的/doge,或者可以用光电对管,二者其实差不多。或者有余力的用超声波模块来实现避障。
- 磁铁检测:首选干簧管,十分便宜,但是也很容易被不小心损坏。
- 停车:同样用红外模块来实现。
- 避障、磁铁检测和停车会在第三天详细说。
稍微整理下:
知识储备
主要用到的模块就只有:红外、驱动、电机舵机等等
没错,仔细分析后从总体来看,想要完成这个项目只需要会GPIO和TIM就够了,所以说想要做出来它,并不难,难的是把他做好,然鹅这是可以通过实践做到的(调车呀/斜眼笑)。所以,不需要感到迷茫,just do it !
下面对接下来三天的内容做个概述
说明
本系列的文章都将以2个方面讲述可能要用到的知识点:
- 理论知识
- 应用:模块应用 + 程序写法
正文
今天主要讲GPIO有关的内容,涉及到定时器的会则会在下期讲
GPIO输入/输出
理论知识
在学过几天32了以后,大家差不多也应该见过点灯之类的基本程序了,我们知道,每个模块和功能在被使用之前,都要完成其基本的配置——初始化。其实我在学32的时候点灯的操作就是初始化GPIO、设置好模式以后通过输出达到的点灯的效果。
那么想用32板子上的某些引脚,我们要做到第一步就是初始化GPIO。
按步骤来,分别是
- 使能端口时钟
- 端口配置
- 工作模式
- 端口速度
- 调用GPIO初始化函数
- (若是设置为输出的话则要在这一步选择初始高还是低)
现在以PA.1输出 1 为例,程序如下:
void Out_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
别看上面这一堆这么多,想看懂它还是很简单的,接下来就依次讲述这几句程序要注意的点:
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIOA可以理解为选择了PA开头的引脚,ENABLE则是使能的意思,什么叫使能?可以通俗地理解为开启这个功能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
Pin_1则是说选择了PA端口的 PA.1 引脚
- GPIO_InitStruct