ITEAD创易工作室 发表于 2014-8-30 10:32:57

【教程】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


黎昕 发表于 2014-8-30 11:26:31

还有您这个#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,这个要到哪里去查看呢?

ITEAD创易工作室 发表于 2014-9-1 09:30:19

这个帖子:【简单教程】手机蓝牙遥控arduino mboard小车
               MBoard手册和原理图下载地址:http://pan.baidu.com/s/1gdei5rH

baijiansong 发表于 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;}

不是很理解!能给解释下不?
页: [1]
查看完整版本: 【教程】BTboard+摇杆控制arduino蓝牙小车