Go Down

Topic: Dumme Frage zum Gyro MPU-6050 (Read 14857 times) previous topic - next topic

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.

MaFu


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?
_______
Manfred

MaFu


It works. :)
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:
Code: [Select]
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
_______
Manfred

kucky

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

Ich habe die hierher:
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

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

kucky

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

o_lampe

#50
Jun 15, 2013, 12:21 pm Last Edit: Jun 15, 2013, 12:24 pm by o_lampe Reason: 1
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
It's not my fault when my Posts are full of Errors. This stupid autocorrection from my browser is set up for german grammar.

kucky

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

nussecke

#52
Jun 18, 2013, 05:27 pm Last Edit: Jun 18, 2013, 05:31 pm by nussecke Reason: 1
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.

kucky

Danke für die Antwort. Ich denke das ist das Problem. Werde mich mal herantasten.
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

MaFu


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.
_______
Manfred

kucky


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
Code: [Select]


#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
Code: [Select]

// 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
Code: [Select]


#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 :smiley-roll:

Gruß aus Leverkusen
Willi

nussecke

#57
Jun 21, 2013, 12:51 pm Last Edit: Jun 21, 2013, 01:10 pm by nussecke Reason: 1
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. ;)
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... ;)
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.

kucky

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

LGW

nussecke

#59
Jun 21, 2013, 03:52 pm Last Edit: Jun 21, 2013, 03:59 pm by nussecke Reason: 1
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 :

Code: [Select]
// 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.

Go Up