找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于Arduino UNO的智能自主避障小车和蓝牙遥控小车制作 代码与教程

[复制链接]
跳转到指定楼层
楼主
ID:1012298 发表于 2022-4-19 12:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Hello,大家好!今天我要给大家分享一下我近期制作的一个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的pin5向Input1输出
int Input2 = 5;                                      //定义uno的pin5向Input2输出
int Input3 = 6;                                      //定义uno的pin5向Input3输出
int Input4 = 7;                                      //定义uno的pin5向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()                                          //舵机左转
{undefined
   while(pos < 180)
    {undefined
      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.杜邦线若干

以上这些材料我制作时所用到,都是可以在某1个宝上买到的。当然对于小车底盘,有能力的朋友,可以自己设计建模一款小车底盘,然后通过3D打印机打印出来也是很好的。

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



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1020048 发表于 2022-4-21 15:27 来自手机 | 只看该作者
楼主,还在吗我那个蓝牙模块通过arduino的串口监视器发送就有回应。然后手机遥控就还是一点反应都没有。能看出这是什么问题?
回复

使用道具 举报

板凳
ID:1011222 发表于 2022-4-23 13:00 | 只看该作者
编译错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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