Я использую плату 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);
}