41回答

0收藏

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

 

#其他 #其他 21513 人阅读 | 41 人回复 | 2014-07-07

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

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

首先给大家介绍今天要使用到的主板:一个mega32u4带两路直流电机驱动的整合开发板: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

引脚图:


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

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




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

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



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


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

以下是代码,很简单,不需要库,蓝牙模块收到对应的信号就执行对应的命令。
  1. #define _US 0x5553 //命名字符串和对应的ACII值
  2. #define _DS 0x4453
  3. #define _LS 0x4C53
  4. #define _RS 0x5253
  5. #define _UL 0x554C
  6. #define _DL 0x444C
  7. #define _UR 0x5552
  8. #define _DR 0x4452
  9. #define _SS 0x5353

  10. #define ENA 10
  11. #define ENB 11
  12. #define IN1 7
  13. #define IN2 8
  14. #define IN3 12
  15. #define IN4 13

  16. #define LOWSPEED 100 //前后左右时候的速度,可以调为其他值
  17. #define HIGHSPEED 255 //转弯的时候的速度,可以调为其他值

  18. #define IN1_HIGH        PORTE |=0x40
  19. #define IN1_LOW                PORTE &=~0x40
  20. #define IN2_HIGH        PORTB |=0x10
  21. #define IN2_LOW                PORTB &=~0x10
  22. #define IN3_HIGH        PORTD |=0x40
  23. #define IN3_LOW                PORTD &=~0x40
  24. #define IN4_HIGH        PORTC |=0x80
  25. #define IN4_LOW                PORTC &=~0x80
  26. #define ENA_HIGH        PORTB |=0x40
  27. #define ENA_LOW                PORTB &=~0x40
  28. #define ENB_HIGH        PORTB |=0x80
  29. #define ENB_LOW                PORTB &=~0x80

  30. uint16_t value;

  31. uint8_t r_buffer[4];

  32. uint8_t number;
  33. uint8_t command;


  34. void setup(){
  35.         pinMode(ENA,OUTPUT);
  36.         pinMode(ENB,OUTPUT);
  37.         pinMode(IN1,OUTPUT);
  38.         pinMode(IN2,OUTPUT);
  39.         pinMode(IN3,OUTPUT);
  40.         pinMode(IN4,OUTPUT);
  41.         //ENA_HIGH;   
  42.         //ENB_HIGH

  43.         
  44.        run(0);


  45. Serial1.begin(9600);

  46. }

  47. void loop(){

  48.         if(Serial1.available())
  49.         {
  50.                 uint8_t readbuf = Serial1.read();
  51.                 r_buffer[number]=readbuf;
  52.                 number++;
  53.                
  54.                 if(readbuf==0x3B) //此处是结束符,3B对应的ACII值是分号
  55.                 {        
  56.                         if(number==3)
  57.                         {
  58.                                 value = (r_buffer[0]<<8) | (r_buffer[1]);
  59.                         }
  60.                         number=0;
  61.                         command=1;

  62.                 }
  63.         

  64.         
  65.         }



  66.         if(command)
  67.         {
  68.                 command=0;
  69.                 switch(value)
  70.                 {
  71.                           case _SS:        run(0);break; //对应9个运动方向
  72.                         case _US:        run(1);break;
  73.                         case _DS:        run(2);break;
  74.                         case _LS:        run(3);break;
  75.                         case _RS:        run(4);break;
  76.                         case _UL:        run(5);break;
  77.                         case _UR:        run(6);break;
  78.                         case _DL:        run(7);break;
  79.                         case _DR:        run(8);break;

  80.                
  81.                 }
  82.         
  83.         
  84.         }





  85. }



  86. void forward()
  87. {
  88.         ENA_HIGH;
  89.         ENB_HIGH;
  90.         IN1_HIGH;
  91.         IN2_LOW;
  92.         IN3_HIGH;
  93.         IN4_LOW;
  94. }

  95. void backward()
  96. {
  97.         ENA_HIGH;
  98.         ENB_HIGH;
  99.         IN1_LOW;
  100.         IN2_HIGH;
  101.         IN3_LOW;
  102.         IN4_HIGH;
  103. }

  104. void turnleft()
  105. {
  106.         ENA_HIGH;
  107.         ENB_HIGH;
  108.         IN1_LOW;
  109.         IN2_LOW;
  110.         IN3_HIGH;
  111.         IN4_LOW;
  112. }

  113. void turnright()
  114. {
  115.         ENA_HIGH;
  116.         ENB_HIGH;
  117.         IN1_HIGH;
  118.         IN2_LOW;
  119.         IN3_LOW;
  120.         IN4_LOW;
  121. }

  122. void stopcar()
  123. {
  124.         ENA_LOW;
  125.         ENB_LOW;
  126.         IN1_LOW;
  127.         IN2_LOW;
  128.         IN3_LOW;
  129.         IN4_LOW;
  130. }

  131. void run(int direct)
  132. {
  133.         switch(direct)
  134.         {
  135.                 case 0:
  136.                                 IN1_LOW;
  137.                                 IN2_LOW;
  138.                                 IN3_LOW;
  139.                                 IN4_LOW;
  140.                                 analogWrite(ENA,0);
  141.                                 analogWrite(ENB,0);
  142.                                 break;
  143.                 case 1:
  144.                                 IN1_HIGH;
  145.                                 IN2_LOW;
  146.                                 IN3_HIGH;
  147.                                 IN4_LOW;
  148.                                 analogWrite(ENA,LOWSPEED);
  149.                                 analogWrite(ENB,LOWSPEED);
  150.                                 break;
  151.                 case 2:
  152.                                 IN1_LOW;
  153.                                 IN2_HIGH;
  154.                                 IN3_LOW;
  155.                                 IN4_HIGH;
  156.                                 analogWrite(ENA,LOWSPEED);
  157.                                 analogWrite(ENB,LOWSPEED);
  158.                                 break;               
  159.                 case 3:
  160.                                 IN1_LOW;
  161.                                 IN2_LOW;
  162.                                 IN3_HIGH;
  163.                                 IN4_LOW;
  164.                                 analogWrite(ENA,LOWSPEED);
  165.                                 analogWrite(ENB,LOWSPEED);
  166.                                 break;               
  167.                 case 4:
  168.                                 IN1_HIGH;
  169.                                 IN2_LOW;
  170.                                 IN3_LOW;
  171.                                 IN4_LOW;
  172.                                 analogWrite(ENA,LOWSPEED);
  173.                                 analogWrite(ENB,LOWSPEED);
  174.                                 break;        
  175.                 case 5:
  176.                                 IN1_HIGH;
  177.                                 IN2_LOW;
  178.                                 IN3_HIGH;
  179.                                 IN4_LOW;
  180.                                 analogWrite(ENA,LOWSPEED);
  181.                                 analogWrite(ENB,HIGHSPEED);
  182.                                 break;
  183.                 case 6:
  184.                                 IN1_HIGH;
  185.                                 IN2_LOW;
  186.                                 IN3_HIGH;
  187.                                 IN4_LOW;
  188.                                 analogWrite(ENA,HIGHSPEED);
  189.                                 analogWrite(ENB,LOWSPEED);
  190.                                 break;               
  191.                 case 7:
  192.                                 IN1_LOW;
  193.                                 IN2_HIGH;
  194.                                 IN3_LOW;
  195.                                 IN4_HIGH;
  196.                                 analogWrite(ENA,LOWSPEED);
  197.                                 analogWrite(ENB,HIGHSPEED);
  198.                                 break;               
  199.                 case 8:
  200.                                 IN1_LOW;
  201.                                 IN2_HIGH;
  202.                                 IN3_LOW;
  203.                                 IN4_HIGH;
  204.                                 analogWrite(ENA,HIGHSPEED);
  205.                                 analogWrite(ENB,LOWSPEED);
  206.                                 break;               
  207.         
  208.         }

  209. }
复制代码
在arduino IDE编译上传完成后,插上蓝牙bee模块,接上电源,硬件完成实物图:




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

好消息:ITEAD自家的蓝牙小车遥控APP已经上线了!
很多小伙伴问我用的蓝牙app是哪个?在哪里下载?现在不用烦恼了!ITEAD已经设计了自己专属的APP,目前只支持安卓系统屏幕4-7寸屏幕的手机或者平板(7寸的话界面排版可能会有空隙,不过不影响使用)
先上视频和照片!


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


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

输入完成后点击返回即可自动保存设置。可能在输入的时候过程会有点繁琐,给点耐心!
说明一下:UL;UP+LEFT(左上),US;UP+STRAIGHT(直行),DDRAW BACK(后退)依次类推。重点是SS;这个指令是让小车停止(Stopstop),我们把它设置为onoff。其他ABCD按键暂时没有使用到,可以自行开发用途。

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


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

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

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

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

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

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



新增【教程】DIY摇杆控制MBoard蓝牙小车

mboard.rar

529.65 KB, 下载次数: 26

ITEAD是深圳一家开源硬件公司,集研发、生产和销售于一体。可提供硬件定制和方案服务。淘宝:itead.taobao.com
分享到:
回复

使用道具 举报

回答|共 41 个

倒序浏览

沙发

dwwzl

发表于 2014-7-8 07:50:11 | 只看该作者

很不错,很详细的介绍,赞一个
用技术,爱生活!
板凳

ITEAD创易工作室

发表于 2014-7-8 10:18:24 | 只看该作者

dwwzl 发表于 2014-7-8 07:50
很不错,很详细的介绍,赞一个

谢赞!源代码昨天没传成功,刚已重新编辑上传了。欢迎指正!
ITEAD是深圳一家开源硬件公司,集研发、生产和销售于一体。可提供硬件定制和方案服务。淘宝:itead.taobao.com
地板

treasuredog

发表于 2014-7-8 10:47:36 | 只看该作者

很好很好,综合区就需要这样的解决方案
5#

expertss

发表于 2014-7-8 12:46:35 | 只看该作者

这个真不错
!!!!!!!!!!!!!!!!!!!!!!!!
6#

treasuredog

发表于 2014-7-8 14:53:06 | 只看该作者

楼主,你是个团队?还是个人?这是你自己的设计方案?准备出售方案?
7#

ITEAD创易工作室

发表于 2014-7-8 15:22:54 | 只看该作者

treasuredog 发表于 2014-7-8 14:53
楼主,你是个团队?还是个人?这是你自己的设计方案?准备出售方案?

我们是深圳的一家开源硬件公司。给大家介绍介绍产品,呵呵···

版主别开枪,是我!
ITEAD是深圳一家开源硬件公司,集研发、生产和销售于一体。可提供硬件定制和方案服务。淘宝:itead.taobao.com
8#

treasuredog

发表于 2014-7-8 21:02:21 | 只看该作者

ITEAD创易工作室 发表于 2014-7-8 15:22
我们是深圳的一家开源硬件公司。给大家介绍介绍产品,呵呵···

版主别开枪,是我! ...

没有,如果是开源哪就最好了,多提供这样的方案,十分欢迎!
9#

ITEAD创易工作室

发表于 2014-7-9 09:10:01 | 只看该作者

treasuredog 发表于 2014-7-8 21:02
没有,如果是开源哪就最好了,多提供这样的方案,十分欢迎!

基于arduino的,我们都是开源的,帖子附件可以下载产品资料和原理图。
ITEAD是深圳一家开源硬件公司,集研发、生产和销售于一体。可提供硬件定制和方案服务。淘宝:itead.taobao.com
10#

w932443004

发表于 2014-7-13 09:55:31 | 只看该作者

谢谢楼主分享经验!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条