Dependencies:   Servo mbed

Revision:
3:306d3725ed04
Parent:
2:baf8a7b2b150
--- a/SystemFunctions.cpp	Tue Feb 07 14:21:54 2017 +0000
+++ b/SystemFunctions.cpp	Sun May 21 12:50:37 2017 +0000
@@ -1,25 +1,133 @@
+#include "mbed.h"
+#include "SystemFunctions.h"
+#include "Servo.h"
+
 // Functions to control and operated the system 
 
-#include "SystemFunctions.h"
+Servo servo1(p21); // PWM out to servo in first axis (Solar Azimuth)
+Servo servo2(p22); // PWM out to servo in second axis (Solar Altitude) 
+
+AnalogIn pot(p20);  // Linear pot input for manual control [initial circuit] 
+
+AnalogIn LDR1(p15); // Top Left LDR
+AnalogIn LDR2(p16); // Top Right LDR
+AnalogIn LDR3(p17); // Bottom Left LDR
+AnalogIn LDR4(p18); // Bottom Right LDR
+
+Serial pc(USBTX,USBRX);
+
+float range = 0.00095; // maximum on period set to 0.95ms
+
 
+float LDR1Array[5];
+float LDR2Array[5];
+float LDR3Array[5];
+float LDR4Array[5];
+
+float Average1;
+float Average2;
+float Average3;
+float Average4;
+
+float OverallAverage;
+
+int i;
+int j;
+int flag = 0;
+
+float value1;
+float value2; 
+float value3; 
+float value4; 
+float value5; 
 
 
 void digitalFilter(){
     i=0;
     j=0;
     for(i=0; i<5; i++){
-        LDR1Array[j]=LDR1; 
-        LDR2Array[j]=LDR2;
-        LDR3Array[j]=LDR3;
-        LDR4Array[j]=LDR4;
+        LDR1Array[j] = LDR1; 
+        LDR2Array[j] = LDR2;
+        LDR3Array[j] = LDR3;
+        LDR4Array[j] = LDR4;
         j++;
         }
-        Average1 = ((LDR1Array[4]*1)+(LDR1Array[3]*0.8)+(LDR1Array[2]*0.6)+(LDR1Array[1]*0.4)+(LDR1Array[0]*0.2))/3; 
-        Average2 = ((LDR2Array[4]*1)+(LDR2Array[3]*0.8)+(LDR2Array[2]*0.6)+(LDR2Array[1]*0.4)+(LDR2Array[0]*0.2))/3; 
-        Average3 = ((LDR3Array[4]*1)+(LDR3Array[3]*0.8)+(LDR3Array[2]*0.6)+(LDR3Array[1]*0.4)+(LDR3Array[0]*0.2))/3; 
-        Average4 = ((LDR4Array[4]*1)+(LDR4Array[3]*0.8)+(LDR4Array[2]*0.6)+(LDR4Array[1]*0.4)+(LDR4Array[0]*0.2))/3; 
+         Average1 = ((LDR1Array[4]*1)+(LDR1Array[3]*0.8)+(LDR1Array[2]*0.6)+(LDR1Array[1]*0.4)+(LDR1Array[0]*0.2))/3; //digital filtering by prioritising the latests measurement
+         Average2 = ((LDR2Array[4]*1)+(LDR2Array[3]*0.8)+(LDR2Array[2]*0.6)+(LDR2Array[1]*0.4)+(LDR2Array[0]*0.2))/3; 
+         Average3 = ((LDR3Array[4]*1)+(LDR3Array[3]*0.8)+(LDR3Array[2]*0.6)+(LDR3Array[1]*0.4)+(LDR3Array[0]*0.2))/3; 
+         Average4 = ((LDR4Array[4]*1)+(LDR4Array[3]*0.8)+(LDR4Array[2]*0.6)+(LDR4Array[1]*0.4)+(LDR4Array[0]*0.2))/3; 
+     
+      value1 = Average1;
+      value2 = Average2;
+      value3 = Average3;
+      value4 = Average4;
+      // Sends each value stored in the array to a variable. After Testing it shows that the values done't vary a lot. also uses 5 at a time sliding window effect [ 1 2 3 4 5 ] -> [ 6 7 8 9 10 ] and not [ 1 2 3 4 5 ] -> [ 2 3 4 5 6 ]   
     }
     
 void servoMovement(){
-    OverallAverage = (Average1 + Average2 + Average3 + Average4)/4;
-    }
\ No newline at end of file
+    OverallAverage = ( Average1 + Average2 + Average3 + Average4)/4;
+    
+    if((OverallAverage - 0.03) > Average1){
+        servo1 = servo1 + 0.00275; // half degree at 0.00275? rotate 1 degree (0.0055) // needs rotation function. Anti clockwise servo 1. 
+        servo2 = servo2 - 0.00275;
+        }
+        wait(0.007);
+        
+        if((OverallAverage - 0.03) > Average2 ){
+            servo1 = servo1 - 0.00275;
+            servo2 = servo2 - 0.00275;     
+        } 
+        wait(0.007);
+    
+        if((OverallAverage - 0.03) > Average3){
+            servo1 = servo1 + 0.00275;
+            servo2 = servo2 + 0.00275;
+        } 
+        wait(0.007);
+        
+        if((OverallAverage - 0.03) > Average4){
+            servo1 = servo1 - 0.00275;
+            servo2 = servo2 + 0.00275;
+        
+        wait(0.007);
+       } else { 
+        servo1 = servo1;
+        servo2 = servo2;
+        }
+        
+        
+    }
+
+void positionTest(){
+   servo1 = 0.5;
+   servo2 = 0.5;
+   wait(1);
+   servo1 = 0.6;
+   servo2 = 0.6;
+   wait(1);
+   servo1 = 0.7;
+   servo2 = 0.7;
+   wait(1);
+   servo1 = 0.8;
+   servo2 = 0.8;
+   wait(1);
+   servo1 = 0.7;
+   servo2 = 0.7;
+   wait(1);
+   servo1 = 0.6;
+   servo2 = 0.6;
+   wait(1);
+   }
+   
+    
+void serialRead(){
+        pc.baud(9600);     
+        pc.printf(" %f  %f  %f  %f  \n",value1,value2,value3,value4);
+        wait(0.2);
+    }
+    
+void initialiseServo(){
+    servo1.calibrate(range, 180); // Function to set maximum on period (0.95ms) as 180 degrees. 
+    servo2.calibrate(range, 180); // Any float value given to the servo is taken as a percentage of the maximum on period (0.95ms) of PWM signal. i.e. servo1 = 0.5 --> This is 50% of 0.95ms which will move the servo to 90 degrees. 
+    }
+    
\ No newline at end of file