|
Hello,各位小伙伴,好久不见了!前段时间比较忙,眼看又到周末了,抽空给之前的蓝牙小车做了一个摇杆控制器,大家就又可以愉快地度过周末了 O(∩_∩)O 特此奉上。
所需配件:
MBoard小车详细制作介绍看此贴:【简单教程】手机蓝牙遥控arduino mboard小车
遥控方面的硬件很简单,BTboard是一款带蓝牙(兼容主从机模式)功能的uno开发板。摇杆扩展板,带按键,教程暂时没有使用到按键功能,小伙伴可以自行添加开发,控制灯光、打开摄像头等等。
BTboard的硬件资料、原理图在此下载:http://pan.baidu.com/s/1gdDvDqb
摇杆扩展板的硬件资料、原理图在此下载:http://pan.baidu.com/s/1sjDbldr
以下是小车的代码(之前的小车有差速,走不了直线,蓝牙需配对,现在修改了代码,调整了差速,增加了蓝牙自动配对):
- #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 200
- #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)
- {
- 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;
- 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+30);
- break;
- case 2:
- IN1_LOW;
- IN2_HIGH;
- IN3_LOW;
- IN4_HIGH;
- analogWrite(ENA,LOWSPEED-15);
- analogWrite(ENB,LOWSPEED+40);
- break;
- case 3:
- IN1_LOW;
- IN2_LOW;
- IN3_HIGH;
- IN4_LOW;
- analogWrite(ENA,0);
- analogWrite(ENB,LOWSPEED+50);
- break;
- case 4:
- IN1_HIGH;
- IN2_LOW;
- IN3_LOW;
- IN4_LOW;
- analogWrite(ENA,LOWSPEED);
- analogWrite(ENB,0);
- 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;
-
- }
- }
复制代码
然后给BTboard烧写控制代码,烧写前一定要把板子上的跳线帽拔掉,否则烧不进代码(board类型选择Arduino Duemilanove):
- #define A0 YIN
- #define A1 XIN
- #define half_value 512
- #define diff_value 20
- String direct[9]={
- "SS;",
- "US;",
- "DS;",
- "LS;",
- "RS;",
- "UL;",
- "DL;",
- "UR;",
- "DR;"
-
- };
- int tempx = 0;
- int tempy = 0;
- char number=0;
- unsigned char times = 0xFF;
- unsigned char last_times = times;
- void setup()
- {
- pinMode(A0,INPUT);
- pinMode(A1,INPUT);
- Serial.begin(9600);
- }
- void loop()
- {
- int val_x,val_y;
- val_x = analogRead(1);
- val_y = analogRead(0);
- tempx = abs(val_x-half_value);
- tempy = abs(val_y-half_value);
-
- if((tempx<diff_value)&&(tempy<diff_value))
- {number=0;times=0;}
- else if((val_y>(half_value+diff_value))&&(tempx<diff_value))
- {number=1;times=0x01;}
- else if((val_y<(half_value-diff_value))&&(tempx<diff_value))
- {number=2;times=0x02;}
- else if((val_x<(half_value-diff_value))&&(tempy<diff_value))
- {number=3;times=0x04;}
- else if((val_x>(half_value+diff_value))&&(tempy<diff_value))
- {number=4;times=0x08;}
- else if((val_y>(half_value+diff_value))&&(val_x<(half_value-diff_value)))
- {number=5;times=0x10;}
- else if((val_y<(half_value-diff_value))&&(val_x<(half_value-diff_value)))
- {number=6;times=0x20;}
- else if((val_y>(half_value+diff_value))&&(val_x>(half_value+diff_value)))
- {number=7;times=0x40;}
- else if((val_y<(half_value-diff_value))&&(val_x>(half_value+diff_value)))
- {number=8;times=0x80;}
- if(times!=last_times)
- {
- last_times = times;
- Serial.print(direct[number]);
- }
- }
复制代码
烧写完成,把跳线帽插到BTboard上的B的一边,开关拨到DAT的一边,如图:
最后把摇杆扩展板叠加上去,摇杆扩展板上的跳帽接到5V的一边,然后上电,USB供电用5V,适配器供电用9v-23V都可以。打开小车的开关,蓝牙就会自动配对,此时黄色指示灯常亮。试试转动摇杆吧!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|