蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

最近事真是多啊,一件接着一件的,加上自己拖延症~ - -!

遥控小车基本完成了,只是自己没时间来更新。

现在更新手机控制的部分

 

 

首先我们要熟悉一个软件——蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

 

官网地址:http://www.amarino-toolkit.net/

 

把下面两个下到手机上 安装

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

 

打开软件:

 

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

 

点击Monitoring

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

可以发送字符 跟上一篇PC端用串口工具发送一样的效果。

 

 

 

 

长按蓝牙设备

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

选择show events,

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

 

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

 

这是加速度传感器发送给arduino的数据

蓝牙遥控小车设计(三)——Amarino和 Android手机重力感应控制

 

利用这些数据 我们就可以得到手机当前的状态,从而我们可以根据手机的姿态控制小车的前进后退左转右转

贴出来以下代码,供大家参考 这是没有加入PWM调速的   只要有姿态变化都是全速的

/*

Name:liu_l

Date:04.03

ID:A    AmarinoService:send to Arduino:A-0.31603462;0.49799395;12.421119   enter:0x0d        都是8位数字

*/

char accelBuff[100]; //定义接收数组用来存放手机发送的加速度传感器参数

int accelDot[2]; //存放数据中的小数点位于accelBuff中的位置,小数点的十六进制为2e

int accelSemi; //存放数据中的分号位于accelBuff中的位置,分号的十六进制为3b

 

int i;    

 

void setup() 

{

  Serial.begin(9600);

  pinMode(4, OUTPUT); //M1

  pinMode(5, OUTPUT); //E1

  pinMode(6, OUTPUT); //E2

  pinMode(7, OUTPUT); //M2

}

 

void loop() 

{

  //接收数据

  if(Serial.available())

  {

    accelBuff[0] = Serial.read(); //read

    //amarino发送的数据包含一个标志A

    if(accelBuff[0] == 'A')

    {

    //开始接收数据,数据以0x13结束

    i=1;

    while(1)

    {

      if(Serial.available())

      {

        accelBuff[i] = Serial.read(); //read

        if(accelBuff[i] == 0x13)

        break;

        else

        i++;

      }

    }

    //一直接收数据,直到接收数据结束 

  }

 

  //获取接收数据中分号的位置

  for(i = 0 ; i < 100 ; i++)

  {

    if(accelBuff[i] == 0x3b)

    {

      accelSemi= i;

      break;

    }

  }

 

  //获取接收数据中小数点的位置

  for(i = 0;i < 100;i++)

  { 

    if(accelBuff[i] == 0x2e)  //小数点

    {

      accelDot[0]= i;       //小数点位置

      break;

    }

  }

 

  for(i = accelSemi;i < 100;i++)  //从第一个分号位置开始,去找第二个小数点位置

  {

    if(accelBuff[i] == 0x2e)

    {

      accelDot[1]= i;

      break;

    }

  }

 

  ////////////////////////////////

  //根据接收到的数据控制小车的运动

  ////////////////////////////////

 

  //首先让小车停止

        digitalWrite(4, HIGH);

        digitalWrite(5, HIGH);

        digitalWrite(6, HIGH);

        digitalWrite(7, HIGH);

        Serial.println("STOP");

 

  //通过X轴数据的正负判端前进还是后退  当数据为十位数的时候才行动

  if(accelBuff[1] == '-') //手机前倾 小车向前走  A-0.31603462;0.49799395;12.421119

  {

    if(accelDot[0] == 4 || (accelBuff[2]-0X30) > 1)    //A-12.3 小数点在第四位(说明X参数为两位整数)  或者   数据第一位本身大于1(0的acsii码为0x30)

    {

      Serial.println("forward");

        digitalWrite(4, HIGH);

        digitalWrite(5, LOW);

        digitalWrite(6, HIGH);

        digitalWrite(7, LOW);

    }

  }

  else

  {

    if(accelDot[0] == 3 || (accelBuff[1]-0X30) > 1)

    {

      Serial.println("back");

        digitalWrite(4, LOW);

        digitalWrite(5, HIGH);

        digitalWrite(6, LOW);

        digitalWrite(7, HIGH);

    }

  }

 

  //通过Y轴数据的正负判断左转还是右转  

  /////////////////////////////////////////////////////    A-0.31603462;0.49799395;12.421119      

  if(accelBuff[accelSemi+1] == '-')                                        //                                     ;-23.5

  {

    if(accelDot[1] == accelSemi+4 || (accelBuff[accelSemi+2]-0X30) > 1)    //如果 第二个小数点的位置等于=第一个分号+4,如上面假设的-23.5 或者是Y加速度值的第一位本身就大于1

    {

      Serial.println("left");

        digitalWrite(4, HIGH);

        digitalWrite(5, LOW);

        digitalWrite(6, HIGH);

        digitalWrite(7, HIGH);

    }

  }

  else

  {

    if(accelDot[1] == accelSemi+3 || (accelBuff[accelSemi+1]-0X30) > 1)

    {



      Serial.println("right");

        digitalWrite(4, HIGH);

        digitalWrite(5, HIGH);

        digitalWrite(6, HIGH);

        digitalWrite(7, LOW);

    }

  }

 }

}

 

你可能感兴趣的:(android)