Test BMA180, HMC5883, ITG3200 sensor on my All_in_one II

Dependencies:   mbed ITG3200 BMA180 HMC5883

Committer:
caroe
Date:
Wed May 30 10:51:50 2012 +0000
Revision:
0:f4e9301d548b

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caroe 0:f4e9301d548b 1 #include "mbed.h"
caroe 0:f4e9301d548b 2 #include "HMC5883.h"
caroe 0:f4e9301d548b 3 #include "BMA180.h"
caroe 0:f4e9301d548b 4 #include "ITG3200.h"
caroe 0:f4e9301d548b 5 Serial pc(USBTX, USBRX);
caroe 0:f4e9301d548b 6
caroe 0:f4e9301d548b 7 DigitalOut l1(LED1);
caroe 0:f4e9301d548b 8 I2C I2CBus(p28, p27);
caroe 0:f4e9301d548b 9 Timer GlobalTime;
caroe 0:f4e9301d548b 10
caroe 0:f4e9301d548b 11 #define PI 3.1415926535897932384626433832795
caroe 0:f4e9301d548b 12 HMC5883 Mag(I2CBus, GlobalTime);
caroe 0:f4e9301d548b 13 BMA180 Acc(I2CBus, GlobalTime);
caroe 0:f4e9301d548b 14 ITG3200 Gyro(I2CBus, GlobalTime);
caroe 0:f4e9301d548b 15
caroe 0:f4e9301d548b 16 int HMC5883_getAngle(float x, float y)
caroe 0:f4e9301d548b 17 {
caroe 0:f4e9301d548b 18 float heading = atan2((float)y,(float)x);
caroe 0:f4e9301d548b 19 // Your mrad result / 1000.00 (to turn it into radians).
caroe 0:f4e9301d548b 20 float declinationAngle = 21.18 / 1000.0;
caroe 0:f4e9301d548b 21 // If you have an EAST declination, use += declinationAngle, if you have a WEST declination, use -= declinationAngle
caroe 0:f4e9301d548b 22 heading += declinationAngle;
caroe 0:f4e9301d548b 23 if(heading < 0) heading += 2*PI;// Correct for when signs are reversed.
caroe 0:f4e9301d548b 24 if(heading > 2*PI) heading -= 2*PI; // Check for wrap due to addition of declination.
caroe 0:f4e9301d548b 25 return(heading * 180/PI); // Convert radians to degrees for readability.
caroe 0:f4e9301d548b 26 }
caroe 0:f4e9301d548b 27
caroe 0:f4e9301d548b 28
caroe 0:f4e9301d548b 29 int main()
caroe 0:f4e9301d548b 30 {
caroe 0:f4e9301d548b 31 pc.baud(115200);
caroe 0:f4e9301d548b 32
caroe 0:f4e9301d548b 33 I2CBus.frequency(400000);
caroe 0:f4e9301d548b 34 GlobalTime.start();
caroe 0:f4e9301d548b 35 //***
caroe 0:f4e9301d548b 36 Acc.Init();
caroe 0:f4e9301d548b 37 wait_ms(500);
caroe 0:f4e9301d548b 38 //0.5 Sekunden kalibrieren
caroe 0:f4e9301d548b 39 //1 g sind ca -2870 auf der 3. Achse
caroe 0:f4e9301d548b 40 short Raw1g[3]= {0, 0, 0}; // -2870
caroe 0:f4e9301d548b 41 Acc.Calibrate(500, Raw1g);
caroe 0:f4e9301d548b 42 //***
caroe 0:f4e9301d548b 43 Gyro.Init();
caroe 0:f4e9301d548b 44 wait_ms(500);
caroe 0:f4e9301d548b 45
caroe 0:f4e9301d548b 46 //0.5 Sekunden kalibrieren
caroe 0:f4e9301d548b 47 Gyro.Calibrate(500);
caroe 0:f4e9301d548b 48 //***
caroe 0:f4e9301d548b 49
caroe 0:f4e9301d548b 50 Mag.Init();
caroe 0:f4e9301d548b 51 #if 1
caroe 0:f4e9301d548b 52 Mag.AutoCalibration= 1; //In Echtzeit kalibrieren
caroe 0:f4e9301d548b 53 #else
caroe 0:f4e9301d548b 54 short MagRawMin[3]= {-400, -400, -400}; //Gespeicherte Werte
caroe 0:f4e9301d548b 55 short MagRawMax[3]= {400, 400, 400};
caroe 0:f4e9301d548b 56 Mag.Calibrate(MagRawMin, MagRawMax);
caroe 0:f4e9301d548b 57 #endif
caroe 0:f4e9301d548b 58
caroe 0:f4e9301d548b 59 while(1)
caroe 0:f4e9301d548b 60 {
caroe 0:f4e9301d548b 61 Mag.Update();
caroe 0:f4e9301d548b 62
caroe 0:f4e9301d548b 63 l1= Mag.MeasurementError;
caroe 0:f4e9301d548b 64 Acc.Update();
caroe 0:f4e9301d548b 65 Gyro.Update();
caroe 0:f4e9301d548b 66
caroe 0:f4e9301d548b 67 pc.printf("Gyro:%.3f %.3f %.3f ",
caroe 0:f4e9301d548b 68 (Gyro.Rate[0]),
caroe 0:f4e9301d548b 69 (Gyro.Rate[1]),
caroe 0:f4e9301d548b 70 (Gyro.Rate[2]));
caroe 0:f4e9301d548b 71
caroe 0:f4e9301d548b 72
caroe 0:f4e9301d548b 73 pc.printf("BMA180:%.3f %.3f %.3f ",
caroe 0:f4e9301d548b 74 (Acc.Acc[0]),
caroe 0:f4e9301d548b 75 (Acc.Acc[1]),
caroe 0:f4e9301d548b 76 (Acc.Acc[2]));
caroe 0:f4e9301d548b 77
caroe 0:f4e9301d548b 78
caroe 0:f4e9301d548b 79
caroe 0:f4e9301d548b 80 // pc.printf("Min: %i %i %i Max: %i %i %i Scale: %.3f %.3f %.3f Offset: %.3i %.3i %.3i Mag: %.3f %.3f %.3f\r\n",
caroe 0:f4e9301d548b 81 /* Mag.RawMin[0], Mag.RawMin[1], Mag.RawMin[2],
caroe 0:f4e9301d548b 82 Mag.RawMax[0], Mag.RawMax[1], Mag.RawMax[2],
caroe 0:f4e9301d548b 83 Mag.Scale[0] , Mag.Scale[1] , Mag.Scale[2],
caroe 0:f4e9301d548b 84 Mag.Offset[0], Mag.Offset[1], Mag.Offset[2],
caroe 0:f4e9301d548b 85 Mag.Mag[0] , Mag.Mag[1] , Mag.Mag[2]);*/
caroe 0:f4e9301d548b 86 printf("grader = %i \n",HMC5883_getAngle(Mag.Mag[0],Mag.Mag[1]));
caroe 0:f4e9301d548b 87
caroe 0:f4e9301d548b 88 wait_ms(20);
caroe 0:f4e9301d548b 89 }
caroe 0:f4e9301d548b 90 }