Allows for reading accelerometer, gyroscope, and magnetometer data from an LSM9DS0 IMU device

Dependencies:   mbed

Dependents:   uVGA_4180 uLCD_4180_mini ECE4781_Project

Committer:
randrews33
Date:
Sun Jan 11 14:44:43 2015 +0000
Revision:
5:e6a15dcba942
Parent:
4:bf8f4e7c9905
Gave credit where credit was due

Who changed what in which revision?

UserRevisionLine numberNew contents of line
randrews33 5:e6a15dcba942 1 //Most of the Credit goes to jimblom and Judah Okeleye
randrews33 0:1b975a6ae539 2 #include "LSM9DS0.h"
randrews33 0:1b975a6ae539 3 #include "mbed.h"
randrews33 0:1b975a6ae539 4
randrews33 0:1b975a6ae539 5 // SDO_XM and SDO_G are both grounded, so our addresses are:
randrews33 4:bf8f4e7c9905 6 #define LSM9DS0_XM 0x1D // Would be 0x1E if SDO_XM is LOW
randrews33 4:bf8f4e7c9905 7 #define LSM9DS0_G 0x6B // Would be 0x6A if SDO_G is LOW
randrews33 0:1b975a6ae539 8
randrews33 0:1b975a6ae539 9
randrews33 4:bf8f4e7c9905 10 LSM9DS0 dof(p9, p10,LSM9DS0_G, LSM9DS0_XM);
randrews33 0:1b975a6ae539 11 Serial pc(USBTX, USBRX); // tx, rx
randrews33 0:1b975a6ae539 12
randrews33 4:bf8f4e7c9905 13 //Uncomment If you want to use interrupts
randrews33 4:bf8f4e7c9905 14 /*DigitalIn pinDRDYG(p14);
randrews33 4:bf8f4e7c9905 15 DigitalIn pinINTG(p13);
randrews33 4:bf8f4e7c9905 16 DigitalIn pinINT1_XM(p14);
randrews33 4:bf8f4e7c9905 17 DigitalIn pinINT2_XM(p15);*/
randrews33 0:1b975a6ae539 18
randrews33 4:bf8f4e7c9905 19 #define PRINT_CALCULATED
randrews33 4:bf8f4e7c9905 20 #define PRINT_SPEED 500 // 500 ms between prints
randrews33 4:bf8f4e7c9905 21
randrews33 4:bf8f4e7c9905 22 //Init Serial port and LSM9DS0 chip
randrews33 0:1b975a6ae539 23 void setup()
randrews33 0:1b975a6ae539 24 {
randrews33 0:1b975a6ae539 25 pc.baud(115200); // Start serial at 115200 bps
randrews33 0:1b975a6ae539 26 // Use the begin() function to initialize the LSM9DS0 library.
randrews33 0:1b975a6ae539 27 // You can either call it with no parameters (the easy way):
randrews33 0:1b975a6ae539 28 uint16_t status = dof.begin();
randrews33 0:1b975a6ae539 29
randrews33 4:bf8f4e7c9905 30
randrews33 4:bf8f4e7c9905 31 //Make sure communication is working
randrews33 0:1b975a6ae539 32 pc.printf("LSM9DS0 WHO_AM_I's returned: 0x");
randrews33 0:1b975a6ae539 33 pc.printf("%x\n",status);
randrews33 0:1b975a6ae539 34 pc.printf("Should be 0x49D4\n");
randrews33 0:1b975a6ae539 35 pc.printf("\n");
randrews33 0:1b975a6ae539 36 }
randrews33 0:1b975a6ae539 37
randrews33 4:bf8f4e7c9905 38
randrews33 4:bf8f4e7c9905 39 void printGyro()
randrews33 4:bf8f4e7c9905 40 {
randrews33 4:bf8f4e7c9905 41 // To read from the gyroscope, you must first call the
randrews33 4:bf8f4e7c9905 42 // readGyro() function. When this exits, it'll update the
randrews33 4:bf8f4e7c9905 43 // gx, gy, and gz variables with the most current data.
randrews33 0:1b975a6ae539 44
randrews33 4:bf8f4e7c9905 45 //Uncomment code if you plan on using interrupts
randrews33 4:bf8f4e7c9905 46 /*while(pinDRDYG == 0)
randrews33 4:bf8f4e7c9905 47 {
randrews33 4:bf8f4e7c9905 48 ;
randrews33 4:bf8f4e7c9905 49 }*/
randrews33 4:bf8f4e7c9905 50
randrews33 0:1b975a6ae539 51
randrews33 4:bf8f4e7c9905 52 dof.readGyro();
randrews33 4:bf8f4e7c9905 53
randrews33 4:bf8f4e7c9905 54 // Now we can use the gx, gy, and gz variables as we please.
randrews33 4:bf8f4e7c9905 55 // Either print them as raw ADC values, or calculated in DPS.
randrews33 4:bf8f4e7c9905 56 pc.printf("G: ");
randrews33 4:bf8f4e7c9905 57 #ifdef PRINT_CALCULATED
randrews33 4:bf8f4e7c9905 58 // If you want to print calculated values, you can use the
randrews33 4:bf8f4e7c9905 59 // calcGyro helper function to convert a raw ADC value to
randrews33 4:bf8f4e7c9905 60 // DPS. Give the function the value that you want to convert.
randrews33 4:bf8f4e7c9905 61 //pc.printf("The bias: %2f, %2f, %2f \n", dof.gbias[0], dof.gbias[1], dof.gbias[2]);
randrews33 4:bf8f4e7c9905 62 pc.printf("%2f",dof.calcGyro(dof.gx) - dof.gbias[0]);
randrews33 0:1b975a6ae539 63 pc.printf(", ");
randrews33 4:bf8f4e7c9905 64 pc.printf("%2f",dof.calcGyro(dof.gy) - dof.gbias[1]);
randrews33 0:1b975a6ae539 65 pc.printf(", ");
randrews33 4:bf8f4e7c9905 66 pc.printf("%2f\n",dof.calcGyro(dof.gz) - dof.gbias[2]);
randrews33 4:bf8f4e7c9905 67 #elif defined PRINT_RAW
randrews33 4:bf8f4e7c9905 68 pc.printf("%d", dof.gx);
randrews33 4:bf8f4e7c9905 69 pc.printf(", ");
randrews33 4:bf8f4e7c9905 70 pc.printf("%d",dof.gy);
randrews33 4:bf8f4e7c9905 71 pc.printf(", ");
randrews33 4:bf8f4e7c9905 72 pc.printf("%d\n",dof.gz);
randrews33 4:bf8f4e7c9905 73 #endif
randrews33 0:1b975a6ae539 74 }
randrews33 0:1b975a6ae539 75
randrews33 4:bf8f4e7c9905 76 void printAccel()
randrews33 4:bf8f4e7c9905 77 {
randrews33 4:bf8f4e7c9905 78 //Uncomment code if you plan on using interrupts
randrews33 4:bf8f4e7c9905 79 /*while(pinINT1_XM == 0)
randrews33 4:bf8f4e7c9905 80 {
randrews33 4:bf8f4e7c9905 81 ;
randrews33 4:bf8f4e7c9905 82 }*/
randrews33 4:bf8f4e7c9905 83
randrews33 4:bf8f4e7c9905 84
randrews33 0:1b975a6ae539 85 dof.readAccel();
randrews33 0:1b975a6ae539 86
randrews33 4:bf8f4e7c9905 87 // Now we can use the ax, ay, and az variables as we please.
randrews33 4:bf8f4e7c9905 88 // Either print them as raw ADC values, or calculated in g's.
randrews33 0:1b975a6ae539 89 pc.printf("A: ");
randrews33 4:bf8f4e7c9905 90 #ifdef PRINT_CALCULATED
randrews33 4:bf8f4e7c9905 91 // If you want to print calculated values, you can use the
randrews33 4:bf8f4e7c9905 92 // calcAccel helper function to convert a raw ADC value to
randrews33 4:bf8f4e7c9905 93 // g's. Give the function the value that you want to convert.
randrews33 4:bf8f4e7c9905 94 //pc.printf("The bias: %2f, %2f, %2f \n", dof.abias[0], dof.abias[1], dof.abias[2]);
randrews33 4:bf8f4e7c9905 95 pc.printf("%2f",dof.calcAccel(dof.ax) - dof.abias[0]);
randrews33 0:1b975a6ae539 96 pc.printf(", ");
randrews33 4:bf8f4e7c9905 97 pc.printf("%2f",dof.calcAccel(dof.ay) - dof.abias[1]);
randrews33 0:1b975a6ae539 98 pc.printf(", ");
randrews33 4:bf8f4e7c9905 99 pc.printf("%2f\n",dof.calcAccel(dof.az) - dof.abias[2]);
randrews33 4:bf8f4e7c9905 100 #elif defined PRINT_RAW
randrews33 4:bf8f4e7c9905 101 pc.printf("%d",dof.ax);
randrews33 4:bf8f4e7c9905 102 pc.printf(", ");
randrews33 4:bf8f4e7c9905 103 pc.printf("%d",dof.ay);
randrews33 4:bf8f4e7c9905 104 pc.printf(", ");
randrews33 4:bf8f4e7c9905 105 pc.printf("%d\n",dof.az);
randrews33 4:bf8f4e7c9905 106 #endif
randrews33 0:1b975a6ae539 107
randrews33 0:1b975a6ae539 108 }
randrews33 0:1b975a6ae539 109
randrews33 4:bf8f4e7c9905 110 void printMag()
randrews33 4:bf8f4e7c9905 111 {
randrews33 4:bf8f4e7c9905 112 //Uncomment code if you plan on using interrupts
randrews33 4:bf8f4e7c9905 113 /*while(pinINT2_XM == 0)
randrews33 4:bf8f4e7c9905 114 {
randrews33 4:bf8f4e7c9905 115 ;
randrews33 4:bf8f4e7c9905 116 }*/
randrews33 4:bf8f4e7c9905 117
randrews33 4:bf8f4e7c9905 118 // To read from the magnetometer, you must first call the
randrews33 4:bf8f4e7c9905 119 // readMag() function. When this exits, it'll update the
randrews33 4:bf8f4e7c9905 120 // mx, my, and mz variables with the most current data.
randrews33 0:1b975a6ae539 121 dof.readMag();
randrews33 0:1b975a6ae539 122
randrews33 4:bf8f4e7c9905 123 // Now we can use the mx, my, and mz variables as we please.
randrews33 4:bf8f4e7c9905 124 // Either print them as raw ADC values, or calculated in Gauss.
randrews33 0:1b975a6ae539 125 pc.printf("M: ");
randrews33 4:bf8f4e7c9905 126 #ifdef PRINT_CALCULATED
randrews33 4:bf8f4e7c9905 127 // If you want to print calculated values, you can use the
randrews33 4:bf8f4e7c9905 128 // calcMag helper function to convert a raw ADC value to
randrews33 4:bf8f4e7c9905 129 // Gauss. Give the function the value that you want to convert.
randrews33 0:1b975a6ae539 130 pc.printf("%2f",dof.calcMag(dof.mx));
randrews33 0:1b975a6ae539 131 pc.printf(", ");
randrews33 0:1b975a6ae539 132 pc.printf("%2f",dof.calcMag(dof.my));
randrews33 0:1b975a6ae539 133 pc.printf(", ");
randrews33 0:1b975a6ae539 134 pc.printf("%2f\n",dof.calcMag(dof.mz));
randrews33 4:bf8f4e7c9905 135 #elif defined PRINT_RAW
randrews33 4:bf8f4e7c9905 136 pc.printf("%d", dof.mx);
randrews33 4:bf8f4e7c9905 137 pc.printf(", ");
randrews33 4:bf8f4e7c9905 138 pc.printf("%d", dof.my);
randrews33 4:bf8f4e7c9905 139 pc.printf(", ");
randrews33 4:bf8f4e7c9905 140 pc.printf("%d\n", dof.mz);
randrews33 4:bf8f4e7c9905 141 #endif
randrews33 0:1b975a6ae539 142 }
randrews33 0:1b975a6ae539 143
randrews33 4:bf8f4e7c9905 144 void loop()
randrews33 0:1b975a6ae539 145 {
randrews33 4:bf8f4e7c9905 146 printGyro(); // Print "G: gx, gy, gz"
randrews33 4:bf8f4e7c9905 147 printAccel(); // Print "A: ax, ay, az"
randrews33 4:bf8f4e7c9905 148 printMag(); // Print "M: mx, my, mz"
randrews33 4:bf8f4e7c9905 149 wait_ms(PRINT_SPEED);
randrews33 0:1b975a6ae539 150 }
randrews33 0:1b975a6ae539 151
randrews33 0:1b975a6ae539 152
randrews33 0:1b975a6ae539 153 int main()
randrews33 0:1b975a6ae539 154 {
randrews33 4:bf8f4e7c9905 155 setup(); //Setup sensor and Serial
randrews33 4:bf8f4e7c9905 156 pc.printf("Hello World\n");
randrews33 4:bf8f4e7c9905 157
randrews33 0:1b975a6ae539 158 while (true)
randrews33 0:1b975a6ae539 159 {
randrews33 4:bf8f4e7c9905 160 //Calculate bias
randrews33 4:bf8f4e7c9905 161 dof.calLSM9DS0(dof.gbias, dof.abias);
randrews33 4:bf8f4e7c9905 162 //pc.printf("Setup Done\n");
randrews33 4:bf8f4e7c9905 163 loop(); //Get sensor values
randrews33 4:bf8f4e7c9905 164 }
randrews33 0:1b975a6ae539 165 }
randrews33 4:bf8f4e7c9905 166