小车制作第二步

文章目录

  • 前言
  • 一、循迹模块
  • 二、程序设计
    • 1.前进函数
    • 2.右转函数
    • 3.左转函数
    • 4.后退函数
  • 三、超声波模块
    • 1.原理
    • 2.工作原理
    • 3.时序图
    • 4.计算公式
    • 5.设计思路
  • 总结


前言

上期博客,博主已经将小车的基本的电机,电机驱动模块,STM32C8T6基本调试完成,并将小车组装完成,并可以让小车进行基本的前进运动,经过一周的调试,博主的小车基本能完成循迹功能,避障模块打算运用超声波测距进行实施,现在对超声波模块已经有了基本了解,但还未进行实地测试。


提示:以下是本篇文章正文内容,下面案例可供参考

一、循迹模块

小车的循迹,我打算使用红外模块来进行实施。黑色对红外线的吸收最为有效,如果遇见黑色的线,红外线反射的会极少,如果是其他颜色,反射的红外线会相对较多。借此,小车可以根据红外线的多少,进行循迹。小车制作第二步_第1张图片
如图所示,这是一个红外模块。上面有3个IO口,分别写着VCC,GND,OUT。其中VCC接3.3V电源,GND接STM32的GND,OUT则是红外模块的输出口,如果遇到黑线,IO口输出高电平。如果遇到其他的颜色,IO口则输出低电平。小车就是通过IO口的高低电平来进行循迹。(这个遇到黑线输出的高低电平,不同的红外模块是不相同的,需要自己使用万用表进行测量得出结果。)一般来说,使用3个红外模块一起并排放置基本上就可以完成循迹了。由于要判断IO口输出的高低电平,设置IO口需要设置成上拉输入,这样STM32的IO口就可以判断输出是否为高电平。下面是对IO口的设置方法。代码如下

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //PA.0 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;;    //上拉输入
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);      //根据设定参数初始化GPIOA.0

GPIO_InitStructure.GPIO_Mode是设置IO口的工作模式,GPIO_Mode_IPU则是上拉输出。

二、程序设计

1.前进函数

如果小车正对黑线,则小车向前前进。
小车正对黑线,对于红外模块来说,就是左右两边的红外模块都未检测到黑线,而中间的红外模块检测到了黑线。因而,中间的红外模块输出高电平,其他的红外模块输出低电平。
代码如下(示例):

  if(PA2==0&&PA1==1&&PA1==0)
  {
   GPIO_ResetBits(GPIOA,GPIO_Pin_9);
   GPIO_ResetBits(GPIOA,GPIO_Pin_11);
   GPIO_SetBits(GPIOA,GPIO_Pin_8);
   GPIO_SetBits(GPIOA,GPIO_Pin_10);
   TIM_SetCompare1(TIM4,100);
   TIM_SetCompare2(TIM4,100);
  }

2.右转函数

当左边的红外模块遇到黑线,其他两个红外模块遇到其他颜色,按照逻辑关系,小车对于黑线是向左发生,因而小车需要进行右转。因而小车右边轮子的转速小于左边轮子的转速。此时需要调整PWM的对比值来调整小车轮子的转速。甚至你可以直接将小车的右边轮子停下,直到小车回到正确的轨道即可。如果你需要转一个特别大角度的弯道,你也可以将小车右边轮子进行反转,这样小车可以进行迅速进行旋转。小车反转也很简单,只需要将电机两边的高低电平反转即可
代码如下(示例):

       if(PA2==1&&PA1==0&&PA0==0)
        {
            GPIO_ResetBits(GPIOA,GPIO_Pin_9);
            GPIO_ResetBits(GPIOA,GPIO_Pin_11);
            GPIO_SetBits(GPIOA,GPIO_Pin_8);
            GPIO_SetBits(GPIOA,GPIO_Pin_10);
            TIM_SetCompare1(TIM4,50);
            TIM_SetCompare2(TIM4,60000);
         }

3.左转函数

左转的逻辑和上述右转的逻辑基本相同。就不再多说了,直接铺代码。

       if(PA0==0&&PA1==0&&PA2==0)
         {
            GPIO_ResetBits(GPIOA,GPIO_Pin_9);
            GPIO_ResetBits(GPIOA,GPIO_Pin_11);
            GPIO_SetBits(GPIOA,GPIO_Pin_8);
            GPIO_SetBits(GPIOA,GPIO_Pin_10);          
            TIM_SetCompare2(TIM4,50);
            TIM_SetCompare1(TIM4,60000);
         }

4.后退函数

由于小车遇到直角,或者其他特殊情况,可能会冲出黑线的范围。这时三个红外模块将都检测不到黑线。如果遇到这种情况,我的想法是小车直接后退,直到遇到黑线为止,这样可以增大小车的容错率。小车后退直接将高低电平反转即可。代码如下:

  if(PA2==0&&PA1==0&&PA0==0)
  {
   GPIO_ResetBits(GPIOA,GPIO_Pin_8);
   GPIO_ResetBits(GPIOA,GPIO_Pin_10);
   GPIO_SetBits(GPIOA,GPIO_Pin_9);
   GPIO_SetBits(GPIOA,GPIO_Pin_11);
   TIM_SetCompare1(TIM4,100);
   TIM_SetCompare2(TIM4,100);
  }

三、超声波模块

1.原理

小车制作第二步_第2张图片
VCC端口可以接5V或者3.3V;
Trig端口是控制端,平常是给低电平,如果给一个大于10us的高电平,就会触发模块输出一个信号;
Echo端口是接受端,端口通过输出一个高电平,高电平持续的时间,就是超声波从发射到接受的时间
OUT端口是输出一个高电平,如果超声波模块正常工作,就会输出一个高电平,可以检验超声波模块是否正常工作。
GND端口接地。

2.工作原理

在这里插入图片描述

3.时序图

小车制作第二步_第3张图片

4.计算公式

在这里插入图片描述

5.设计思路

由于博主还没有编写代码,就先写一下博主的思路
1.首先设置两个端口,一个设置为推完输出接Trig,一个设置为为上拉输入接Echo.给Trig设置为低电平。
2.然后给Trig一个大于10us的高电平,这个直接通过延时函数即可实现。
3.通过判断Echo的高电平时间来计算距离,一般是计算多次取平均值。

总结

总的来说制作小车过程中,还是比较有难度的。首先是连线问题,很多线交叉在一起,会影响小车的运行。需要通过一个板子将他焊接在一起,再把线进行固定。再就是电机和红外模块需要进行实地调试,每一个电机都是不同的。就算你的参数一样,但转速也可能不同。所以一般都是边调试程序,边进行实地测试。然后就是要学会自己看手册,很多模块都是没学过的,但都比较简单,可以通过自己查手册进行自学。

你可能感兴趣的:(小车制作第二步)