Program that implements position including rotation

Dependencies:   MPU6050IMU Mouse SDFileSystem mbed

Committer:
joshwilkins2013
Date:
Tue Mar 31 22:36:45 2015 +0000
Revision:
0:5ed57e0c2298

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joshwilkins2013 0:5ed57e0c2298 1 #include "mbed.h"
joshwilkins2013 0:5ed57e0c2298 2 #include "MPU6050.h"
joshwilkins2013 0:5ed57e0c2298 3 #include "SDFileSystem.h"
joshwilkins2013 0:5ed57e0c2298 4 #include "Mouse.h"
joshwilkins2013 0:5ed57e0c2298 5
joshwilkins2013 0:5ed57e0c2298 6 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
joshwilkins2013 0:5ed57e0c2298 7
joshwilkins2013 0:5ed57e0c2298 8 Serial pc(USBTX, USBRX);
joshwilkins2013 0:5ed57e0c2298 9
joshwilkins2013 0:5ed57e0c2298 10 FILE *Data; // Creates name of file
joshwilkins2013 0:5ed57e0c2298 11 char buffer[5000000]; // Buffer size (# of characters) for SD card
joshwilkins2013 0:5ed57e0c2298 12
joshwilkins2013 0:5ed57e0c2298 13 MPU6050 mpu6050;
joshwilkins2013 0:5ed57e0c2298 14 MOUSE mouse;
joshwilkins2013 0:5ed57e0c2298 15 Timer t;
joshwilkins2013 0:5ed57e0c2298 16
joshwilkins2013 0:5ed57e0c2298 17 DigitalIn button(PTB9);
joshwilkins2013 0:5ed57e0c2298 18
joshwilkins2013 0:5ed57e0c2298 19 signed long mx, my;
joshwilkins2013 0:5ed57e0c2298 20 float d,dx,dy;
joshwilkins2013 0:5ed57e0c2298 21 double x,xx,y,yy;
joshwilkins2013 0:5ed57e0c2298 22 double psi,lpsi=0; // psi - current orientation, lpsi - last orientation, theta - current angle around circle
joshwilkins2013 0:5ed57e0c2298 23 double gyroZ,lgyroZ;
joshwilkins2013 0:5ed57e0c2298 24 double dt, timer;
joshwilkins2013 0:5ed57e0c2298 25
joshwilkins2013 0:5ed57e0c2298 26 bool closed = 1; // Flag for sd card, to open and close with switch
joshwilkins2013 0:5ed57e0c2298 27
joshwilkins2013 0:5ed57e0c2298 28
joshwilkins2013 0:5ed57e0c2298 29 //================================================================================
joshwilkins2013 0:5ed57e0c2298 30 //============= Sensor Initialization =============
joshwilkins2013 0:5ed57e0c2298 31 //================================================================================
joshwilkins2013 0:5ed57e0c2298 32
joshwilkins2013 0:5ed57e0c2298 33 void gyro_init(){
joshwilkins2013 0:5ed57e0c2298 34 i2c.frequency(400000);
joshwilkins2013 0:5ed57e0c2298 35
joshwilkins2013 0:5ed57e0c2298 36 uint8_t whoami = mpu6050.readByte(MPU6050_ADDRESS, WHO_AM_I_MPU6050); // Read WHO_AM_I register for MPU-6050
joshwilkins2013 0:5ed57e0c2298 37 pc.printf("I AM 0x%x\n\r", whoami);
joshwilkins2013 0:5ed57e0c2298 38 pc.printf("I SHOULD BE 0x68\n\r");
joshwilkins2013 0:5ed57e0c2298 39
joshwilkins2013 0:5ed57e0c2298 40 if (whoami == 0x68){
joshwilkins2013 0:5ed57e0c2298 41 pc.printf("MPU6050 is online...");
joshwilkins2013 0:5ed57e0c2298 42 wait(1);
joshwilkins2013 0:5ed57e0c2298 43
joshwilkins2013 0:5ed57e0c2298 44 mpu6050.MPU6050SelfTest(SelfTest); // Start by performing self test and reporting values
joshwilkins2013 0:5ed57e0c2298 45 if(SelfTest[0] < 1.0f && SelfTest[1] < 1.0f && SelfTest[2] < 1.0f && SelfTest[3] < 1.0f && SelfTest[4] < 1.0f && SelfTest[5] < 1.0f) {
joshwilkins2013 0:5ed57e0c2298 46 mpu6050.resetMPU6050(); // Reset registers to default in preparation for device calibration
joshwilkins2013 0:5ed57e0c2298 47 mpu6050.calibrateMPU6050(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
joshwilkins2013 0:5ed57e0c2298 48 mpu6050.initMPU6050();
joshwilkins2013 0:5ed57e0c2298 49 pc.printf("MPU6050 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature
joshwilkins2013 0:5ed57e0c2298 50
joshwilkins2013 0:5ed57e0c2298 51 pc.printf("\nMPU6050 passed self test... Initializing");
joshwilkins2013 0:5ed57e0c2298 52 wait(2); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
joshwilkins2013 0:5ed57e0c2298 53 } else pc.printf("\nDevice did not the pass self-test!\n\r");
joshwilkins2013 0:5ed57e0c2298 54 } else {
joshwilkins2013 0:5ed57e0c2298 55 pc.printf("Could not connect to MPU6050: \n\r");
joshwilkins2013 0:5ed57e0c2298 56 pc.printf("%#x \n", whoami);
joshwilkins2013 0:5ed57e0c2298 57 while(1) ; // Loop forever if communication doesn't happen
joshwilkins2013 0:5ed57e0c2298 58 }
joshwilkins2013 0:5ed57e0c2298 59 }
joshwilkins2013 0:5ed57e0c2298 60
joshwilkins2013 0:5ed57e0c2298 61
joshwilkins2013 0:5ed57e0c2298 62 //================================================================================
joshwilkins2013 0:5ed57e0c2298 63 //============= Get Inputs =============
joshwilkins2013 0:5ed57e0c2298 64 //================================================================================
joshwilkins2013 0:5ed57e0c2298 65
joshwilkins2013 0:5ed57e0c2298 66 void get_Rates(){
joshwilkins2013 0:5ed57e0c2298 67 if(mpu6050.readByte(MPU6050_ADDRESS, INT_STATUS) & 0x01) { // check if data ready interrupt
joshwilkins2013 0:5ed57e0c2298 68 mpu6050.readGyroData(gyroCount); // Read the x/y/z adc gyro values
joshwilkins2013 0:5ed57e0c2298 69 mpu6050.getGres();
joshwilkins2013 0:5ed57e0c2298 70 gyroZ = gyroCount[2]*gRes; // - gyroBias[2];
joshwilkins2013 0:5ed57e0c2298 71 }
joshwilkins2013 0:5ed57e0c2298 72 }
joshwilkins2013 0:5ed57e0c2298 73
joshwilkins2013 0:5ed57e0c2298 74
joshwilkins2013 0:5ed57e0c2298 75 //================================================================================
joshwilkins2013 0:5ed57e0c2298 76 //============= Main Program Start =============
joshwilkins2013 0:5ed57e0c2298 77 //================================================================================
joshwilkins2013 0:5ed57e0c2298 78
joshwilkins2013 0:5ed57e0c2298 79 int main(){
joshwilkins2013 0:5ed57e0c2298 80 pc.baud(115200);
joshwilkins2013 0:5ed57e0c2298 81
joshwilkins2013 0:5ed57e0c2298 82 Data = fopen("/sd/Data.txt", "w");
joshwilkins2013 0:5ed57e0c2298 83 closed = 0;
joshwilkins2013 0:5ed57e0c2298 84
joshwilkins2013 0:5ed57e0c2298 85 gyro_init();
joshwilkins2013 0:5ed57e0c2298 86 mouse.init();
joshwilkins2013 0:5ed57e0c2298 87
joshwilkins2013 0:5ed57e0c2298 88 t.start();
joshwilkins2013 0:5ed57e0c2298 89 timer = t.read_us();
joshwilkins2013 0:5ed57e0c2298 90
joshwilkins2013 0:5ed57e0c2298 91 while(1) {
joshwilkins2013 0:5ed57e0c2298 92 if(button) {
joshwilkins2013 0:5ed57e0c2298 93
joshwilkins2013 0:5ed57e0c2298 94 if (closed){
joshwilkins2013 0:5ed57e0c2298 95 Data = fopen("/sd/Data.txt", "w");
joshwilkins2013 0:5ed57e0c2298 96 closed = 0;
joshwilkins2013 0:5ed57e0c2298 97 }
joshwilkins2013 0:5ed57e0c2298 98
joshwilkins2013 0:5ed57e0c2298 99 DigitalOut myled(LED1);
joshwilkins2013 0:5ed57e0c2298 100
joshwilkins2013 0:5ed57e0c2298 101 get_Rates(); // Gyro rates & Mouse position
joshwilkins2013 0:5ed57e0c2298 102
joshwilkins2013 0:5ed57e0c2298 103 dt = (t.read_us() - timer) / 1000000.00;
joshwilkins2013 0:5ed57e0c2298 104 timer = t.read_us();
joshwilkins2013 0:5ed57e0c2298 105
joshwilkins2013 0:5ed57e0c2298 106
joshwilkins2013 0:5ed57e0c2298 107 //================================================================================
joshwilkins2013 0:5ed57e0c2298 108 //============= Char Conversion =============
joshwilkins2013 0:5ed57e0c2298 109 //================================================================================
joshwilkins2013 0:5ed57e0c2298 110
joshwilkins2013 0:5ed57e0c2298 111 psi += ((lgyroZ+gyroZ)/2)*dt; // Current orientation/pose
joshwilkins2013 0:5ed57e0c2298 112 if (psi>360) psi -= 360; // resets current orientation to keep between 0 & 360
joshwilkins2013 0:5ed57e0c2298 113 if (psi<-360) psi += 360; // resets current orientation to keep between 0 & -360
joshwilkins2013 0:5ed57e0c2298 114 lgyroZ = gyroZ;
joshwilkins2013 0:5ed57e0c2298 115
joshwilkins2013 0:5ed57e0c2298 116 mx = mouse.getDx();
joshwilkins2013 0:5ed57e0c2298 117 my = mouse.getDy();
joshwilkins2013 0:5ed57e0c2298 118 dx = (mx/231.25); // Converts char into float in inches
joshwilkins2013 0:5ed57e0c2298 119 dy = (my/231.25); // Experimentally obtained 231.25 (1850/8in)
joshwilkins2013 0:5ed57e0c2298 120
joshwilkins2013 0:5ed57e0c2298 121 double a1 = psi;
joshwilkins2013 0:5ed57e0c2298 122 a1 *= (PI/180);
joshwilkins2013 0:5ed57e0c2298 123 double a2 = lpsi;
joshwilkins2013 0:5ed57e0c2298 124 a2 *= (PI/180);
joshwilkins2013 0:5ed57e0c2298 125 double a3 = a1-a2;
joshwilkins2013 0:5ed57e0c2298 126
joshwilkins2013 0:5ed57e0c2298 127 double a = dx*tan(a3);
joshwilkins2013 0:5ed57e0c2298 128 double b = dx/cos(a3);
joshwilkins2013 0:5ed57e0c2298 129 double c = (dy+a)*cos(a2)-(b*sin(a1));
joshwilkins2013 0:5ed57e0c2298 130 double d = sqrt((dx*dx)+(dy*dy));
joshwilkins2013 0:5ed57e0c2298 131 double e = sqrt((d*d)-(c*c));
joshwilkins2013 0:5ed57e0c2298 132 double f = (dy+a)*cos(a3);
joshwilkins2013 0:5ed57e0c2298 133 double g = c*cos(a1);
joshwilkins2013 0:5ed57e0c2298 134 double h = (f-g)/(sin(a1));
joshwilkins2013 0:5ed57e0c2298 135
joshwilkins2013 0:5ed57e0c2298 136 yy -= c;
joshwilkins2013 0:5ed57e0c2298 137 xx += h;
joshwilkins2013 0:5ed57e0c2298 138
joshwilkins2013 0:5ed57e0c2298 139 x = xx + 3;
joshwilkins2013 0:5ed57e0c2298 140 y = yy - 9.5;
joshwilkins2013 0:5ed57e0c2298 141
joshwilkins2013 0:5ed57e0c2298 142 lpsi = psi;
joshwilkins2013 0:5ed57e0c2298 143
joshwilkins2013 0:5ed57e0c2298 144 if (Data == NULL) pc.printf("Unable to write the file \n"); // This chunk for writing to file on SD card
joshwilkins2013 0:5ed57e0c2298 145 else fprintf(Data, "%f %f %f %f\r\n",psi,x,y,timer); // can read float or double not int (only checked these three types)
joshwilkins2013 0:5ed57e0c2298 146
joshwilkins2013 0:5ed57e0c2298 147 }else{
joshwilkins2013 0:5ed57e0c2298 148 if(!closed){
joshwilkins2013 0:5ed57e0c2298 149 fclose(Data);
joshwilkins2013 0:5ed57e0c2298 150 closed = 1;
joshwilkins2013 0:5ed57e0c2298 151 }
joshwilkins2013 0:5ed57e0c2298 152 }
joshwilkins2013 0:5ed57e0c2298 153 }
joshwilkins2013 0:5ed57e0c2298 154 }