【教程】BTboard+摇杆控制arduino蓝牙小车
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;
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)
{
if(number==3)
{
value = (r_buffer<<8) | (r_buffer);
}
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_value512
#define diff_value20
String direct={
"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);
}
}
烧写完成,把跳线帽插到BTboard上的B的一边,开关拨到DAT的一边,如图:
最后把摇杆扩展板叠加上去,摇杆扩展板上的跳帽接到5V的一边,然后上电,USB供电用5V,适配器供电用9v-23V都可以。打开小车的开关,蓝牙就会自动配对,此时黄色指示灯常亮。试试转动摇杆吧!
http://player.youku.com/player.php/sid/XNzYzOTU0MjQ4/v.swf
还有您这个#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和#define ENA 10
#define ENB 11
#define IN1 7
#define IN2 8
#define IN3 12
#define IN4 13是不是指的就是PORTE的第三位就是数字引脚7,这个要到哪里去查看呢? 这个帖子:【简单教程】手机蓝牙遥控arduino mboard小车
MBoard手册和原理图下载地址:http://pan.baidu.com/s/1gdei5rH unsigned char times = 0xFF;
unsigned char last_times = times;
times=0;times=0x01;............
if(times!=last_times)
{last_times = times;}
不是很理解!能给解释下不?
页:
[1]