【问题标题】:gryo scope and accelerometer output陀螺仪和加速度计输出
【发布时间】:2015-02-19 18:53:56
【问题描述】:

我目前正在使用 arduino、陀螺仪、加速度计和蓝牙芯片进行项目,以尝试对一些数据进行建模。我目前正在尝试收集数据,将其打包并通过蓝牙发送到手机。问题是我使用的蓝牙芯片是低能量芯片,因此它一次只能发送 20 个字节的消息。我试图通过将收集的数据存储一定时间然后以 20 字节突发的形式全部发送来解决这个问题。我目前正在测试这种方法,而不发送数据,只是将数据打印到串行监视器。这就是我的问题出现的地方,当实时打印数据时一切正常,但是当我尝试将它存储在一个数组中时,我得到了这个:

593,575,567,0,0,0

592,575,567,0,0,0

592,575,567,0,0,0

592,575,567,0,0,0

592,575,567,0,0,0

593,575,567,0,0,0

586,576,568,0,0,0

0,0,0

0,0

0,0

,0,0,0

0,0,0

如您所见,它似乎刚刚破裂。如果有人可以帮助我,那就太好了!

这里是相关的代码块

for(int i = 0; i < loopVal; i++)
  {
    yawGyroValDouble = 0;
    pitchGyroValDouble = 0;
    rollGyroValDouble = 0;
    totalClicksY = 0;
    angleY = 0;
    totalClicksP = 0;
    angleP = 0;
    totalClicksR = 0;
    angleR = 0;      
    xRe = 0;
    yRe = 0;
    zRe = 0;
    s = "";
    int starttime = millis(); // get start time
    int endtime = starttime; // init end time
    while ((endtime - starttime) < time)
    {
      getGyroValues();  // This will update rollGyroVal, pitchGyroVal, and yawGyroVal with new values

      yawGyroValDouble =yawGyroVal;
      if(abs(yawGyroValDouble) > abs(gyroNoiseThresh)){ // ignore noise
        totalClicksY+=yawGyroValDouble; // update runsum
      }

      pitchGyroValDouble =pitchGyroVal;
      if(abs(yawGyroValDouble) > abs(gyroNoiseThresh)){ // ignore noise
        totalClicksP+=pitchGyroValDouble; // update runsum
      }

      rollGyroValDouble =rollGyroVal;
      if(abs(yawGyroValDouble) > abs(gyroNoiseThresh)){ // ignore noise
        totalClicksR+=rollGyroValDouble; // update runsum
      }

      xRe = analogRead(pinX);

      yRe = analogRead(pinY);

      zRe = analogRead(pinZ);

      delay (gyroDelayTime);
      endtime = millis();
    }

    angleY = totalClicksY / clicksPerDegCCW;
    angleP = totalClicksP / clicksPerDegCCW;
    angleR = totalClicksR / clicksPerDegCCW;

    String yawSend = String(angleY);

    String pitchSend = String(angleP);

    String rollSend = String(angleR);

    String xSend = String(xRe);

    String ySend = String(yRe);

    String zSend = String(zRe);


    //s = "Accel - X: " + xSend + " Y: " + ySend + " Z: " + zSend + "\n" + "Gyro - Yaw: " + yawSend + " Pitch: " + pitchSend + " Roll: " + rollSend;
    s = "" + xSend + "," + ySend + "," + zSend + "," + yawSend + "," + pitchSend + "," + rollSend;
    Serial.println(s);
    res[i] = s;
  }

【问题讨论】:

    标签: bluetooth arduino accelerometer gyroscope


    【解决方案1】:

    您没有显示 totalClicksYtotalClicksPtotalClicksRclicksPerDegCCW 的声明位置,但我敢打赌它们被声明为整数类型(int 或 long)。如果是这样,你的数学结果:

    angleY = totalClicksY / clicksPerDegCCW;
    angleP = totalClicksP / clicksPerDegCCW;
    angleR = totalClicksR / clicksPerDegCCW;
    

    将是整数。并且如果这些除法的结果小于1,它们将被截断为0。

    尝试将totalClicksYtotalClicksPtotalClicksRclicksPerDegCCW 声明为double。那个,或者在你做数学的时候把它们投射出来,像这样:

    angleY = (double)totalClicksY / (double)clicksPerDegCCW;
    angleP = (double)totalClicksP / (double)clicksPerDegCCW;
    angleR = (double)totalClicksR / (double)clicksPerDegCCW;
    

    (我还假设 angleYanglePangleR 也被声明为双精度 - 如果不是,它们肯定应该是)。

    【讨论】:

    • 这些已经设置为双打。经过一番测试,我发现了问题所在。事实证明我的内存快用完了。唯一的解决方案是购买更多内存!不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多