打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
从菜鸟到完美掌控arduino蓝牙小车
本帖最后由 血阳 于 2015-8-21 14:29 编辑

在写这篇帖子之前,先感谢前段时间,在论坛里,为我耐心解答的大神朋友们,无论我问出什么奇葩的问题,都能为我耐心解答,真心感谢你们。
先上视频吧,虽然拍的不是很好;

小车照片:










基础篇
首先,我们先来看看我们需要的哪些工具:
1、        arduino控制板  x1
2、        L298N电机驱动模块 x1
3、        Arduino Bluetooth Bee蓝牙模块 x1
4、        Arduino Bluetooth蓝牙扩展板 x1
5、        小车底盘 x1
6、        电源(7~9V)x1
7、        导线 若干

说明:
1、我的教程是二轮驱动的,所以用L298N电机驱动模块,这个模块简单易懂,要做二轮的话,推荐这个模块。
2、蓝牙模块选用这个,比较方便,直接把蓝牙插到扩展板,再把扩展板插到arduino控制板上,连上蓝牙就可以直接用了。
3、电源,选择7~9V才能更好的驱动两个电机,我没买电源,就将就着用我的移动电源的高输出接口(就是充平板的那个口)给供电了。






接下来,我们先介绍一下这个L298N电机驱动板模块吧,它直接影响到我们后面的编程。

      相关接口,已经标注好在图中了。电机接口,就是接电机引出两条线的地方,如果发现电机转动方向相反了,可以把两条线互换一下方向。就ok了。
      L298N  GND 接   arduino GND;
      L298N  VCC 外接另一个电源;
      arduino自己也接一个电源。
      L298N  5V   这里可以不用接   arduino 5V了;
       接着说与程序相关的6个脚。首先说ENA和ENB吧,他们分别是控制电机1和电机2的速度的,即是控制PWM的,如果你不想改变这个电机转速的话,就不用动了,它短路帽子不要动就行,如果你要改变速度,就可以把那个小帽子去掉,然后引出来接在arduino的模拟引脚上输出PWM信号。
至于In1~In4,前面的In1和In2是控制电机1的,In3和In4是控制电机2的。好了,这里有张表,通过表格,你就可以清楚的知道他们的机理了。(这个是对于电机1的,电机2同理)




      最后,我们来简单讲蓝牙的连接吧,很简单,供电好以后,我们用手机连上蓝牙后,配对,密码一般是“1234”或者“0000”,输入好密码,就配对成功了。
        Ok,现在讲完该讲的部分,我们就该开始制作我们期待已久的蓝牙小车了~
        还有一点要说的是,先制作不带控制速度的,这样写程序比较简单。



第1步:简单地运行电机
        首先,来看看连线吧,我决定,用arduino的4、5、6、7引脚来控制我的小车。4、5控制左轮。6、7控制右轮。
        所以驱动模块的In1接arduino的4引脚,In2接5引脚,然后电机的两条线分别接驱动模块中电机1的OUT1和OUT2;“供电正极”接5V引脚,“接地”接 GND。       
        根据上面给出的表格,我们先来简单地设计一个程序,来实现:左轮正转2s,停止2s,反转2s,停止2s。循环。

代码如下:
/*****************************************
二轮蓝牙小车——左轮测试
运动过程:左轮正转2s,停止2s,反转2s,停止2s。循环
占用4、5引脚
2015.05.01
   ——by 极客工坊  血阳
   ——王小丰
*****************************************/
#define IN1 4 
#define IN2 5     //定义In1接arduino的4引脚,In2接5引脚
void setup()
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
}
void loop()
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  delay(2000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  delay(2000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);         //左轮后退
  delay(2000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  delay(2000);
}


连好线,我们下载好程序,就试试吧。实验结果很成功,果然按照预想的运动了。
注意,运行时候按下复位键开始检测。假如这个运动方向与你所设的程序方向不同,那么,你可以把电机中的OUT1的线和OUT2的线互换一下就行了。(不按复位键你不知道你的程序开始是从正转开始还是反转开始)
接着,我们以同理来驱动一下右轮试试,同理驱动模块的In3接arduino的6引脚,In4接7引脚,然后电机的两条线分别接驱动模块中电机2的OUT3和OUT4。运动过程:右轮正转2s,停止2s,反转2s,停止2s。循环。

/*****************************************
二轮蓝牙小车——右轮测试
运动过程:右轮正转2s,停止2s,反转2s,停止2s。循环
占用4、5引脚
2015.05.01
   ——by 极客工坊  血阳
   ——王小丰
*****************************************/
#define IN3 6 
#define IN4 7     //定义IN3接arduino的6引脚,IN4接7引脚
void setup()
{
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
}
void loop()
{
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
  delay(2000);
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  delay(2000);
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);         //右轮后退
  delay(2000);
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  delay(2000);
}

      这里我发现了,我连线运行与我设定的方向相反,于是我把电机的两条线在OUT那里互换,然后就ok了。

第二步:小车的简单运动
        接着。最基本的弄完以后,我们来分析一下小车的运动方式,就可以编写程序让小车运动了。
下面是小车运动方式:



     有了这个,我们进行编程的时候,就简单多了。
     下面,我们来写写简单的前进2s然后停止1s,接着后退2s停止3s的程序吧。


/*****************************************
二轮蓝牙小车
运动过程:前进2s,停止1s,接着后退2s停止3s
占用4、5引脚
2015.05.01
   ——by 极客工坊  血阳
   ——王小丰
*****************************************/
#define IN1 4 
#define IN2 5     //定义In1接arduino的4引脚,In2接5引脚
#define IN3 6 
#define IN4 7     //定义IN3接arduino的6引脚,IN4接7引脚
void setup()
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);

}
void loop()
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
  delay(2000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  delay(1000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);        //右轮后退
  delay(2000);
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
  delay(3000);
}

下载程序。供电,实验结果如预料一样,很成功

第三步:函数的编写
      考虑到,假如把说有程序都写在loop循环里,会很复杂,所以,我们以函数形式,写下每个运动状态,然后再进行函数调用的话,程序会显得比较简单。如果这步你看前几个就懂了,就可以跳到第四步去了。
      下面,我们开始编写这些运动状态的程序:


/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}



/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);        //右轮后退
}



/**************************************************
turnLeft子函数——左转子函数
函数功能:控制车左转

**************************************************/
void turnLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnbackLeft子函数——左后转弯子函数
函数功能:控制车左后转弯

**************************************************/
void turnbackLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);         //右轮后退
}

/**************************************************
turnRight子函数——右后转弯转子函数
函数功能:控制车右后转弯

**************************************************/
void turnRight( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}


/**************************************************
turnbackRight子函数——右转子函数
函数功能:控制车右转

**************************************************/
void turnbackRight( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);         //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}


/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转

**************************************************/
void turnLeftOrigin( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转

**************************************************/
void turnRightOrigin( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);        //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);       //右轮后退
}



/**************************************************
stop子函数—停止子函数
函数功能:控制车停止

**************************************************/
void _stop()
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}




第四步:函数的运用
       麻烦的函数编写完以后,我们就可以尝试着兴高采烈地运用他们吧。
        我们来写一段程序来,简单地控制小车让小车运动:前进2s—后退2s—前左转2s—后左转2s—前右转2s—后右转2s—原地左转2s—原地右转2s—停止3s。
        看起来运动好复杂,其实有了上面的函数以后,我们编写起来级很简单了,注意的是,在调用函数之前,我们要先在前面声明好函数哦。
       
下面是我们的控制程序:
/*****************************************
二轮蓝牙小车
运动过程:利用函数:前进2s—后退2s—前左转2s—后左转2s
—前右转2s—后右转2s—原地左转2s—原地右转2s—停止3s。
2015.05.01
   ——by 极客工坊  血阳
   ——王小丰
*****************************************/
#define IN1 4 
#define IN2 5     //定义In1接arduino的4引脚,In2接5引脚
#define IN3 6 
#define IN4 7     //定义IN3接arduino的6引脚,IN4接7引脚

void forward( );
void back( );
void turnLeft( );
void turnRight( );
void turnbackLeft( );
void turnbackRight( );
void turnLeftOrigin( );
void turnRightOrigin( );
void _stop();          //这里是把我们用到的函数都声明一遍

void setup()
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
}

void loop()
{
    forward( );
    delay(2000);
    back( );
    delay(2000);
    turnLeft( );
    delay(2000);
    turnbackLeft( );
    delay(2000);
    turnRight( );
    delay(2000);
    turnbackRight( );
    delay(2000);
    turnLeftOrigin( );
    delay(2000);
    turnRightOrigin( );
    delay(2000);
    _stop();
    delay(3000);   
}



/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);        //右轮后退
}

/**************************************************
turnLeft子函数——左转子函数
函数功能:控制车左转
**************************************************/
void turnLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnbackLeft子函数——左后转弯子函数
函数功能:控制车左后转弯
**************************************************/
void turnbackLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);         //右轮后退
}

/**************************************************
turnRight子函数——右后转弯转子函数
函数功能:控制车右后转弯
**************************************************/
void turnRight( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}

/**************************************************
turnbackRight子函数——右转子函数
函数功能:控制车右转
**************************************************/
void turnbackRight( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);         //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}


/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);        //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);       //右轮后退
}



/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}

这样,我们就很成功地驱动了小车,做了简单的运动啦~

第五步:蓝牙模块的功能检测
       这一步就是我们的关键了,连接好蓝牙,那么我们就能通过蓝牙来很好的控制小车,如果蓝牙部分没做好,那么我们前面的辛苦就白费啦~好啦,话不多说,我们开始吧。
       首先我们要知道怎么让arduino接收命令,他用的是Serial.read()语句来实现的,具体我就不多讲了,在论坛里关于这一块的多的是,大家去找找就能找到的。
       其次注意的是这个命令的接受和发送,都会转化为ASCII码,所以在接收的时候,我们的命令以ASCII码来判断,或者用单引号来 帮助我们接收。例如:手机端如果发送了“1“,那么我们这边接收到的是1的ASCII码,所以我们在判断是接收几的时候,我们要用case‘1’或者case49来判断(注:1的ASCII码是49)。
       电脑的发送很简单,就是打开“工具“中的”串口监视器“。就可以发送命令了,蓝牙的话,只要连接成功,通过小软件也可以发送啦。
       Ok,下面我们来一个简简单单的例子来练习发送和接收命令,然后再尝试用蓝牙来无线发送和接收。
小实验:当接收到1这个数字的时候,arduino的13号灯就亮起。收到2这个数的时候,就灭。(这里13号灯就是我们板子上的L灯,观察它就行。)
       我们首先先通过数据线连接电脑,让电脑通过串口监视器来给板子发送命令,看看是否达到我们要求。如果达到要求了,再把数据线退掉,加上蓝牙模块,通过手机连接好蓝牙以后,设置好参数,再给板子发送命令,来证明我们蓝牙能够正常工作。为我们后面的蓝牙控小车检测好蓝牙。

注意:在下载程序的时候,不要连接蓝牙设备,否则会下载失败。
代码:
void setup()
{
  pinMode(13,OUTPUT);
  Serial.begin(9600);
}
int i;
void loop()
{
  if(Serial.available()>0)
  {
      i=Serial.read();
      switch(i)
      {
        case'1':
            {digitalWrite(13,HIGH);break;}
        case'2':
            {digitalWrite(13,LOW);break;}
      }
  }
}



终结篇:期待已久的激动人心的蓝牙操控小车车
       我这里用的是九键控制小车,前后分别是2、8。1379是前后左右转,46是原地左右转。
到了这里,我觉得已经不用说了,上程序,然后你就懂了。

/*****************************************
二轮蓝牙小车
2015.05.01
   ——by 极客工坊  血阳
   ——王小丰
*****************************************/
#define IN1 4 
#define IN2 5     //定义In1接arduino的4引脚,In2接5引脚
#define IN3 6 
#define IN4 7     //定义IN3接arduino的6引脚,IN4接7引脚

void forward( );
void back( );
void turnLeft( );
void turnRight( );
void turnbackLeft( );
void turnbackRight( );
void turnLeftOrigin( );
void turnRightOrigin( );
void _stop();          //这里是把我们用到的函数都声明一遍

void setup()
{
  pinMode(IN1,OUTPUT);
  pinMode(IN2,OUTPUT);
  pinMode(IN3,OUTPUT);
  pinMode(IN4,OUTPUT);
  Serial.begin(9600);
}
int i;
void loop()
{
    if(Serial.available())
    {
      i=Serial.read();
      
      switch(i)
      {
        case'1':
          {turnLeft( );  break; }
        case'2':
          {forward( );   break;}
        case'3':
          {turnRight( );   break;}
        case'4':
          {turnLeftOrigin( );   break;}
        case'5':
          {_stop();   break;}
        case'6':
          {turnRightOrigin( );   break;}
        case'7':
          {turnbackLeft( );   break;}
        case'8':
          {back( );   break;}
        case'9':
          {turnbackRight( );   break;}
      }
    }    
}




/**************************************************
forward子函数——前进子函数
函数功能:控制车前进
**************************************************/
void forward( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
back子函数——后退子函数
函数功能:控制车后退
**************************************************/
void back( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);        //右轮后退
}

/**************************************************
turnLeft子函数——左转子函数
函数功能:控制车左转
**************************************************/
void turnLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnbackLeft子函数——左后转弯子函数
函数功能:控制车左后转弯
**************************************************/
void turnbackLeft( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);         //右轮后退
}

/**************************************************
turnRight子函数——右后转弯转子函数
函数功能:控制车右后转弯
**************************************************/
void turnRight( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);         //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}

/**************************************************
turnbackRight子函数——右转子函数
函数功能:控制车右转
**************************************************/
void turnbackRight( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);         //左轮后退
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}


/**************************************************
turnLeftOrigin子函数——原地左转子函数
函数功能:控制车原地左转
**************************************************/
void turnLeftOrigin( )
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,HIGH);        //左轮后退
  digitalWrite(IN3,HIGH);      
  digitalWrite(IN4,LOW);         //右轮前进
}


/**************************************************
turnRightOrigin子函数——原地右转子函数
函数功能:控制车原地右转
**************************************************/
void turnRightOrigin( )
{
  digitalWrite(IN1,HIGH);      
  digitalWrite(IN2,LOW);        //左轮前进
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,HIGH);       //右轮后退
}



/**************************************************
stop子函数—停止子函数
函数功能:控制车停止
**************************************************/
void _stop()
{
  digitalWrite(IN1,LOW);      
  digitalWrite(IN2,LOW);         //左轮静止不动
  digitalWrite(IN3,LOW);      
  digitalWrite(IN4,LOW);         //右轮静止不动
}




ok到这里就结束了,当然,如果你想加入控制速度的代码,也可以,就是在每个函数里面加入ENA和ENB的部分,然后让他们接模拟引脚,再让函数有个形参,就差不多了,看完这个之后,加上速度,应该很简单的~~~最后,祝你好运,早日让自己的小车跑起来哦~~


最后,若想要控制小车速度的话,这里有一个简单的例子,根据例子,稍微改一下程序,就可以轻松控制速度了。
http://www.geek-workshop.com/for ... 14831&pid=98199


下面是附带的整个,教程pdf  和 手机蓝牙串口。想下载的话可以在这下载哦~
教程PDF:
我的arduino教程.pdf(749.25 KB)
(下载次数: 364, 2015-5-1 23:49 上传)

手机蓝牙串口app:
蓝牙串口助手 v1.97.rar(51.53 KB)
(下载次数: 344, 2015-5-2 00:01 上传)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Arduino在中断函数里面怎么延时
使用arduino直接驱动1602液晶显示文字
基础教程2 Arduino 让多个LED 炫酷地闪
【Arduino学习笔记】蓝牙控制手自两用避障车
Arduino小车
Arduino教程 Lesson 3:做一个S.O.S求救信号灯
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服