A system demonstrating interface of 6DOF sensor to Android

Dependencies:   ITG3200 mbed

Fork of 6dof_new_workwith_v2 by Chen Zhai

Files at this revision

API Documentation at this revision

Comitter:
Vigneshwar
Date:
Mon Mar 18 02:32:48 2013 +0000
Parent:
0:5ca44aa85a30
Commit message:
Micropower Wireless Health sensors

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 5ca44aa85a30 -r 6ec19e5615d9 main.cpp
--- a/main.cpp	Tue Mar 12 21:56:17 2013 +0000
+++ b/main.cpp	Mon Mar 18 02:32:48 2013 +0000
@@ -1,7 +1,8 @@
 #include "ITG3200.h"
 #include "ADXL345_I2C.h"
 
-Serial pc(USBTX, USBRX);
+Serial rn42(p9, p10); 
+//Serial pc(USBTX, USBRX);
 ITG3200 gyro(p28, p27);
 ADXL345_I2C accel(p28, p27);
 DigitalOut WakeLed(LED1);
@@ -14,7 +15,7 @@
 double w_last_z=0;
 int autosleep_counter=100;
 
-int accel_read[3] = {0, 0, 0};  
+int accel_read[3] = {0, 0, 0};
 double twocomp16_to_double(int16_t x);
 int16_t double_to_twocomp16(double x);
 char RegPeekAcc(char address);
@@ -26,50 +27,57 @@
 
 InterruptIn pushbutt(p21);
 void bushbutt_handler()
-{ WakeLed=1;
-  SleepLed=0;
+{
+    WakeLed=1;
+    SleepLed=0;
 }
+
 InterruptIn accinterupt(p22);
 void acc_int_handler()
-{ RegPeekAcc(0x30); //clear interrput
-  WakeLed=1;
-  SleepLed=0;
+{
+    RegPeekAcc(0x30); //clear interrput
+    WakeLed=1;
+    SleepLed=0;
 }
 
 
-int main() {
+int main()
+{
 
-
+    rn42.baud(115200);
     char str[512];
     gyro.setWhoAmI(0x68);
-    pc.printf("Now starting 6-degrees-of-freedom (ITG-3200 ADXL345) test...\n");
-    pc.printf("Accelerometer Device ID is: 0x%02x\n", accel.getDeviceID());
-    pc.printf("Gyro Devide ID is: 0x%02x\n", gyro.getWhoAmI()); 
-    
+    //pc.printf("Now starting 6-degrees-of-freedom (ITG-3200 ADXL345) test...\n");
+    //pc.printf("Accelerometer Device ID is: 0x%02x\n", accel.getDeviceID());
+    //pc.printf("Gyro Devide ID is: 0x%02x\n", gyro.getWhoAmI());
+
     // Accel setup
     // These are here to test whether any of the initialization fails. It will print the failure
-    if (accel.setPowerControl(0x00)){
-         pc.printf("didn't intitialize power control\n"); 
-         return 0;  }
+    if (accel.setPowerControl(0x00)) {
+        //pc.printf("didn't intitialize power control\n");
+        return 0;
+    }
     //Full resolution, +/-16g, 4mg/LSB.
-    wait(.001);    
-    if(accel.setDataFormatControl(0x0B)){
-        pc.printf("didn't set data format\n");
-        return 0;  }
+    wait(.001);
+    if(accel.setDataFormatControl(0x0B)) {
+        //pc.printf("didn't set data format\n");
+        return 0;
+    }
     wait(.001);
     //3.2kHz data rate.
-    if(accel.setDataRate(ADXL345_3200HZ)){
-       pc.printf("didn't set data rate\n");
-       return 0;    }
-    wait(.001);   
-    //Measurement mode.    
+    if(accel.setDataRate(ADXL345_3200HZ)) {
+        //pc.printf("didn't set data rate\n");
+        return 0;
+    }
+    wait(.001);
+    //Measurement mode.
     if(accel.setPowerControl(MeasurementMode)) {
-       pc.printf("didn't set the power control to measurement\n"); 
-       return 0;   
-    }     
-    // Gyro setup   
+        //pc.printf("didn't set the power control to measurement\n");
+        return 0;
+    }
+    // Gyro setup
     gyro.setLpBandwidth(LPFBW_42HZ);
-       
+
     //Added for Acc
     WakeLed=1;
     AccCalib();
@@ -79,76 +87,86 @@
     RegPeekAcc(0x30); //clear interrput
     wait(0.1);
     pushbutt.rise(&bushbutt_handler); //enable mbed trigger detect
-    accinterupt.rise(&acc_int_handler);  
+    accinterupt.rise(&acc_int_handler);
     RegdumpAcc();
 
-    
+
     if(true)
-    for(int i=0;i<=100000;i++)
-    {
-        wait(0.01);
-        
-        if(ReadLed==1) ReadLed=0;
-        else ReadLed=1;
-        
-        accel.getOutput(accel_read);
-        
-        sprintf(str, "%i,%i,%i,%i,%i,%i,%i\n\r", (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2],
-                                                     gyro.getGyroX(), gyro.getGyroY(), gyro.getGyroZ(), (int16_t)gyro.getTemperature());  
-    
-        double d_accelx=(double) (int16_t)accel_read[0];
-        double d_accely=(double) (int16_t)accel_read[1];
-        double d_accelz=(double) (int16_t)accel_read[2];  
-        double wp=6.28e-2; //IIR pole for DC cancellation
-        double w_x,w_y,w_z;
-        double dc_x,dc_y,dc_z;
+        for(int i=0; i<=100000; i++) {
+            wait(0.01);
+
+            if(ReadLed==1) ReadLed=0;
+            else ReadLed=1;
+
+            accel.getOutput(accel_read);
+
+            sprintf(str, "%i,%i,%i,%i,%i,%i,%i,A", (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2],
+                    gyro.getGyroX(), gyro.getGyroY(), gyro.getGyroZ(), (int16_t)gyro.getTemperature());
+            
+            rn42.printf(str);
             
-        //IIR calculate DC term in acceleration
-        w_x=d_accelx+ (1-wp)*w_last_x; dc_x=wp*w_x; w_last_x=w_x;     
-        w_y=d_accely+ (1-wp)*w_last_y; dc_y=wp*w_y; w_last_y=w_y;  
-        w_z=d_accelz+ (1-wp)*w_last_z; dc_z=wp*w_z; w_last_z=w_z;   
-      
-        d_accelx=d_accelx-dc_x;
-        d_accely=d_accely-dc_y;
-        d_accelz=d_accelz-dc_z;            
-        double mag_accel=d_accelx*d_accelx+d_accely*d_accely+d_accelz*d_accelz;
-        mag_accel=sqrt(mag_accel);
-        pc.printf("With DC Cal:Double %f %f %f . Offset is %f %f %f. Mag %f\n\r",d_accelx,d_accely,d_accelz,dc_x,dc_y,dc_z,mag_accel);       
-        RegPeekAcc(0x30);
-        
-        if(autosleep_counter>0) autosleep_counter-=1;
-        else
-        { if(mag_accel<15) 
-             {sleep1();
-             }   
+            double d_accelx=(double) (int16_t)accel_read[0];
+            double d_accely=(double) (int16_t)accel_read[1];
+            double d_accelz=(double) (int16_t)accel_read[2];
+            double wp=6.28e-2; //IIR pole for DC cancellation
+            double w_x,w_y,w_z;
+            double dc_x,dc_y,dc_z;
+
+            //IIR calculate DC term in acceleration
+            w_x=d_accelx+ (1-wp)*w_last_x;
+            dc_x=wp*w_x;
+            w_last_x=w_x;
+            w_y=d_accely+ (1-wp)*w_last_y;
+            dc_y=wp*w_y;
+            w_last_y=w_y;
+            w_z=d_accelz+ (1-wp)*w_last_z;
+            dc_z=wp*w_z;
+            w_last_z=w_z;
+
+            d_accelx=d_accelx-dc_x;
+            d_accely=d_accely-dc_y;
+            d_accelz=d_accelz-dc_z;
+            double mag_accel=d_accelx*d_accelx+d_accely*d_accely+d_accelz*d_accelz;
+            mag_accel=sqrt(mag_accel);
+            //pc.printf("With DC Cal:Double %f %f %f . Offset is %f %f %f. Mag %f\n\r",d_accelx,d_accely,d_accelz,dc_x,dc_y,dc_z,mag_accel);
+            RegPeekAcc(0x30);
+
+            if(autosleep_counter>0) autosleep_counter-=1;
+            else {
+                if(mag_accel<15) {
+//                    sleep1();
+                    autosleep_counter=30;
+                }
+            }
+
+            /*
+            pc.printf("Gyro[%5i, %5i, %5i]   Accel[%4i, %4i, %4i]\n\t",
+                                gyro.getGyroX(), gyro.getGyroY(), gyro.getGyroZ(),
+                                (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2]);
+            */
         }
-        
-        /*
-        pc.printf("Gyro[%5i, %5i, %5i]   Accel[%4i, %4i, %4i]\n\t", 
-                            gyro.getGyroX(), gyro.getGyroY(), gyro.getGyroZ(),
-                            (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2]);
-        */
-    }
 
 
 }
 
 
 double twocomp16_to_double(int16_t x)
-{double a;
-a= double(x);
-return a;
+{
+    double a;
+    a= double(x);
+    return a;
 }
 int16_t double_to_twocomp16(double x)
-{int16_t a;
- a=(signed int16_t) x;
- return a;
+{
+    int16_t a;
+    a=(signed int16_t) x;
+    return a;
 }
 
 char RegPeekAcc(char address)
 {
     char value=accel.SingleByteRead(address);
-    pc.printf("AccReg address: %X value: %X\n\r",address,value);
+    //pc.printf("AccReg address: %X value: %X\n\r",address,value);
     return value;
 }
 void RegPokeAcc(char address, char value)
@@ -157,70 +175,87 @@
 }
 
 void AccCalib()
-{   CalLed=1;
-    double acc0=0,acc1=0,acc2=0; 
-    double sum0=0,sum1=0,sum2=0; 
+{
+    CalLed=1;
+    double acc0=0,acc1=0,acc2=0;
+    double sum0=0,sum1=0,sum2=0;
     wait(0.1) ;
     accel.getOutput(accel_read);
-//    RegPokeAcc(0x1e,offsetcal((int16_t)accel_read[0])); 
-//    RegPokeAcc(0x1f,offsetcal((int16_t)accel_read[1])); 
+//    RegPokeAcc(0x1e,offsetcal((int16_t)accel_read[0]));
+//    RegPokeAcc(0x1f,offsetcal((int16_t)accel_read[1]));
 //    RegPokeAcc(0x20,offsetcal((int16_t)accel_read[2]));
-    for(int n=1;n<=10;n++){
+    for(int n=1; n<=10; n++) {
         wait(0.1);
         accel.getOutput(accel_read);
         acc0=(double)(int16_t)accel_read[0];
         acc1=(double)(int16_t)accel_read[1];
         acc2=(double)(int16_t)accel_read[2];
-        sum0+=acc0;sum1+=acc1;sum2+=acc2;
+        sum0+=acc0;
+        sum1+=acc1;
+        sum2+=acc2;
     }
     sum0=sum0/10/(-4);
     sum1=sum1/10/(-4);
-    sum2=sum2/10/(-4);    
+    sum2=sum2/10/(-4);
     int16_t acc0_16=(signed int16_t)sum0;
     int16_t acc1_16=(signed int16_t)sum1;
-    int16_t acc2_16=(signed int16_t)sum2;    
-    RegPokeAcc(0x1e,acc0_16); 
-    RegPokeAcc(0x1f,acc1_16); 
-    RegPokeAcc(0x20,acc2_16); 
- //   pc.printf("Calibration. Calculated offset %i   %i   %i\n\r",acc0_16,acc1_16,acc2_16);
+    int16_t acc2_16=(signed int16_t)sum2;
+    RegPokeAcc(0x1e,acc0_16);
+    RegPokeAcc(0x1f,acc1_16);
+    RegPokeAcc(0x20,acc2_16);
+//   pc.printf("Calibration. Calculated offset %i   %i   %i\n\r",acc0_16,acc1_16,acc2_16);
     int valid=1;
-    for(int n=1;n<=10;n++)
-    {wait(0.1);
-    accel.getOutput(accel_read);
-    accel.getOutput(accel_read);
-    acc0=(double)(int16_t)accel_read[0]; if(abs(acc0)>50) valid=0;
-    acc1=(double)(int16_t)accel_read[1];if(abs(acc1)>50) valid=0;
-    acc2=(double)(int16_t)accel_read[2];if(abs(acc2)>50) valid=0;
- //   pc.printf("verifying cal %i,%i,%i \n\r", (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2]);
- //   pc.printf("verifying cal (double)%f %f %f\n\r",acc0,acc1,acc2);
- //   pc.printf("valid= %d \n\r",valid);
-    }    
+    for(int n=1; n<=10; n++) {
+        wait(0.1);
+        accel.getOutput(accel_read);
+        accel.getOutput(accel_read);
+        acc0=(double)(int16_t)accel_read[0];
+        if(abs(acc0)>50) valid=0;
+        acc1=(double)(int16_t)accel_read[1];
+        if(abs(acc1)>50) valid=0;
+        acc2=(double)(int16_t)accel_read[2];
+        if(abs(acc2)>50) valid=0;
+//   pc.printf("verifying cal %i,%i,%i \n\r", (int16_t)accel_read[0], (int16_t)accel_read[1], (int16_t)accel_read[2]);
+//   pc.printf("verifying cal (double)%f %f %f\n\r",acc0,acc1,acc2);
+//   pc.printf("valid= %d \n\r",valid);
+    }
 //    if(valid==1)
-//    CalLed=0;
+    CalLed=0;
 //    else AccCalib();
 }
 
 void RegdumpAcc()
 {
-pc.printf("\r---------a new regdump start\n\r-------");
-pc.printf("Acc DeviceID \t");RegPeekAcc(0x00);
-pc.printf("X_asis: \t");RegPeekAcc(0x1e);
-pc.printf("Y_asis: \t");RegPeekAcc(0x1f);
-pc.printf("Z_asis: \t");RegPeekAcc(0x20);
-pc.printf("Act Thresh: \t");RegPeekAcc(0x24);
-pc.printf("Axis Enable: \t");RegPeekAcc(0x27);
-pc.printf("Interpt Ctrl: \t");RegPeekAcc(0x2e);
-pc.printf("Interpt Mapping: \t");RegPeekAcc(0x2f);
+    //pc.printf("\r---------a new regdump start\n\r-------");
+    //pc.printf("Acc DeviceID \t");
+    RegPeekAcc(0x00);
+    //pc.printf("X_asis: \t");
+    RegPeekAcc(0x1e);
+    //pc.printf("Y_asis: \t");
+    RegPeekAcc(0x1f);
+    //pc.printf("Z_asis: \t");
+    RegPeekAcc(0x20);
+    //pc.printf("Act Thresh: \t");
+    RegPeekAcc(0x24);
+    //pc.printf("Axis Enable: \t");
+    RegPeekAcc(0x27);
+    //pc.printf("Interpt Ctrl: \t");
+    RegPeekAcc(0x2e);
+    //pc.printf("Interpt Mapping: \t");
+    RegPeekAcc(0x2f);
 //pc.printf("Source of interupt:\t");RegPeekAcc(0x30);
-pc.printf("Data format control\t");RegPeekAcc(0x31);
-pc.printf("FIFO Ctrl:\t");RegPeekAcc(0x38);
-pc.printf("FIFO Status:\t");RegPeekAcc(0x39);
+    //pc.printf("Data format control\t");
+    RegPeekAcc(0x31);
+    //pc.printf("FIFO Ctrl:\t");
+    RegPeekAcc(0x38);
+    //pc.printf("FIFO Status:\t");
+    RegPeekAcc(0x39);
 }
 
 void sleep1()
 {
-WakeLed=0;
-SleepLed=1;
-sleep();
+    WakeLed=0;
+    SleepLed=1;
+    sleep();
 
 }
\ No newline at end of file