Dependencies:   EthernetNetIf mbed

Revision:
1:5721a5772035
Parent:
0:ad88907cf227
Child:
2:53614df77a8e
--- a/main.cpp	Tue Apr 03 17:46:32 2012 +0000
+++ b/main.cpp	Thu Apr 12 15:46:38 2012 +0000
@@ -25,8 +25,10 @@
 #define GYRO_RATE   0.005
 //Sampling accelerometer at 200Hz.
 #define ACC_RATE    0.005
-//Updating filter at 40Hz.
-#define FILTER_RATE 0.1
+//Updating filter at 20Hz.
+#define FILTER_RATE 0.025
+//Defines the delay for the corrections made by the algorithm
+#define CORRECTION_DELAY 5
 
 //At rest the gyroscope is centred around 0 and goes between about
 //-5 and 5 counts. As 1 degrees/sec is ~15 LSB, error is roughly
@@ -43,12 +45,34 @@
 Ticker accelerometerTicker;
 Ticker gyroscopeTicker;
 Ticker filterTicker;
+Ticker motorTicker;
 
-
+//Variables for the tcp controls
 int connected   = 0,
     calibrated  = 0,
     led1        = 0;
-//Offsets for the gyroscope.
+    
+//stabilizing variables, these control the thrust and wanted x/y level
+float m1_set    = 0.001,
+      m2_set    = 0.001,
+      m3_set    = 0.001,
+      m4_set    = 0.001;
+      
+double    a_motor_1   = 0,
+          a_motor_2   = 0,
+          a_motor_3   = 0,
+          a_motor_4   = 0;
+
+int x_level_1   = 0,
+    x_level_2   = 0,
+    x_level_3   = 0,
+    x_level_4   = 0,
+    y_level_1   = 0,
+    y_level_2   = 0,
+    y_level_3   = 0,
+    y_level_4   = 0;
+    
+//O1ffsets for the gyroscope.
 //The readings we take when the gyroscope is stationary won't be 0, so we'll
 //average a set of readings we do get when the gyroscope is stationary and
 //take those away from subsequent readings to ensure the gyroscope is offset
@@ -101,6 +125,7 @@
 void sampleGyroscope(void);
 //Update the filter and calculate the Euler angles.
 void filter(void);
+void motor(void);
 void tcp_send(const char*);
 void onConnectedTCPSocketEvent(TCPSocketEvent e);
 void onListeningTCPSocketEvent(TCPSocketEvent e);
@@ -187,7 +212,18 @@
 
 }
 
-
+void motor(void) {
+            int x = toDegrees(imuFilter.getRoll());
+            int y = toDegrees(imuFilter.getPitch());
+            a_motor_1 = a_motor_1+((float)(x/2)/CORRECTION_DELAY)+((float)(y/2)/CORRECTION_DELAY);
+            if(a_motor_1>99){       m1_set = 0.002;}
+            else if(a_motor_1 < 1){ m1_set = 0.001175;}
+            else{                   m1_set = (a_motor_1+117.5)/100000;}
+    m1.pulsewidth(m1_set);
+    m2.pulsewidth(m2_set);
+    m3.pulsewidth(m3_set);
+    m4.pulsewidth(m4_set); 
+}
 
 int main() {
    
@@ -203,6 +239,11 @@
     err=ListeningSock.listen(); // Starts listening
     if(err){printf("Listening Error\r\n");}
     
+    m1.pulsewidth(0.001);
+    m2.pulsewidth(0.001);
+    m3.pulsewidth(0.001);
+    m4.pulsewidth(0.001); 
+    
     //Initialize inertial sensors.
     initializeAccelerometer();
     calibrateAccelerometer();
@@ -210,18 +251,18 @@
 
     //Set up timers.
     //Accelerometer data rate is 200Hz, so we'll sample at this speed.
-    accelerometerTicker.attach(&sampleAccelerometer, 0.005);
+//    accelerometerTicker.attach(&sampleAccelerometer, 0.005);
     //Gyroscope data rate is 200Hz, so we'll sample at this speed.
-    gyroscopeTicker.attach(&sampleGyroscope, 0.005);
+//    gyroscopeTicker.attach(&sampleGyroscope, 0.005);
     //Update the filter variables at the correct rate.
-    filterTicker.attach(&filter, FILTER_RATE);
+//    filterTicker.attach(&filter, FILTER_RATE);
         
     Timer tmr;
     tmr.start();
       
     while(true)
     {
-        wait(FILTER_RATE);
+        wait(0.2);
         
         Net::poll();
         if(tmr.read() > 0.2){
@@ -233,6 +274,11 @@
             led1    = 1;
             calibrated = 1;
             
+//            m1_set = 0.001175;
+//            m2_set = 0.001175;
+//            m3_set = 0.001175;
+//            m4_set = 0.001175; 
+            
             //Set up timers.
             //Accelerometer data rate is 200Hz, so we'll sample at this speed.
             accelerometerTicker.attach(&sampleAccelerometer, 0.005);
@@ -240,17 +286,42 @@
             gyroscopeTicker.attach(&sampleGyroscope, 0.005);
             //Update the filter variables at the correct rate.
             filterTicker.attach(&filter, FILTER_RATE);
+            
+            motorTicker.attach(&motor, 0.02);
 
             tcp_send("Done initializing\r\n");
 
         }
 
         if(calibrated){
+            
+
+            
+
+            
+/*            a_motor_2 = a_motor_2-((((x_level_2-x)/2)-((y_level_2-y)/2))/CORRECTION_DELAY);
+            if(a_motor_2>99){       m2_set = (100+117.5)/100000;}
+            else if(a_motor_2 < 1){ m2_set = (0+117.5)/100000;}
+            else{                   m2_set = (a_motor_2+117.5)/100000;}
+            
+            a_motor_3 = a_motor_3+((((x_level_3-x)/2)-((y_level_3-y)/2))/CORRECTION_DELAY);
+            if(a_motor_3>99){       m3_set = (100+117.5)/100000;}
+            else if(a_motor_3 < 1){ m3_set = (0+117.5)/100000;}
+            else{                   m3_set = (a_motor_3+117.5)/100000;}
+            
+            a_motor_4 = a_motor_4+((((x_level_4-x)/2)+((y_level_4-y)/2))/CORRECTION_DELAY);
+            if(a_motor_4>99){       m4_set = (100+117.5)/100000;}
+            else if(a_motor_4 < 1){ m4_set = (0+117.5)/100000;}
+            else{                   m4_set = (a_motor_4+117.5)/100000;}*/
+        
+        
             char buffer [128];
             sprintf (buffer, "x:%f - y:%f - z:%f \r\n",toDegrees(imuFilter.getRoll()),
                                                         toDegrees(imuFilter.getPitch()),
                                                         toDegrees(imuFilter.getYaw()));
-            tcp_send(buffer);    
+            tcp_send(buffer);   
+            sprintf (buffer, "am1:%f\r\n",a_motor_1);
+            tcp_send(buffer);   
         }
     }  
 }
@@ -366,22 +437,53 @@
 //           pConnectedSock->send(buff, len);
            int test = buff[0];
            char buffer[128];
-           sprintf(buffer, "|%i|\r\n", test);
+           sprintf(buffer, "|%i|", test);
            tcp_send(buffer); 
            if(test == 115)  {connected = 1;}
-/*           if(test == 49)   {m1_set += 0.00001;}
-           if(test == 50)   {m2_set += 0.00001;}
-           if(test == 51)   {m3_set += 0.00001;}
-           if(test == 52)   {m4_set += 0.00001;}
-           if(test == 113)  {m1_set -= 0.00001;}
-           if(test == 119)  {m2_set -= 0.00001;}
-           if(test == 101)  {m3_set -= 0.00001;}
-           if(test == 114)  {m4_set -= 0.00001;}
+           if(test == 112)  {
+                a_motor_1 += 5;
+                a_motor_1 += 5;
+                a_motor_1 += 5;
+                a_motor_1 += 5;
+           }
+           if(test == 49)   {
+                m1_set += 0.00002;
+                sprintf (buffer, " %f\r\n",m1_set);
+                tcp_send(buffer);
+           }
+           if(test == 50)   {
+                m2_set += 0.00002;
+                sprintf (buffer, " %f\r\n",m2_set);
+                tcp_send(buffer);
+           }
+           if(test == 51)   {
+                m3_set += 0.00002;
+                sprintf (buffer, " %f\r\n",m3_set);
+                tcp_send(buffer);
+           }
+           if(test == 52)   {
+                m4_set += 0.00002;
+                sprintf (buffer, " %f\r\n",m4_set);
+                tcp_send(buffer);;
+           }
+           if(test == 113)  {
+                m1_set -= 0.00002;
+           }
+           if(test == 119)  {
+                m2_set -= 0.00002;
+           }
+           if(test == 101)  {
+                m3_set -= 0.00002;
+           }
+           if(test == 114)  {
+                m4_set -= 0.00002;
+           }
            if(test == 107)  {
                 m1_set = 0.0011;
                 m2_set = 0.0011;
                 m3_set = 0.0011;
-                m4_set = 0.0011;}*/
+                m4_set = 0.0011;
+           }
                  
 
            buff[len]=0; // make terminater