Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EMG HIDScope PID QEI mbed TextLCD
Diff: main.cpp
- Revision:
- 10:819fb5288aa0
- Parent:
- 9:3e19a344c025
- Child:
- 11:c5042e19a096
diff -r 3e19a344c025 -r 819fb5288aa0 main.cpp
--- 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);