Pages: 1 ... 3 4 [5] 6   Go Down
Author Topic: Dumme Frage zum Gyro MPU-6050  (Read 13577 times)
0 Members and 2 Guests are viewing this topic.
Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 2
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin
Logged

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-razz.
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
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 7
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

To young to die - never to old for rock'n roll

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

_______
Manfred

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 7
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !
Logged

To young to die - never to old for rock'n roll

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 7
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier steht was interessantes zu dem Thema 5883 in 6050 einbinden:
https://github.com/jrowberg/i2cdevlib/issues/18
Allerdings bleibt eine konkrete Lösung offen - nur der Ansatz ist da.
Werde mich dem mal in den nächsten Tagen widmen.
Logged

To young to die - never to old for rock'n roll

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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;

Code:
//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


* IMG_0570.JPG (2279.82 KB, 3264x2448 - viewed 58 times.)
Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 7
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

To young to die - never to old for rock'n roll

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley smiley

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

LG
Willi

P.S. Der Titel könnte bei mir Programm sein. smiley-roll-sweat

Logged

D-49565 Bramsche
Offline Offline
Sr. Member
****
Karma: 7
Posts: 477
Geht nich ? Gipp's nich !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... leider eben nicht.
Deshalb sagte ich ja: Mal hier schauen, da gibt es einen guten Ansatz (oder gar gelöst ?).
https://github.com/jrowberg/i2cdevlib/issues/18

An "so was" wie Programm-Modulen fummle ich auch grade für mein"HELUINO" Projekt. Denn allmählich aber sicher wirds mit einem Shetch arg unübersichtlich. Geht dir wahrscheinlich ähnlich...  smiley-twist
Logged

To young to die - never to old for rock'n roll

Leverkusen
Offline Offline
Sr. Member
****
Karma: 4
Posts: 333
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey,
1. ich glaube ich bestelle mir beim Chinamann einen 9DOF zum testen. Sind dort erschwinglich.
2. das ist der Grund für die Frage mir dem Auslagern der MPU-Messung in mein Modul "Sensor".

LG
Willi
Logged

Pages: 1 ... 3 4 [5] 6   Go Up
Jump to: