Mein Beschleunigungssensor driftet stark ab

Entschuldigung also mal die Backgroundinfos:

Also ich will Bewegungsvektoren auslesen und mit welcher Geschwindigkeit diese sich bewegen. Der Sensor soll dann an einen Roboterarm angebracht werden und die Daten dann an den Arduino weiter senden, der diese dann verarbeitet.

Also der erste Versuch war mal mit einem Beschleunigungssensor quasi die Beschleunigung in die verschiedenen Richtungen zu messen und die dann in eine Geschwindigkeit umzurechnen.
(Fürs erste mal nur in die X-Richtung um mal was sinnvolles raus zubekommen)

 // MPU-6050 Short Example Sketch
// Public Domain
#include<Wire.h>
#define CNT_MAX 100
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

float vx_ms=0;
int cnt = 1;
int AcXcorr;
float AcX_ms2;
  
void setup(){
  AcXcorr=0;
  AcX_ms2=0;
  
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);

}

            void loop(){
              
  unsigned long TIMESTAMP = micros(); // oder für schnelle Sachen auch micros();
              
              Wire.beginTransmission(MPU_addr);
              Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
              Wire.endTransmission(false);
              Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
              AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
              AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
              AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
              Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
              GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
              GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
              GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
              
         
            
  unsigned long Differenz = micros() - TIMESTAMP;        
            
              if(cnt<=CNT_MAX)
              {
                AcXcorr=AcXcorr + AcX;  // digits
            
                AcX_ms2=(AcX)/1670.18;        // Korrektur des Drifts und Umrehnen auf m/s^2
                if (cnt==CNT_MAX)
                {
                  AcXcorr=AcXcorr/cnt;  // digits
                }
                cnt++;
              }
              else
              { 
                 AcX_ms2=(AcX-1*AcXcorr)/1670.18;        // Korrektur des Drifts und Umrechnen auf m/s^2
                 vx_ms = vx_ms + ((float)AcX_ms2) * (Differenz/1000)  ;   // Berechnen von vx [m/s]
              }
            

   
  // Serial.print("Berechnungsdauer =  ");Serial.print(Differenz);       
              
            
                Serial.print(" | AcX = "); Serial.print(AcX_ms2);
               // Serial.print(" | AcY = "); Serial.print(AcY);
                Serial.print(" | AcZ = "); Serial.print(AcZ/1670.18);
                Serial.print(" | vx  = "); Serial.println(vx_ms);
               // Serial.print(" | Tmp = "); Serial.println(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
                //Serial.print(" | GyX = "); Serial.print(GyX);
                //Serial.print(" | GyY = "); Serial.print(GyY);
                //Serial.print(" | GyZ = "); Serial.println(GyZ);
            
              if(cnt<=CNT_MAX)delay(1);
              else            delay(100);
            }

Gesch_Sensor_Test_1.ino (3.01 KB)