MPU6050 Auflösung

Hallo,

ich bastel gerade ein bisschen mit dem MPU6050 rum. Nutze ihn derzeit zum Erfassen der X und Y Achse. Habe aber ein paar "Probleme" mit den Min und Max-Werten. In der Beispielsdatei waren die Werte als int16_t deklariert, somit -32768 - 32767. Diese Extremwerte kann ich aber nicht anfahren. Die Werte spielen im Bereich von ca. -16000 und 16000 ab.

#include "Wire.h"
#include "I2Cdev.h"       // https://github.com/jrowberg/i2cdevlib
#include "MPU6050.h"      // https://github.com/jrowberg/i2cdevlib
#include <FastSPI_LED2.h> // https://code.google.com/p/fastspi/

MPU6050 accelgyro;
int ax, ay, az;
int axStart, ayStart, azStart;
const int minRaw = -32768;
const int maxRaw = 32767;
const byte minOut = 0;
const byte maxOut = 255;

const byte NUM_LEDS = 1;
const byte DATA_PIN = 6;
CRGB leds[NUM_LEDS];

int rRaw,gRaw,bRaw;
byte r, g, b;
unsigned long lastMillis0;
unsigned long lastMillis1;
unsigned long lastMillis2;

void setup() {
  Wire.begin();
  Serial.begin(115200);
  accelgyro.initialize();
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
}

void loop() {
  // Jede 100ms neue Werte einholen und umrechnen
  if(millis() - lastMillis0 > 100) {
    lastMillis0 = millis();
    accelgyro.getAcceleration(&ax, &ay, &az);

    rRaw = map(ax, minRaw, maxRaw, 0, 255);
    if(rRaw >= 0 && rRaw <= 255) r = rRaw;

    gRaw = map(ay, minRaw, maxRaw, 0, 255);
    if(gRaw > 127 && gRaw <= 255) g = gRaw;

    leds[0] = CRGB(r,g,0);
    FastLED.show();
  }

  // Jede Sekunde die Werte auf den Seriellen Monitor ausgeben
  if(millis() - lastMillis1 > 1000) {
    lastMillis1 = millis();
    Serial.print(r); 
    Serial.print("(");
    Serial.print(ax);
    Serial.print(")");
    Serial.print("\t");
    Serial.print(g);
    Serial.print("(");
    Serial.print(ay);
    Serial.println(")");
  }
}

sschultewolter:
In der Beispielsdatei waren die Werte als int16_t deklariert, somit -32768 - 32767. Diese Extremwerte kann ich aber nicht anfahren. Die Werte spielen im Bereich von ca. -16000 und 16000 ab.

Ja klar, Du mißt die Erdbeschleunigung (1g) und der kleinste Messbereich des Sensors ist der 2g Messbereich.

Die Empfindlichkeit steht in http://www.invensense.com/mems/gyro/documents/RM-MPU-6000A-00v4.2.pdf Seite 29:
Im ±2g Messbereich: 16384 pro g
Im ±4g Messbereich 8192 pro g
Im ±8g Messbereich 4096 pro g
Im ±16g Messbereich 2048 pro g

Um im 2g-Messbereich tatsächlich 2g zu messen, müßtest Du den Sensor nicht nur in Ruhelage der Erdschwere (1g) aussetzen, sondern ihn zusätzlich mit 1g (9,81m/s2)nach oben beschleunigen. 1g + 1g = 2g = 2* 16384 = 32768

Wenn Du den Sensor im Messbereich auf den 8g Messbereich umschalten würdest, dann würde er Dir ruhend im Erdschwerefeld sogar nur Werte um die 4000 statt 16000 anzeigen.