Dumme Frage zum Gyro MPU-6050

Ich kann es erst heute probieren. Du machst mir aber Hoffnung.

It works. :slight_smile:
Das würde aber bedeuten, dass man verschiedene Arduino/libraries für einzelne Projekte anlegen muss. Ist aber nicht weiter schlimm, wenn man es weiss.
Danke für eure Hilfe.

LG
Willi

Ich hab herausgefunden, dass sich bei mir die FreeIMU und die dazugehörigen Libraries (aus dem Zip-Archiv) mit der MPU6050 Library nicht vertragen.

erni-berni:
Ich hab herausgefunden, dass sich bei mir die FreeIMU und die dazugehörigen Libraries (aus dem Zip-Archiv) mit der MPU6050 Library nicht vertragen.

Ist aber seltsam. Nachdem die FreeIMU Beispiele ja keine MPU6050 Lib verwenden: wieso kann die dann durch bloßes vorhandensein querschießen?
Von wo ist denn die MPU6050 Lib? Dann probier ich das auch mal aus.
Aber zur Not die Lib einfach weglassen. Nachdem man mit FreeIMU eigentlich alles machen kann braucht man die doch eh nicht. Oder kann die etwas was mit der FreeIMU nicht geht?

kucky:
It works. :slight_smile:
Das würde aber bedeuten, dass man verschiedene Arduino/libraries für einzelne Projekte anlegen muss. Ist aber nicht weiter schlimm, wenn man es weiss.
Danke für eure Hilfe.

LG
Willi

Schau doch mal, ob es mit Deinem alten Arduino Verzeichnis auch geht, wenn Du die MPU6050 Lib weglässt (siehe Post von erni-berni).

Ich hab bei mir im "libraries" Ordner inzwischen doch so einiges stehen und bisher noch nie irgendwelche Querschläger gehabt:

Adafruit_GFX, Adafruit_SSD1306, ADS7846, adxl345driver, Aiko, AltSoftSerial, bma180, bmp085driver, Bounce,
DateTime, DateTimeStrings, DCF77, DebugUtils, dfr_lcd_keypad, DigitalToggle, digitalWriteFast, DS18S20, DS1307,
EasyDriver4, EEPROM, encoder, Esplora, Ethernet, ExactDelay, Firmata, Flash, FlexiTimer2, FreeIMU, GSM, HMC58X3,
I2Cdev, IRremote, itg3200filv05, LCDMenu2, LiquidCrystal, LowPower, Matrix, MeetAndroid, MemoryFree, Menu, MenuBackend,
MI0283QT2, MI0283QT9, MPU60X0, MS561101BA, mSDshield, MsTimer2, MultiStepper, NewPing, OneWire, PololuA4983, QP, RF12,
SD, SDcard, Servo, Servo_785, ShiftPWM, ShiftRegKeypad, ShiftRegLCD, simpleThread, SoftI2CMaster, SoftwareSerial, SPI, Sprite,
Statistic, Stepper, TimerOne, TinyWireM, TinyWireS, Tlc5940, TouchLib, WiFi, Wire

Das versuche ich gleich mal. Ohne MPU6050. Was ist denn mit der MPU6050_9Axis_MotionApps41.h?

Ich habe die hierher:

Das reine FreeIMU funktioniert, so wie MaFu es beschrieben hat. Aber der Luftdrucksensor BMP085 macht wieder einen Fehler, wo auch die I2CDev wieder angezeigt wird. Kann es sein, das an dieser herumgeschraubt wurde? Wird FreeIMU denn noch supported?
Gruß
Willi

Hier die Fehlermeldung, wenn ich nur die BPM085.h includiere

Compiling 'FreeIMU_yaw_pitch_roll' for 'Arduino Mega 2560 or Mega ADK'
BMP085.cpp : : In member function 'bool BMP085::testConnection()':
BMP085.cpp : readByte(uint8_t&, int, uint8_t [2])'
I2Cdev.h : readByte(bool, uint8_t, uint8_t, uint8_t*, uint16_t)
BMP085.cpp : : In member function 'void BMP085::loadCalibration()':
BMP085.cpp : readBytes(uint8_t&, int, int, uint8_t [22])'
I2Cdev.h : readBytes(bool, uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)
BMP085.cpp : : In member function 'uint8_t BMP085::getControl()':
BMP085.cpp : readByte(uint8_t&, int, uint8_t [2])'
I2Cdev.h : readByte(bool, uint8_t, uint8_t, uint8_t*, uint16_t)
BMP085.cpp : : In member function 'void BMP085::setControl(uint8_t)':
BMP085.cpp : writeByte(uint8_t&, int, uint8_t&)'
I2Cdev.h : writeByte(bool, uint8_t, uint8_t, uint8_t)
BMP085.cpp : : In member function 'uint16_t BMP085::getMeasurement2()':
BMP085.cpp : readBytes(uint8_t&, int, int, uint8_t [2])'
I2Cdev.h : readBytes(bool, uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)
BMP085.cpp : : In member function 'uint32_t BMP085::getMeasurement3()':
BMP085.cpp : readBytes(uint8_t&, int, int, uint8_t [2])'
I2Cdev.h : readBytes(bool, uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)
Error compiling

Man muss berücksichtigen, dass die FreeImu-Dateien erst noch angepasst werden müssen.
Da es z.B. verschiedene Boards mit dem MPU6050 Chip gibt und wiederum verschiedene Magnetsensoren.
Daher muss man verschiedene Zeilen // auskommentieren und andere dafür compilierbar machen.

PS: Einige Beispielprogramme verwenden den Interupt-Ausgang vom MPU6050, ausserdem braucht man 'processing' zur visualisierung dr Daten. Wenn auf dem serial Monitor nur kryptisches Zeug kommt, dann mal processing als Empfänger benutzen

Sorry, war ein paar Tage mit testen beschäftigt.

@MaFu: In Deiner Liste fehlen aber die beiden Lib´s Robot_Control und Robot_Motor und die machen bei mir Stress.

Da ich mich selbst an Anfänger bezeichne, werde ich FreeIMU fallen lassen, und mich auf das Original konzentrieren. Ich versuche die MPU6050 Daten in meine Sensor-Classe in integrieren. Bisher immer gescheitert. Wenn ich das richtig verstehe, wird die Interrupt-Routine nicht benötigt. Hat hier jemand einen Tipp, was wohin muss. Bei meinen Versuchen kam zum Schluss immer "...multiple define..." und irgendwie verwiesen diese Meldungen immer auf die "MPU6050_9Axis_MotionApps41.h". Die Lip MPU6050 habe ich nicht inkludiert.

LG
Willi

Also ich hatte auch mal Probleme mit den beiden Robot Librarys. Die sind - soweit ich das mitbekommen hab - nur für die neuen Arduino Roboterbausätze gedacht. Also wenn du die nicht verwendest und Probleme verursachen, würde ich die aus deinem Libraryordner rauslöschen.

Zum Thema "Multiple Define" das passiert entweder, wenn du eine Datei mehrfach einbindest, in denen Variablen / Funktionen / Konstanten etc. ohne #ifndef definiert werden, (auch eventuell in untergeordneten Dateien) oder innerhalb einer Datei etwas mehrfach definierst. Aber ich würde in deinem Fall auf ersteres tippen.

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