极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18116|回复: 3

【教程】BTboard+摇杆控制arduino蓝牙小车

[复制链接]
发表于 2014-8-30 10:32:57 | 显示全部楼层 |阅读模式
Hello,各位小伙伴,好久不见了!前段时间比较忙,眼看又到周末了,抽空给之前的蓝牙小车做了一个摇杆控制器,大家就又可以愉快地度过周末了 O(∩_∩)O 特此奉上。

所需配件:



MBoard小车详细制作介绍看此贴:【简单教程】手机蓝牙遥控arduino mboard小车
遥控方面的硬件很简单,BTboard是一款带蓝牙(兼容主从机模式)功能的uno开发板。摇杆扩展板,带按键,教程暂时没有使用到按键功能,小伙伴可以自行添加开发,控制灯光、打开摄像头等等。

BTboard的硬件资料、原理图在此下载:http://pan.baidu.com/s/1gdDvDqb
摇杆扩展板的硬件资料、原理图在此下载:http://pan.baidu.com/s/1sjDbldr

以下是小车的代码(之前的小车有差速,走不了直线,蓝牙需配对,现在修改了代码,调整了差速,增加了蓝牙自动配对):



  1. #define _US 0x5553
  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 200

  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)
  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;
  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+30);
  150.                                 break;
  151.                 case 2:
  152.                                 IN1_LOW;
  153.                                 IN2_HIGH;
  154.                                 IN3_LOW;
  155.                                 IN4_HIGH;
  156.                                 analogWrite(ENA,LOWSPEED-15);
  157.                                 analogWrite(ENB,LOWSPEED+40);
  158.                                 break;               
  159.                 case 3:
  160.                                 IN1_LOW;
  161.                                 IN2_LOW;
  162.                                 IN3_HIGH;
  163.                                 IN4_LOW;
  164.                                 analogWrite(ENA,0);
  165.                                 analogWrite(ENB,LOWSPEED+50);
  166.                                 break;               
  167.                 case 4:
  168.                                 IN1_HIGH;
  169.                                 IN2_LOW;
  170.                                 IN3_LOW;
  171.                                 IN4_LOW;
  172.                                 analogWrite(ENA,LOWSPEED);
  173.                                 analogWrite(ENB,0);
  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. }
复制代码


然后给BTboard烧写控制代码,烧写前一定要把板子上的跳线帽拔掉,否则烧不进代码(board类型选择Arduino Duemilanove):


  1. #define A0 YIN
  2. #define A1 XIN

  3. #define half_value  512
  4. #define diff_value  20

  5. String direct[9]={
  6. "SS;",
  7. "US;",
  8. "DS;",
  9. "LS;",
  10. "RS;",
  11. "UL;",
  12. "DL;",
  13. "UR;",
  14. "DR;"

  15. };

  16. int tempx = 0;
  17. int tempy = 0;
  18. char number=0;

  19. unsigned char times = 0xFF;
  20. unsigned char last_times = times;

  21. void setup()
  22. {
  23.   pinMode(A0,INPUT);
  24.   pinMode(A1,INPUT);

  25.   Serial.begin(9600);  
  26. }
  27. void loop()
  28. {

  29.   int val_x,val_y;
  30.   val_x = analogRead(1);
  31.   val_y = analogRead(0);
  32.   tempx = abs(val_x-half_value);       
  33.   tempy = abs(val_y-half_value);       

  34.   if((tempx<diff_value)&&(tempy<diff_value))
  35.   {number=0;times=0;}
  36.   else if((val_y>(half_value+diff_value))&&(tempx<diff_value))
  37.   {number=1;times=0x01;}
  38.   else if((val_y<(half_value-diff_value))&&(tempx<diff_value))
  39.   {number=2;times=0x02;}
  40.   else if((val_x<(half_value-diff_value))&&(tempy<diff_value))
  41.   {number=3;times=0x04;}
  42.   else if((val_x>(half_value+diff_value))&&(tempy<diff_value))
  43.   {number=4;times=0x08;}
  44.   else if((val_y>(half_value+diff_value))&&(val_x<(half_value-diff_value)))
  45.   {number=5;times=0x10;}
  46.   else if((val_y<(half_value-diff_value))&&(val_x<(half_value-diff_value)))
  47.   {number=6;times=0x20;}
  48.   else if((val_y>(half_value+diff_value))&&(val_x>(half_value+diff_value)))
  49.   {number=7;times=0x40;}
  50.   else if((val_y<(half_value-diff_value))&&(val_x>(half_value+diff_value)))
  51.   {number=8;times=0x80;}
  52.   if(times!=last_times)
  53.   {
  54.         last_times = times;
  55.         Serial.print(direct[number]);
  56.   }
  57. }
复制代码


烧写完成,把跳线帽插到BTboard上的B的一边,开关拨到DAT的一边,如图:



最后把摇杆扩展板叠加上去,摇杆扩展板上的跳帽接到5V的一边,然后上电,USB供电用5V,适配器供电用9v-23V都可以。打开小车的开关,蓝牙就会自动配对,此时黄色指示灯常亮。试试转动摇杆吧!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-8-30 11:26:31 | 显示全部楼层
还有您这个
  1. #define IN1_HIGH        PORTE |=0x40
  2. #define IN1_LOW                PORTE &=~0x40
  3. #define IN2_HIGH        PORTB |=0x10
  4. #define IN2_LOW                PORTB &=~0x10
  5. #define IN3_HIGH        PORTD |=0x40
  6. #define IN3_LOW                PORTD &=~0x40
  7. #define IN4_HIGH        PORTC |=0x80
  8. #define IN4_LOW                PORTC &=~0x80
  9. #define ENA_HIGH        PORTB |=0x40
  10. #define ENA_LOW                PORTB &=~0x40
  11. #define ENB_HIGH        PORTB |=0x80
  12. #define ENB_LOW                PORTB &=~0x80
复制代码
  1. #define ENA 10
  2. #define ENB 11
  3. #define IN1 7
  4. #define IN2 8
  5. #define IN3 12
  6. #define IN4 13
复制代码
是不是指的就是PORTE的第三位就是数字引脚7,这个要到哪里去查看呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-1 09:30:19 | 显示全部楼层
这个帖子:【简单教程】手机蓝牙遥控arduino mboard小车
               MBoard手册和原理图下载地址:http://pan.baidu.com/s/1gdei5rH
回复 支持 反对

使用道具 举报

发表于 2015-4-18 18:03:02 | 显示全部楼层
unsigned char times = 0xFF;
unsigned char last_times = times;

times=0;times=0x01;............

if(times!=last_times)
  {last_times = times;}

不是很理解!能给解释下不?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 04:39 , Processed in 0.042475 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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