基于Arduino UNO的智能自主避障小车和蓝牙遥控小车

       Hello,大家好!今天我要给大家分享我近期制作的一个arduino小项目----智能避障小车。之前在某站上无意间刷到某位博主制作的一款智能避障小车,觉得很有意思,便打算自己也做一个来玩玩,于是便制作了一款我自己理解的避障小车。在此基础上,我还增加了蓝牙遥控,让二者可以相互切换,提高项目可玩性。当然,和其他避障小车类似,这款也是采用超声波来测距避障,代码相对其他大佬来说显得比较浅显易懂,对于刚接触Arduino的朋友非常友好。好了,废话不多说,直接看代码!!!

一、代码

/*********************************/                  //调取蓝牙模块库,调取伺服电机库
                                                                                                    
#include <SoftwareSerial.h>                          //调取库函数
#include <Servo.h>                                   //声明调用Servo.h库
SoftwareSerial BT(A0, A1);                           //新建对象,接收脚为A0--TXD,发送脚为A1--RXD
Servo servo;                                         //创建一个舵机对象

/*********************************/                  //定义驱动模块串口及变量

int TrigPin = 2;                                     //发出超声波
int EchoPin = 3;                                     //收到反射回来的超声波                                                                                                   
int Input1 = 4;                                      //定义uno的pin4向Input1输出
int Input2 = 5;                                      //定义uno的pin5向Input2输出
int Input3 = 6;                                      //定义uno的pin6向Input3输出
int Input4 = 7;                                      //定义uno的pin7向Input4输出
int pos = 118;                                       //创建变量,存储从模拟端口读取的值
float cm;                                            //因为测得的距离是浮点型的,单位为cm
int xuan;                                            
int choice;                                          //小车功能选择

/********************* ************/                 //控制函数部分

void stop()                                          //小车停止
{
   digitalWrite(Input1,LOW);                         //给低电平
   digitalWrite(Input2,LOW);                         //给低电平
   digitalWrite(Input3,LOW);                         //给低电平
   digitalWrite(Input4,LOW);                         //给低电平
   delay(50);  
}

void forward()                                       //小车前进
{
   digitalWrite(Input1,HIGH);                        //给高电平
   digitalWrite(Input2,LOW);                         //给低电平
   digitalWrite(Input3,HIGH);                        //给高电平
   digitalWrite(Input4,LOW);                         //给低电平
   delay(50);
}

void backward()                                      //小车后退
{
   digitalWrite(Input1,LOW);                         //给低电平
   digitalWrite(Input2,HIGH);                        //给高电平
   digitalWrite(Input3,LOW);                         //给低电平
   digitalWrite(Input4,HIGH);                        //给高电平
   delay(50);  
}

void turnleft()                                      //小车左转
{
   digitalWrite(Input1,HIGH);                        //给高电平
   digitalWrite(Input2,LOW);                         //给低电平
   digitalWrite(Input3,LOW);                         //给低电平
   digitalWrite(Input4,HIGH);                        //给高电平
   delay(50);  
}

void turnright()                                     //小车右转
{
   digitalWrite(Input1,LOW);                         //给低电平
   digitalWrite(Input2,HIGH);                        //给高电平
   digitalWrite(Input3,HIGH);                        //给高电平
   digitalWrite(Input4,LOW);                         //给低电平
   delay(50);
}

void Left()                                          //舵机左转
{
   while(pos < 180)
    {
      pos++;
      servo.write(pos);                              //写入舵机角度       
      delay(15);                                     //延时使舵机转到相应角度    
    }
}
 
void Right()                                         //舵机右转
{
   while(pos > 60)
    {
      pos--;
      servo.write(pos);                                 
      delay(15);                                        
    }
}
 
void Ranging()                                       //测量距离
{
   digitalWrite(TrigPin, LOW);                       //低电平发一个短时间脉冲去TrigPin 
   delayMicroseconds(2);                             //delayMicroseconds在更小的时间内延时准确,delayMicroseconds是毫秒级计时单位
   digitalWrite(TrigPin, HIGH);                      //通过这里控制超声波的发射
   delayMicroseconds(10);                            
   digitalWrite(TrigPin, LOW);                       //通过这里控制停止超声波的发射
   cm = pulseIn(EchoPin, HIGH) / 58.0;               //将回波时间换算成cm ,其中pulseIn(接收信号引脚,高低电平)函数用来接收反射回来的声波
   cm = (int(cm * 100.0)) / 100.0;                   //保留两位小数 
   Serial.print("Distance:"); 
   Serial.print(cm); 
   Serial.print("cm"); 
   Serial.println(); 
   //以上四句在串口监视器中输出
   delay(1000);
}

/****************************************************/

void setup()
{
   Serial.begin(9600);                               //与电脑串口相连,波特率为9600
   servo.attach(9);                                  //9号引脚输出舵机控制信号,仅能使用输出PWM信号的引脚
   pinMode(Input1, OUTPUT);                          //Input1引脚设置为输出模式
   pinMode(Input2, OUTPUT);                          //Input2引脚设置为输出模式
   pinMode(Input3, OUTPUT);                          //Input3引脚设置为输出模式
   pinMode(Input4, OUTPUT);                          //Input4引脚设置为输出模式
   pinMode(TrigPin, OUTPUT);                         //发出超声波串口设置为输出
   pinMode(EchoPin, INPUT);                          //接受超声波接口设为输入
   BT.begin(9600);                                   //设置波特率为9600
}

void loop()
{
  switch(choice)
    {
       case 'X' :                                    //选择避障
         Ranging();                                  //测量距离
         if(cm > 10.0)                               //没有碰到障碍物
           forward();
         else                                        //碰到障碍物
           {
             backward();                             //小车后退
             delay(200);                             //延时确定后退距离
             stop();                                 //小车停止
             Right();                                //舵机右转
             Ranging();                              //测量距离
             servo.write(118);                       //舵机回中
             if(cm > 10.0)                           //如果右边满足条件
               {
                 turnright();                        //小车右转
                 delay(200);                         //延时确定转弯角度
               }
             else                                    //如果右边不满足
               {
                 Left();                             //舵机左转
                 Ranging();                          //测量距离
                 servo.write(118);                   //舵机回中
                 turnleft();                         //小车左转
                 delay(200);                         //延时确定转弯角度
               }
           }
      case 'Y' :                                     //选择遥控
        while(BT.available())                        //蓝牙识别字符
          {
             xuan = BT.read();                       //蓝牙读取字符
             switch(xuan)
               {
                 case 'A' :                                
                   forward();                        //调取前进函数
                 case 'B' :                                 
                   backward();                       //调取后退函数  
                 case 'C' :                                
                   turnleft();                       //调取左转函数
                 case 'D' :                               
                   turnright();                      //调取右转函数   
                 case 'E' :                                
                   stop();                           //调取停止函数
               }
          }   
    }
}

代码看起来是不是很通俗易懂呢!!!

接下来给你们介绍我理解的手机蓝牙通讯和电脑串口通讯:

手机:BT.begin(9600); 

电脑:Serial.begin(9600);

括号里是波特率。二者更深层次的含义由于学术不精,无法给出具体解释,但经过实际测试是正确的。

        代码中涉及的伺服电机角度,是根据我购买的伺服电机结合制作时的需要所测量和设定的角度,只具有参考性。各位可以根据自己购买的伺服电机来进行修改。

void Left()                               //舵机左转
{
   while(pos < 180)
    {
      pos++;
      servo.write(pos);      //写入舵机角度  
      delay(15);//延时使舵机转到相应度        }
}

        该部分控制舵机转动采用while循环来实现,主要是使舵机逐角度的变化,也可以直接使用

servo.write(pos);

写入需要的角度,但会使的舵机转动到所设定角度的时间很短,可能会对舵机造成伤害(个人观点)。

二、所需材料

1.Arduino UNO开发板

2.HC-SR04超声波模块

3.HC-06蓝牙模块

4.L298N电机驱动板模块

5.智能小车底盘

6.18650充电电池及电池仓

7.杜邦线若干

        以上这些材料是我制作时用到的,均可在淘宝上购买到。对于小车框架,可以直接在网上购买或者自己制作。有能力的朋友,可以自己设计建模一款小车框架,然后通过3D打印实现。

         当然,小车并不只限于轮式结构,履带式小车相较轮式适应路况的性能更优秀,是不错的选择哦。

         手机端蓝牙遥控器用的是‘手机蓝牙调试器’,在应用商店里就可以下载到。相对应的A,B,C,D,E,X,Y在按键操作里编辑即可。

  • 16
    点赞
  • 183
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值