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);
        }
      }
     }
    }
  • 相关阅读:
    FrameBuffer系列 之 一点资源
    FrameBuffer系列 之 显示图片
    FrameBuffer系列 之 相关结构与结构体
    FrameBuffer系列 之 介绍
    FrameBuffer系列 之 简单编程
    程序员五大层次,你属于哪一层?
    提高编程效率的14件事
    GTK简单了解记录
    __read_mostly变量含义
    [系统启动]Printk与sched_clock_init的一点分析
  • 原文地址:https://www.cnblogs.com/liu-l/p/3708627.html
Copyright © 2011-2022 走看看