Акселерометр MPU 6050 отправляет 16-битные значения без знака - PullRequest
0 голосов
/ 20 апреля 2019

Я использую плату GY-521, чтобы получить данные акселерометра для подростка 3.6. Из того, что я понимаю, я должен ожидать от него знаковых (положительных и отрицательных) значений, но вместо этого я получаю значения от 0 до 65535.

Итак, вот что я получаю:

Когда датчик лежит на столе ровно, моя ось Z читает примерно ожидаемое значение 16384. Когда я поворачиваю датчик в любом направлении до 90 градусов, значение уменьшается до 0. Как только я поворачиваюсь более чем на 90 °, значение поднимается примерно до 65500, а когда я продолжаю вращаться, оно падает примерно до 50000, когда датчик переворачивается вверх ногами (т.е. на 180 °).

Так что мне кажется, что для первой половины поворота я получаю ожидаемые значения, но затем вместо получения отрицательных значений после обнуления он переходит к максимальному значению 16-разрядного знака без знака.

Для осей X и Y я получаю аналогичный результат, но повернут на 90 градусов. Поэтому, когда датчик лежит на столе ровно, обе оси показывают 0. Когда я поворачиваю датчик в одном направлении, значение поднимается до 16384 при 90 °, а затем возвращается к 0 после 180 °. Если я поверну датчик в другом направлении, значение поднимется до 65500, затем снизится до 50000 при 90 °, а затем вернется до 65500 при 180 °.

Вот весь код, который я использую:

#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);
}   

1 Ответ

0 голосов
/ 02 мая 2019

Хорошо, поэтому я нашел решение, которое работает для меня.

Мне пришлось определить переменные AccX, AccY и AccZ как "int16_t".Это дает мне ожидаемые значения со знаком через функцию Wire.

Это немного обходной путь, поскольку я хочу масштабировать эти значения до десятичных чисел, поэтому мне нужно создать еще один набор переменных, которые я определяю как float.

Если бы кто-нибудь мог объяснить, почему я должен определять переменные таким образом или лучше, но у меня есть более хорошее решение проблемы, я был бы рад услышать это.

Пока я могу работатьс тем, что у меня есть.

...