加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【简单教程】手机蓝牙遥控arduino mboard小车

(2014-07-07 16:01:44)
标签:

arduino

itead

蓝牙小车

手机蓝牙遥控

mboard

分类: Iteaduino学习笔记
很高兴又跟大家见面了,今天教小伙伴们轻松做一个蓝牙遥控小车。

首先给大家介绍今天要使用到的主板:ITEADUINO Mboard

http://s11/mw690/003bqY9ggy6Kgdr1qaufa&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />
MBoard是一款基于ATMega32U4Leonardo)芯片的带电机驱动功能的Arduino整合板。使用的是L298P电机驱动芯片,可以驱动两路直流电机或者1个步进电机。另外还配备了Bee插座、2.4G模块接口和SD卡槽,还把ATMega32U4I/O口引出为电子积木接口,方便连接各种传感器模块。非常适合智能小车、智能机器人的开发应用。


产品特性:
板子大小:  80.77mm X 57.66mm X 1.6mm
供电电压:  7~23V DC
主控芯片:  Atmega32u4
指示灯:    PWR, Tx, Rx, D13, C1, C2,C3, C4
通信接口:  XBee,nRF24L01+,UART,IIC
I/O电压:   3-3.6V DC
I/O电流:   100-500mA
电机每路电流:最大3A


引脚图:
http://s14/mw690/003bqY9ggy6KgdqKyqF8d&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

详细原理图和手册下载:http://pan.baidu.com/s/1c0ncd2o

在大致认识这个板子后,我们现在就用它来做一个手机蓝牙控制的小车。所需配件如下:


http://s2/mw690/003bqY9ggy6Kgdq0rBL91&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

第一步,先把小车组装好。我想各位小伙伴们都有自己心爱的小车模型了吧?

我们以亚克力小车为例,安装很简单,两个后轮,一个万向轮。

http://s8/mw690/003bqY9ggy6Kgdq8cPJ77&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

http://s13/mw690/003bqY9ggy6Kgdqbkcsfc&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />
接下来先把电机引线接好,再把mboard板子用铜柱固定在小车上,连接电机。如下图:

http://s5/mw690/003bqY9ggy6KgdqeDGc64&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

现在就可以烧写程序了,使用一根mini接口的USB数据线连接电脑和mboard驱动安装就不介绍了,跟arduinounoLeonardo一样。mboard烧写的时候”board类型选择leonardo”

以下是代码,很简单,不需要库,蓝牙模块收到对应的信号就执行对应的命令。

#define _US 0x5553 //命名字符串和对应的ACII

#define _DS 0x4453

#define _LS 0x4C53

#define _RS 0x5253

#define _UL 0x554C

#define _DL 0x444C

#define _UR 0x5552

#define _DR 0x4452

#define _SS 0x5353

 

#define ENA 10

#define ENB 11

#define IN1 7

#define IN2 8

#define IN3 12

#define IN4 13

 

#define LOWSPEED 100 //前后左右时候的速度,可以调为其他值

#define HIGHSPEED 255 //转弯的时候的速度,可以调为其他值

 

#define IN1_HIGH  PORTE |=0x40

#define IN1_LOW      PORTE &=~0x40

#define IN2_HIGH  PORTB |=0x10

#define IN2_LOW      PORTB &=~0x10

#define IN3_HIGH  PORTD |=0x40

#define IN3_LOW      PORTD &=~0x40

#define IN4_HIGH  PORTC |=0x80

#define IN4_LOW      PORTC &=~0x80

#define ENA_HIGH  PORTB |=0x40

#define ENA_LOW      PORTB &=~0x40

#define ENB_HIGH  PORTB |=0x80

#define ENB_LOW      PORTB &=~0x80

 

uint16_t value;

 

uint8_t r_buffer[4];

 

uint8_t number;

uint8_t command;

 

 

void setup(){

    pinMode(ENA,OUTPUT);

    pinMode(ENB,OUTPUT);

    pinMode(IN1,OUTPUT);

    pinMode(IN2,OUTPUT);

    pinMode(IN3,OUTPUT);

    pinMode(IN4,OUTPUT);

    //ENA_HIGH;  

    //ENB_HIGH

 

   

       run(0);

 

 

Serial1.begin(9600);

 

}

 

void loop(){

 

    if(Serial1.available())

    {

       uint8_t readbuf = Serial1.read();

       r_buffer[number]=readbuf;

       number++;

      

       if(readbuf==0x3B) //此处是结束符,3B对应的ACII值是分号

       

           if(number==3)

           {

              value = (r_buffer[0]<<8) | (r_buffer[1]);

           }

           number=0;

           command=1;

 

       }

   

 

   

    }

 

 

 

    if(command)

    {

       command=0;

       switch(value)

       {

           case _SS:  run(0);break; //对应9个运动方向

           case _US:  run(1);break;

           case _DS:  run(2);break;

           case _LS:  run(3);break;

           case _RS:  run(4);break;

           case _UL:  run(5);break;

           case _UR:  run(6);break;

           case _DL:  run(7);break;

           case _DR:  run(8);break;

 

      

       }

   

   

    }

 

 

 

 

 

}

 

 

 

void forward()

{

    ENA_HIGH;

    ENB_HIGH;

    IN1_HIGH;

    IN2_LOW;

    IN3_HIGH;

    IN4_LOW;

}

 

void backward()

{

    ENA_HIGH;

    ENB_HIGH;

    IN1_LOW;

    IN2_HIGH;

    IN3_LOW;

    IN4_HIGH;

}

 

void turnleft()

{

    ENA_HIGH;

    ENB_HIGH;

    IN1_LOW;

    IN2_LOW;

    IN3_HIGH;

    IN4_LOW;

}

 

void turnright()

{

    ENA_HIGH;

    ENB_HIGH;

    IN1_HIGH;

    IN2_LOW;

    IN3_LOW;

    IN4_LOW;

}

 

void stopcar()

{

    ENA_LOW;

    ENB_LOW;

    IN1_LOW;

    IN2_LOW;

    IN3_LOW;

    IN4_LOW;

}

 

void run(int direct)

{

    switch(direct)

    {

       case 0:

              IN1_LOW;

              IN2_LOW;

              IN3_LOW;

              IN4_LOW;

              analogWrite(ENA,0);

              analogWrite(ENB,0);

              break;

       case 1:

              IN1_HIGH;

              IN2_LOW;

              IN3_HIGH;

              IN4_LOW;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,LOWSPEED);

              break;

       case 2:

              IN1_LOW;

              IN2_HIGH;

              IN3_LOW;

              IN4_HIGH;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,LOWSPEED);

              break;    

       case 3:

              IN1_LOW;

              IN2_LOW;

              IN3_HIGH;

              IN4_LOW;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,LOWSPEED);

              break;    

       case 4:

              IN1_HIGH;

              IN2_LOW;

              IN3_LOW;

              IN4_LOW;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,LOWSPEED);

              break;

       case 5:

              IN1_HIGH;

              IN2_LOW;

              IN3_HIGH;

              IN4_LOW;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,HIGHSPEED);

              break;

       case 6:

              IN1_HIGH;

              IN2_LOW;

              IN3_HIGH;

              IN4_LOW;

              analogWrite(ENA,HIGHSPEED);

              analogWrite(ENB,LOWSPEED);

              break;    

       case 7:

              IN1_LOW;

              IN2_HIGH;

              IN3_LOW;

              IN4_HIGH;

              analogWrite(ENA,LOWSPEED);

              analogWrite(ENB,HIGHSPEED);

              break;    

       case 8:

              IN1_LOW;

              IN2_HIGH;

              IN3_LOW;

              IN4_HIGH;

              analogWrite(ENA,HIGHSPEED);

              analogWrite(ENB,LOWSPEED);

              break;    

   

    }

 

}

在arduino IDE编译上传完成后,插上蓝牙bee模块,接上电源,硬件完成实物图:

http://s13/mw690/003bqY9ggy6KgdqwRu41c&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

http://s4/mw690/003bqY9ggy6KgdqAkAbf3&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

http://s4/mw690/003bqY9ggy6KgdqFqMze3&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" /> 

此时,蓝牙指示灯不停闪烁,处于等待配对状态。

好消息:ITEAD自家的蓝牙小车遥控APP已经上线了!

现在不用烦恼了!ITEAD已经设计了自己专属的APP,目前只支持安卓系统屏幕4-7寸屏幕的手机或者平板(7寸的话界面排版可能会有空隙,不过不影响使用)

先上视频和照片!

 

 http://s4/mw690/003bqY9ggy6PESDPOdta3&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

使用方法:

安装完成后,点击Set up 按键,可以看到软件默认设置好的按键指令,如下图:

 http://s13/mw690/003bqY9ggy6PESFh5Rabc&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

 不过我们现在的小车代码已经修改过了,所以这里面的设置也要改一下先。修改设置后如图:

 http://s3/mw690/003bqY9ggy6PESFj7oKd2&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

输入完成后点击返回即可自动保存设置。可能在输入的时候过程会有点繁琐,给点耐心!

说明一下:UL;UP+LEFT(左上),US;UP+STRAIGHT(直行),DDRAW BACK(后退)依次类推。重点是SS;这个指令是让小车停止(Stopstop),我们把它设置为onoff。其他ABCD按键暂时没有使用到,可以自行开发用途。

 

返回主界面后,点击手机菜单键可以打开搜索链接按键,如图:

 http://s5/mw690/003bqY9ggy6PESFeAte84&690mboard小车" TITLE="【简单教程】手机蓝牙遥控arduino mboard小车" />

搜索到itead设备,首次连接需要输入pin码:1234

连接配对成功后就可以用手机遥控Mboard蓝牙小车了!

最后一个说明:很多小伙伴反应配对上后发指令小车不会动,这是因为供电不足的原因。请一定从设配器口供9V-24V的电源,小车上的4节电池槽可以用来给主板供电,不过如果用9V以上的充电池的话就不需要用电池槽了。本教程使用的是318650充电锂电池,电压12V

APP下载地址:百度云盘http://pan.baidu.com/s/1jGwyzvK


按下刚设置好的按键,看小车是不是动起来了?

PS:如果小车原地打转,就是电机+ -接反了。如果跟设置的控制方向相反,可以重新设置键盘,左右命令反过来即可。

淘宝地址:http://itead.taobao.com/

技术讨论QQ群:272420347

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有