ECE 4781 Project

Dependencies:   LSM9DS0 SDFileSystem mbed

Committer:
mburtt3
Date:
Sun Nov 15 22:16:32 2015 +0000
Revision:
0:ea323e2fa56c
Publishing ECE 4781 Project;

Who changed what in which revision?

UserRevisionLine numberNew 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 }