Numero Uno / Mbed 2 deprecated TheProgram

Dependencies:   EMG HIDScope PID QEI mbed TextLCD

Files at this revision

API Documentation at this revision

Comitter:
ewoud
Date:
Tue Oct 27 17:18:17 2015 +0000
Parent:
9:3e19a344c025
Child:
11:c5042e19a096
Commit message:
working very smooth. fixed float->int problem, correct lcd working

Changed in this revision

EMG.lib Show annotated file Show diff for this revision Revisions of this file
inits.h 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
--- a/EMG.lib	Mon Oct 26 14:26:13 2015 +0000
+++ b/EMG.lib	Tue Oct 27 17:18:17 2015 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/Numero-Uno/code/EMG/#9f27d04c6183
+https://developer.mbed.org/teams/Numero-Uno/code/EMG/#deb12a6f646e
--- a/inits.h	Mon Oct 26 14:26:13 2015 +0000
+++ b/inits.h	Tue Oct 27 17:18:17 2015 +0000
@@ -28,17 +28,21 @@
 DigitalIn edgeright(PTC7);
 DigitalIn edgetop(PTC0);
 DigitalIn edgebottom(PTC9);
+DigitalIn edgeStart(PTC8);
+DigitalIn edgeFinish(PTC1);
 
-// emg input
+// pot input
 AnalogIn pot1(A0);
 AnalogIn pot2(A1);
 
 // user interface
-DigitalOut outofboundsled(LED1);
+DigitalOut statusled(LED_GREEN);
 InterruptIn startButton(D3);
+bool calibrated=false; // bool to determine if button press has to start calibration or the game
 InterruptIn stopButton(D2);
 InterruptIn initpositionButton(PTC6); 
 HIDScope scope(5);
+bool controlbypc=false;
 
 ////////////////////////////
 //////// Timers ////////////
@@ -59,15 +63,15 @@
 
 
 // Working variables for motors
-volatile int leftPulses     = 0;
+volatile float leftPulses     = 0;
 volatile float leftAngle=0;
-volatile int leftPrevPulses = 0;
+volatile float leftPrevPulses = 0;
 volatile float leftPwmDuty  = 0.0;
 volatile float leftVelocity = 0.0;
 float leftRequest=0;
 
-volatile int rightPulses     = 0;
-volatile int rightPrevPulses = 0;
+volatile float rightPulses     = 0;
+volatile float rightPrevPulses = 0;
 volatile float rightAngle =0;
 volatile float rightPwmDuty  = 0.0;
 volatile float rightVelocity = 0.0;
@@ -78,7 +82,7 @@
 float verrequest;
 float grenslaag=0.3;
 float grenshoog=0.7;
-float round=27720;
+float round=4200.0*6.6*6.6;
 float maxspeed=1; //cm/sec
 float currentX;
 float currentY;
--- a/main.cpp	Mon Oct 26 14:26:13 2015 +0000
+++ b/main.cpp	Tue Oct 27 17:18:17 2015 +0000
@@ -22,49 +22,61 @@
     goFlag=true;
 }
 void initpositiongo(){
-    if(initposition_go){initposition_go=false;}
-    else {initposition_go=true;}
-    pc.printf("initposition: %d \n\r",initposition_go);
+    if(initposition_go){initposition_go=false;
+        pc.printf("ended init process\n\r");}
+    else {initposition_go=true;
+        pc.printf("started init process\n\rleft arm: QAZ right arm: OKM");
+       
+    }
 }
 
 void systemStart(){
+    //if (calibrated==false){
+    //    calibrate_go=true;
+   // }
     if (systemOn==true){
         systemOn=false;
         lcd.cls(); 
-        lcd.printf("stopped :(");
+        lcd.printf("stopped :(\n\r");
+        pc.printf("stopped :(\n\r");
+        statusled=1;
     }
     else {
         systemOn=true;
         lcd.cls(); 
-        lcd.printf("GO GO GO!!");
+        lcd.printf("GO GO GO!!\n\r");
+        pc.printf("started\n\r");
+        statusled=0;
     }
 }
 void systemStop(){
     systemOn=false;
     pc.printf("system stopped\n\r");
     lcd.cls(); 
-    lcd.printf("stopped :(");
+    lcd.printf("stopped :(\n\r");
+    statusled=1;
 }
 
-
 int main() {
-    pc.printf("system start");
+    pc.printf("system start\n\r");
     lcd.printf("A-MAZE-ING\nMARIO"); // print a test message to the display.
     // initialize (defined in inits.h)
     initMotors();
     initPIDs();
     
-    outofboundsled=1;
     edgeleft.mode(PullUp);
     edgeright.mode(PullUp);
     edgetop.mode(PullUp);
     edgebottom.mode(PullUp);
+    edgeStart.mode(PullUp);
+    edgeFinish.mode(PullUp);
     
     // interrupts
     motorControlTicker.attach(&setGoFlag, RATE);
     lcdTicker.attach(&setLcdFlag,0.2);
     cali_button.rise(&calibratego);
     initpositionButton.rise(&initpositiongo);
+    //startButton.fall(&buttonpressTimer); could be used to calculate the button press time
     startButton.rise(&systemStart);
     stopButton.rise(&systemStop);
     
@@ -74,7 +86,7 @@
         if (calibrate_go==true){
             lcd.cls();
             lcd.printf("calibrating...");
-            calibrate();    
+            calibrate();
             lcd.cls();     
             lcd.printf("ready to start!\nPress the Button");
             
@@ -90,37 +102,63 @@
             // **************
             // get emg signal
             if(initposition_go){
-                leftRequest=pot1.read()*10-5;
-                rightRequest=pot2.read()*10-5;
-                //pc.printf("initposition_go, left:%f, leftAngle:%f, right:%f, rightAngle: %f",leftRequest, leftAngle, rightRequest, rightAngle);
+                if (pc.readable()){
+                    char input= pc.getc();
+                    if(input=='q'){leftRequest=0.5;}
+                    else if(input=='a'){leftRequest=0;}
+                    else if(input=='z'){leftRequest=-0.5;}
+
+                    if(input=='o'){rightRequest=0.5;}
+                    else if(input=='k'){rightRequest=0;}
+                    else if(input=='m'){rightRequest=-0.5;}
+                    pc.putc(input);
+                    
+                    leftRequest=leftRequest*maxspeed;
+                    rightRequest=rightRequest*maxspeed;
+                }
+
             }
             else {
-                sample_filter();   
-                y2=0;   
-                // determine if forward or backward signal is stronger
-                if (y1 > y2){
-                    horrequest = y1; 
-                } 
+                if(controlbypc){
+                    if (pc.readable()){
+                        char input= pc.getc();
+                        if(input=='8'){verrequest=0.5;}
+                        else if(input=='2'){verrequest=-0.5;}
+                        else if(input=='4'){horrequest=-0.5;}
+                        else if(input=='6'){horrequest=0.5;}
+                        else {horrequest=0; verrequest=0;}
+                        pc.putc(input);
+                    }
+                    
+                    
+                }
                 else {
-                    horrequest = -y2;
-                }
-                if (y3 > y4){
-                    verrequest = y3; 
-                } 
-                else {
-                    verrequest = -y4;
+                    sample_filter();    
+                    if (y1 > y2){
+                        horrequest = y1; 
+                    } 
+                    else {
+                        horrequest = -y2;
+                    }
+                    if (y3 > y4){
+                        verrequest = y3; 
+                    } 
+                    else {
+                        verrequest = -y4;
+                    }
+                     // perform stepping between boundries
+                    if(horrequest < -grenshoog){horrequest=-1;} else if(horrequest>=-grenshoog and horrequest<-grenslaag){horrequest=-0.5;}
+                    else if(horrequest >  grenshoog){horrequest=1; } else if(horrequest>= grenslaag and horrequest<grenshoog){horrequest=0.5;} 
+                    else {horrequest=0;}
+                    
+                    if(verrequest < -grenshoog){verrequest=-1;} else if(verrequest>=-grenshoog and verrequest<-grenslaag){verrequest=-0.5;}
+                    else if(verrequest >  grenshoog){verrequest=1; } else if(verrequest>= grenslaag and verrequest<grenshoog){verrequest=0.5;} 
+                    else {verrequest=0;}
+            
                 }
                 
                 
-                // perform stepping between boundries
-                if(horrequest < -grenshoog){horrequest=-1;} else if(horrequest>=-grenshoog and horrequest<-grenslaag){horrequest=-0.5;}
-                else if(horrequest >  grenshoog){horrequest=1; } else if(horrequest>= grenslaag and horrequest<grenshoog){horrequest=0.5;} 
-                else {horrequest=0;}
-                
-                if(verrequest < -grenshoog){verrequest=-1;} else if(verrequest>=-grenshoog and verrequest<-grenslaag){verrequest=-0.5;}
-                else if(verrequest >  grenshoog){verrequest=1; } else if(verrequest>= grenslaag and verrequest<grenshoog){verrequest=0.5;} 
-                else {verrequest=0;}
-            
+               
             
                 horrequest=horrequest*maxspeed; // turn [-1, 1] into [-max cm/s, max cm/s]
                 verrequest=verrequest*maxspeed;
@@ -129,18 +167,18 @@
                 // ***************       
                 // calculate required rotational velocity from the requested horizontal velocity
                 // first get the current position from the motor encoders and make them start at 45 degree. 
-                leftAngle=-(leftQei.getPulses()/round)*360+45; 
-                rightAngle=-(rightQei.getPulses()/round)*360+45;
+                leftAngle=(leftQei.getPulses()/round)*360+45; 
+                rightAngle=(rightQei.getPulses()/round)*360+45;
                 
                 // trigonometry to get xy position from angles (cm)
                 currentX = (tan(rightAngle*M_PI/180)*l)/(tan(leftAngle*M_PI/180)+tan(rightAngle*M_PI/180));
                 currentY = tan(leftAngle*M_PI/180)*currentX;
                 
                 // restrict motion if edges are touched
-                if (edgeleft==0){
+                if (edgeleft==0 or edgeFinish==0){
                     if (horrequest < 0){horrequest=0; }
                 }
-                if (edgeright==0){
+                if (edgeright==0 or edgeStart==0){
                     if (horrequest > 0){horrequest=0; }
                 }
                 if (edgetop==0){
@@ -159,10 +197,10 @@
                 toRightAngle = atan(toY/(l-toX))*180/M_PI;
                 
                 // restrict motion if angles out-of-bound
-                if (toLeftAngle < 0){toLeftAngle=0; pc.printf("out of bounds \n\r");}
-                if (toLeftAngle > 90){toLeftAngle=90; pc.printf("out of bounds \n\r");}
-                if (toRightAngle < 0){toRightAngle=0; pc.printf("out of bounds \n\r");}
-                if (toRightAngle > 90){toRightAngle=90; pc.printf("out of bounds \n\r");}
+                //if (toLeftAngle < 0){toLeftAngle=0; pc.printf("out of bounds \n\r");}
+               //if (toLeftAngle > 90){toLeftAngle=90; pc.printf("out of bounds \n\r");}
+                //if (toRightAngle < 0){toRightAngle=0; pc.printf("out of bounds \n\r");}
+                //if (toRightAngle > 90){toRightAngle=90; pc.printf("out of bounds \n\r");}
                 
                 // restrict motion if position is out of reach of the arms
                 //if (sqrt(pow(currentX,2)+pow(currentY,2)) > armlength){ // too far from left arm
@@ -185,13 +223,13 @@
             // **************
             // Velocity calculation
             // left, differentiate from encoders
-            leftPulses = leftQei.getPulses()/round*360; // (degree)
+            leftPulses = -(float)leftQei.getPulses()/round*360; // (degree)
             leftVelocity = ((float)(leftPulses - leftPrevPulses))/ RATE; // (degree/sec)
             leftPrevPulses = leftPulses;
             leftController.setProcessValue(leftVelocity); // set PID process value
             
             // right
-            rightPulses = rightQei.getPulses()/round*360; // (degree)
+            rightPulses = -(float)rightQei.getPulses()/round*360; // (degree)
             rightVelocity = ((float)(rightPulses - rightPrevPulses))/ RATE; // (degree/sec)
             rightPrevPulses = rightPulses;
             rightController.setProcessValue(rightVelocity); // set PID process value
@@ -203,31 +241,31 @@
             
             leftPwmDuty = leftController.compute();
             if (leftPwmDuty < 0){ // put motor in reverse when we have a negative value
-                leftDirection = 1;
+                leftDirection = 0;
                 leftMotor = -leftPwmDuty;
             }
             else {
-                leftDirection = 0;
+                leftDirection = 1;
                 leftMotor = leftPwmDuty;
             }
             
             // right
             rightPwmDuty = rightController.compute();
             if (rightPwmDuty < 0){ // put motor in reverse when we have a negative value
-                rightDirection = 1;
+                rightDirection = 0;
                 rightMotor = -rightPwmDuty;
             }
             else {
-                rightDirection = 0;
+                rightDirection = 1;
                 rightMotor = rightPwmDuty;
             }
             
             // ***************
             // User feedback
-            scope.set(0, y1);
-            scope.set(1, y2);
-            scope.set(2, y3);
-            scope.set(3, y4);
+            scope.set(0, leftAngle);
+            scope.set(1, toLeftAngle);
+            scope.set(2, rightAngle);
+            scope.set(3, toRightAngle);
             scope.set(4, horrequest);
             scope.set(5, verrequest);
             scope.send();
@@ -239,7 +277,8 @@
             leftMotor=0;
             rightMotor=0;
         }
-        if(lcdGoFlag==true){
+        
+        if(lcdGoFlag==true && systemOn==true){
             text="";
             text+="hor: ";
             if(horrequest==-1){text+="<<";}
@@ -251,24 +290,24 @@
             if(horrequest==1){text+=">>";}
         
         
-            text+=" T:%d\n",playTimer.read();
+            text+=" T:XXX";
+            text+="ver: ";
             
-            if(verrequest==-1){text+="<<";}
-            if(verrequest==-0.5){text+=" <";}
-            if(verrequest>=0){text+="  ";}
+            if(verrequest==-1){text+="vv";}
+            else if(verrequest==-0.5){text+=" v";}
+            else {text+="  ";}
             text+="0";
+            
+            if(verrequest==1){text+="TT";}
+            else if(verrequest==0.5){text+="T ";}
             if(verrequest<=0){text+="  ";}
-            if(verrequest==0.5){text+="> ";}
-            if(verrequest==1){text+=">>";}
             
-            text+" HIT:%d",0;
+            text+=" HIT:X";
             
            
             
             char chartext[1024];
             strcpy(chartext, text.c_str());
-            
-            pc.printf(chartext);
              
             lcd.cls();
             lcd.printf(chartext);