IMU står för inertial measurement unit och innebär kort en enhet som känner av riktning, hastighet och gravitationskrafter. De sitter exempelvis i telefoner för att rotera skärmen beroende på i vilken vilken man håller den. De går att köpa från Sparkfun eller om man är sparsam från ebay. De består oftast av chip-kombinationen ITG3205 (gyro), ADXL345 (accellerometer) och HMC5883L (kompass). Att använda varje chip var för sig ger inte speciellt mycket men kombinationen ger desto mer. En video visar detta bättre (dock med en annan IMU):
Det finns tyvärr relativt dålig dokumentation till hur man får igång en IMU i Arduino varför jag här publicerar ett enkelt exempel.
Arduino-bibliotek:
Biblioteket på veresano.net är bra (trots att sidan är rörig). Sök efter FreeIMU library och ladda ner arduino-biblioteket. Flytta allt till libraries i din projektmapp.
Beroende på vilken IMU du har behöver du redigera FreeIMU.h. Leta efter ”Uncomment the appropriated version of FreeIMU you are using”. Jag använder en billig 9 DOF IMU från ebay och valde SEN_10724 eftersom den har samma komponenter. Såhär ser den ut:
Test-program:
#include <ADXL345.h>
#include <HMC58X3.h>
#include <ITG3200.h>
//#include <bma180.h>
#include <MS561101BA.h>
//#define DEBUG
#include "DebugUtils.h"
#include "FreeIMU.h"
//#include "CommunicationUtils.h"
#include <Wire.h>
int raw_values[9];
float ypr[3]; // yaw pitch roll
float val[9];
// Set the FreeIMU object
FreeIMU imu = FreeIMU();
void setup() {
Serial.begin(115200);
Wire.begin();
delay(5);
imu.init(); // the parameter enable or disable fast mode
delay(5);
}
void loop() {
imu.getValues(val);
imu.getYawPitchRoll(ypr);
Serial.print("acc1: ");
Serial.print(val[0]);
Serial.print("\tacc2: ");
Serial.print(val[1]);
Serial.print("\tacc3: ");
Serial.print(val[2]);
Serial.print("\tgyr1: ");
Serial.print(val[3]);
Serial.print("\tgyr2: ");
Serial.print(val[4]);
Serial.print("\tgyr3: ");
Serial.print(val[5]);
Serial.print("\tmag1: ");
Serial.print(val[6]);
Serial.print("\tmag2: ");
Serial.print(val[7]);
Serial.print("\tmag3: ");
Serial.print(val[8]);
Serial.print("\tYaw: ");
Serial.print(ypr[0]);
Serial.print("\tPitch: ");
Serial.print(ypr[1]);
Serial.print("\tRoll: ");
Serial.print(ypr[2]);
Serial.println("");
delay(100);
}






Hej Sebastian,
Great work, är den förlängda Kalmanfiltret du talar om den inbyggda DMP som kommer med InvenSense MPU 6050? Jag vet att nya FreeIMU skepp med MUP 6050.
Också, Jag undrar om du kunde dela visualisering koden.
Tack så mycket,
Fabian
Hello Sebastian,
Jag använder exakt samma ebay IMU ombord och Arduino Nano som du gjorde i ditt exempel, men jag har kämpat med det för 2 dagar att försöka få det att fungera. Jag får sådan hemsk drift att det snurrar som en topp när jag använder Processing 3D kub program. Jag använder de senaste filerna från FreeIMU förvaringsplats för FreeIMU biblioteket, den FreeIMU_GUI kalibreringsverktyget, och Processing 3D kub demo. I FreeIMU.h Jag är också använder SEN_10724 som du gjorde. Har du några idéer om varför jag inte kan få denna sak kalibrerad / arbetar? Jag har faktiskt 2 av IMU chips och båda beter sig på samma sätt. Efter den första frustrerande dag jag bytte till den andra identiska chip för att se om den första skulle ha haft felaktig maskinvara. Problemet måste vara antingen mjukvara eller något jag gör fel i steg. Jag får ganska desperat eftersom jag borde ha haft detta arbete genom idag, så absolut all hjälp du kan ge kommer att vara ett liv sparare!