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

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

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

现在更新手机控制的部分

首先我们要熟悉一个软件——

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

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

打开软件:

点击Monitoring

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

长按蓝牙设备

选择show events,

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

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

贴出来以下代码,供大家参考 这是没有加入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);
    }
  }
 }
}
原文地址:https://www.cnblogs.com/liu-l/p/3708627.html