zoukankan      html  css  js  c++  java
  • 蓝牙遥控小车设计(三)——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);
        }
      }
     }
    }
  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/liu-l/p/3708627.html
Copyright © 2011-2022 走看看