找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3875|回复: 1
打印 上一主题 下一主题
收起左侧

stm32单片机红外遥控超声波避障小车源程序+视频+制作详解

[复制链接]
跳转到指定楼层
楼主
ID:794476 发表于 2020-7-2 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
去年11月到12月,和同学一起在学校参加院电子设计大赛做的项目,看起来时间很长,但实际上我们拢共做的时间差不多是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针显示模块,代码部分也没什么好说的,网上找到读懂后直接调用就行了

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "motor.h"
  4. #include "usart.h"
  5. #include "remote.h"  
  6. #include "oled.h"
  7. #include "hcsr04.h"
  8. /*
  9. void ZYSTM32_run(int speed,int time);       //前进函数
  10. void ZYSTM32_brake(int time);               //刹车函数
  11. void ZYSTM32_Spin_Left(int speed,int time); //左旋转函数
  12. void ZYSTM32_Spin_Right(int speed,int time);//右旋转函数
  13. void ZYSTM32_back(int speed,int time);      //后退函数
  14. */
  15. float length=0,sum=0;
  16.          u16 tim;
  17.          uint j=0;
  18. int i=2000;
  19. int main(void)
  20. {        
  21.          u8 key;
  22.           float distance;
  23.          delay_init();
  24.          TIM4_PWM_Init(7199,0);  //初始化PWM
  25.          Remote_Init();                        //红外接收初始化        
  26.          CH_SR04_Init();
  27.                           OLED_Init();                        //初始化OLED  
  28.                 OLED_Clear();
  29.          ZYSTM32_brake(500);         
  30.          NVIC_Config();         
  31.          while(1)
  32.                 {                  
  33.                          key=Remote_Scan();        
  34.                         distance=Senor_Using();                        
  35.                         OLED_ShowString(0,2,"distance is");
  36.                         OLED_ShowNum(0,4,distance,8,20);
  37.                         if(distance>30)
  38.                         switch(key)
  39.                         {   
  40.                                 case 98:ZYSTM32_run(100);break;            
  41.                                 case 2:ZYSTM32_brake(100);break;                                             
  42.                                 case 34:ZYSTM32_Spin_Left(100);break;                  
  43.                                 case 168:ZYSTM32_back(100);break;                  
  44.                                 case 194:ZYSTM32_Spin_Right(100);break;
  45.         case 104:speedchange(1);break;
  46.         case 152:speedchange(2);break;        
  47.         case 176:speedchange(3);break;        
  48.                                 case 48:turnleft45(220);break;                //4   
  49.                                 case 24:turnright45(220);break;                //5   
  50.                      case 16:turnleft45(50);break;     //7
  51.         case 56:turnright45(50);break;                //8               
  52.                                 case 224:speeddown();break;                                    
  53.                                 case 144:speedup();break;
  54.                         }
  55.                         else
  56.                                 {
  57.                                         ZYSTM32_back(100);
  58.                                         delay_us(50);
  59.                                         ZYSTM32_brake(100);
  60.                         }
  61.                 }
  62. }
复制代码

所有资料51hei提供下载:
小车基础部分+红外遥控+超声波避障测距显示.7z (205.01 KB, 下载次数: 126)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:793141 发表于 2020-9-19 14:58 | 只看该作者
为什么用红外遥控没有反应
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表