ES309 Project Team / Mbed 2 deprecated ES309_NerfTurretfinal

Dependencies:   Motor QEI mbed mbedWSEsbc

Fork of ES309_NerfTurret by ES309 Project Team

Files at this revision

API Documentation at this revision

Comitter:
rixonfletcher
Date:
Thu May 12 12:51:37 2016 +0000
Parent:
1:758c16346f28
Child:
3:4dcf81584894
Commit message:
mbed program

Changed in this revision

Motor.lib Show annotated file Show diff for this revision Revisions of this file
QEI.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.lib	Thu May 12 12:51:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/Motor/#f265e441bcd9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Thu May 12 12:51:37 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/aberk/code/QEI/#5c2ad81551aa
--- a/main.cpp	Tue Mar 01 15:00:31 2016 +0000
+++ b/main.cpp	Thu May 12 12:51:37 2016 +0000
@@ -1,48 +1,146 @@
 #include "mbed.h"
+#include "Motor.h"
+#include "QEI.h"
+#define pi (3.14159265)
+#define logfreq (100)
+#define data_pts (500)
+
+Serial pc(USBTX, USBRX);
+Motor m(p25, p23, p27);
+QEI enc(p16,p17,NC,1600);
 
 DigitalOut light[]= {LED1, LED2, LED3, LED4};
-DigitalOut spinner(p20);
-DigitalOut plunger(p21);
+DigitalOut spinner(p21);
+DigitalOut plunger(p22);
+
+// firing circuit configuration
+int disc=20; //number of discs in magazine
+float shot_time=0.6; //time per shot. 3.51s for 5 shots
+int fire=4; //number of bullets to fire (reset to zero after every round of shots)
+float fwait; //fire time wait
+int shoot;
+
+
+//turret circuit configuration
+float motspeed;
+float x;
+float rad;
+int count;
+Timer t;
+float rad_one=0;
+float time_one=0;
+float omega; //angular velocity
+float old_E;
+float E; // error
+float PI=3.14159265;
+float old_t;
+float DC;
+float old_DC;
+float theta;
+//float theta_desired=x;
+float Ts=0.01;
+
 
 int main()
 {
-    int disc=20; //number of discs in magazine
-    float shot_time=0.6; //time per shot. 3.51s for 5 shots
-    int fire=0; //number of bullets to fire (reset to zero after every round of shots)
-    float fwait; //fire time wait
+    // initialize firing settings
+    light[0].write(0);
+    light[3].write(0);
+    spinner=0;
+    plunger=0;
+
+    // initialize turret settings
+    t.reset();
+    enc.reset();
+    m.speed(0.0);
+
+        pc.printf("enter an angle\r\n");
+        pc.scanf("%f", &x); //angle input from matlab
+
+    while(1) {
+
 
-    while(disc>0) {
-        light[0].write(0);
-        light[3].write(0);
-        spinner=0;
-        plunger=0;
-        printf("Ready to fire, %d discs left. Type number of shots. \n \r\r",disc);
-        scanf("%d",&fire);
+        // Turret Actuation
+
+        //turn to angle if target is detected
+        t.reset();
+        while(old_t<5.0) {
+            t.start();
+            wait(1/logfreq);
+            //if(t.read()-old_t>=Ts)
 
-        if (fire>0) { //fires for desired number of shots
+            count = enc.getPulses() ;
+            theta = -count*((2*pi)/3200) ;
+            // Calculate position error
+            E=(x*(PI/180))-theta;
+
+            // Control algorithm
+            DC = (0.9841*old_DC) + (0.2348*E) - (0.2335*old_E);
+            old_E  = E;
+            m.speed(DC+0.15);
+            old_DC = DC;
 
-            fwait=fire*shot_time;
-            printf("fire=%d \n\r",fire);
-            printf("fwait=%f \n\r",fwait);
-            
-            light[0].write(1);
-            spinner=1; //spinner turns on for 3 seconds
-            wait(1.5);
-            
-            light[3].write(1);
-            plunger=1; //plunger turns on for desired number of shots
-            wait(fwait);
+            if(DC>0 && DC<0.7)
+                m.speed(DC+0.1);
+            if(E>-1.0)
+                m.speed(DC+0.15);
+            if (E<0.015 && E>-0.01)
+                m.speed(0.0);
+            else if(DC<0 && DC>-0.7) {
+                m.speed(DC-0.34);
+                if(E>-1.0)
+                    m.speed(DC-0.5);
+                if (E>-0.015&& E<0.01)
+                    m.speed(0.0);
+            }
+            // Age variables
+            old_t  = t.read();
+            printf("time: %f  angle: %f  error: %f  DC: %f\n\r", t.read(), theta, E,DC);
+
+        }// end turret actuation
+            m.speed(0.0);
+            old_t=0.0;
+
+// shoots only when magazine is full
+
+
+
+//printf("Ready to fire, %d discs left. Type number of shots. \n \r\r",disc);
+        
 
-            //calculate number of shots left
-            disc=disc-fire;
-            //reset fire sequence
-            fire=0; 
-            fwait=0;
-        }
-    }
-        light[0].write(0);
-        light[3].write(0);
-        spinner=0;
-        plunger=0;
-        printf("You ran out of discs. Press the reset button to reload. \n\r\r");
-}
\ No newline at end of file
+                       
+                            fwait=fire*shot_time;
+                            //printf("fire=%d \n\r",fire);
+                            //printf("fwait=%f \n\r",fwait);
+
+                            light[0].write(1);
+                            spinner=1; //spinner turns on for 3 seconds
+                            wait(1.5);
+
+                            light[3].write(1);
+                            plunger=1; //plunger turns on for desired number of shots
+                            wait(fwait);
+
+                            //calculate number of shots left
+                            //disc=disc-fire;
+                            //reset fire sequence
+                    
+
+                //end of firing while loop
+
+
+                        light[0].write(0);
+                        light[3].write(0);
+                        spinner=0;
+                        plunger=0;
+                        
+                        
+                        m.speed(0.0);
+                        old_t=0.0;
+                        //enc.reset();
+                        pc.printf("enter an angle\r\n");
+                        pc.scanf("%f", &x);
+               
+    } //end of main while loop
+
+} //end main
\ No newline at end of file