0

我正在使用 GY-521 分线板在 3.6 英寸上获取加速度计数据。据我了解,我应该期望它有带符号的(正负)值,但我得到的值是 0 到 65535。

所以这就是我得到的:

当传感器平放在桌子上时,我的 Z 轴读数约为预期的 16384。当我向任何方向旋转传感器直到 90 度时,值下降到 0。一旦我转动超过 90°,值就会跳跃高达 65500 左右,当我继续旋转时,一旦传感器倒置(所以 180°),它就会下降到 50000 左右。

所以在我看来,在旋转的前半部分,我得到了预期值,但是在下降到零后没有得到负值,而是跳转到无符号 16 位的最大值。

对于 X 和 Y 轴,我得到了类似的结果,但旋转了 90 度。因此,当传感器平放在桌面上时,两个轴的读数均为 0。当我向一个方向转动传感器时,该值在 90° 时上升到 16384,然后在 180° 后下降到 0。如果我向另一个方向转动传感器,该值会上升到 65500 左右,然后在 90° 时下降到 50000,然后在 180° 时回到 65500。

这是我使用的整个代码:

#include <Wire.h>

const int MPU = 0x68; // MPU6050 I2C address
float AccX, AccY, AccZ;

void setup() {
  Serial.begin(19200);
  Wire.begin();
  Wire.beginTransmission(MPU); 
  Wire.write(0x6B); 
  Wire.write(0b00000000); 
  Wire.endTransmission();
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1C);
  Wire.write(0b00000001);
  Wire.endTransmission();      
}

void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); 
  Wire.endTransmission();
  Wire.requestFrom(MPU, 6, true);
  AccX = (Wire.read()<<8|Wire.read()); 
  AccY = (Wire.read()<<8|Wire.read()); 
  AccZ = (Wire.read()<<8|Wire.read()); 

  Serial.print(AccX);
  Serial.print(",");
  Serial.print(AccY);
  Serial.print(",");
  Serial.println(AccZ);
  delay(100);
}   
4

1 回答 1

0

好的,所以我找到了一个适合我的解决方案。

我必须将变量 AccX、AccY 和 AccZ 定义为“int16_t”。这通过 Wire 函数为我提供了预期的有符号值。

这是一种解决方法,因为我想将这些值缩放为十进制数,所以我需要创建另一组我定义为浮点数的变量。

如果有人能解释为什么我必须以这种方式或更好地定义变量但有更好的问题解决方案,我会很高兴听到它。

现在,我可以使用我所拥有的。

于 2019-05-02T15:10:50.870 回答