Dit is het passieve stuurprogramma van de handorthese behorend bij mijn bacheloropdracht. Groet, Menno Sytsma

Dependencies:   EMG FastPWM HIDScope mbed-src

Revision:
2:1dd9e630a7b5
Parent:
1:f63d8a73460c
Child:
3:9f9ef68a25a2
--- a/main.cpp	Mon May 30 13:14:25 2016 +0000
+++ b/main.cpp	Tue May 31 14:53:58 2016 +0000
@@ -16,7 +16,7 @@
 
 int N;
 bool Start(0);
-bool Setting(0);
+double Setting(0);
 bool Dotask(0);
 int i;
 
@@ -25,18 +25,22 @@
 // Verklaren van de in en outputs
 Ticker Loopticker;                  // Deze ticker wordt gebruikt om de looptimerflag aan te roepen.
 volatile bool LoopTimerFlag2 = 0;    // Volatile, omdat deze heel vaak verandert van waar naar onwaar.
+Ticker Loopticker2;                  // Deze ticker wordt gebruikt om de looptimerflag aan te roepen.
+volatile bool LoopTimerFlag3 = 0;
 AnalogIn Referentie(A0);            // De schuifpotmeter naast de geleiding van de draad is de referentie.
-AnalogIn Boardpotmeter(A1);         // POT1 op het board wordt gebruikt als input van de controlloop.
+AnalogIn Boardpotmeter(A2);         // POT1 op het board wordt gebruikt als input van de controlloop.
+AnalogIn Boardpotmeter2(A1);
 DigitalOut motor1direction(D7);     //D6 en D7 voor motor 1 (op het motorshield)
 FastPWM motor1speed(D6);
 DigitalOut Led(LED_RED);
-AnalogIn Safety(A5);
+
 
 float potmeter;
 float Error;
 float Referentie2=1.0;
 float Input;
 float Output;
+float POT;
 double Error_prev = 0;
 double Error_int = 0;
 double Error_der;
@@ -74,8 +78,6 @@
 
 double Inputberekening(double B)
 {
-    //double Inp = 10*B;            // De potmeter geeft ook waardes tussen 0 en 1, dit wordt met een factor 10 geschaald zodat deze als een positie in cm opgelegd kunnen worden.
-    //Input = Filter2.step(Inp);
     Input = 5.5+(2.5*-cos(2*time_));
     if (Input>=9) {                             // De Input moet binnnen een aantal grenzen blijven. Groter dan 7 is mechanisch niet mogelijk.
         Input=9;                                // Bij een waarde kleiner dan 1,5 zijn de strings niet meer gewikkeld en werkt de controller averechts en is deze uiterst instabiel.
@@ -85,6 +87,12 @@
     return Input;
 }
 
+/*double Inputberekening2(double B, double Val)
+{
+    double Inp = 10*B;            // De potmeter geeft ook waardes tussen 0 en 1, dit wordt met een factor 10 geschaald zodat deze als een positie in cm opgelegd kunnen worden.
+    Val = Filter2.step(Inp);
+    return Inp;
+}*/
 
 double Errorberekening(double Input,double Ref)
 {
@@ -124,6 +132,11 @@
     LoopTimerFlag2 = 1;
 }
 
+void tickerfunctie3()                //Deze functie wordt elke honderdste seconde aangeroepen en zorgt ervoor dat de while-loop helemaal uitgevoerd kan worden.
+{
+    LoopTimerFlag3 = 1;
+}
+
 void Motor_controller()                 // De P_controller, door de ticker elke honderdste seconde uitgevoerd.
 {
     if(Ref_der < 0) {
@@ -145,137 +158,188 @@
         }
     }
 }
-    void Extendfinger(){
-        Error = 0;
-        int J = 0;
-        time_ = 0;                                      // Voordat het hele programma begint, staat de Error op 0, zodat de motor niet spastisch gaat draaien om dit te compenseren.
+void Extendfinger()
+{
+    Error = 0;
+    int J = 0;
+    time_ = 0;                                      // Voordat het hele programma begint, staat de Error op 0, zodat de motor niet spastisch gaat draaien om dit te compenseren.
+    while(1 && J<=320) {
+        Loopticker.attach(tickerfunctie2,0.01);
+        Hidscope.attach(scopeSend,0.01);                // Verzenden naar HIDscope
         while(1 && J<=320) {
-            Loopticker.attach(tickerfunctie2,0.01);
-            Hidscope.attach(scopeSend,0.01);                // Verzenden naar HIDscope
-            while(1 && J<=320) {
-                while(LoopTimerFlag2 !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
-                LoopTimerFlag2 = 0;                         // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
-                J= J+1;
-                pc.printf(" J is %i \n",J);
-                Led = 1;
-                double Input = Inputberekening(Boardpotmeter.read());
-                time_ += time_increment;
-                double Ref2 =  Referentieschaling(Referentie.read()/2,Input);       // De referentiewaarde is via deze functie (gevonden met metingen en polyfit) verbonden aan de afstand in centimeters voor waarden tussen 0 en 0.5.
-                Ref_der = Referentie2-Ref_prev;
-                Ref_prev = Referentie2;
-                Error = Errorberekening(Input, Referentie2);
-                Output = PID_controller(Error,5,1,0.1,0.01, Error_prev, Error_int);
-                Motor_controller();
-            }
+            while(LoopTimerFlag2 !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
+            LoopTimerFlag2 = 0;                         // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
+            J= J+1;
+            //pc.printf(" J is %i \n",J);
+            Led = 1;
+            double Input = Inputberekening(Boardpotmeter.read());
+            time_ += time_increment;
+            double Ref2 =  Referentieschaling(Referentie.read()/2,Input);       // De referentiewaarde is via deze functie (gevonden met metingen en polyfit) verbonden aan de afstand in centimeters voor waarden tussen 0 en 0.5.
+            Ref_der = Referentie2-Ref_prev;
+            Ref_prev = Referentie2;
+            Error = Errorberekening(Input, Referentie2);
+            Output = PID_controller(Error,5,1,0.1,0.01, Error_prev, Error_int);
+            Motor_controller();
         }
-        motor1speed.write(0);
+    }
+    motor1speed.write(0);
 
-    }
+}
 
-    void tickerfunctie() {
-        LoopTimerFlag = 1;
-    }
+void tickerfunctie()
+{
+    LoopTimerFlag = 1;
+}
+
+/*void Determinemax()
+{
+    double Val = 10*Boardpotmeter.read();            // De potmeter geeft ook waardes tussen 0 en 1, dit wordt met een factor 10 geschaald zodat deze als een positie in cm opgelegd kunnen worden.
+    double Max = Filter2.step(Val);
+    double Set_Error = Referentie.read()-Max;
+}*/
 
-    void Determinetask() {
-        if (Button1pressed == 0) {
-
-            Groen = 0;
-            N++;
-            wait (0.5);
-            Groen = 1;
+double P_controller(double Max, bool Keuze)
+{
+    while (Button1pressed.read()==1) {
+        Loopticker2.attach(tickerfunctie3,0.01);
+        while(LoopTimerFlag3 !=1);                  // Als LTF 0 is, blijft hij 0 en stopt de loop.
+        LoopTimerFlag2 = 0;                           // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
+        //pc.printf("Hello World! \n");
+        if (bool (0)) {
+            POT = Boardpotmeter.read();
+        } else if (bool (1)) {
+            POT = Boardpotmeter2.read();
         }
+        float Input = 10*POT; //Inputberekening2(POT,0);           // De potmeter geeft ook waardes tussen 0 en 1, dit wordt met een factor 10 geschaald zodat deze als een positie in cm opgelegd kunnen worden.
+        //pc.printf(" J is %i \n",J);
+        Led = 1;
+        float Ref2 =  Referentieschaling(Referentie.read()/2,Input);       // De referentiewaarde is via deze functie (gevonden met metingen en polyfit) verbonden aan de afstand in centimeters voor waarden tussen 0 en 0.5.
+        Ref_der = Ref2-Ref_prev;
+        Ref_prev = Ref2;
+        Error = Input-Ref2;
+        pc.printf("Input = %f Referentie= %f Error= %f \n", Input, Ref2, Error);
+        Output = PID_controller(Error,5,1,0.1,0.01, Error_prev, Error_int);
+        Motor_controller();
+        
     }
 
-    /* void Extendfinger()
-    {
-        //i = i+1;
-        wait (0.5);      // Knipper 2 keer met Rood en 1 keer met paars
-        Rood = 0;
-        wait (0.5);
-        Rood = 1;
-        wait (0.5);
-        Rood = 0;
-        wait (0.5);
-        Rood = 1;
-        wait (0.5);
-        Rood = 0;
-        Blauw = 0;
-        wait (0.5);
-        Rood = 1;
-        Blauw = 1;
+
+
+    /* //double Max = Filter2.step(Val);
+     double Ref3 = Referentieschaling(Referentie.read()/2,Val);
+     double Set_Error = Ref3-Val;
+     pc.printf("Maximum = %d Referentie= %d Error= %d \n", Val, Ref3, Set_Error);
+     Output = Set_Error;
+     if(Set_Error>=0.02) {
+         motor1direction.write(1);
+         motor1speed = fabs(Set_Error);
+     }
+     else if (Set_Error<-0.02) {
+         motor1direction.write(0);
+         motor1speed = fabs(Set_Error);
+     }
+     else {
+         motor1speed = 0;
+     } */
+
+
+    Groen = 0;
+    wait (0.5);
+    return Max;
+}
+
+void Determinetask()
+{
+    if (Button1pressed == 0) {
+
+        Groen = 0;
+        N++;
         wait (0.5);
-    } */
+        Groen = 1;
+    }
+}
+
+int main()
+{
+    Rood = 1;
+    Blauw = 1;
+    Groen = 1;
+    int i = 0;
+    pc.printf("Hello World! %i \n", i);
+    Finitestatemachine.attach(tickerfunctie,0.1);
+
+    while (true) {
+        while(LoopTimerFlag !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
+        LoopTimerFlag = 0;                           // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
+        if (Start==0 && Setting==0 && Dotask==0) { // In eerste instantie gaan de leds even uit
+
+            Start = 1;
+            Groen = 0;
+            pc.printf("State 1\n");
+        }
+
+        if (Start==1 && Setting==0 && Dotask==0) {      // State 2 heeft Geel als kleur
+            Groen = 0;
+            Rood = 0;
+            pc.printf("State 2\n");
+            if (Button1pressed.read()==1 && Button2pressed.read()==0) {
+                Setting = true;
+                Start = false;
+                Groen = 1;
+                Rood = 1;
+                pc.printf("State 2 A\n");
+                wait(0.5);
+
 
-    int main() {
-        Rood = 1;
-        Blauw = 1;
-        Groen = 1;
-        int i = 0;
-        pc.printf("Hello World! %i \n", i);
-        Finitestatemachine.attach(tickerfunctie,0.1);
+            }
+            if (Button1pressed.read()==0 && Button2pressed.read()==1 && N>0) {
+                Groen = 1;
+                Rood = 1;
+                Dotask = 1;
+                Start=0;
+                pc.printf("State 2 B\n");
+                wait(0.5);
+            }
+        }
+        if (Start==0 && Setting==1 && Dotask==0) {          // Leds zijn uit, elke count gaat het groene lampje even branden.
+            pc.printf("State 2 C\n");
+            double Maximum = P_controller(0,0);
+            Groen = 1;
+            pc.printf("Max = %f \n", Maximum);
+            double Minimum = P_controller(0,1);
+            Groen = 1;
+            pc.printf("Min = %f \n", Minimum);
+            Setting = 2;
+        }
 
-        while (true) {
-            while(LoopTimerFlag !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
-            LoopTimerFlag = 0;                           // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
-            if (Start==0 && Setting==0 && Dotask==0) { // In eerste instantie gaan de leds even uit
+        if (Start==0 && Setting==2 && Dotask==0) {          // Leds zijn uit, elke count gaat het groene lampje even branden.
+            pc.printf("State 3\n");
+            Determinetask();                            // Aantal gewenste herhalingen van Dotask instellen
+            pc.printf("N = %i \n", N);
+            if (Button1pressed.read()== 1 && Button2pressed.read()== 0) {
+                Setting = 0;
+                Dotask = 1;
+                pc.printf("State 3 B\n");
+            }
+        }
 
+        if (Start==0 && Setting==0 && Dotask==1) {
+            pc.printf("State 4\n");
+            while(i < N) {
+
+                pc.printf("i = %i  N = %i \n", i, N);
+                Extendfinger();
+                //int J = 0;
+                pc.printf("Extendfinger()afgerond\n", i, N);
+                i++;
+            }
+            if (i==N) {
+                Dotask = 0;
                 Start = 1;
-                Groen = 0;
-                pc.printf("State 1\n");
+                i=0;
+                pc.printf("Final state \n");
             }
 
-            if (Start==1 && Setting==0 && Dotask==0) {      // State 2 heeft Geel als kleur
-                Groen = 0;
-                Rood = 0;
-                pc.printf("State 2\n");
-                if (Button1pressed.read()==1 && Button2pressed.read()==0) {
-                    Setting = true;
-                    Start = false;
-                    Groen = 1;
-                    Rood = 1;
-                    pc.printf("State 2 A\n");
-                    wait(0.5);
-
-
-                }
-                if (Button1pressed.read()==0 && Button2pressed.read()==1 && N>0) {
-                    Groen = 1;
-                    Rood = 1;
-                    Dotask = 1;
-                    Start=0;
-                    pc.printf("State 2 B\n");
-                    wait(0.5);
-                }
-            }
-
-            if (Start==0 && Setting==1 && Dotask==0) {          // Leds zijn uit, elke count gaat het groene lampje even branden.
-                pc.printf("State 3\n");
-                Determinetask();                            // Aantal gewenste herhalingen van Dotask instellen
-                pc.printf("N = %i \n", N);
-                if (Button1pressed.read()== 1 && Button2pressed.read()== 0) {
-                    Setting = 0;
-                    Dotask = 1;
-                    pc.printf("State 3 B\n");
-                }
-            }
-
-            if (Start==0 && Setting==0 && Dotask==1) {
-                pc.printf("State 4\n");
-                while(i < N) {
-
-                    pc.printf("i = %i  N = %i \n", i, N);
-                    Extendfinger();
-                    //int J = 0;
-                    pc.printf("Extendfinger()afgerond\n", i, N);
-                    i++;
-                }
-                if (i==N) {
-                    Dotask = 0;
-                    Start = 1;
-                    i=0;
-                    pc.printf("Final state \n");
-                }
-
-            }
         }
     }
+}