Dumme Frage zum Gyro MPU-6050

Danke für die Antwort. Ich denke das ist das Problem. Werde mich mal herantasten.
LGW

Hallo MaFu,
ich habe gelesen, dass Du auch mit Micro Vision arbeitest. Ich hier im Hinblick auf MPU6050 und das Einbinden der Lib´s Fragen. Soll ich die hier stellen, oder besser einen neuen Threat aufmachen?

LGW

kucky:
Hallo MaFu,
ich habe gelesen, dass Du auch mit Micro Vision arbeitest. Ich hier im Hinblick auf MPU6050 und das Einbinden der Lib´s Fragen. Soll ich die hier stellen, oder besser einen neuen Threat aufmachen?

LGW

Frag ruhig. Aber prinzipiell ist da eigentlich alles gleich, ich mache keinen Unterschied gegenüber der Arduino IDE wenn ich in VisualStudio arbeite.

Hallo MaFu,
ich möchte mein Projekt in 4 Module aufteilen.
Center-> hier läuft alles zusammen
Sensor -> wie der Name schon sagt, u.a. MPU6050
Motor -> Regel- Steuerung der Motoren
Command -> Bedienung per Bluetooth und CMDMessenger

Über Allem schwebt die *.ino

Nun versuche ich seit geraumer Zeit, die MPU6050 Lib in das Sensormodul zu implementieren.
Versuch 1. Quadxx.ino -> Center -> Sensor ohne Erfolg.
Versuch2 . Quadxx.ino -> Sensor ohne Erfolg.
Was ich auch versuche, die Fehlermeldung lt. immer annähernd gleich:

Compiling 'Quad08' for 'Arduino Mega 2560 or Mega ADK'
Sensor.cpp.o : : In function MPU6050::dmpGetAccel(long*, unsigned char const*)': MPU6050_9Axis_MotionApps41.h : dmpGetAccel(long*, unsigned char const*)' Quad08.cpp.o : :D:\NotInstalled\arduino104\libraries\MPU6050\MPU6050_9Axis_MotionApps41.h:636: first defined here ld.exe : : Disabling relaxation: it will not work with multiple definitions Sensor.cpp.o : : In function MPU6050::dmpGetAccel(int*, unsigned char const*)':
MPU6050_9Axis_MotionApps41.h : dmpGetAccel(int*, unsigned char const*)'
Quad08.cpp.o : :D:\NotInstalled\arduino104\libraries\MPU6050\MPU6050_9Axis_MotionApps41.h:644: first defined here
Sensor.cpp.o : : In function `MPU6050::dmpGetAccel(VectorInt16*, unsigned char const*)':
MPU6050_9Axis_MotionApps41.h : dmpGetAccel(VectorInt16*, unsigned char const*)'

Quad08.ino

#include "Sensor.h"
#include <MPU6050_9Axis_MotionApps41.h>
//#include <MPU6050_6Axis_MotionApps20.h>
//#include <MPU6050.h>
//#include <Streaming.h>
//#include <Base64.h>
//#include <CmdMessenger.h>
//#include <Servo.h>
//#include <Brushless.h>
//#include <PID_v1.h>
//#include <helper_3dmath.h>
//#include <Metro.h>
//#include <HMC5883L.h>
//#include <BMP085.h>
#include <Wire.h>
#include <I2Cdev.h>

// owen classes

//-----------------------------------------------------------------------------------------------------------
void setup() {
    Wire.begin();
    Serial.begin(115200);
	Serial3.begin(19200);
	Serial.println("**************************");
	Serial.println("*         Quad 07        *");
	Serial.print  ("*  ");Serial.print(__DATE__);Serial.print(" ");Serial.print(__TIME__);Serial.println("  *");
	Serial.println("**************************");

//	center.init();

	Serial.flush();   
//    pinMode(LED_PIN, OUTPUT);// configure LED for output
	Serial3.println("Bluetooth OK");
}
//-------------------------------------------------------------------------------------------------
void loop() { 
//	center.doWork();

}

Sensor.h

// Sensor.h

#ifndef _SENSOR_h
#define _SENSOR_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
#else
	#include "WProgram.h"
#endif

#ifdef __AVR_ATmega2560__

	#endif

#ifdef __AVR_ATmega328P__

	#endif

#include <MPU6050_9Axis_MotionApps41.h>
#include <I2Cdev.h>
#include <helper_3dmath.h>
//#include <BMP085.h>
//#include <HMC5883L.h>
//#include <PID_v1.h>

extern MPU6050	mpu;
extern bool blinkState;
extern volatile bool mpuInterrupt;
extern uint8_t fifoBuffer[];
extern bool dmpReady;
extern uint8_t devStatus;
extern uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
extern uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
extern uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
extern uint16_t fifoCount;     // count of all bytes currently in FIFO
extern Quaternion q;           // [w, x, y, z]         quaternion container
extern VectorFloat gravity;    // [x, y, z]            gravity vector
extern float ypr[];            // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

class Sensor
{
 private:

 public:
	void init();
};
extern Sensor SENSOR;
#endif

Sensor.cpp

#include "Sensor.h"

MPU6050	mpu;

volatile bool mpuInterrupt = false;

bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

float temperature;	///< Data from Barometer 
float pressure;
float altitude;	
float heading;
float degrees;		/// Data from compass

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorFloat gravity;    // [x, y, z]            gravity vector
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

//-----------------------------------------------------------------------------------------------------------
void dmpDataReady() {
    mpuInterrupt = true;
}

void Sensor::init()
{
	mpu.initialize();
	Serial.println(F("Initializing DMP..."));		 // load and configure the DMP
    devStatus = mpu.dmpInitialize();

	if (devStatus == 0) // make sure it worked (returns 0 if so) turn on the DMP, now that it's ready
	{																
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);
        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
		pinMode(2, INPUT_PULLUP);
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;       
        packetSize = mpu.dmpGetFIFOPacketSize();	     // get expected DMP packet size for later comparison
    } 
		else
	{
        // ERROR!                     
        Serial.print(F("DMP Initialization failed (code "));	// 1 = initial memory load failed
        Serial.print(devStatus);								// 2 = DMP configuration updates failed
        Serial.println(F(")"));									// (if it's going to break, usually the code will be 1)		
    }
}
Sensor SENSOR;

Es ist doch richtig, das man bei Verwendung von VM, die Lib´s in die ino-Datei aus core heraus inkludiert, und anschließend im eigentlichen Modul nochmal per copy and past inkludiert. Ich habe Dir mal meine Projektdatei angehangen. Vielleicht hast Du ja Muse hier mal rein zuschauen, und evtl. zu korrigieren :roll_eyes:

Gruß aus Leverkusen
Willi

Quad08.rar (2.6 MB)

Das Problem lag wohl eher darin, dass die Library in sich getrennt war. Also Teile der Funktionen waren ausgelagert. Da ich auch nicht so ein Programmiergenie bin, kann ich dir den programmiertechnischen Hintergrund nicht erklären, weshalb es nicht funktioniert hat. Bin nur auf die Idee gekommen, weil ich mal was ähnliches versucht hatte und das auch irgendwie ziemlich schiefging. Im Anhang findest du die abgeänderten Dateien, hab se grob zusammengeschustert, dass alle Infos in den zwei mpu6050.cpp / .h Dateien untergebracht sind, auch wenn die Dateien nun leicht überdimensioniert aussehen. :wink:
Die Auswahl des Sensors erfolgt jetzt nicht mehr über einbetten der jeweiligen Datei, sondern über ein define in der Sensor.h
Edit: hat leider doch nicht so funktioniert wie ich eigentlich wollte. Hab die Sensorauswahl jetzt erstmal rausgenommen .. solangs funktioniert... :wink:
Die version wie sie im Anhang ist greift jetzt immer nur auf die 9 DOF variante zu, wenn das reicht ists ok, wenn du die 6dof variante brauchst, mussts dir halt entsprechend umkopieren.

Quad08V2.zip (54 KB)

Hey,
hoffentlich ist bald Feierabend :slight_smile: damit ich das versuchen kann. Schon mal vielen Dank für die Mühe.

LGW

Also nochmal drübergeguckt, also an der Library konnts nicht liegen (hab die getrennt mal getestet und so lief sie ja ohne Probleme), sondern musste irgendwie ne Wechselwirkung mit deinem Code sein, deswegen nochmal drübergeschaut. Hab deine Klasse leicht modifiziert und die ganzen globalen Variablen mit in die Klasse gezogen und erstmal im Public gesetzt, kA welche du davon wirklich public brauchst. Hab jetzt erstmal alles in die Sensor.h gepackt. die Cpp kannste erstmal rausnehmen. Alle anderen Dateien kannste so lassen, wie du sie hier veröffentlich hast.

Sensor.h :

// Sensor.h

#ifndef _SENSOR_h
#define _SENSOR_h

#if defined(ARDUINO) && ARDUINO >= 100
	#include "Arduino.h"
#else
	#include "WProgram.h"
#endif

#ifdef __AVR_ATmega2560__

	#endif

#ifdef __AVR_ATmega328P__

	#endif

#include "Wire.h"
#include "I2Cdev.h"
#include "helper_3dmath.h"
#include "MPU6050_9Axis_MotionApps41.h"
//#include <BMP085.h>
//#include <HMC5883L.h>
//#include <PID_v1.h>


volatile bool mpuInterrupt = false;
bool dmpReady= false;

void dmpDataReady() {
mpuInterrupt = true;
}

class Sensor
{
  
 public:
 
  MPU6050 mpu;


  uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
  uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
  uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
  uint16_t fifoCount;     // count of all bytes currently in FIFO
  uint8_t fifoBuffer[64]; // FIFO storage buffer
  
  float temperature;	///< Data from Barometer 
  float pressure;
  float altitude;	
  float heading;
  float degrees;		/// Data from compass
  
  // orientation/motion vars
  Quaternion q;           // [w, x, y, z]         quaternion container
  VectorFloat gravity;    // [x, y, z]            gravity vector
  float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
  

  //Funktionen
  Sensor();
  void init();


private:

}; 


Sensor::Sensor()
{
}

void Sensor::init()
{
         mpu.initialize();
	Serial.println(F("Initializing DMP..."));		 // load and configure the DMP
        devStatus = mpu.dmpInitialize();

	if (devStatus == 0) // make sure it worked (returns 0 if so) turn on the DMP, now that it's ready
	{																
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);
        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
		pinMode(2, INPUT_PULLUP);
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;       
        packetSize = mpu.dmpGetFIFOPacketSize();	     // get expected DMP packet size for later comparison
    } 
		else
	{
        // ERROR!                     
        Serial.print(F("DMP Initialization failed (code "));	// 1 = initial memory load failed
        Serial.print(devStatus);								// 2 = DMP configuration updates failed
        Serial.println(F(")"));									// (if it's going to break, usually the code will be 1)		
    }
}

Sensor SENSOR1;
#endif

EDIT: Also ich hab das übrigens aus dem Grund so gemacht, weil ich auf dem Weg so ähnlich ein Problem gelöst hab und mit dem ganzen EXTERN Gedöns nichts anfangen kann und lieber auf dem bekannten Weg geblieben bin. Hat jetzt auch den Vorteil, dass du nicht soviele globalen Variablen hast und alle über die Sensorklasse ansprechen kannst. Vielleicht kann ja einer der Programmierexperten uns aufklären, woran das lag, dass es mit der externen Klasse nicht funktioniert hat.

Hallo,
nun habe ich 2 Helfer. Bitte gebt mir etwas Zeit das umzusetzten. Der Tipp von MaFu hat erwartungsgemäß funtioniert. Als ich aber zum Testen den BMP085 inkludiert habe, kam der Fehler "pow" nicht gefunden. Was "pow" ist weiss ich.
Bis gleich

Kurze Zwischenfrage. Wenn ich "Projekt/Add Arduino Lib/cor/xxx" eine Lib inkludiere, wird diese in der *ino Datei mit <> angezeigt. Wenn ich das mache heißt es:

Compiling 'Quad08' for 'Arduino Mega 2560 or Mega ADK'
Quad08.ino : In file included from
BMP085.h : expected `)' before 'address'
BMP085.h : 'int16_t' does not name a type
etc.
In Hochkommata:
Compiling 'Quad08' for 'Arduino Mega 2560 or Mega ADK'
Quad08.ino : In file included from
Sensor.h : No such file or directory
Quad08.ino : In file included from
Sensor.h : 'BMP085' does not name a type

und die Definition wird nicht angezeigt. Heißt für mich, nicht inkludiert.

Das BMP085 example funktioniert.

Wenn ich die beiden Dateien ins Projekt kopiere:

....
BMP085.cpp : expected )' before numeric constant BMP085.cpp : expected )' before ';' token
BMP085.cpp : : In member function 'float BMP085::getAltitude(float, float)':
BMP085.cpp : 'pow' was not declared in this scope
Error compiling

Ich werde mich jetzt an Nusseckes Vorschlag machen. Ich denke, beide Vorschläge zusammnen bringen die Lösung.

LGW

Zum Thema include .. hatte jetzt auch öfters Probleme, wenn ichs so <> eingebettet habe. Sobald ich die Kollegen gegen "" getauscht hatte gabs keine Probleme mehr.

Aber gut gemeinter Rat: Bevor du jetzt hier gleich wieder 20000000 Sensoren auf einmal reinballerst und dein Code dadurch bestimmt nicht übersichtlicher wirst, versuch erstmal jeden Sensor alleine zum laufen zu bekommen. Ist A) Übersichtlicher und B) findest du schneller den Fehler

Werde Deinen Rat mit Sicherheit befolgen.
Ergebniss, es läuft. Ich habe nur die Sache mit dem "weglassen" der *.cpp nicht verstanden.

Ich habe damit gemeint, dass schon der gesamte Code der Klasse in der von mir dargestellten Sensor.h enthalten ist. Damit benötigst du die Sensor.cpp nicht, weil die in diesem Fall keinen Inhalt hätte.
Zusammengefasst bei dir war: .h -> Definition; .cpp -> Funktionen detailliert .. bei mir .h komplette Klassendefinition + FUnktionen detailliert.
Ist natürlich nicht sonderlich übersichtlich mit nur einer Datei, aber wollte beim Testen nicht zwischen zwei Dateien hin und herwechseln.
Aber egal. Solangs läuft ist alles gut :smiley:

Ich habe (hoffentlich) alle Tipps berücksichtigt. Ich belasse erst einmal die MPU6050 relevanten Teile in der *.ino Datei. Im setup wird initialisiert und in der loop die MPU-Werte augelesen. Alles läuft so wie ich es erwarte habe. Auch die anderen Klassen arbeiten so wie sie sollen. Ist vielleicht nicht so elegant, aber wayne interessiert´s :P.
Die Sache mit dem includieren <> oder " " ist abes schon seltsam. In der *.ino mit <>, und in der Klasse in der die Lib verwendet wir nochmal mit " ".

Nochmals vielen Dank an alle. Wenn ich wieder Fragen habe, werde ich in diesem Threat fortfahren.

Gruß
Willi

Ich hol das mal wieder hoch, weil Frage vorweg:

Hat es von euch schon mal jemand geschafft einen 6050 mit 5883 in der Art zu kombinieren, das der 6050 die Daten des 5883 liest und mit berechnet ?

Mit Jeff Rowberg's MPU6050_DMP6.ino sieht das ja mit einem 6050 allein schon sehr gut aus. (Probiert)
Irgendwo hab ich mal bei der vielen rumkugelei gelesen, dass es mit der MPU6050_9Axis_MotionApps41.h und einer kleinen "Adaptierung" darin auf mit dem 5583 funktioniert, so das der Wert 0 unabhängig von der Initialisierungslage immer Norden entspricht.

TERWI:
Ich hol das mal wieder hoch, weil Frage vorweg:

Hat es von euch schon mal jemand geschafft einen 6050 mit 5883 in der Art zu kombinieren, das der 6050 die Daten des 5883 liest und mit berechnet ?

Mit Jeff Rowberg's MPU6050_DMP6.ino sieht das ja mit einem 6050 allein schon sehr gut aus. (Probiert)
Irgendwo hab ich mal bei der vielen rumkugelei gelesen, dass es mit der MPU6050_9Axis_MotionApps41.h und einer kleinen "Adaptierung" darin auf mit dem 5583 funktioniert, so das der Wert 0 unabhängig von der Initialisierungslage immer Norden entspricht.

Ich nutze die Flyduino 9DOF IMU, da ist der 5883 schon mit drauf. Zählt auch, da ja auch nur über I2C verbunden.
Und mit der FreeIMU Lib, die ich in diesem Thread schon ein paar mal erwähnt habe, werden automatisch alle Sensoren verwendet. Funktioniert einwandfrei ohne Aufwand und es muss nichts "adaptiert" werden.

Die Frage ist für mich, ob die Berechnungen von Accel/Gyro zu Magno extern erfolgen müssen (FreeIMU macht das ?) oder ob das alles ala "All In Wonder" übder die DMU des 6050 erfolgen kann !?
Der 9150 z.B. ist nicht s anders als ein 6050 mit Magnetometer - nur werden da die Werte des Magno's mit eingelesen und gleich in einem Rutsch brechnet.
Vorteil der ganzen Sache wäre/ist, das dir die Hardware gleich alles passend berechnet und man den Dino nicht für diesen Kram strapazieren muss !

Hier steht was interessantes zu dem Thema 5883 in 6050 einbinden:

Allerdings bleibt eine konkrete Lösung offen - nur der Ansatz ist da.
Werde mich dem mal in den nächsten Tagen widmen.

Ich denke, ich kann hier nicht viel helfen. Nur soviel, dass ich auch mit der "MPU6050_9Axis_MotionApps41.h" in Verbindung mit dem "HMC5883L.h" arbeite. Die Kompasswerte sind zwar nicht 0 für Nord, aber reproduzierbar. Dauert ca 10 sec. Siehe Bild. Meinstest Du das mit Adaption bzw. Offset? Ich hätte auch gedacht, dass eine Achse des Bauteils in Nord/Süd Richtung zeigt.

Ich habe aber in diesem Zusammenhang eine andere Frage. Ich versuche immeIch denke, ich kann hier nicht viel helfen. Nur soviel, dass ich auch mit der "MPU6050_9Axis_MotionApps41.h" in Verbindung mit dem "HMC5883L.h" arbeite. Die Kompasswerte sind zwar nicht 0 für Nord, aber reproduzierbar. Dauert ca 10 sec. Siehe Bild. Meintest Du das mit Adaption bzw. Offset? Ich hätte auch gedacht, dass eine Achse des Bauteils in Nord/Süd Richtung zeigt.
Die FreeIMU Sache habe ich ad acta gelegt.

Ich habe aber in diesem Zusammenhang eine andere Frage. Ich versuche immer wieder die MPU-Daten-Erfassung in einem Modul unterzubringen. Schon viel Stunden versucht, immer mit dem Erfolg, dass irgendwann der Compiler mit Fehlermeldungen um sich wirft. Aktuell befindet sich dieser Part in der Startdatei (*.ino).
Ich möchte diesen Part aber in ein anderes Programmmodul verlegen. Hat da jemand einen Tipp?

Hier mein Ansatz;

//Standard classes
#include <Servo.h>
#include <Brushless.h>
#include <Metro.h>
#include <PID_v1.h>
#include <HMC5883L.h>
#include <MPU6050_9Axis_MotionApps41.h>
#include <helper_3dmath.h>
#include <I2Cdev.h>
#include <BMP085.h>
#include <Streaming.h>
#include <Base64.h>
#include <CmdMessenger.h>
#include <Wire.h>

//Owen classes
#include "Center.h"

#define LED_PIN	13

MPU6050	mpu;

//-------------------- MPU6050 Parts-------------------------------------------------------------------------

uint8_t fifoBuffer[64];
bool dmpReady;
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
Quaternion q;           // [w, x, y, z]         quaternion container
VectorFloat gravity;    // [x, y, z]            gravity vector
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
//-------------------- MPU6050 Parts Ende -------------------------------------------------------------------

bool blinkState = false;

//-----------------------------------------------------------------------------------------------------------
volatile bool mpuInterrupt = false;
void dmpDataReady() {
    mpuInterrupt = true;
}

//-----------------------------------------------------------------------------------------------------------
void setup()
{
    Wire.begin();
    Serial.begin(115200);
	Serial3.begin(9600);
	Serial.println("**************************");
	Serial.println("*         Quad102        *");
	Serial.print  ("*  ");Serial.print(__DATE__);Serial.print(" ");Serial.print(__TIME__);Serial.println("  *");
	Serial.println("**************************");

	Serial.flush();   
    pinMode(LED_PIN, OUTPUT);// configure LED for output
	Serial3.println("Bluetooth OK");

	CENTER.init();

//-------------------- MPU6050 Parts-------------------------------------------------------------------------
	Serial.println(F("Initializing MPU6050 devices..."));
	mpu.initialize();

    Serial.println(F("Testing MPU6050 connections..."));
    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

    // wait for ready
    Serial.println(F("\nSend any character to begin DMP programming and demo: "));
    //while (Serial.available() && Serial.read()); // empty buffer
    //while (!Serial.available());                 // wait for data
    //while (Serial.available() && Serial.read()); // empty buffer again

	Serial.println(F("Initializing DMP..."));		 // load and configure the DMP
    devStatus = mpu.dmpInitialize();

	if (devStatus == 0) 
	{				// make sure it worked (returns 0 if so)
												// turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);
        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
		pinMode(2, INPUT_PULLUP);
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();
        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;       
        packetSize = mpu.dmpGetFIFOPacketSize();	     // get expected DMP packet size for later comparison
    } 
	else
	{
        // ERROR!                     
        Serial.print(F("DMP Initialization failed (code "));	// 1 = initial memory load failed
        Serial.print(devStatus);								// 2 = DMP configuration updates failed
        Serial.println(F(")"));									// (if it's going to break, usually the code will be 1)		
    }
//-------------------- MPU6050 Parts Ende -------------------------------------------------------------------
Serial.println("Setup done !");
}
//-----------------------------------------------------------------------------------------------------------
void loop()
{
//-------------------- MPU6050 Parts-------------------------------------------------------------------------
	if (!dmpReady) return;		 // if programming failed, don't try to do anything
    while (!mpuInterrupt && fifoCount < packetSize) {
        // other program behavior stuff here
    }

	mpuInterrupt = false;			// reset interrupt flag and get INT_STATUS byte
    mpuIntStatus = mpu.getIntStatus();   
    fifoCount = mpu.getFIFOCount();				 // get current FIFO count

    if ((mpuIntStatus & 0x10) || fifoCount == 1024) 
	{       
        mpu.resetFIFO();		// reset so we can continue cleanly
        Serial.println(F("FIFO overflow!"));
    } 
	else if (mpuIntStatus & 0x02) 
	{
        while (fifoCount < packetSize) 
			fifoCount = mpu.getFIFOCount();
        
        mpu.getFIFOBytes(fifoBuffer, packetSize);	// read a packet from FIFO
        fifoCount -= packetSize;       
        mpu.dmpGetQuaternion(&q, fifoBuffer);	// display Euler angles in degrees
        mpu.dmpGetGravity(&gravity, &q);
        mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
		
#ifdef OUTPUT_YPR                                   /// Only for debug
		Serial.print("OUTPUT_YPR#");
		Serial.print(ypr[0] * 180/M_PI);
		Serial.print("#");
		Serial.print(ypr[1] * 180/M_PI);
		Serial.print("#");
		Serial.println(ypr[2] * 180/M_PI);
		Serial.flush();
#endif

	CENTER.getMPUdata(ypr, MPUITEM);   <---- Hier werden die Daten an das CENTER-Mudul weitergegeben.
	}
//-------------------- MPU6050 Parts Ende -------------------------------------------------------------------	

	CENTER.doWork();	

	// blink LED to indicate activity
	blinkState = !blinkState;
	digitalWrite(LED_PIN, blinkState);		

}
//-----------------------------------------------------------------------------------------------------------

LG
Willi

Warum so aufwendig ?
Ich verwende hier alle diesbezüglichen LIBs von Jeff Rowberg.
Das wäre die I2Cdev, MPU6050, HM5883, BMP085.
Da lassen sich alle Demo's problemlos und auf Anhieb kompilieren und sie funktionieren auch !

Hast du dir mal die Demo MPU6050_DMP6.ino aus der MPU6050-Lib angesehen ?
Die arbeitet mit der MPU6050_6Axis_MotionApps20.h und bringt bereits astrein stabile Werte für den 6050.
Allerdings ohne besagten Kompassbezug und "0" ist eben grade da, so wie das Teil beim initialisieren stand/lag.

Das wäre dann ja eben der Trick mit der MPU6050_9Axis_MotionApps41.h !
Die bezieht sich jedoch schon auf den Nachfolger 9150 - ein 6050 mit eingebautem Kompass AK8975.
Selbiger hat allerdings andere Adressen ....

Deshalb fand nicht nur ich den Ansatz aus dem "Issue-Posting" schon ganz hervorragend !
Denn wenn man das kombiniert bekommt, macht die DMU des 6050 die ganze Rechenarbeit und man hat dann einen richtigen, Tilt-Kompensierten Kompass.
Dafür ist das Teil ja eben genau gemacht.

Man kann das logo auch zu Fuß machen wie hier z.B.:
https://www.loveelectronics.co.uk/Tutorials/13/tilt-compensated-compass-arduino-tutorial
Das funzt logo auch, aber der arme Dino muss da schon etwas mehr rechnen.

Und eben das will ich bei meinem Heli-Projekt eben vermeiden. Der Mega hat da schon genu zu tun....

Hallo,
habe ich das richtig verstanden? Die MPU6050_9Axis_MotionApps41.h arbeitet nicht mit dem MPU6050 + HM5883 zusammen?
Ich verwende die LIBs von Jeff Rowberg. Die Demos sind auch OK. Ich dachte nur, dass man mit der ..9Axis.. den Kompass mit betreiben könnte. Dein Hinweis "besagten Kompassbezug und "0" ist eben grade da, so wie das Teil beim initialisieren stand/lag" war geradezu Gold wert. Danke. :slight_smile: :slight_smile:

Vielleicht gibt es ja noch so einen Tipp zu der Frage "verschieben in ein anders Programm-Modul". :wink:

LG
Willi

P.S. Der Titel könnte bei mir Programm sein. :cold_sweat: