This is some awesome robot code

Dependencies:   mbed-rtos mbed QEI

Fork of ICRSEurobot13 by Thomas Branch

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "globals.h"
00002 #include "Kalman.h"
00003 #include "mbed.h"
00004 #include "rtos.h"
00005 #include "Arm.h"
00006 #include "MainMotor.h"
00007 #include "Encoder.h"
00008 #include "Colour.h"
00009 #include "CakeSensor.h"
00010 #include "Printing.h"
00011 #include "coprocserial.h"
00012 #include <algorithm>
00013 #include "motion.h"
00014 #include "MotorControl.h"
00015 #include "system.h"
00016 #include "ai.h"
00017 
00018 void motortest();
00019 void encodertest();
00020 void motorencodetest();
00021 void motorencodetestline();
00022 void motorsandservostest();
00023 void armtest();
00024 void motortestline();
00025 void colourtest();
00026 void cakesensortest();
00027 void printingtestthread(void const*);
00028 void printingtestthread2(void const*);
00029 void feedbacktest();
00030 
00031 DigitalOut *balloon_ptr;
00032 
00033 void timeisup_isr(){
00034     MotorControl::motorsenabled = 0;
00035     *balloon_ptr = 0;
00036 }
00037 
00038 int main()
00039 {
00040 
00041     /*****************
00042      *   Test Code   *
00043      *****************/
00044     //motortest();
00045     //encodertest();
00046     //motorencodetest();
00047     //motorencodetestline();
00048     //motorsandservostest();
00049     //armtest();
00050     //while(1);
00051     //motortestline();
00052     //ledtest();
00053     //phototransistortest();
00054     //ledphototransistortest();
00055     //colourtest(); // Red SnR too low
00056     //cakesensortest();
00057     //feedbacktest();
00058 
00059     /*
00060     DigitalOut l1(LED1);
00061     Thread p(Printing::printingloop,        NULL,   osPriorityNormal,   2048);
00062     l1=1;
00063     Thread a(printingtestthread,    NULL,   osPriorityNormal,   1024);
00064     Thread b(printingtestthread2,   NULL,   osPriorityNormal,   1024);
00065     Thread::wait(osWaitForever);
00066     */
00067     
00068     SystemTime.start();
00069     
00070     Serial pc(USBTX, USBRX);
00071     pc.baud(115200);
00072     InitSerial();
00073     wait(3);
00074     Kalman::KalmanInit();
00075     
00076     Thread predictthread(Kalman::predictloop, NULL, osPriorityNormal, 2084);//512); //temp 2k
00077     Kalman::start_predict_ticker(&predictthread);
00078     
00079     Thread updatethread(Kalman::updateloop, NULL, osPriorityNormal, 2084);
00080     
00081     Ticker motorcontroltestticker;
00082     motorcontroltestticker.attach(MotorControl::motor_control_isr, 0.05);
00083     // ai layer thread
00084     Thread aithread(AI::ailayer, NULL, osPriorityNormal, 2048);
00085     
00086     // motion layer periodic callback
00087     RtosTimer motion_timer(motion::motionlayer, osTimerPeriodic);
00088     motion_timer.start(50);
00089 
00090     Thread printingThread(Printing::printingloop, NULL, osPriorityLow, 2048);
00091     
00092     //worry about starting
00093     DigitalIn startcord(P_START_CORD);
00094     startcord.mode(PullUp);
00095     while(!startcord)
00096         Thread::wait(50);
00097         
00098     //worry about stopping
00099     DigitalOut balloon(P_BALLOON);
00100     balloon = 1;
00101     balloon_ptr = &balloon;
00102     Timeout timeout_90s;
00103     timeout_90s.attach(timeisup_isr, 90);
00104     
00105     aithread.signal_set(0x2); //Tell AI thread that its time to go
00106     
00107     
00108     measureCPUidle(); //repurpose thread for idle measurement
00109     /*
00110     MotorControl::set_omegacmd(0);
00111     for(float spd = 0.02; spd <= 0.5; spd *= 1.4){
00112     
00113         MotorControl::set_fwdcmd(spd);
00114         
00115         Thread::wait(3000);
00116         
00117         float f = MotorControl::mfwdpowdbg;
00118         float r = MotorControl::mrotpowdbg;
00119         MotorControl::set_fwdcmd(0);
00120         printf("targetspd:%f, fwd:%f, rot:%f\r\n", spd, f, r);
00121         Thread::wait(5000);
00122     }
00123     
00124     MotorControl::set_fwdcmd(0);
00125     for(float spd = 0.05; spd <= 2; spd *= 1.4){
00126     
00127         MotorControl::set_omegacmd(spd);
00128         
00129         Thread::wait(3000);
00130         
00131         float f = MotorControl::mfwdpowdbg;
00132         float r = MotorControl::mrotpowdbg;
00133         MotorControl::set_omegacmd(0);
00134         printf("targetspd:%f, fwd:%f, rot:%f\r\n", spd, f, r);
00135         Thread::wait(5000);
00136     }
00137     */
00138     Thread::wait(osWaitForever);
00139    
00140 }
00141 
00142 #include <cstdlib>
00143 using namespace std;
00144 
00145 void printingtestthread(void const*)
00146 {
00147     const char ID = 1;
00148     float buffer[3] = {ID};
00149     Printing::registerID(ID,sizeof(buffer)/sizeof(buffer[0]));
00150     while (true){
00151         for(size_t i = 1; i != sizeof(buffer)/sizeof(buffer[0]); ++i){
00152             buffer[i] = ID ;
00153         }
00154         Printing::updateval(ID, buffer, sizeof(buffer)/sizeof(buffer[0]));
00155         Thread::wait(200);
00156     }
00157 }
00158 
00159 void printingtestthread2(void const*)
00160 {
00161     const char ID = 2;
00162     float buffer[5] = {ID};
00163     Printing::registerID(ID,sizeof(buffer)/sizeof(buffer[0]));
00164     while (true){
00165         for(size_t i = 1; i != sizeof(buffer)/sizeof(buffer[0]); ++i){
00166             buffer[i] = ID;
00167         }
00168         Printing::updateval(ID, buffer, sizeof(buffer)/sizeof(buffer[0]));
00169         Thread::wait(500);
00170     }
00171 }
00172 
00173 
00174 /*
00175 void feedbacktest(){
00176     //Encoder Eright(P_ENC_RIGHT_A, P_ENC_RIGHT_B), Eleft(P_ENC_LEFT_A, P_ENC_LEFT_B);
00177     MainMotor mright(P_MOT_RIGHT_A, P_MOT_RIGHT_B), mleft(P_MOT_LEFT_A, P_MOT_LEFT_B);
00178 
00179     Kalman::State state;
00180 
00181     float Pgain = -0.01;
00182     float fwdspeed = -400/3.0f;
00183     Timer timer;
00184     timer.start();
00185 
00186     while(true) {
00187         float expecdist = fwdspeed * timer.read();
00188         state = Kalman::getState();
00189         float errleft = left_encoder.getTicks() - (expecdist);
00190         float errright = right_encoder.getTicks() - expecdist;
00191 
00192         mleft(max(min(errleft*Pgain, 0.4f), -0.4f));
00193         mright(max(min(errright*Pgain, 0.4f), -0.4f));
00194     }
00195 }
00196 */
00197 
00198 void cakesensortest()
00199 {
00200     wait(1);
00201     printf("cakesensortest");
00202 
00203     CakeSensor cs(P_DISTANCE_SENSOR);
00204     while(true) {
00205         wait(0.1);
00206         printf("distance: %f\t %f\r\n", cs.Distance(),cs.Distanceincm());
00207     }
00208 }
00209 
00210 void colourtest()
00211 {
00212     Colour c_upper(P_COLOR_SENSOR_BLUE_UPPER, P_COLOR_SENSOR_RED_UPPER, P_COLOR_SENSOR_IN_UPPER,UPPER);
00213     Colour c_lower(P_COLOR_SENSOR_BLUE_LOWER, P_COLOR_SENSOR_RED_LOWER, P_COLOR_SENSOR_IN_LOWER,LOWER);
00214 
00215     while(true) {
00216         wait(0.1);
00217 
00218         switch(c_lower.getColour()) {
00219             case BLUE :
00220                 printf("BLUE\n");
00221                 break;
00222             case RED:
00223                 printf("RED\n");
00224                 break;
00225             case WHITE:
00226                 printf("WHITE\n");
00227                 break;
00228             case BLACK:
00229                 printf("BLACK\n");
00230                 break;
00231             default:
00232                 printf("BUG\n");
00233         }
00234 
00235     }
00236 
00237 }
00238 
00239 /*
00240 
00241 void pt_test()
00242 {
00243     DigitalOut _blue_led(p10);
00244     DigitalOut _red_led(p11);
00245     AnalogIn _pt(p18);
00246     
00247     bytepack_t datapackage;
00248     // first 3 bytes of header is used for alignment
00249     datapackage.data.header[0] = 0xFF;
00250     datapackage.data.header[1] = 0xFF;
00251     datapackage.data.header[2] = 0xFF;
00252     while(true) {
00253         //toggles leds for the next state
00254         _blue_led = 1;
00255         _red_led = 0;
00256         wait(0.01);
00257         volatile float blue_temp = _pt.read();
00258 
00259 
00260         datapackage.data.ID = (unsigned char)0;
00261         datapackage.data.value = blue_temp;
00262         datapackage.data.aux = 0;
00263         for (int i = 0; i < sizeof(datapackage); i++) {
00264             //mbed_serial.putc(datapackage.type_char[i]);
00265             pc.putc(datapackage.type_char[i]);
00266         }
00267 
00268         _blue_led = 0;
00269         _red_led = 1;
00270         wait(0.01);
00271         volatile float red_temp = _pt.read();
00272 
00273 
00274         datapackage.data.ID = (unsigned char)1;
00275         datapackage.data.value = red_temp;
00276         datapackage.data.aux = 0;
00277         for (int i = 0; i < sizeof(datapackage); i++) {
00278             //mbed_serial.putc(datapackage.type_char[i]);
00279             pc.putc(datapackage.type_char[i]);
00280         }
00281 
00282         _blue_led = 0;
00283         _red_led = 0;
00284         wait(0.01);
00285         volatile float noise_temp = _pt.read();
00286 
00287 
00288         datapackage.data.ID = (unsigned char)2;
00289         datapackage.data.value = noise_temp;
00290         datapackage.data.aux = 0;
00291         for (int i = 0; i < sizeof(datapackage); i++) {
00292             //mbed_serial.putc(datapackage.type_char[i]);
00293             pc.putc(datapackage.type_char[i]);
00294         }
00295 
00296     }
00297 }
00298 */
00299 #ifdef AGDHGADSYIGYJDGA
00300 PwmOut white(p26);
00301 PwmOut black(p25);
00302 
00303 void armtest() 
00304 {    
00305     
00306     white.period(0.05);
00307     black.period(0.05);
00308     
00309   /*  float f=1;
00310     for (f=1; f<3; f+=0.1)
00311     { 
00312         black.pulsewidth_us(f*1000);
00313         wait(1);
00314         printf("%f\r\n", f);
00315     }
00316     for (f=2; f>0; f-=0.1)
00317     { 
00318         black.pulsewidth_us(f*1000);
00319         wait(1);
00320         printf("%f\r\n", f);
00321     }*/
00322     
00323     
00324     for(;;)
00325     {
00326         black.pulsewidth_us(2.0*1000);
00327         wait(2);
00328         black.pulsewidth_us(0.9*1000);//1.2
00329         wait(2);
00330     }
00331     
00332     // white works
00333     /*for(;;)
00334     {
00335         white.pulsewidth_us(0.6*1000);
00336         wait(2);
00337         white.pulsewidth_us(2.5*1000);
00338         wait(2);
00339     }*/
00340     
00341    /* while(1) //2.5 -> //0.6
00342     {
00343         white.pulsewidth_us(int(f*1000));
00344         printf("%f\r\n", f);
00345         f-=0.1;
00346         wait(1);
00347     }*/
00348 }
00349 #endif
00350 #ifdef FSDHGFSJDF
00351 void armtest()
00352 {
00353     Arm lower_arm(p25, 0.05, 0.9, 2.0);
00354     Arm upper_arm(p26, 0.05, 0.6, 2.5);
00355     
00356     while(1)
00357     {
00358         upper_arm.go_up();
00359         wait(2);
00360         upper_arm.go_down();
00361         wait(2);
00362     }
00363 }
00364 #endif
00365 void armtest(){}
00366 /*
00367 void motorsandservostest()
00368 {
00369     Encoder Eleft(p27, p28), Eright(p30, p29);
00370     MainMotor mleft(p24,p23), mright(p21,p22);
00371     Arm sTop(p25), sBottom(p26);
00372     //Serial pc(USBTX, USBRX);
00373     const float speed = 0.0;
00374     const float dspeed = 0.0;
00375 
00376     Timer servoTimer;
00377     mleft(speed);
00378     mright(speed);
00379     servoTimer.start();
00380     while (true) {
00381         printf("Position is: %i \t %i \n\r", Eleft.getTicks(), Eright.getTicks());
00382         if (Eleft.getTicks() < Eright.getTicks()) {
00383             mleft(speed);
00384             mright(speed - dspeed);
00385         } else {
00386             mright(speed);
00387             mleft(speed - dspeed);
00388         }
00389         if (servoTimer.read() < 1) {
00390             sTop.clockwise();
00391         } else if (servoTimer.read() < 4) {
00392             sTop.halt();
00393         } else if (servoTimer.read() < 5) {
00394             sBottom.anticlockwise();
00395             //Led=1;
00396         } else if (servoTimer.read() < 6) {
00397             sBottom.clockwise();
00398             //Led=0;
00399         } else if (servoTimer.read() < 7) {
00400             sBottom.halt();
00401         } else {
00402             sTop.anticlockwise();
00403         }
00404         if (servoTimer.read() >= 9) servoTimer.reset();
00405     }
00406 }
00407 */
00408 void motortestline()
00409 {
00410     MainMotor mleft(p24,p23), mright(p21,p22);
00411     const float speed = 0.2;
00412     mleft(speed);
00413     mright(speed);
00414     while(true) wait(1);
00415 }
00416 
00417 void motorencodetestline()
00418 {
00419     Encoder Eright(P_ENC_RIGHT_A, P_ENC_RIGHT_B), Eleft(P_ENC_LEFT_A, P_ENC_LEFT_B);
00420     MainMotor mright(P_MOT_RIGHT_A, P_MOT_RIGHT_B), mleft(P_MOT_LEFT_A, P_MOT_LEFT_B);
00421     //Serial pc(USBTX, USBRX);
00422     const float speed = 0.2;
00423     const float dspeed = 0.1;
00424 
00425     mleft(speed);
00426     mright(speed);
00427     while (true) {
00428         //left 27 cm = 113 -> 0.239 cm/pulse
00429         //right 27 cm = 72 -> 0.375 cm/pulse
00430         printf("Position is: %i \t %i \n\r", (int)(Eleft.getTicks()*0.239), (int)(Eright.getTicks()*0.375));
00431         if (Eleft.getTicks()*0.239 < Eright.getTicks()*0.375) {
00432             mright(speed - dspeed);
00433         } else {
00434             mright(speed + dspeed);
00435         }
00436     }
00437 
00438 }
00439 
00440 void motorencodetest()
00441 {
00442     Encoder Eright(P_ENC_RIGHT_A, P_ENC_RIGHT_B), Eleft(P_ENC_LEFT_A, P_ENC_LEFT_B);
00443     MainMotor mright(P_MOT_RIGHT_A, P_MOT_RIGHT_B), mleft(P_MOT_LEFT_A, P_MOT_LEFT_B);
00444     Serial pc(USBTX, USBRX);
00445 
00446     const float speed = -0.3;
00447     const int enc = -38;
00448     while(true) {
00449         mleft(speed);
00450         mright(0);
00451         while(Eleft.getTicks()>enc) {
00452             printf("Position is: %i \t %i \n\r", Eleft.getTicks(), Eright.getTicks());
00453         }
00454         Eleft.reset();
00455         Eright.reset();
00456         mleft(0);
00457         mright(speed);
00458         while(Eright.getTicks()>enc) {
00459             printf("Position is: %i \t %i \n\r", Eleft.getTicks(), Eright.getTicks());
00460         }
00461         Eleft.reset();
00462         Eright.reset();
00463     }
00464 }
00465 
00466 void encodertest()
00467 {
00468     Encoder E1(P_ENC_LEFT_A, P_ENC_LEFT_B);
00469     //Encoder E2(P_ENC_RIGHT_A, P_ENC_RIGHT_B);
00470     Serial pc(USBTX, USBRX);
00471     while(true) {
00472         wait(0.1);
00473         printf("Position is: %i \t %i \n\r", E1.getTicks(), 0);//E2.getTicks());
00474     }
00475 
00476 }
00477 void motortest()
00478 {
00479     MainMotor mright(p22,p21), mleft(p23,p24);
00480     while(true) {
00481         wait(1);
00482         mleft(0.8);
00483         mright(0.8);
00484         wait(1);
00485         mleft(-0.2);
00486         mright(0.2);
00487         wait(1);
00488         mleft(0);
00489         mright(0);
00490     }
00491 }