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: HIDScope MODSERIAL QEI TextLCD mbed
Fork of TotalControlEmg2 by
Revision 51:dcbfdf3b9468, committed 2015-10-28
- Comitter:
- RemcoDas
- Date:
- Wed Oct 28 12:47:38 2015 +0000
- Parent:
- 50:16314b798754
- Child:
- 52:85ddaee35185
- Commit message:
- Faal
Changed in this revision
| Kalibratie.cpp | 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/Kalibratie.cpp Wed Oct 28 09:28:48 2015 +0000
+++ b/Kalibratie.cpp Wed Oct 28 12:47:38 2015 +0000
@@ -15,7 +15,8 @@
}
if (y > ymax && i >= samples / 10) { //Check on maximum, not first 10 samples (offset)
ymax = y;
- }
+ }
+ wait(0.05);
}
return ymax;
}
@@ -33,7 +34,8 @@
}
if (y < ymin && i >= samples / 10) { // not first 10 samples (offset)
ymin = y;
- }
+ }
+ wait(0.05);
}
return ymin;
}
\ No newline at end of file
--- a/main.cpp Wed Oct 28 09:28:48 2015 +0000
+++ b/main.cpp Wed Oct 28 12:47:38 2015 +0000
@@ -31,11 +31,12 @@
enum aimFase {OFF, CW, CCW}; // Aim motor possible states
uint8_t aimState = OFF; // first state aim motor
//-------------------------------Variables---------------------------------------------------------------------
-int maxCounts = 13000; // max richt motor counts Aim motor
+int maxCounts = 0; // max richt motor counts Aim motor
int breakPerc = 0;
volatile int modeL = 1, modeR = 1;
-const double servoBreak = 0.00165, servoFree = 0.002; // Range servo,between servoL en servoR (= pulsewidth pwm servo)
-const double tControl = 0.05, tLcd = 2; // ticker time (sec)
+const double wM1 = 0.3, wM2 = 0.25; // Power motors
+const double servoBreak = 0.0016, servoFree = 0.002; // Range servo,between servoL en servoR (= pulsewidth pwm servo)
+const double tControl = 0.1, tLcd = 2; // ticker time (sec)
const double Fs = 200; //Sample frequency Hz
double t = 1/ Fs; // time EMGticker
double thresholdlowL= 0, thresholdmidL = 0, thresholdhighL= 0;
@@ -44,7 +45,6 @@
volatile bool L = false, R = false; // Booleans for checking if mode. has been 1?
volatile bool btn = false; // Button is pressed?
volatile bool controlFlag = false, btnFlag = false, emgFlag = false, lcdFlag = false, runEmg = true; // Go flags
-bool boolBrake = false;
//----------------------------Functions-----------------------------------------------------------------------
void PRINT(const char* text){
lcd.cls(); // clear LCD scherm
@@ -58,7 +58,7 @@
double ymax = KalibratieMax(emgL, true); // Maxium value left EMG, boolean indicates left
PRINT("EMG LEFT well done!"); // LCD
- if((ymax-ymin) < 0.05 || !runEmg){ // No EMG connected or button pushed
+ if((ymax-ymin) < 0.05 || !runEmg){ // No EMG connected or button pushed
ymin = 10;
ymax = 10;
}
@@ -67,6 +67,7 @@
thresholdhighL = 0.8 * ymax; // Highest threshold
pc.printf("ymaxL = %f en yminL = %f \r\n",ymax, ymin);
+ wait(0.5);
}
void EMGkalibratieR(){ // Determine thresholds right EMG, same as left
PRINT("EMG RIGHT relax muscle");
@@ -85,6 +86,7 @@
thresholdhighR = 0.8 * ymax;
pc.printf("ymaxR = %f en yminR = %f \r\n",ymax, ymin); // terminal
+ wait(0.5);
}
int EMGfilter(AnalogIn& emg, bool side){
double u = emg.read(); // read emg signal (left or right EMG)
@@ -142,7 +144,7 @@
}
void checkSide(AnalogIn& ks, int dir){
if((dirM2.read() == dir) && (pwmM2.read()>0)){ // direction motor clashes with killswitch and motor is on
- if(ks.read()>0.8){
+ if(ks.read()>0.95){
pwmM2.write(0); // Aim motor freeze
pc.printf("BOEM! CRASH! KASTUK!\r\n"); // Terminal
PRINT("BOEM! CRASH!"); // LCD
@@ -155,7 +157,7 @@
}
void motorAim(int dir){ // Rotate Aim motor with given direction
dirM2.write(dir);
- pwmM2.write(0.2);
+ pwmM2.write(wM2);
}
bool controlAim(){ // Function to control aim motor with modes
bool both = false; // boolean if both modes are 3
@@ -225,33 +227,43 @@
}
case CALIBRATE_AIM: {
pwmM2.period(1/100000); // period motor 2
- printf("Position is kalibrating\r\n"); // terminal
+ pc.printf("Position is kalibrating\r\n"); // terminal
PRINT("Wait a moment, please"); // LCD
dirM2.write(0); // direction aim motor
- pwmM2.write(0.2); // percentage motor power
- bool calibrated = false;
+ pwmM2.write(wM2); // percentage motor power
+ volatile bool calibratedR = false;
+ volatile bool calibratedL = false;
while(state==CALIBRATE_AIM){
if(controlFlag){
controlFlag = false;
- if(!calibrated){ // Not calibrated
- if((ksRight.read()>0.8)){ // Killswitch?
+ //pc.printf("ksleft: %f, ksRight: %f, boolL: %i, boolR: %i, counts: %i\r\n", ksLeft.read(), ksRight.read(), calibratedL, calibratedR, abs(enc2.getPulses()));
+ if(calibratedR == false){ // Not calibrated
+ if((ksRight.read()>0.95)){ // Killswitch?
pwmM2.write(0); // Aim motor freeze
- enc2.reset(); // Reset encoder
- PRINT("Aim calibrated"); // LCD
- pc.printf("Aim calibrated\r\n");// Terminal
- calibrated = true;
- pc.printf("Go to midi position\r\n");
+ enc2.reset(); // Reset encoder
+ calibratedR = true;
dirM2.write(1); // direction aim motor
- pwmM2.write(0.2); // percentage motor power, turn it on
+ pwmM2.write(wM2); // percentage motor power, turn it on
+ }
+ }
+ else if(calibratedL == false){ // Right switch kalibrated
+ if((ksLeft.read()>0.95)){
+ pwmM2.write(0); // Aim motor freeze
+ maxCounts = abs(enc2.getPulses());
+ calibratedL = true;
+ dirM2.write(0); // direction aim motor
+ pwmM2.write(0.2); // percentage motor power, turn it on
}
- }
- if(calibrated) { // Calibrated
- checkAim(); // Check killswitches
- if(abs(enc2.getPulses()) > 600){ // rotate aim motor to midi position
+ }
+ else { // Botch sides calibrated
+ //checkAim(); // Check killswitches
+ if(abs(enc2.getPulses()) < (maxCounts/2) && (pwmM2.read()>0)){ // rotate aim motor to midi position
pwmM2.write(0); // Aim motor freeze
state = CALIBRATE_BEAM; // next state
+ PRINT("Aim calibrated"); // LCD
+ pc.printf("Aim calibrated\r\n");// Terminal
}
- }
+ }
}
}
lcd.cls();
@@ -300,7 +312,7 @@
if(lcdFlag){ // LCD loop to project 3 texts on lcd
lcdFlag = false;
if(i%3 == 0){
- PRINT("Flex left or right half to aim");
+ PRINT("Flex L or R half to aim");
}
else if(i%3 == 1){
PRINT("Flex both half to freeze");
@@ -376,13 +388,13 @@
case FIRE: {
pc.printf("Shooting\r\n"); // terminal
PRINT("FIRING"); // lcd
- pwmM1.write(0.3); // beam motor on
+ pwmM1.write(wM1); // beam motor on
bool breaking = false;
int countBreak = 0;
if(breakPerc > 0){
servo.pulsewidth(servoBreak); // Servo to break position
breaking = true; // boolean breaking?
- countBreak = 2100*breakPerc/4; // Amount of counts where must be breaked
+ countBreak = 2100*breakPerc/3; // Amount of counts where must be breaked
}
while(state == FIRE){ // while in FIRE state
if(controlFlag){ // BREAK goFlag half rotation beam = breaking
