ECE 4781 Project
Dependencies: LSM9DS0 SDFileSystem mbed
main.cpp@0:ea323e2fa56c, 2015-11-15 (annotated)
- Committer:
- mburtt3
- Date:
- Sun Nov 15 22:16:32 2015 +0000
- Revision:
- 0:ea323e2fa56c
Publishing ECE 4781 Project;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mburtt3 | 0:ea323e2fa56c | 1 | // skeleton code for ECE 2036 thermostat lab |
mburtt3 | 0:ea323e2fa56c | 2 | // code must be added by students |
mburtt3 | 0:ea323e2fa56c | 3 | #include "mbed.h" |
mburtt3 | 0:ea323e2fa56c | 4 | //#include "TMP36.h" |
mburtt3 | 0:ea323e2fa56c | 5 | #include "SDFileSystem.h" |
mburtt3 | 0:ea323e2fa56c | 6 | //#include "TextLCD.h" |
mburtt3 | 0:ea323e2fa56c | 7 | //#include "PinDetect.h" |
mburtt3 | 0:ea323e2fa56c | 8 | //#include "Speaker.h" |
mburtt3 | 0:ea323e2fa56c | 9 | // must add your new class code to the project file Shiftbrite.h |
mburtt3 | 0:ea323e2fa56c | 10 | //#include "Shiftbrite.h" |
mburtt3 | 0:ea323e2fa56c | 11 | #include "LSM9DS0.h" |
mburtt3 | 0:ea323e2fa56c | 12 | #include <cmath> |
mburtt3 | 0:ea323e2fa56c | 13 | |
mburtt3 | 0:ea323e2fa56c | 14 | // use class to setup temperature sensor pins |
mburtt3 | 0:ea323e2fa56c | 15 | //TMP36 myTMP36(p15); //Analog in |
mburtt3 | 0:ea323e2fa56c | 16 | |
mburtt3 | 0:ea323e2fa56c | 17 | // use class to setup microSD card filesystem |
mburtt3 | 0:ea323e2fa56c | 18 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
mburtt3 | 0:ea323e2fa56c | 19 | |
mburtt3 | 0:ea323e2fa56c | 20 | // use class to setup the LCD |
mburtt3 | 0:ea323e2fa56c | 21 | //TextLCD myLCD(p22, p23, p24, p25, p26, p27); // rs, e, d4-d7 |
mburtt3 | 0:ea323e2fa56c | 22 | |
mburtt3 | 0:ea323e2fa56c | 23 | // use class to setup Mbed's four on-board LEDs |
mburtt3 | 0:ea323e2fa56c | 24 | DigitalOut myLED1(LED1); |
mburtt3 | 0:ea323e2fa56c | 25 | DigitalOut myLED2(LED2); |
mburtt3 | 0:ea323e2fa56c | 26 | DigitalOut myLED3(LED3); |
mburtt3 | 0:ea323e2fa56c | 27 | DigitalOut myLED4(LED4); |
mburtt3 | 0:ea323e2fa56c | 28 | |
mburtt3 | 0:ea323e2fa56c | 29 | //also setting any unused analog input pins to digital outputs reduces A/D noise a bit |
mburtt3 | 0:ea323e2fa56c | 30 | //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/ |
mburtt3 | 0:ea323e2fa56c | 31 | DigitalOut P16(p16); |
mburtt3 | 0:ea323e2fa56c | 32 | DigitalOut P17(p17); |
mburtt3 | 0:ea323e2fa56c | 33 | DigitalOut P18(p18); |
mburtt3 | 0:ea323e2fa56c | 34 | DigitalOut P19(p19); |
mburtt3 | 0:ea323e2fa56c | 35 | DigitalOut P20(p20); |
mburtt3 | 0:ea323e2fa56c | 36 | |
mburtt3 | 0:ea323e2fa56c | 37 | //Copied straight from the SDFileSystem_HelloWorld Code |
mburtt3 | 0:ea323e2fa56c | 38 | int main() { |
mburtt3 | 0:ea323e2fa56c | 39 | printf("Hello World!\n"); |
mburtt3 | 0:ea323e2fa56c | 40 | |
mburtt3 | 0:ea323e2fa56c | 41 | mkdir("/sd/mydir", 0777); |
mburtt3 | 0:ea323e2fa56c | 42 | |
mburtt3 | 0:ea323e2fa56c | 43 | FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); |
mburtt3 | 0:ea323e2fa56c | 44 | if(fp == NULL) { |
mburtt3 | 0:ea323e2fa56c | 45 | error("Could not open file for write\n"); |
mburtt3 | 0:ea323e2fa56c | 46 | } |
mburtt3 | 0:ea323e2fa56c | 47 | fprintf(fp, "Hello fun SD Card TEST1"); |
mburtt3 | 0:ea323e2fa56c | 48 | fclose(fp); |
mburtt3 | 0:ea323e2fa56c | 49 | |
mburtt3 | 0:ea323e2fa56c | 50 | printf("Goodbye World!\n"); |
mburtt3 | 0:ea323e2fa56c | 51 | } |
mburtt3 | 0:ea323e2fa56c | 52 | |
mburtt3 | 0:ea323e2fa56c | 53 | // This code is for the IMU and is taken straight from https://developer.mbed.org/users/randrews33/notebook/lsm9ds0-inertial-measurement-unit/ |
mburtt3 | 0:ea323e2fa56c | 54 | // For testing purposes |
mburtt3 | 0:ea323e2fa56c | 55 | // SDO_XM and SDO_G are both grounded, so our addresses are: |
mburtt3 | 0:ea323e2fa56c | 56 | #define LSM9DS0_XM 0x1E // Would be 0x1E if SDO_XM is LOW |
mburtt3 | 0:ea323e2fa56c | 57 | #define LSM9DS0_G 0x6A // Would be 0x6A if SDO_G is LOW |
mburtt3 | 0:ea323e2fa56c | 58 | |
mburtt3 | 0:ea323e2fa56c | 59 | // Create an instance of the LSM9DS0 library called `dof` the |
mburtt3 | 0:ea323e2fa56c | 60 | // parameters for this constructor are: |
mburtt3 | 0:ea323e2fa56c | 61 | // pins,[gyro I2C address],[xm I2C add.] |
mburtt3 | 0:ea323e2fa56c | 62 | LSM9DS0 dof(p28, p27, LSM9DS0_G, LSM9DS0_XM); |
mburtt3 | 0:ea323e2fa56c | 63 | DigitalIn DReady(p23); |
mburtt3 | 0:ea323e2fa56c | 64 | |
mburtt3 | 0:ea323e2fa56c | 65 | Serial pc(USBTX, USBRX); // tx, rx |
mburtt3 | 0:ea323e2fa56c | 66 | |
mburtt3 | 0:ea323e2fa56c | 67 | bool printMag = true; |
mburtt3 | 0:ea323e2fa56c | 68 | bool printAccel = true; |
mburtt3 | 0:ea323e2fa56c | 69 | bool printGyro = true; |
mburtt3 | 0:ea323e2fa56c | 70 | |
mburtt3 | 0:ea323e2fa56c | 71 | void setup() |
mburtt3 | 0:ea323e2fa56c | 72 | { |
mburtt3 | 0:ea323e2fa56c | 73 | pc.baud(115200); // Start serial at 115200 bps |
mburtt3 | 0:ea323e2fa56c | 74 | // Use the begin() function to initialize the LSM9DS0 library. |
mburtt3 | 0:ea323e2fa56c | 75 | // You can either call it with no parameters (the easy way): |
mburtt3 | 0:ea323e2fa56c | 76 | uint16_t status = dof.begin(); |
mburtt3 | 0:ea323e2fa56c | 77 | |
mburtt3 | 0:ea323e2fa56c | 78 | // Or call it with declarations for sensor scales and data rates: |
mburtt3 | 0:ea323e2fa56c | 79 | //uint16_t status = dof.begin(dof.G_SCALE_2000DPS, |
mburtt3 | 0:ea323e2fa56c | 80 | // dof.A_SCALE_6G, dof.M_SCALE_2GS); |
mburtt3 | 0:ea323e2fa56c | 81 | |
mburtt3 | 0:ea323e2fa56c | 82 | // begin() returns a 16-bit value which includes both the gyro |
mburtt3 | 0:ea323e2fa56c | 83 | // and accelerometers WHO_AM_I response. You can check this to |
mburtt3 | 0:ea323e2fa56c | 84 | // make sure communication was successful. |
mburtt3 | 0:ea323e2fa56c | 85 | pc.printf("LSM9DS0 WHO_AM_I's returned: 0x"); |
mburtt3 | 0:ea323e2fa56c | 86 | pc.printf("%x\n",status); |
mburtt3 | 0:ea323e2fa56c | 87 | pc.printf("Should be 0x49D4\n"); |
mburtt3 | 0:ea323e2fa56c | 88 | pc.printf("\n"); |
mburtt3 | 0:ea323e2fa56c | 89 | } |
mburtt3 | 0:ea323e2fa56c | 90 | |
mburtt3 | 0:ea323e2fa56c | 91 | void printGyro() { |
mburtt3 | 0:ea323e2fa56c | 92 | dof.readGyro(); |
mburtt3 | 0:ea323e2fa56c | 93 | |
mburtt3 | 0:ea323e2fa56c | 94 | pc.printf("G: "); |
mburtt3 | 0:ea323e2fa56c | 95 | |
mburtt3 | 0:ea323e2fa56c | 96 | pc.printf("%2f",dof.calcGyro(dof.gx)); |
mburtt3 | 0:ea323e2fa56c | 97 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 98 | pc.printf("%2f",dof.calcGyro(dof.gy)); |
mburtt3 | 0:ea323e2fa56c | 99 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 100 | pc.printf("%2f\n",dof.calcGyro(dof.gz)); |
mburtt3 | 0:ea323e2fa56c | 101 | } |
mburtt3 | 0:ea323e2fa56c | 102 | |
mburtt3 | 0:ea323e2fa56c | 103 | void printAccel() { |
mburtt3 | 0:ea323e2fa56c | 104 | dof.readAccel(); |
mburtt3 | 0:ea323e2fa56c | 105 | |
mburtt3 | 0:ea323e2fa56c | 106 | pc.printf("A: "); |
mburtt3 | 0:ea323e2fa56c | 107 | |
mburtt3 | 0:ea323e2fa56c | 108 | pc.printf("%2f",dof.calcAccel(dof.ax)); |
mburtt3 | 0:ea323e2fa56c | 109 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 110 | pc.printf("%2f",dof.calcAccel(dof.ay)); |
mburtt3 | 0:ea323e2fa56c | 111 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 112 | pc.printf("%2f\n",dof.calcAccel(dof.az)); |
mburtt3 | 0:ea323e2fa56c | 113 | |
mburtt3 | 0:ea323e2fa56c | 114 | } |
mburtt3 | 0:ea323e2fa56c | 115 | |
mburtt3 | 0:ea323e2fa56c | 116 | void printMag() { |
mburtt3 | 0:ea323e2fa56c | 117 | dof.readMag(); |
mburtt3 | 0:ea323e2fa56c | 118 | |
mburtt3 | 0:ea323e2fa56c | 119 | pc.printf("M: "); |
mburtt3 | 0:ea323e2fa56c | 120 | |
mburtt3 | 0:ea323e2fa56c | 121 | pc.printf("%2f",dof.calcMag(dof.mx)); |
mburtt3 | 0:ea323e2fa56c | 122 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 123 | pc.printf("%2f",dof.calcMag(dof.my)); |
mburtt3 | 0:ea323e2fa56c | 124 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 125 | pc.printf("%2f\n",dof.calcMag(dof.mz)); |
mburtt3 | 0:ea323e2fa56c | 126 | } |
mburtt3 | 0:ea323e2fa56c | 127 | |
mburtt3 | 0:ea323e2fa56c | 128 | // Here's a fun function to calculate your heading, using Earth's |
mburtt3 | 0:ea323e2fa56c | 129 | // magnetic field. |
mburtt3 | 0:ea323e2fa56c | 130 | // It only works if the sensor is flat (z-axis normal to Earth). |
mburtt3 | 0:ea323e2fa56c | 131 | // Additionally, you may need to add or subtract a declination |
mburtt3 | 0:ea323e2fa56c | 132 | // angle to get the heading normalized to your location. |
mburtt3 | 0:ea323e2fa56c | 133 | // See: http://www.ngdc.noaa.gov/geomag/declination.shtml |
mburtt3 | 0:ea323e2fa56c | 134 | void printHeading(float hx, float hy) |
mburtt3 | 0:ea323e2fa56c | 135 | { |
mburtt3 | 0:ea323e2fa56c | 136 | float heading; |
mburtt3 | 0:ea323e2fa56c | 137 | |
mburtt3 | 0:ea323e2fa56c | 138 | if (hy > 0) heading = 90 - (atan(hx / hy) * (180 / 3.14)); |
mburtt3 | 0:ea323e2fa56c | 139 | else if (hy < 0) heading = - (atan(hx / hy) * (180 / 3.14)); |
mburtt3 | 0:ea323e2fa56c | 140 | else // hy = 0 |
mburtt3 | 0:ea323e2fa56c | 141 | { |
mburtt3 | 0:ea323e2fa56c | 142 | if (hx < 0) heading = 180; |
mburtt3 | 0:ea323e2fa56c | 143 | else heading = 0; |
mburtt3 | 0:ea323e2fa56c | 144 | } |
mburtt3 | 0:ea323e2fa56c | 145 | |
mburtt3 | 0:ea323e2fa56c | 146 | pc.printf("Heading: "); |
mburtt3 | 0:ea323e2fa56c | 147 | pc.printf("%2f\n",heading); |
mburtt3 | 0:ea323e2fa56c | 148 | } |
mburtt3 | 0:ea323e2fa56c | 149 | |
mburtt3 | 0:ea323e2fa56c | 150 | // Another fun function that does calculations based on the |
mburtt3 | 0:ea323e2fa56c | 151 | // acclerometer data. This function will print your LSM9DS0's |
mburtt3 | 0:ea323e2fa56c | 152 | // orientation -- it's roll and pitch angles. |
mburtt3 | 0:ea323e2fa56c | 153 | void printOrientation(float x, float y, float z) |
mburtt3 | 0:ea323e2fa56c | 154 | { |
mburtt3 | 0:ea323e2fa56c | 155 | float pitch, roll; |
mburtt3 | 0:ea323e2fa56c | 156 | |
mburtt3 | 0:ea323e2fa56c | 157 | pitch = atan2(x, sqrt(y * y) + (z * z)); |
mburtt3 | 0:ea323e2fa56c | 158 | roll = atan2(y, sqrt(x * x) + (z * z)); |
mburtt3 | 0:ea323e2fa56c | 159 | pitch *= 180.0 / 3.14; |
mburtt3 | 0:ea323e2fa56c | 160 | roll *= 180.0 / 3.14; |
mburtt3 | 0:ea323e2fa56c | 161 | |
mburtt3 | 0:ea323e2fa56c | 162 | pc.printf("Pitch, Roll: "); |
mburtt3 | 0:ea323e2fa56c | 163 | pc.printf("%2f",pitch); |
mburtt3 | 0:ea323e2fa56c | 164 | pc.printf(", "); |
mburtt3 | 0:ea323e2fa56c | 165 | pc.printf("%2f\n",roll); |
mburtt3 | 0:ea323e2fa56c | 166 | } |
mburtt3 | 0:ea323e2fa56c | 167 | |
mburtt3 | 0:ea323e2fa56c | 168 | void readData() { |
mburtt3 | 0:ea323e2fa56c | 169 | // To read from the device, you must first call the |
mburtt3 | 0:ea323e2fa56c | 170 | // readMag(), readAccel(), and readGyro() functions. |
mburtt3 | 0:ea323e2fa56c | 171 | // When this exits, it'll update the appropriate |
mburtt3 | 0:ea323e2fa56c | 172 | // variables ([mx, my, mz], [ax, ay, az], [gx, gy, gz]) |
mburtt3 | 0:ea323e2fa56c | 173 | // with the most current data. |
mburtt3 | 0:ea323e2fa56c | 174 | |
mburtt3 | 0:ea323e2fa56c | 175 | dof.readMag(); |
mburtt3 | 0:ea323e2fa56c | 176 | dof.readAccel(); |
mburtt3 | 0:ea323e2fa56c | 177 | dof.readGyro(); |
mburtt3 | 0:ea323e2fa56c | 178 | } |
mburtt3 | 0:ea323e2fa56c | 179 | |
mburtt3 | 0:ea323e2fa56c | 180 | void loop() { |
mburtt3 | 0:ea323e2fa56c | 181 | // Loop until the Data Ready signal goes high |
mburtt3 | 0:ea323e2fa56c | 182 | while (!Dready) {} |
mburtt3 | 0:ea323e2fa56c | 183 | |
mburtt3 | 0:ea323e2fa56c | 184 | readData(); |
mburtt3 | 0:ea323e2fa56c | 185 | |
mburtt3 | 0:ea323e2fa56c | 186 | if (printGyro) printGyro(); // Print "G: gx, gy, gz" |
mburtt3 | 0:ea323e2fa56c | 187 | if (printAccel) printAccel(); // Print "A: ax, ay, az" |
mburtt3 | 0:ea323e2fa56c | 188 | if (printMag) printMag(); // Print "M: mx, my, mz" |
mburtt3 | 0:ea323e2fa56c | 189 | |
mburtt3 | 0:ea323e2fa56c | 190 | // Print the heading and orientation for fun! |
mburtt3 | 0:ea323e2fa56c | 191 | printHeading((float) dof.mx, (float) dof.my); |
mburtt3 | 0:ea323e2fa56c | 192 | printOrientation(dof.calcAccel(dof.ax), dof.calcAccel(dof.ay), |
mburtt3 | 0:ea323e2fa56c | 193 | dof.calcAccel(dof.az)); |
mburtt3 | 0:ea323e2fa56c | 194 | pc.printf("\n"); |
mburtt3 | 0:ea323e2fa56c | 195 | |
mburtt3 | 0:ea323e2fa56c | 196 | wait(2); |
mburtt3 | 0:ea323e2fa56c | 197 | } |
mburtt3 | 0:ea323e2fa56c | 198 | |
mburtt3 | 0:ea323e2fa56c | 199 | |
mburtt3 | 0:ea323e2fa56c | 200 | int main() |
mburtt3 | 0:ea323e2fa56c | 201 | { |
mburtt3 | 0:ea323e2fa56c | 202 | setup(); |
mburtt3 | 0:ea323e2fa56c | 203 | while (true) |
mburtt3 | 0:ea323e2fa56c | 204 | { |
mburtt3 | 0:ea323e2fa56c | 205 | loop(); |
mburtt3 | 0:ea323e2fa56c | 206 | } |
mburtt3 | 0:ea323e2fa56c | 207 | } |