查看: 1982|回复: 3

[项目] 基于stm32单片机的红外遥控超声波避障小车

[复制链接]
  • TA的每日心情

    2020-8-17 09:21
  • 签到天数: 3 天

    连续签到: 3 天

    [LV.2]偶尔看看I

    发表于 2020-8-17 10:30:45 | 显示全部楼层 |阅读模式
    分享到:
    简述
    19年11月到12月,和同学一起在学校参加院电子设计大赛做的项目,捋捋这段经历。
    我们在做的时候又多加了测距显示和差速调节(让小车可以从完全停止到最高速度),后面我会分块尽量详细叙述小车的功能原理及代码介绍。

    视频演示

    电源
    我们采用的是三节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里面引进并在后面的调速函数和三挡预置速度函数调用,就能够实现这两个功能了。里面更改占空比的数值是我们测试调节修改出来的。
    1. void speedchange(signed char flag)
    2. {
    3. if(flag==1)
    4. {
    5.   i=2000;
    6. TIM_SetCompare2(TIM4,i);
    7. TIM_SetCompare4(TIM4,i);
    8.   }else if(flag==2)
    9. {
    10.   i=1000;
    11.   TIM_SetCompare2(TIM4,i);
    12. TIM_SetCompare4(TIM4,i);
    13. }else if(flag==3)
    14. {
    15. i=1;
    16.   TIM_SetCompare2(TIM4,i);
    17. TIM_SetCompare4(TIM4,i);
    18. }
    19. }
    20. void speeddown(void)
    21. {
    22. i+=100;
    23. TIM_SetCompare2(TIM4,i);
    24. TIM_SetCompare4(TIM4,i);
    25. }
    26. void speedup(void)
    27. {
    28. if(1)
    29. {
    30.    i-=100;
    31.    TIM_SetCompare2(TIM4,i);
    32.    TIM_SetCompare4(TIM4,i);
    33.   while(i<=0)
    34.   {
    35.    i=1;
    36.    break;
    37.   }
    38. }
    复制代码

    在控制方向上,我们有旋转和有一定精度的角度的旋转。功能完成也是依靠调节占空比,不再赘述。
    下面是驱动的motor.h代码。

    1. moto.h
    2. #ifndef __MOTOR_H_
    3. #define __MOTOR_H_

    4. #include "stm32f10x.h"

    5. void TIM4_PWM_Init(unsigned short arr,unsigned short psc);
    6. //电机驱动IO定义
    7. /*
    8. LEFT_MOTOR_GO   PB8 左电机方向控制
    9. LEFT_MOTOR_PWM PB9 左电机PWM

    10. RIGHT_MOTOR_GO PA6     右电机方向控制
    11. RIGHT_MOTOR_PWM PB10   右电机电机PWM
    12. */
    13. #define LEFT_MOTOR_GOin1             GPIO_Pin_5
    14. #define LEFT_MOTOR_GOin1_GPIO        GPIOB
    15. #define LEFT_MOTOR_GOin1_SET         GPIO_SetBits(LEFT_MOTOR_GOin1_GPIO,LEFT_MOTOR_GOin1)
    16. #define LEFT_MOTOR_GOin1_RESET       GPIO_ResetBits(LEFT_MOTOR_GOin1_GPIO,LEFT_MOTOR_GOin1)

    17. #define LEFT_MOTOR_GOin2             GPIO_Pin_6
    18. #define LEFT_MOTOR_GOin2_GPIO        GPIOB
    19. #define LEFT_MOTOR_GOin2_SET         GPIO_SetBits(LEFT_MOTOR_GOin2_GPIO,LEFT_MOTOR_GOin2)
    20. #define LEFT_MOTOR_GOin2_RESET       GPIO_ResetBits(LEFT_MOTOR_GOin2_GPIO,LEFT_MOTOR_GOin2)

    21. #define LEFT_MOTOR_PWM            GPIO_Pin_7
    22. #define LEFT_MOTOR_PWM_GPIO       GPIOB
    23. #define LEFT_MOTOR_PWM_SET        GPIO_SetBits(LEFT_MOTOR_PWM_GPIO,LEFT_MOTOR_PWM)
    24. #define LEFT_MOTOR_PWM_RESET      GPIO_ResetBits(LEFT_MOTOR_PWM_GPIO,LEFT_MOTOR_PWM)

    25. #define RIGHT_MOTOR_GOin3             GPIO_Pin_4
    26. #define RIGHT_MOTOR_GOin3_GPIO        GPIOA
    27. #define RIGHT_MOTOR_GOin3_SET         GPIO_SetBits(RIGHT_MOTOR_GOin3_GPIO,RIGHT_MOTOR_GOin3)
    28. #define RIGHT_MOTOR_GOin3_RESET       GPIO_ResetBits(RIGHT_MOTOR_GOin3_GPIO,RIGHT_MOTOR_GOin3)

    29. #define RIGHT_MOTOR_GOin4             GPIO_Pin_5
    30. #define RIGHT_MOTOR_GOin4_GPIO        GPIOA
    31. #define RIGHT_MOTOR_GOin4_SET         GPIO_SetBits(RIGHT_MOTOR_GOin4_GPIO,RIGHT_MOTOR_GOin4)
    32. #define RIGHT_MOTOR_GOin4_RESET       GPIO_ResetBits(RIGHT_MOTOR_GOin4_GPIO,RIGHT_MOTOR_GOin4)

    33. #define RIGHT_MOTOR_PWM            GPIO_Pin_9
    34. #define RIGHT_MOTOR_PWM_GPIO       GPIOB
    35. #define RIGHT_MOTOR_PWM_SET        GPIO_SetBits(RIGHT_MOTOR_PWM_GPIO,RIGHT_MOTOR_PWM)
    36. #define RIGHT_MOTOR_PWM_RESET      GPIO_ResetBits(RIGHT_MOTOR_PWM_GPIO,RIGHT_MOTOR_PWM)

    37. #endif
    复制代码

    红外遥控
    红外遥控部分我们没有进行修改,直接用了正点原子的例程,不多赘述。
    值得一提的是,我们在开始项目之前,没有好好查找资料,不知道板子上就有红外,在网上买了额外的红外接收模块HX1838,不过实际效果很好用,而且拉风,就是竖着的那个天线(我的设计,酷炫)。
    下面的remote.h的代码
    1. remote.h
    2. #ifndef __RED_H
    3. #define __RED_H
    4. #include "sys.h"   
    5. #define RDATA  PAin(1)   //红外数据输入脚

    6. //红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的.
    7. //我们选用的遥控器识别码为0
    8. #define REMOTE_ID 0
    9. extern u8 RmtCnt;   //按键按下的次数
    10. void Remote_Init(void);     //红外传感器接收头引脚初始化
    11. u8 Remote_Scan(void);     
    12. #endif
    复制代码
    超声波
    超声波部分我们采用的模块是HC-SR04,同样是一个比较经典的模块,这一部分比较搞的是什么,是超声波模块需要5v供电,及其重要,我们一开始代码调试好后,一直显示不出来正确的数据,一直为0(我们有加OLED显示模块,所以可以方便测试),从驱动做好后一直顺风顺水突然在这卡壳了,弄得我们自闭许久。后来在网上查到是5v供电后,一改立马成功。
    下面是hcsr04.h的代码
    1. hcsr04.h
    2. #ifndef __CS_H
    3. #define __CS_H  

    4. #include "stm32f10x.h"
    5. #include "delay.h"
    6. //使用了TIM3
    7. #include "sys.h"
    8. #define uint unsigned int
    9. #define TRIG_Send PAout(6)
    10. #define ECHO_Reci PAin(7)

    11. void CH_SR04_Init(void);  //超声波模块相关配置初始化
    12. float Senor_Using(void);  //测距函数,返回值即为距离
    13. void NVIC_Config(void);   //中断配置

    14. #endif
    复制代码
    OLED显示
    1. 我们用的0.96寸7针显示模块,代码部分也没什么好说的,网上找到读懂后直接调用就行了
    2. oled.h

    3. //              ----------------------------------------------------------------
    4. //              GND    电源地
    5. //              VCC  接5V或3.3v电源
    6. //              D0   接PD6(SCL)
    7. //              D1   接PD7(SDA)
    8. //              RES  接PD4
    9. //              DC   接PD5
    10. //              CS   接PD3               
    11. #ifndef __OLED_H
    12. #define __OLED_H      
    13. #include "sys.h"
    14. #include "stdlib.h"      
    15. //OLED模式设置
    16. //0:4线串行模式
    17. //1:并行8080模式
    18. #define OLED_MODE 0
    19. #define SIZE 16
    20. #define XLevelL  0x00
    21. #define XLevelH  0x10
    22. #define Max_Column 128
    23. #define Max_Row  64
    24. #define Brightness 0xFF
    25. #define X_WIDTH  128
    26. #define Y_WIDTH  64            
    27. //-----------------OLED端口定义----------------         
    28. #define OLED_CS_Clr()  GPIO_ResetBits(GPIOD,GPIO_Pin_3)//CS
    29. #define OLED_CS_Set()  GPIO_SetBits(GPIOD,GPIO_Pin_3)

    30. #define OLED_RST_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_4)//RES
    31. #define OLED_RST_Set() GPIO_SetBits(GPIOD,GPIO_Pin_4)

    32. #define OLED_DC_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_5)//DC
    33. #define OLED_DC_Set() GPIO_SetBits(GPIOD,GPIO_Pin_5)

    34. #define OLED_WR_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_14)
    35. #define OLED_WR_Set() GPIO_SetBits(GPIOG,GPIO_Pin_14)

    36. #define OLED_RD_Clr() GPIO_ResetBits(GPIOG,GPIO_Pin_13)
    37. #define OLED_RD_Set() GPIO_SetBits(GPIOG,GPIO_Pin_13)

    38. //PC0~7,作为数据线
    39. #define DATAOUT(x) GPIO_Write(GPIOC,x);//输出  
    40. //使用4线串行接口时使用

    41. #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_6)//CLK
    42. #define OLED_SCLK_Set() GPIO_SetBits(GPIOD,GPIO_Pin_6)

    43. #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOD,GPIO_Pin_7)//DIN
    44. #define OLED_SDIN_Set() GPIO_SetBits(GPIOD,GPIO_Pin_7)

    45. #define OLED_CMD  0 //写命令
    46. #define OLED_DATA 1 //写数据

    47. //OLED控制用函数
    48. void OLED_WR_Byte(u8 dat,u8 cmd);     
    49. void OLED_Display_On(void);
    50. void OLED_Display_Off(void);                    
    51. void OLED_Init(void);
    52. void OLED_Clear(void);
    53. void OLED_DrawPoint(u8 x,u8 y,u8 t);
    54. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
    55. void OLED_ShowChar(u8 x,u8 y,u8 chr);
    56. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
    57. void OLED_ShowString(u8 x,u8 y, u8 *p);  
    58. void OLED_Set_Pos(unsigned char x, unsigned char y);
    59. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
    60. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
    61. #endif
    复制代码
    主函数
    1. #include "usart.h"
    2. #include "remote.h"  
    3. #include "oled.h"
    4. #include "hcsr04.h"
    5. /*
    6. void ZYSTM32_run(int speed,int time);       //前进函数
    7. void ZYSTM32_brake(int time);               //刹车函数
    8. void ZYSTM32_Spin_Left(int speed,int time); //左旋转函数
    9. void ZYSTM32_Spin_Right(int speed,int time);//右旋转函数
    10. void ZYSTM32_back(int speed,int time);      //后退函数
    11. */
    12. float length=0,sum=0;
    13.   u16 tim;
    14.   uint j=0;
    15. int i=2000;
    16. int main(void)
    17. {
    18.   u8 key;
    19.    float distance;
    20.   delay_init();
    21.   TIM4_PWM_Init(7199,0);  //初始化PWM
    22.   Remote_Init();   //红外接收初始化
    23.   CH_SR04_Init();
    24.      OLED_Init();   //初始化OLED  
    25.   OLED_Clear();
    26.   ZYSTM32_brake(500);  
    27.   NVIC_Config();  
    28.   while(1)
    29.   {   
    30.     key=Remote_Scan();
    31.    distance=Senor_Using();   
    32.    OLED_ShowString(0,2,"distance is");
    33.    OLED_ShowNum(0,4,distance,8,20);
    34.    if(distance>30)
    35.    switch(key)
    36.    {   
    37.     case 98:ZYSTM32_run(100);break;     
    38.     case 2:ZYSTM32_brake(100);break;         
    39.     case 34:ZYSTM32_Spin_Left(100);break;   
    40.     case 168:ZYSTM32_back(100);break;     
    41.     case 194:ZYSTM32_Spin_Right(100);break;
    42.         case 104:speedchange(1);break;
    43.         case 152:speedchange(2);break;
    44.         case 176:speedchange(3);break;
    45.     case 48:turnleft45(220);break;  //4   
    46.     case 24:turnright45(220);break;  //5   
    47.        case 16:turnleft45(50);break;     //7
    48.         case 56:turnright45(50);break;  //8  
    49.     case 224:speeddown();break;         
    50.     case 144:speedup();break;
    51.    }
    52.    else
    53.     {
    54.      ZYSTM32_back(100);
    55.      delay_us(50);
    56.      ZYSTM32_brake(100);
    57.    }
    58.   }
    59. }
    复制代码


    回复

    使用道具 举报

    该用户从未签到

    发表于 2021-6-22 14:41:09 | 显示全部楼层
    加油!希望可以学到东西!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-16 21:34 , Processed in 0.142679 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.