Ich kann es erst heute probieren. Du machst mir aber Hoffnung.
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
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.
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
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.
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.
Quad08V2.zip (54 KB)
Hey,
hoffentlich ist bald Feierabend 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