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.
main.cpp
00001 #include "mbed.h" 00002 #include "Motor.h" 00003 #include "Servo.h" 00004 #include "string.h" 00005 #include <iostream> 00006 00007 // Open: 0 max open 00008 #define OPEN 0.43 00009 // Close 1 max close **Don't set to 1 00010 #define CLOSE 0.87 00011 // absolute positions for the z-axis 00012 #define UP 0.36 00013 #define DOWN 0.512 00014 00015 // Object declarations 00016 I2C i2c(p9, p10); 00017 Serial pc(USBTX, USBRX); 00018 Motor motor_x1(p21, p5, p6, &i2c); 00019 Motor motor_x2(p22, p11, p12, &i2c); 00020 Motor motor_y(p23, p15, p16, &i2c); 00021 Motor motor_z(p24, p13, p14); 00022 Servo claw(p25); 00023 AnalogIn z_dist(p20); 00024 Serial device(p28, p27); // tx, rx 00025 Ticker pos_monitor; 00026 DigitalOut leds[] = { (LED1), (LED2), (LED3), (LED4) }; 00027 00028 const int XWIDTH = 208; 00029 const int YWIDTH = 554; 00030 char resetAll = 0x4E; // to reset all devices on one i2c bus, write data 0x4E to address 0x00. 00031 float height; 00032 00033 //function declarations 00034 void send_char( char* ); 00035 void getAllMeasurements(void); 00036 void moveX(int pos); 00037 void moveY(int pos); 00038 void moveZ(float pos); 00039 void movePiece(char c1, char r1, char c2, char r2); 00040 00041 int main() 00042 { 00043 // initializing routine for all i2c devices 00044 // no motor_z.init since it it not a i2c device 00045 // since motor_x2's orientation is switched, flip "is_reversed" bit 00046 i2c.write(0x00, &resetAll, 1); 00047 motor_x1.init(0x20, 1, false); 00048 motor_x2.init(0x22, 2, false); 00049 motor_y.init(0x24, 3, true); 00050 motor_x2.is_reversed = true; 00051 00052 /* for debugging 00053 motor_x1.getTicks(); 00054 motor_x2.getTicks(); 00055 motor_y.getTicks(); 00056 */ 00057 00058 pos_monitor.attach(&getAllMeasurements, 0.003); // interrupt routine to measure current position on all axis 00059 00060 // get claw ready 00061 // note to self: in future revisions, implement a way to tare X and Y 00062 moveZ(UP); 00063 claw = OPEN; 00064 00065 //main variables 00066 char char_buf[4]; 00067 char rchar = 'z'; 00068 char status = '0'; 00069 int count = 0; 00070 int numLeds = sizeof(leds)/sizeof(DigitalOut); 00071 00072 // wake up device 00073 // done by sending EasyVR 'b' character 00074 // recommended wake routine: keep sending 'b' until confirmation, via 'o' 00075 device.putc('b'); 00076 while (device.getc()!='o') { 00077 device.putc('b'); 00078 leds[0] = 1; 00079 wait(0.2); 00080 } 00081 00082 //reset all leds initially 00083 for(int i = 0; i < numLeds; i++) { 00084 leds[i] = 0; 00085 } 00086 00087 //wait until ready 00088 while (device.readable()!=0) {} 00089 00090 //movePiece('b', '2', 'b', '4'); 00091 00092 //main loop 00093 while (1) { 00094 leds[0] = 0; 00095 leds[1] = 0; 00096 leds[2] = 0; 00097 leds[3] = 1; //solid led4 means mbed is in wait for request mode 00098 while (pc.readable() == 0) {} //wait for a readable byte 00099 status = pc.getc(); 00100 00101 if(status == 'n') { 00102 // REQUEST FOR VR COMMAND 00103 while ( count < 4 ) { 00104 //flash led 4 for user confirmation of new recog 00105 leds[3] = !leds[3]; 00106 //start recog based off either words or numbers 00107 if(count == 0 || count == 2) { 00108 device.putc('d'); 00109 wait(0.001); 00110 device.putc('C'); //Ben's trained words (C) // FLOHRS (B) 00111 wait(0.001); 00112 //pc.printf("Say a column letter\n"); 00113 } else if(count == 1|| count == 3) { 00114 device.putc('i'); 00115 wait(0.001); 00116 device.putc('D'); //Wordset #3 - numbers 00117 wait(0.001); 00118 //pc.printf("Say a row number\n"); 00119 } 00120 //wait for confirmation of new recog 00121 while (device.readable()!=0) {} 00122 rchar=device.getc(); 00123 00124 // Word recognized 00125 // Each move is a sequence of 4 words. Each word recognized makes an LED light up 00126 if (rchar=='r') { 00127 wait(.001); 00128 device.putc(' '); 00129 while (device.readable()!=0) {} 00130 rchar=device.getc(); 00131 //pc.printf("Recognized:"); 00132 //pc.putc(rchar-'A'+'a'); 00133 char_buf[count] = (rchar-'A'+'a'); 00134 leds[count] = 1; 00135 count++; 00136 // error 00137 } else if (rchar=='s') { 00138 wait(.001); 00139 device.putc(' '); 00140 while (device.readable()!=0) {} 00141 rchar=device.getc(); 00142 //pc.printf("Recognized:"); 00143 //pc.putc(rchar-'A'+'0'); 00144 char_buf[count] = (rchar-'A'+'0'); 00145 leds[count] = 1; 00146 count++; 00147 } else if (rchar=='e') { 00148 wait(.001); 00149 device.putc(' '); 00150 while (device.readable()!=0) {} 00151 rchar=device.getc(); 00152 device.putc(' '); 00153 while (device.readable()!=0) {} 00154 rchar=device.getc(); 00155 } 00156 } 00157 //successful input string created 00158 00159 //reset all leds 00160 for(int i = 0; i < numLeds; i++) { 00161 leds[i] = 0; 00162 } 00163 count = 0; 00164 //send data to EEBOX 00165 send_char(char_buf); 00166 } else if( status == 'm') { 00167 leds[0] = 0; 00168 leds[1] = 1; 00169 leds[2] = 0; 00170 leds[3] = 1; 00171 //status for claw move 00172 //wait for reply 00173 pc.putc('m'); 00174 while( pc.readable() == 0); 00175 count = 0; 00176 char_buf[count] = pc.getc(); //grab char 00177 leds[count] = 1; 00178 count++; 00179 leds[0] = 0; 00180 leds[1] = 0; 00181 leds[2] = 0; 00182 leds[3] = 0; 00183 while (count < 4) { 00184 leds[count] = 1; 00185 pc.putc(' '); 00186 while (pc.readable() == 0) {} //wait for response (beginning of string) 00187 char_buf[count] = pc.getc(); 00188 count++; 00189 } 00190 leds[0] = 0; 00191 leds[1] = 0; 00192 leds[2] = 0; 00193 leds[3] = 0; 00194 //Recieved the 4 char buffer for movement 00195 movePiece(char_buf[0], char_buf[1], char_buf[2], char_buf[3]); 00196 //wait(10); 00197 //pc.printf("mbed recieved following string for move:\n"); 00198 //pc.printf("%c%c%c%c\n\n", char_buf[0], char_buf[1], char_buf[2], char_buf[3]); 00199 count = 0; 00200 } 00201 } 00202 00203 00204 } 00205 00206 //Function Definitions 00207 void send_char( char output[] ) 00208 { 00209 //Successful Request, send confirmation byte 00210 char status; 00211 do { 00212 pc.putc('n'); 00213 while (pc.readable() == 0) {} //wait for a readable byte 00214 status = pc.getc(); 00215 } while( status != ' '); 00216 00217 for(int i = 0; i < 4; i++) { 00218 00219 do { 00220 while (pc.readable() == 0) {} //wait for a readable byte 00221 status = pc.getc(); 00222 } while( status != ' '); 00223 00224 pc.putc(output[i]); 00225 00226 } 00227 00228 //terminate communication 00229 do { 00230 while (pc.readable() == 0) {} //wait for a readable byte 00231 status = pc.getc(); 00232 } while( status != ' '); 00233 00234 pc.putc('s'); //send termination byte 00235 00236 } 00237 void moveX(int pos) //make pos signed 00238 { 00239 float diff1, diff2, spd1, spd2, lower = 0.06, upper = 0.8, integral1 = 0.0, integral2 = 0.0; 00240 //int K = 1000; 00241 int K = 2000, Ki = 0.001; 00242 while (!((abs(motor_x1.ticks - pos) <= 9) && (abs(motor_x2.ticks - pos) <= 9))) { 00243 diff1 = (pos - motor_x1.ticks); 00244 diff2 = (pos - motor_x2.ticks); 00245 integral1 += (diff1*0.001); 00246 integral2 += (diff2*0.001); 00247 spd1 = (diff1/K) + (Ki*integral1); 00248 spd2 = (diff2/K) + (Ki*integral2); 00249 if (spd1 >= upper) spd1 = upper; 00250 else if(spd1 <= lower && spd1 > 0.0) spd1 = lower; 00251 else if(spd1 < 0.0 && spd1 >= -lower) spd1 = -lower; 00252 else if(spd1 <= -upper) spd1 = -upper; 00253 //rationalize a speed for the motor x2 00254 if (spd2 >= upper) spd2 = upper; 00255 else if(spd2 <= lower && spd2 > 0.0) spd2 = lower; 00256 else if(spd2 < 0.0 && spd2 >= -lower) spd2 = -lower; 00257 else if(spd2 <= -upper) spd2 = -upper; 00258 00259 //printf("Motor %d is at position %d, moving with speed %f\n", motor_x1.motorID, motor_x1.ticks, spd1); // debugging 00260 //printf("Motor %d is at position %d, moving with speed %f\n", motor_x2.motorID, motor_x2.ticks, spd2); // debugging 00261 00262 //adjust speed according to difference between two motors 00263 if (abs(motor_x1.ticks - motor_x2.ticks) <= 10) { 00264 motor_x1.speed(spd1); 00265 motor_x2.speed(spd2); 00266 wait(0.001); 00267 } 00268 //if motor x1 is lagging behind motor x2, slow motor x2 00269 else if (abs(diff1) > abs(diff2)) { 00270 //apply new speed settings to x motors 00271 motor_x2.speed(spd2/2); 00272 motor_x1.speed(spd1); 00273 wait(0.001); 00274 } 00275 //if motor x2 is lagging behind motor x1, slow motor x1 00276 else if (abs(diff2) > abs(diff1)) { 00277 //apply new speed settings to x motors 00278 motor_x1.speed(spd1/2); 00279 motor_x2.speed(spd2); 00280 wait(0.001); 00281 } 00282 }//while 00283 motor_x1.speed(0); 00284 motor_x2.speed(0); 00285 wait(0.5); 00286 //adjusting 00287 while (!((abs(motor_x1.ticks - pos) <= 6) && (abs(motor_x2.ticks - pos) <= 6))) { 00288 diff1 = (pos - motor_x1.ticks); 00289 diff2 = (pos - motor_x2.ticks); 00290 if(diff1 > 0) spd1 = 0.05; 00291 else if(diff1 < 0) spd1 = -0.05; 00292 else if(diff1 == 0) spd1 = 0; 00293 if(diff2 > 0) spd2 = 0.05; 00294 else if(diff2 < 0) spd2 = -0.05; 00295 else if(diff2 == 0) spd2 = 0; 00296 //printf("Motor %d is at position %d, moving with speed %f\n", motor_x1.motorID, motor_x1.ticks, spd1); // debugging 00297 //printf("Motor %d is at position %d, moving with speed %f\n", motor_x2.motorID, motor_x2.ticks, spd2); // debugging 00298 00299 motor_x1.speed(spd1); 00300 motor_x2.speed(spd2); 00301 wait(0.005); 00302 } 00303 motor_x1.speed(0); 00304 motor_x2.speed(0); 00305 wait(0.5); 00306 //printf("Done! Motor %d is at position %d\n", motor_x1.motorID, motor_x1.ticks); // debugging 00307 //printf("Done! Motor %d is at position %d\n", motor_x2.motorID, motor_x2.ticks); // debugging 00308 } 00309 00310 void moveZ(float pos) // ~0.31 for top, ~0.46 for bottom 00311 { 00312 float tempPos = pos; 00313 if(pos == DOWN){ 00314 pos = 0.47; 00315 } 00316 //float height1, height2; 00317 while(!((abs(height - pos) < 0.01))) { 00318 //pc.printf("z height: %f\n", height); 00319 if(height < pos) { 00320 motor_z.speed(0.025); 00321 wait(0.02); 00322 motor_z.speed(0.015); 00323 } else if(height > pos) { 00324 motor_z.speed(-0.16); 00325 wait(0.02); 00326 motor_z.speed(-0.08); 00327 } 00328 } // ~ .47 00329 pos = tempPos; 00330 wait(0.5); 00331 while(!((abs(height - pos) < 0.01))) { // adjusting loop 00332 //pc.printf("z height: %f\n", height); 00333 if(height < pos) { 00334 motor_z.speed(0.02); 00335 wait(0.02); 00336 motor_z.speed(0.01); 00337 } else if(height > pos) { 00338 motor_z.speed(-0.1); 00339 wait(0.02); 00340 motor_z.speed(-0.05); 00341 } 00342 } 00343 motor_z.speed(0); 00344 } 00345 void getAllMeasurements() 00346 { 00347 motor_x1.getTicks(); 00348 motor_x2.getTicks(); 00349 motor_y.getTicks(); 00350 height = z_dist; 00351 } 00352 00353 void moveY(int pos) 00354 { 00355 motor_y.move(pos); 00356 } 00357 00358 void movePiece(char c1, char r1, char c2, char r2) 00359 { 00360 // c1, c2 should be within 'a' and 'h' 00361 // subtracting 'a' from c1 or c2 get it's "square offset" from initial position 00362 // i.e. if c1 = 'b', 'b'-'a'=1 tells it to move the distance of 1 square forward 00363 // r1, r2 should be within '1' and '9', or ':' 00364 // same logic, but with '1' 00365 00366 //*** NOTE: 00367 //When a move is a capture, [c2 r2] will always be [b :] 00368 int goToY = (c1 - 'a')*YWIDTH; 00369 int goToX = (r1 - '1')*XWIDTH; 00370 moveX(goToX); 00371 moveY(goToY); 00372 00373 // go down to pick up a piece, and go back up 00374 moveZ(DOWN); 00375 wait(0.7); 00376 claw = CLOSE; 00377 wait(0.5); 00378 moveZ(UP); 00379 00380 // move to destination 00381 goToY = (c2 - 'a')*YWIDTH; 00382 goToX = (r2 - '1')*XWIDTH; 00383 moveX(goToX); 00384 moveY(goToY); 00385 moveZ(DOWN); 00386 wait(0.7); 00387 claw = OPEN; 00388 wait(0.5); 00389 moveZ(UP); 00390 }
Generated on Wed Jul 13 2022 18:02:43 by
1.7.2