您的位置 首页 电路

stm32单片机红外遥控超声波避障小车

和同学一起在学校参加院电子设计大赛做的项目,看起来时间很长,但实际上我们拢共做的时间差不多是3天的样

和同学一同在校园参与院电子设计大赛做的项目,看起来时刻很长,但实际上咱们拢共做的时刻差不多是3天的姿态。

板子是正点的,所以许多当地咱们就直接扒的正点的例程,比方红外遥控的部分完好拿过来了,能直接用。

咱们在完结校园的要求后又多加了测距显现和差速调理(让小车能够从彻底中止到最高速度),后边我会分块尽量具体叙说小车的功用原理及代码介绍。

视频演示

https://www.bilibili.com/video/av85501350/

电源

咱们选用的是三节18650供电,三节电池就有12v,用来驱动小车捉襟见肘,为了取得更安稳契合小车需求的电压,咱们又选用了一个LM2596S降压模块,把12V的电压给降到3v给单片机供电。在装置电源的时分,其实咱们犯了一个过错,把电池给装置在了小车的第二层,这样在取放电池时就需求拆开螺丝,比较费事。

驱动

驱动模块运用的是经典的L298N,首要是实验室一抓一大把,关于模块的具体阐明能够查找得到,不再赘述。

咱们关于这个模块具体的运用如图咱们做的是4轮驱动,把轮子分左右用一个驱动模块进行驱动,为了用PWM对小车进行速度操控,所以咱们需求调用时钟,这儿调用TIM4,使能PB8对左电机进行方向操控,使能PB9作为左电机的PWM信号,使能PA6对右电机进行方向操控,使能PB10作为右电机的PWM信号。

一边有俩电机对应俩轮子,所以,这儿还进行了映射,PB8映射到PB5和PB6,对应左面的in1和in2,进行方向操控。

PA6映射到PA5和PA6,对应左面的in3和in4,进行方向操控。

更多具体的装备都在函数里边。

驱动部分并不是由我彻底担任,所以我会在大体完结后找机会请其时一同完结的小伙伴一同校验。

在驱动部分,我想再首要挑一部分具体谈谈。

其时咱们在关于进行差速操控部分有一个主意,让它完结从零开始逐渐加快或许最高速逐渐减速,一起也完结要求的三挡速度。

关于要求的三挡速度,其他选了小车的组,据我调查,应该都是在函数里边写好了预先装备3个的PWM占空比,来完结。

其时是我担任的这个功用的完结,我觉得这样写只能单一完结那个要求,然后为了达到咱们料想的差速调理,所以我在主函数设置一个变量来代表占空比,然后motor.c里边引入并在后边的调速函数和三挡预置速度函数调用,就能够完结这两个功用了。里边更改占空比的数值是咱们测验调理修正出来的。

在操控方向上,咱们有旋转和有必定精度的视点的旋转。功用完结也是依托调理占空比,不再赘述。

超声波部分咱们选用的模块是HC-SR04,同样是一个比较经典的模块,这一部分比较搞的是什么,是超声波模块需求5v供电,及其重要,咱们一开始代码调试好后,一向显现不出来正确的数据,一向为0(咱们有加OLED显现模块,所以能够便利测验),从驱动做好后一向顺风顺水忽然在这卡壳了,弄得咱们自闭良久。后来在网上查到是5v供电后,一改立马成功。

OLED显现

咱们用的0.96寸7针显现模块,代码部分也没什么好说的,网上找到读懂后直接调用就行了

单片机源程序如下:

#include "stm32f10x.h"

#include "delay.h"

#include "motor.h"

#include "usart.h"

#include "remote.h"  

#include "oled.h"

#include "hcsr04.h"

float length=0,sum=0;

         u16 tim;

         uint j=0;

int i=2000;

int main(void)

{        

         u8 key;

          float distance;

         delay_init();

         TIM4_PWM_Init(7199,0);  //初始化PWM

         Remote_Init();                        //红外接纳初始化        

         CH_SR04_Init();

                          OLED_Init();                        //初始化OLED  

                OLED_Clear();

         ZYSTM32_brake(500);         

         NVIC_Config();         

         while(1)

                {                  

                         key=Remote_Scan();        

                        distance=Senor_Using();                        

                        OLED_ShowString(0,2,"distance is");

                        OLED_ShowNum(0,4,distance,8,20);

                        if(distance>30)

                        switch(key)

                        {   

                                case 98:ZYSTM32_run(100);break;            

                                case 2:ZYSTM32_brake(100);break;                                             

                                case 34:ZYSTM32_Spin_Left(100);break;                  

                                case 168:ZYSTM32_back(100);break;                  

                                case 194:ZYSTM32_Spin_Right(100);break;

        case 104:speedchange(1);break;

        case 152:speedchange(2);break;        

        case 176:speedchange(3);break;        

                                case 48:turnleft45(220);break;                //4   

                                case 24:turnright45(220);break;                //5   

                     case 16:turnleft45(50);break;     //7

        case 56:turnright45(50);break;                //8               

                                case 224:speeddown();break;                                    

                                case 144:speedup();break;

                        }

                        else

                                {

                                        ZYSTM32_back(100);

                                        delay_us(50);

                                        ZYSTM32_brake(100);

                        }

                }

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/91164.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部