Script met een paar limiet toevoegingen en reset van arm als die te ver door draait.

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed

Fork of Samenvoegen6 by Biorobotics10

Files at this revision

API Documentation at this revision

Comitter:
Wallie117
Date:
Wed Oct 21 11:32:48 2015 +0000
Parent:
1:0e1d91965b8e
Commit message:
Dit is het script van de robot, er zijn problemen gekomen door while loops in te zetten. Dit verstoord het lezen van het EMG signaal. Het EMG signaal en Encoder signaal moet in de Tickers komen!!

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Oct 20 09:29:32 2015 +0000
+++ b/main.cpp	Wed Oct 21 11:32:48 2015 +0000
@@ -20,8 +20,8 @@
 //AnalogIn pot(A2);
 //AnalogIn pot1(A3);
 
-QEI wheel2 (D10, D11, NC, 64,QEI::X4_ENCODING);          // Function for Encoder1 on the motor1 to the Microcontroller
-QEI wheel1 (D12, D13, NC, 64,QEI::X4_ENCODING);          // Function for Encoder2 on the motor2 to the Microcontroller
+QEI wheel1 (D10, D11, NC, 64,QEI::X4_ENCODING);          // Function for Encoder1 on the motor1 to the Microcontroller
+QEI wheel2 (D12, D13, NC, 64,QEI::X4_ENCODING);          // Function for Encoder2 on the motor2 to the Microcontroller
 
 //**************** OUTPUTS ****************
 DigitalOut red(LED_RED);                                        // LED declared for calibration
@@ -33,10 +33,10 @@
 
 DigitalOut magnet(D2);
 
-DigitalOut motor2direction(D4);                                 // D4 en D5 zijn motor 2 (op het motorshield)
-PwmOut motor2speed(D5);
-DigitalOut motor1direction(D7);                                 // D6 en D7 zijn motor 1 (op het motorshield)
-PwmOut motor1speed(D6);
+DigitalOut motor1direction(D4);                                 // D4 en D5 zijn motor 2 (op het motorshield)
+PwmOut motor1speed(D5);
+DigitalOut motor2direction(D7);                                 // D6 en D7 zijn motor 1 (op het motorshield)
+PwmOut motor2speed(D6);
 
 //**************** FUNCTIONS **************
 /* HIDScope    scope(4);          */                              // HIDScope declared with 4 scopes
@@ -101,23 +101,24 @@
 bool            flag_left           = true;
 bool            flag_right          = true;
 float           pos_board           = 0;                                   // The position of the board begins at zero
+int             pos_board1          = 0;
 float           Encoderread2        = 0;
 
 
 //********* VARIABLES FOR CONTROL 3 ************
-const float     minimum_contract    = 0.2;                                 // Certain levels for muscle activity to activate motor
-const float     medium_contract     = 0.5;                                 // "Medium contract muscle"
+const float     minimum_contract    = 0.4;                                 // Certain levels for muscle activity to activate motor
+const float     medium_contract     = 0.6;                                 // "Medium contract muscle"
 const float     maximum_leftbiceps  = 0.8;                                 // "Maximum contract muscle"
 const float     on                  = 1.0;
 const float     off                 = 0.0;
-const float     minimum_throw_angle = -5;
+const float     minimum_throw_angle = 20;
 const float     maximum_throw_angle = 110;
 float           pos_arm             = 0;
 int             pos_arm1            = 0;
 float           Encoderread1        = 0;
 int             switch_rondjes      = 2;
 int             rondjes             = 0;
-float           pos_armrondjes_max  = 5;
+float           pos_armrondjes_max  = 3;
 
 bool            problem1            = false;
 bool            problem2            = false;
@@ -125,7 +126,8 @@
 //********* VARIABLES FOR CONTROL 4 ************
 
 float           reset_positie       = 0;      // Belangrijk
-float           reset_board         = 0;
+int             reset_arm           = 0;
+int             reset_board         = 0;
 float           speedcompensation;
 float           speedcompensation2;
 int             t                   = 5;                           // aftellen naar nieuw spel
@@ -153,6 +155,8 @@
 double cali_array1[2560] = {};                                  // array to store values in
 double cali_array2[2560] = {};
 
+double cali_array3[512] = {};
+
 void hoog_laag_filter()
 {
     u1 = EMG1;
@@ -296,9 +300,12 @@
         if (flag_s) {
             Encoderread1 = wheel1.getPulses();
             pos_arm = (Encoderread1/((64.0*131.0)/360.0));   // Omrekenen naar graden van arm
+            pos_arm1 = pos_arm;
 
             Encoderread2 = wheel2.getPulses();
             pos_board = (Encoderread2/((64.0*131.0)/360.0));   // Omrekenen naar graden van board
+            pos_board1 = pos_board;
+            
             flag_calibration = false;
         }
         //************************* FASE SWITCH ******************************************
@@ -307,6 +314,9 @@
             j++;
             wait(0.01);                                              // Problemen met EMG metingen die te hoog zijn op het begin van script na calibratie. vandaar ff wachten en de sample loop een paar keer doorlopen.
             pc.printf("waarde j = %i \n",j);
+            led_rood.write(0);
+            led_groen.write(1);
+            led_geel.write(0);
         }
 
         if( j > N) {
@@ -315,37 +325,31 @@
 
                     //******************* Fase 1 **************************
                 case(1):
+                        led_rood.write(1);
+                        led_groen.write(0);
+                        led_geel.write(0);
                     rondjes = 0;
                     if (y1> contract) {
                         flag_right = false;
                         flag_left = true;
-                        led_rood.write(0);
-                        led_groen.write(0);
-                        led_geel.write(1);
+
                     }
 
                     if (y2 > contract) {
                         flag_right = true;
                         flag_left = false;
-                        led_rood.write(0);
-                        led_groen.write(0);
-                        led_geel.write(1);
+                      
                     }
 
                     if (pos_board < maxleft) {
                         flag_left = false;
                         motor2speed.write(relax);
-                        led_rood.write(1);
-                        led_groen.write(0);
-                        led_geel.write(0);
+                    
                     }
 
                     if (pos_board > maxright) {
                         flag_right = false;
                         motor2speed.write(relax);
-                        led_rood.write(1);
-                        led_groen.write(0);
-                        led_geel.write(0);
                     }
 
                     if (flag_left == true) {
@@ -370,14 +374,17 @@
                         motor2speed.write(relax);
                         fase = 2;
                         fase_switch_wait = true;
+                        led_rood.write(0);
+                        led_groen.write(0);
+                        led_geel.write(1);
                         j = 0;
-                        led_rood.write(0);
-                        led_groen.write(1);
-                        led_geel.write(0);
                     }
                     break;
                     //******************* Fase 2 **************************
                 case(2):
+                led_rood.write(0);
+                led_groen.write(0);
+                led_geel.write(1);
                     motor1direction.write(cw);
                     pos_arm1 = (pos_arm - (rondjes * 360));
 
@@ -396,30 +403,18 @@
 
                     if (y2 > minimum_contract & y2 < medium_contract) {
                         motor1speed.write((y2 - minimum_contract)/(medium_contract - minimum_contract));
-                        led_rood.write(0);
-                        led_groen.write(0);
-                        led_geel.write(1);
                     }
                     if (y2 > medium_contract) {               // Hoger dan drempelwaarde = Actief
                         motor1speed.write(1);
-                        led_rood.write(0);
-                        led_groen.write(0);
-                        led_geel.write(1);
                     }
                     if (y2 < minimum_contract) {              // Lager dan drempel = Rust
                         motor1speed.write(relax);
-                        led_rood.write(0);
-                        led_groen.write(1);
-                        led_geel.write(0);
                     }
 
                     if( rondjes == pos_armrondjes_max) {                    // max aantal draaing gemaakt!!!!!!
                         problem1 = true;
                         problem2 = true;
                         motor1speed.write(relax);
-                        led_rood.write(1);
-                        led_groen.write(0);
-                        led_geel.write(0);
                         
                           while (problem1) {
                             j++;
@@ -444,29 +439,21 @@
                         led_rood.write(0);
                         wait(0.1);
                         led_rood.write(1);
-                    }
+                        wait(1.5);
 
                     while(problem2) {
-                        motor1speed.write(relax);
-                        wait(1.5);
-                        while(1) {
-                            led_rood.write(0);
-                            led_groen.write(1);
-                            led_geel.write(0);
-                            
-                            motor1direction.write(0);
-                            problem_velocity = 0.05 + (pos_arm/720)*0.4;
-                            motor1speed.write(problem_velocity);
+                            motor1direction.write(ccw);
+                            motor1speed.write(0.02);
                             
                             if (flag_s) {
                                 Encoderread1 = wheel1.getPulses();
                                 pos_arm = (Encoderread1/((64.0*131.0)/360.0));   // Omrekenen naar graden van arm
                             }
-                            if (pos_arm < 0) {
-                                led_rood.write(0);
-                                led_groen.write(1);
-                                led_geel.write(0);
+                            if (pos_arm < 10) {
+                                
                                 problem2 = false;
+                                motor1speed.write(0);
+                                rondjes = 0;
                                 wait(1);
                             }
                         }
@@ -478,10 +465,6 @@
                             fase = 3;
                             pc.printf("Van fase 2 naar fase 3\n");
                             
-                            led_rood.write(0);
-                            led_groen.write(1);
-                            led_geel.write(0);
-                            
                             wait(2);
                             j = 0;
                             fase_switch_wait = true;
@@ -492,48 +475,50 @@
                     break;
                     //********************************************* Fase 3 **********************************************
                 case(3):
-
+                        led_rood.write(0);
+                        led_groen.write(1);
+                        led_geel.write(0);
                     switch(switch_reset) {
                         case(1):
                             if(pos_arm < reset_positie) {                   //ene kant op draaien
                                 motor1direction.write(cw);
-                                speedcompensation2 = ((reset_positie - pos_arm)/900.0 + (0.1));
-                                motor1speed.write(speedcompensation2);
-                            }
-                            if(pos_arm > reset_positie) {                //andere kant op
-                                motor1direction.write(ccw);
-                                speedcompensation2 = ((pos_arm - reset_positie)/500.0 + (0.1));
+                                speedcompensation2 = 0.05;//((reset_arm - pos_arm1)/900.0 + (0.02));
                                 motor1speed.write(speedcompensation2);
                             }
-                            if(pos_arm < reset_positie+3 && pos_arm > reset_positie-3) {                  // Dit gaat niet goed komen, omdat het precies die waarde moet zijn
-                                for(int cali_index1 = 0; cali_index1 < 2560; cali_index1++)
-                                
-                                motor1speed.write(0);
-                                arm = true;
-                                switch_reset = 2;
-                            }
+                            if(pos_arm > reset_positie)                  //andere kant op
+                        {
+                            motor1direction.write(ccw);
+                            speedcompensation2 = 0.05;//((pos_arm1 - reset_arm)/500.0 + (0.02));
+                            motor1speed.write(speedcompensation2);
+                        }
+                        if(pos_arm < reset_positie+5 && pos_arm > reset_positie-5)                    // Dit gaat niet goed komen, omdat het precies die waarde moet zijn
+                        {
+                            motor1speed.write(0);
+                            arm = true;
+                            switch_reset = 2;
+                        }
                             pc.printf("Positie_arm = %f \t \t snelheid = %f \n",pos_arm, speedcompensation);
                             wait(0.0001);
                             break;
 
                         case(2):
                             pc.printf("\t switch magneet automatisch \n");
-                            wait(1);
+                            wait(0.2);
                             magnet.write(on);
-                            wait(0.5);
+                            wait(2);
                             switch_reset = 3;
                             break;
-
+                                    
                         case(3):
                             if(pos_board < reset_board) {
                                 motor2direction.write(cw);
-                                speedcompensation = ((reset_board - pos_board)/500.0 + (0.1));
+                                speedcompensation = 0.05; //((reset_board - pos_board1)/500.0 + (0.1));
                                 motor2speed.write(speedcompensation);
                             }
 
                             if(pos_board > reset_board) {
                                 motor2direction.write(ccw);
-                                speedcompensation = ((pos_board - reset_board)/500.0 + (0.1));
+                                speedcompensation = 0.05;//((pos_board1 - reset_board)/500.0 + (0.05));
                                 motor2speed.write(speedcompensation);
                             }
                             if(pos_board < reset_board+5 && pos_board > reset_board-5) {