This is lab2 of 4180 dealing with the extra parts kit.

Dependencies:   mbed LSM9DS1_Library_cal

Committer:
jbaker66
Date:
Mon Feb 15 15:40:30 2016 +0000
Revision:
8:ac38b8f1190d
Parent:
7:ef9f3c067efd
Added IMU code to be tested [JB]

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jesse Baker 2:4401fc907d45 1 // <- remove this if you want to code this and comment Georges
Jesse Baker 2:4401fc907d45 2 #include "mbed.h"
jbaker66 8:ac38b8f1190d 3 #include "LSM9DS1.h"
jbaker66 8:ac38b8f1190d 4 #define PI 3.14159
jbaker66 4:1443e98048a6 5 // --------------------------------------------------------------------------------
Jesse Baker 2:4401fc907d45 6
jbaker66 4:1443e98048a6 7 //// AnalogOut sine wave complete
jbaker66 4:1443e98048a6 8 //AnalogOut aout(p18);
jbaker66 4:1443e98048a6 9 //
jbaker66 4:1443e98048a6 10 //int main(){
jbaker66 4:1443e98048a6 11 // const double pi = 3.141592653589793238462;
jbaker66 4:1443e98048a6 12 // const double amplitude = 1;
jbaker66 4:1443e98048a6 13 // const double offset = 65535/2;
jbaker66 4:1443e98048a6 14 // double rads = 0.0;
jbaker66 4:1443e98048a6 15 // uint16_t sample = 0;
Jesse Baker 5:d3dfaed9fd93 16 //
jbaker66 4:1443e98048a6 17 // while(1){
jbaker66 4:1443e98048a6 18 // // sinewave output
jbaker66 4:1443e98048a6 19 // for (int i = 0; i < 360; i++) {
jbaker66 4:1443e98048a6 20 // rads = (pi * i) / 180.0f;
jbaker66 4:1443e98048a6 21 // sample = (uint16_t)(amplitude * (offset * (cos(rads + pi))) + offset);
jbaker66 4:1443e98048a6 22 // aout.write_u16(sample);
jbaker66 4:1443e98048a6 23 // }
jbaker66 4:1443e98048a6 24 // }
jbaker66 4:1443e98048a6 25 //}
jbaker66 4:1443e98048a6 26 // --------------------------------------------------------------------------------
jbaker66 3:8e9172f7d119 27
jbaker66 7:ef9f3c067efd 28 //// Sharp IR sensor complete
jbaker66 7:ef9f3c067efd 29 //
jbaker66 7:ef9f3c067efd 30 //Serial pc(USBTX, USBRX);
jbaker66 7:ef9f3c067efd 31 //
jbaker66 7:ef9f3c067efd 32 //AnalogIn sensor(p15);
jbaker66 7:ef9f3c067efd 33 //DigitalOut led1(LED1);
jbaker66 7:ef9f3c067efd 34 //DigitalOut led2(LED2);
jbaker66 7:ef9f3c067efd 35 //DigitalOut led3(LED3);
jbaker66 7:ef9f3c067efd 36 //DigitalOut led4(LED4);
jbaker66 7:ef9f3c067efd 37 //
jbaker66 7:ef9f3c067efd 38 //int main(){
jbaker66 7:ef9f3c067efd 39 // while(1){
jbaker66 7:ef9f3c067efd 40 //
jbaker66 7:ef9f3c067efd 41 // if(sensor > 0.61){
jbaker66 7:ef9f3c067efd 42 // led1 = 1;
jbaker66 7:ef9f3c067efd 43 // led2 = 1;
jbaker66 7:ef9f3c067efd 44 // led3 = 1;
jbaker66 7:ef9f3c067efd 45 // led4 = 1;
jbaker66 7:ef9f3c067efd 46 // }
jbaker66 7:ef9f3c067efd 47 // else if(sensor > 0.46){
jbaker66 7:ef9f3c067efd 48 // led1 = 1;
jbaker66 7:ef9f3c067efd 49 // led2 = 1;
jbaker66 7:ef9f3c067efd 50 // led3 = 1;
jbaker66 7:ef9f3c067efd 51 // led4 = 0;
jbaker66 7:ef9f3c067efd 52 // }
jbaker66 7:ef9f3c067efd 53 // else if(sensor > 0.30){
jbaker66 7:ef9f3c067efd 54 // led1 = 1;
jbaker66 7:ef9f3c067efd 55 // led2 = 1;
jbaker66 7:ef9f3c067efd 56 // led3 = 0;
jbaker66 7:ef9f3c067efd 57 // led4 = 0;
jbaker66 7:ef9f3c067efd 58 // }
jbaker66 7:ef9f3c067efd 59 // else if(sensor > 0.15){
jbaker66 7:ef9f3c067efd 60 // led1 = 1;
jbaker66 7:ef9f3c067efd 61 // led2 = 0;
jbaker66 7:ef9f3c067efd 62 // led3 = 0;
jbaker66 7:ef9f3c067efd 63 // led4 = 0;
jbaker66 7:ef9f3c067efd 64 // }
jbaker66 7:ef9f3c067efd 65 // else{
jbaker66 7:ef9f3c067efd 66 // led1 = 0;
jbaker66 7:ef9f3c067efd 67 // led2 = 0;
jbaker66 7:ef9f3c067efd 68 // led3 = 0;
jbaker66 7:ef9f3c067efd 69 // led4 = 0;
jbaker66 7:ef9f3c067efd 70 // }
jbaker66 7:ef9f3c067efd 71 //
jbaker66 7:ef9f3c067efd 72 //// pc.printf("%f\n", sensor.read());
jbaker66 7:ef9f3c067efd 73 //// wait(.5);
jbaker66 7:ef9f3c067efd 74 // }
jbaker66 7:ef9f3c067efd 75 //}
jbaker66 7:ef9f3c067efd 76 // --------------------------------------------------------------------------------
Jesse Baker 5:d3dfaed9fd93 77
jbaker66 8:ac38b8f1190d 78 // I2C Bus and USB Virtual Com Port
jbaker66 8:ac38b8f1190d 79
jbaker66 8:ac38b8f1190d 80 // Earth's magnetic field varies by location. Add or subtract
jbaker66 8:ac38b8f1190d 81 // a declination to get a more accurate heading. Calculate
jbaker66 8:ac38b8f1190d 82 // your's here:
jbaker66 8:ac38b8f1190d 83 // http://www.ngdc.noaa.gov/geomag-web/#declination
jbaker66 8:ac38b8f1190d 84 #define DECLINATION -4.94 // Declination (degrees) in Atlanta,GA.
jbaker66 8:ac38b8f1190d 85
jbaker66 8:ac38b8f1190d 86 DigitalOut myled(LED1);
jbaker66 8:ac38b8f1190d 87 Serial pc(USBTX, USBRX);
jbaker66 8:ac38b8f1190d 88 // Calculate pitch, roll, and heading.
jbaker66 8:ac38b8f1190d 89 // Pitch/roll calculations taken from this app note:
jbaker66 8:ac38b8f1190d 90 // http://cache.freescale.com/files/sensors/doc/app_note/AN3461.pdf?fpsp=1
jbaker66 8:ac38b8f1190d 91 // Heading calculations taken from this app note:
jbaker66 8:ac38b8f1190d 92 // http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/Magnetic__Literature_Application_notes-documents/AN203_Compass_Heading_Using_Magnetometers.pdf
jbaker66 8:ac38b8f1190d 93 void printAttitude(float ax, float ay, float az, float mx, float my, float mz)
jbaker66 8:ac38b8f1190d 94 {
jbaker66 8:ac38b8f1190d 95 float roll = atan2(ay, az);
jbaker66 8:ac38b8f1190d 96 float pitch = atan2(-ax, sqrt(ay * ay + az * az));
jbaker66 8:ac38b8f1190d 97 // touchy trig stuff to use arctan to get compass heading (scale is 0..360)
jbaker66 8:ac38b8f1190d 98 mx = -mx;
jbaker66 8:ac38b8f1190d 99 float heading;
jbaker66 8:ac38b8f1190d 100 if (my == 0.0)
jbaker66 8:ac38b8f1190d 101 heading = (mx < 0.0) ? 180.0 : 0.0;
jbaker66 8:ac38b8f1190d 102 else
jbaker66 8:ac38b8f1190d 103 heading = atan2(mx, my)*360.0/(2.0*PI);
jbaker66 8:ac38b8f1190d 104 //pc.printf("heading atan=%f \n\r",heading);
jbaker66 8:ac38b8f1190d 105 heading -= DECLINATION; //correct for geo location
jbaker66 8:ac38b8f1190d 106 if(heading>180.0) heading = heading - 360.0;
jbaker66 8:ac38b8f1190d 107 else if(heading<-180.0) heading = 360.0 + heading;
jbaker66 8:ac38b8f1190d 108 else if(heading<0.0) heading = 360.0 + heading;
jbaker66 8:ac38b8f1190d 109
jbaker66 8:ac38b8f1190d 110
jbaker66 8:ac38b8f1190d 111 // Convert everything from radians to degrees:
jbaker66 8:ac38b8f1190d 112 //heading *= 180.0 / PI;
jbaker66 8:ac38b8f1190d 113 pitch *= 180.0 / PI;
jbaker66 8:ac38b8f1190d 114 roll *= 180.0 / PI;
jbaker66 8:ac38b8f1190d 115
jbaker66 8:ac38b8f1190d 116 pc.printf("Pitch: %f, Roll: %f degress\n\r",pitch,roll);
jbaker66 8:ac38b8f1190d 117 pc.printf("Magnetic Heading: %f degress\n\r",heading);
jbaker66 8:ac38b8f1190d 118 }
jbaker66 8:ac38b8f1190d 119
jbaker66 8:ac38b8f1190d 120
jbaker66 8:ac38b8f1190d 121
jbaker66 8:ac38b8f1190d 122
jbaker66 8:ac38b8f1190d 123 int main()
jbaker66 8:ac38b8f1190d 124 {
jbaker66 8:ac38b8f1190d 125 //LSM9DS1 lol(p9, p10, 0x6B, 0x1E);
jbaker66 8:ac38b8f1190d 126 LSM9DS1 IMU(p9, p10, 0xD6, 0x3C);
jbaker66 8:ac38b8f1190d 127 IMU.begin();
jbaker66 8:ac38b8f1190d 128 if (!IMU.begin()) {
jbaker66 8:ac38b8f1190d 129 pc.printf("Failed to communicate with LSM9DS1.\n");
jbaker66 8:ac38b8f1190d 130 }
jbaker66 8:ac38b8f1190d 131 IMU.calibrate(1);
jbaker66 8:ac38b8f1190d 132 IMU.calibrateMag(0);
jbaker66 8:ac38b8f1190d 133 while(1) {
jbaker66 8:ac38b8f1190d 134 while(!IMU.tempAvailable());
jbaker66 8:ac38b8f1190d 135 IMU.readTemp();
jbaker66 8:ac38b8f1190d 136 while(!IMU.magAvailable(X_AXIS));
jbaker66 8:ac38b8f1190d 137 IMU.readMag();
jbaker66 8:ac38b8f1190d 138 while(!IMU.accelAvailable());
jbaker66 8:ac38b8f1190d 139 IMU.readAccel();
jbaker66 8:ac38b8f1190d 140 while(!IMU.gyroAvailable());
jbaker66 8:ac38b8f1190d 141 IMU.readGyro();
jbaker66 8:ac38b8f1190d 142 pc.printf("\nIMU Temperature = %f C\n\r",25.0 + IMU.temperature/16.0);
jbaker66 8:ac38b8f1190d 143 pc.printf(" X axis Y axis Z axis\n\r");
jbaker66 8:ac38b8f1190d 144 pc.printf("gyro: %9f %9f %9f in deg/s\n\r", IMU.calcGyro(IMU.gx), IMU.calcGyro(IMU.gy), IMU.calcGyro(IMU.gz));
jbaker66 8:ac38b8f1190d 145 pc.printf("accel: %9f %9f %9f in Gs\n\r", IMU.calcAccel(IMU.ax), IMU.calcAccel(IMU.ay), IMU.calcAccel(IMU.az));
jbaker66 8:ac38b8f1190d 146 pc.printf("mag: %9f %9f %9f in gauss\n\r", IMU.calcMag(IMU.mx), IMU.calcMag(IMU.my), IMU.calcMag(IMU.mz));
jbaker66 8:ac38b8f1190d 147 printAttitude(IMU.calcAccel(IMU.ax), IMU.calcAccel(IMU.ay), IMU.calcAccel(IMU.az), IMU.calcMag(IMU.mx),
jbaker66 8:ac38b8f1190d 148 IMU.calcMag(IMU.my), IMU.calcMag(IMU.mz));
jbaker66 8:ac38b8f1190d 149 myled = 1;
jbaker66 8:ac38b8f1190d 150 wait(0.5);
jbaker66 8:ac38b8f1190d 151 myled = 0;
jbaker66 8:ac38b8f1190d 152 wait(0.5);
jbaker66 8:ac38b8f1190d 153 }
jbaker66 8:ac38b8f1190d 154 }