ITEAD创易工作室 发表于 2014-7-7 18:06:02

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

本帖最后由 ITEAD创易工作室 于 2015-2-2 17:41 编辑

http://player.youku.com/player.php/sid/XODg0NzczMjAw/v.swf
很高兴又跟大家见面了,今天教小伙伴们轻松做一个蓝牙遥控小车。

首先给大家介绍今天要使用到的主板:一个mega32u4带两路直流电机驱动的整合开发板:Mboard。




MBoard是一款基于ATMega32U4(Leonardo)芯片的带电机驱动功能的Arduino整合板。使用的是L298P电机驱动芯片,可以驱动两路直流电机或者1个步进电机。另外还配备了Bee插座、2.4G模块接口和SD卡槽,还把ATMega32U4的I/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

引脚图:



详细原理图和手册回复即可下载。

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





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

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






接下来先把电机引线接好,再把mboard板子用铜柱固定在小车上,连接电机。如下图:



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

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

//命名字符串和对应的ACII值
#define _US 0x5553
#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;

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=readbuf;
                number++;
               
                if(readbuf==0x3B) //此处是结束符,3B对应的ACII值是分号
                {      
                        if(number==3)
                        {
                              value = (r_buffer<<8) | (r_buffer);
                        }
                        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模块,接上电源,硬件完成实物图:






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

好消息:ITEAD自家的蓝牙小车遥控APP已经上线了!很多小伙伴问我用的蓝牙app是哪个?在哪里下载?现在不用烦恼了!ITEAD已经设计了自己专属的APP,目前只支持安卓系统屏幕4寸-7寸屏幕的手机或者平板(7寸的话界面排版可能会有空隙,不过不影响使用)。先上视频和照片! 使用方法:安装完成后,点击Set up 按键,可以看到软件默认设置好的按键指令,如下图: 不过我们现在的小车代码已经修改过了,所以这里面的设置也要改一下先。修改设置后如图: 输入完成后点击返回即可自动保存设置。可能在输入的时候过程会有点繁琐,给点耐心!说明一下:UL;是UP+LEFT(左上),US;是UP+STRAIGHT(直行),D是DRAW BACK(后退)依次类推。重点是SS;这个指令是让小车停止(Stopstop),我们把它设置为on和off。其他ABCD按键暂时没有使用到,可以自行开发用途。 返回主界面后,点击手机菜单键可以打开搜索链接按键,如图: 搜索到itead设备,首次连接需要输入pin码:1234
连接配对成功后就可以用手机遥控Mboard蓝牙小车了!
最后一个说明:很多小伙伴反应配对上后发指令小车不会动,这是因为供电不足的原因。请一定从设配器口供9V-24V的电源,小车上的4节电池槽可以用来给主板供电,不过如果用9V以上的充电池的话就不需要用电池槽了。本教程使用的是3节18650充电锂电池,电压12V。
APP下载地址:百度云盘http://pan.baidu.com/s/1mgqUFgc
按下刚设置好的按键,看小车是不是动起来了?

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





ITEAD创易工作室 发表于 2014-7-8 14:14:08

本帖最后由 ITEAD创易工作室 于 2014-8-30 10:35 编辑

MBoard手册和原理图下载地址:http://pan.baidu.com/s/1gdei5rH

新增【教程】DIY摇杆控制MBoard蓝牙小车:http://www.geek-workshop.com/thread-10868-1-1.html

黎昕 发表于 2014-8-30 11:20:25

蓝牙不需要初始化以及基本设置(波特率、名称等)的么?还有就是如果需要手机端和arduino之间的互相通信又该如何实现呢?

ITEAD创易工作室 发表于 2014-9-1 09:28:08

黎昕 发表于 2014-8-30 11:20 static/image/common/back.gif
蓝牙不需要初始化以及基本设置(波特率、名称等)的么?还有就是如果需要手机端和arduino之间的互相通信又该 ...

Serial1.begin(9600);
http://image.geek-workshop.com/forum/201407/07/180026c5h44esbot1c4g4d.png
如果需要配对密码的话输入:0000或者1234

黎昕 发表于 2014-9-2 10:23:11

ITEAD创易工作室 发表于 2014-9-1 09:28 static/image/common/back.gif
Serial1.begin(9600);

如果需要配对密码的话输入:0000或者1234

嗯已搞明白!谢谢!

无名小子 发表于 2014-9-17 20:57:20

对于我这种初学者来说,还不能理解长长的代码中的一些字符的含义!
想问一问Serial1 begin(9600),是不是设置与蓝牙模块的通讯频率??
为什么编译会出错,说的是没有被声明!(并未直接复制楼主的代码,是自己写的简单代码!)

ITEAD创易工作室 发表于 2014-9-19 14:35:12

无名小子 发表于 2014-9-17 20:57 static/image/common/back.gif
对于我这种初学者来说,还不能理解长长的代码中的一些字符的含义!
想问一问Serial1 begin(9600),是不是设 ...

因为这个mboard的芯片是leonardo,有两个串口的,因为不想烧代码的时候老是拔插蓝牙bee,所以用的是Serial1串口跟蓝牙通信,对烧写代码没有影响。如果你是用UNO,只有一个串口,就要先烧写代码再插上蓝牙串口模块,UNO只有Serial,没有Serial1、2、3什么的。

无名小子 发表于 2014-9-20 21:15:20

ITEAD创易工作室 发表于 2014-9-19 14:35 static/image/common/back.gif
因为这个mboard的芯片是leonardo,有两个串口的,因为不想烧代码的时候老是拔插蓝牙bee,所以用的是Seria ...

偶,谢谢!我的板子的确只用serial就可以了!!

追梦forever 发表于 2014-9-21 19:03:05

请问楼主“蓝牙串口通信助手”的app在哪下载呢?

ITEAD创易工作室 发表于 2014-9-22 09:17:33

追梦forever 发表于 2014-9-21 19:03 static/image/common/back.gif
请问楼主“蓝牙串口通信助手”的app在哪下载呢?

我也是在安智市场下载的。不一定要这个APP,很多类似的蓝牙串口助手、串口调试软件都可以。

cyriliii 发表于 2014-9-29 09:30:50

正好要做一个手机蓝牙的东东,收下了

宇神 发表于 2014-10-6 18:34:21

请问,手机连接上蓝牙之后的那个软件界面是怎么弄得?是自己编的软件么?

ITEAD创易工作室 发表于 2014-10-7 10:05:59

宇神 发表于 2014-10-6 18:34 static/image/common/back.gif
请问,手机连接上蓝牙之后的那个软件界面是怎么弄得?是自己编的软件么?

:L 安智市场随便下载一个蓝牙串口助手APP就可以了

rader 发表于 2014-10-21 06:48:54

学习,需要,谢谢

grrgehtj 发表于 2014-10-26 22:09:37

没法烧写程序,这是怎么回事?
页: [1] 2
查看完整版本: 【简单教程】手机蓝牙遥控arduino mboard小车