problem 4 for HW 2

Dependencies:   4DGL-uLCD-SE LSM9DS0 mbed

Committer:
lzzcd001
Date:
Wed Feb 18 14:51:57 2015 +0000
Revision:
0:05e5a0fe0f9d
problem 4 for HW 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lzzcd001 0:05e5a0fe0f9d 1 // LSM9DS90/uLCD Demo
lzzcd001 0:05e5a0fe0f9d 2 // ECE 4180 Lab Code Template
lzzcd001 0:05e5a0fe0f9d 3
lzzcd001 0:05e5a0fe0f9d 4 #include "mbed.h"
lzzcd001 0:05e5a0fe0f9d 5 #include "LSM9DS0.h"
lzzcd001 0:05e5a0fe0f9d 6 #include "uLCD_4DGL.h"
lzzcd001 0:05e5a0fe0f9d 7
lzzcd001 0:05e5a0fe0f9d 8 // uncomment this line to enable the uLCD for Part 4 of the lab
lzzcd001 0:05e5a0fe0f9d 9 #define PART_4
lzzcd001 0:05e5a0fe0f9d 10
lzzcd001 0:05e5a0fe0f9d 11 // SDO_XM and SDO_G are pulled up, so our addresses are:
lzzcd001 0:05e5a0fe0f9d 12 #define LSM9DS0_XM_ADDR 0x1D // Would be 0x1E if SDO_XM is LOW
lzzcd001 0:05e5a0fe0f9d 13 #define LSM9DS0_G_ADDR 0x6B // Would be 0x6A if SDO_G is LOW
lzzcd001 0:05e5a0fe0f9d 14
lzzcd001 0:05e5a0fe0f9d 15 // refresh time. set to 500 for part 2 and 50 for part 4
lzzcd001 0:05e5a0fe0f9d 16 #define REFRESH_TIME_MS 300
lzzcd001 0:05e5a0fe0f9d 17
lzzcd001 0:05e5a0fe0f9d 18 // Verify that the pin assignments below match your breadboard
lzzcd001 0:05e5a0fe0f9d 19 LSM9DS0 imu(p9, p10, LSM9DS0_G_ADDR, LSM9DS0_XM_ADDR);
lzzcd001 0:05e5a0fe0f9d 20 Serial pc(USBTX, USBRX);
lzzcd001 0:05e5a0fe0f9d 21 DigitalIn sw(p18);
lzzcd001 0:05e5a0fe0f9d 22
lzzcd001 0:05e5a0fe0f9d 23 #ifdef PART_4
lzzcd001 0:05e5a0fe0f9d 24 uLCD_4DGL lcd(p28, p27, p30);
lzzcd001 0:05e5a0fe0f9d 25 #endif
lzzcd001 0:05e5a0fe0f9d 26
lzzcd001 0:05e5a0fe0f9d 27 //Init Serial port and LSM9DS0 chip
lzzcd001 0:05e5a0fe0f9d 28 void setup()
lzzcd001 0:05e5a0fe0f9d 29 {
lzzcd001 0:05e5a0fe0f9d 30 #ifdef PART_4
lzzcd001 0:05e5a0fe0f9d 31 lcd.baudrate(3000000);
lzzcd001 0:05e5a0fe0f9d 32 lcd.background_color(0);
lzzcd001 0:05e5a0fe0f9d 33 lcd.cls();
lzzcd001 0:05e5a0fe0f9d 34
lzzcd001 0:05e5a0fe0f9d 35 lcd.printf("Initializing...");
lzzcd001 0:05e5a0fe0f9d 36 #endif
lzzcd001 0:05e5a0fe0f9d 37
lzzcd001 0:05e5a0fe0f9d 38 // Use the begin() function to initialize the LSM9DS0 library.
lzzcd001 0:05e5a0fe0f9d 39 // You can either call it with no parameters (the easy way):
lzzcd001 0:05e5a0fe0f9d 40 uint16_t status = imu.begin();
lzzcd001 0:05e5a0fe0f9d 41
lzzcd001 0:05e5a0fe0f9d 42 //Make sure communication is working
lzzcd001 0:05e5a0fe0f9d 43 pc.printf("LSM9DS0 WHO_AM_I's returned: 0x%X\n", status);
lzzcd001 0:05e5a0fe0f9d 44 pc.printf("Should be 0x49D4\n\n");
lzzcd001 0:05e5a0fe0f9d 45 }
lzzcd001 0:05e5a0fe0f9d 46
lzzcd001 0:05e5a0fe0f9d 47 int main()
lzzcd001 0:05e5a0fe0f9d 48 {
lzzcd001 0:05e5a0fe0f9d 49 setup(); //Setup sensor and Serial
lzzcd001 0:05e5a0fe0f9d 50 pc.printf("------ LSM0DS0 Demo -----------\n");
lzzcd001 0:05e5a0fe0f9d 51 lcd.cls();
lzzcd001 0:05e5a0fe0f9d 52 float prevheading = imu.calcHeading();
lzzcd001 0:05e5a0fe0f9d 53 float pi = 3.14;
lzzcd001 0:05e5a0fe0f9d 54 float prevline_x = 30*cos(prevheading*pi/180) + 64;
lzzcd001 0:05e5a0fe0f9d 55 float prevline_y = 30*sin(prevheading*pi/180) + 64;
lzzcd001 0:05e5a0fe0f9d 56 float prevcirc_x = 64;
lzzcd001 0:05e5a0fe0f9d 57 float prevcirc_y = 64;
lzzcd001 0:05e5a0fe0f9d 58 if (sw == 1) {
lzzcd001 0:05e5a0fe0f9d 59 lcd.line(64,64,prevline_x, prevline_y, BLUE);
lzzcd001 0:05e5a0fe0f9d 60 lcd.circle(64, 64, 30, GREEN);
lzzcd001 0:05e5a0fe0f9d 61 } else {
lzzcd001 0:05e5a0fe0f9d 62 lcd.circle(64, 64, 10, BLUE);
lzzcd001 0:05e5a0fe0f9d 63 }
lzzcd001 0:05e5a0fe0f9d 64 while (true)
lzzcd001 0:05e5a0fe0f9d 65 {
lzzcd001 0:05e5a0fe0f9d 66 // TODO - add code here to read compass or accelerometer data
lzzcd001 0:05e5a0fe0f9d 67 // and print it to the USB serial port (part 2) and display it on the uLCD (part 3)
lzzcd001 0:05e5a0fe0f9d 68
lzzcd001 0:05e5a0fe0f9d 69 // Compass Trigonometry tip: you can retrieve the compass heading (in degrees) directly from
lzzcd001 0:05e5a0fe0f9d 70 // the IMU library. Example:
lzzcd001 0:05e5a0fe0f9d 71 // imu.readMag();
lzzcd001 0:05e5a0fe0f9d 72 // float heading = imu.calcHeading();
lzzcd001 0:05e5a0fe0f9d 73 // Remember that x = length*cos(heading) and y = length*sin(heading)
lzzcd001 0:05e5a0fe0f9d 74 // to convert from degrees to radians (for sin/cos functions), multiply by pi/180
lzzcd001 0:05e5a0fe0f9d 75 sw.read();
lzzcd001 0:05e5a0fe0f9d 76 if (sw) {
lzzcd001 0:05e5a0fe0f9d 77 imu.readMag();
lzzcd001 0:05e5a0fe0f9d 78 imu.readAccel();
lzzcd001 0:05e5a0fe0f9d 79 imu.readTemp();
lzzcd001 0:05e5a0fe0f9d 80 float heading = imu.calcHeading();
lzzcd001 0:05e5a0fe0f9d 81 //lcd.circle(64, 64, 30, WHITE);
lzzcd001 0:05e5a0fe0f9d 82 lcd.line(64,64,prevline_x,prevline_y, BLACK);
lzzcd001 0:05e5a0fe0f9d 83 lcd.circle(prevcirc_x,prevcirc_y, 10, BLACK);
lzzcd001 0:05e5a0fe0f9d 84 float line_x = 30*cos(heading*pi/180) + 64;
lzzcd001 0:05e5a0fe0f9d 85 float line_y = 30*sin(heading*pi/180) + 64;
lzzcd001 0:05e5a0fe0f9d 86 lcd.circle(64, 64, 30, GREEN);
lzzcd001 0:05e5a0fe0f9d 87 lcd.line(64,64,line_x, line_y, BLUE);
lzzcd001 0:05e5a0fe0f9d 88 prevline_x = line_x;
lzzcd001 0:05e5a0fe0f9d 89 prevline_y = line_y;
lzzcd001 0:05e5a0fe0f9d 90 wait_ms(REFRESH_TIME_MS);
lzzcd001 0:05e5a0fe0f9d 91 } else {
lzzcd001 0:05e5a0fe0f9d 92 imu.readMag();
lzzcd001 0:05e5a0fe0f9d 93 imu.readAccel();
lzzcd001 0:05e5a0fe0f9d 94 //lcd.circle(64, 64, 30, WHITE);
lzzcd001 0:05e5a0fe0f9d 95 lcd.line(64,64,prevline_x,prevline_y, BLACK);
lzzcd001 0:05e5a0fe0f9d 96 lcd.circle(64, 64, 30, BLACK);
lzzcd001 0:05e5a0fe0f9d 97 lcd.circle(prevcirc_x,prevcirc_y, 10, BLACK);
lzzcd001 0:05e5a0fe0f9d 98 float circ_x = imu.ax_raw*0.01 + 64;
lzzcd001 0:05e5a0fe0f9d 99 float circ_y = imu.ay_raw*0.01 + 64;
lzzcd001 0:05e5a0fe0f9d 100 lcd.circle(circ_x,circ_y,10, BLUE);
lzzcd001 0:05e5a0fe0f9d 101 prevcirc_x = circ_x;
lzzcd001 0:05e5a0fe0f9d 102 prevcirc_y = circ_y;
lzzcd001 0:05e5a0fe0f9d 103 wait_ms(REFRESH_TIME_MS);
lzzcd001 0:05e5a0fe0f9d 104 }
lzzcd001 0:05e5a0fe0f9d 105 }
lzzcd001 0:05e5a0fe0f9d 106 }