PIDs and fun

Dependencies:   btbee m3pi_ng mbed FatFileSystemCpp

USBTest.cpp

Committer:
crmackey
Date:
2015-05-29
Revision:
20:e844f2e48691
Parent:
18:1dc7fdc248aa

File content as of revision 20:e844f2e48691:

    #include "mbed.h"
    #include "m3pi_ng.h"
    #include "time.h"
    #include "btbee.h"
    #include "MSCFileSystem.h"
    #include <vector>
    
    #define FSNAME "msc"
    MSCFileSystem msc(FSNAME);
    
    m3pi m3pi;
    btbee btbee;
    DigitalIn m3pi_pb(p21);
    DigitalIn m3pi_IN[] = {(p12)};
    DigitalOut mbed_led[] = {(LED1), (LED2),(LED3), (LED4)};
    DigitalOut m3pi_led[] = {(p13), (p14), (p15), (p16), (p17), (p18), (p19), (p20)};
    
    // Minimum and maximum motor speeds
    #define MAX 1.0
    #define MIN 0
    
    // PID terms
    #define P_TERM 1.5
    #define I_TERM 0
    #define D_TERM 25
    
    int main() {
        
        
    while(1) {
        
        
        btbee.reset();
        m3pi_pb.mode(PullUp);
        
        m3pi.printf("Wait 4");
        m3pi.locate(0,1);
        m3pi.printf("PC");
        
        while(m3pi_pb) {
            m3pi_led[0]=!m3pi_led[0];
            wait(3);
            btbee.printf("\n");
            btbee.printf("PC connected. Press the button \n");
        }
        
        m3pi.cls();
        
        Timer LapTimer;
        Timer LoopTime;
        Timer WriteTime;
        char Bat[] = {'V','o','l','t',' ','i','s'};
      m3pi.print(Bat,7);
      wait(0.75);
      m3pi.cls();
       float batteryvoltage = m3pi.battery();
       char* str = new char[30];
       sprintf(str, "%.4g", batteryvoltage);
       m3pi.print(str,6);
       btbee.printf("Battery voltage is %f \n", batteryvoltage);
       wait(0.75);
       m3pi.cls();
       
        if (batteryvoltage < 4.2)
         {
        char low[] = {'L','o','w',' ','b','a','t'};
        m3pi.print(low,7);
        char ExitSound[]={'V','1','5','O','6','E','4','O','5','E','4'};
        m3pi.playtune(ExitSound,11);
        btbee.printf("Battery voltage is too low. Stopping program");
        exit(1);
         }
    
        m3pi.locate(0,1);
        m3pi.printf("Line PID");
    
        wait(2.0);
    
        btbee.printf("Now calibrating \n");
    
        m3pi.sensor_auto_calibrate();
        
        btbee.printf("Finished calibrating \n");
        
    
        float right;
        float left;
        float current_pos_of_line = 0.0;
        float previous_pos_of_line = 0.0;
        float derivative,proportional,integral = 0;
        double power;
        float speed = MAX;
        int LapTest[5];
        int s1, s2, s3, s4, s5;
        int counter = -1;
        int checkvar = 0;
        double Time1, Time2, Time3, Time4, Time5, TimeAve;
        vector < double > ZeTimes(2);
        vector < vector < double > > Data;
        double stuff;
        double junk;
        double timer;
        double TimeToWrite;
        int loopcounter = 0;
       
        
        btbee.printf("\n");
        btbee.printf("Now starting \n");
        
        while (1) {
            
            LoopTime.start();
    
            
           // Get the position of the line.
            current_pos_of_line = m3pi.line_position(); 
            
            stuff = current_pos_of_line;
                  
            proportional = current_pos_of_line;
            //fprintf(fp, "%f", current_pos_of_line);
            //fprintf(fp, "        ");
            
            // Compute the derivative
            derivative = current_pos_of_line - previous_pos_of_line;
            
            // Compute the integral
            integral += proportional;
            
            // Remember the last position.
            previous_pos_of_line = current_pos_of_line;
            
            // Compute the power
            power = (proportional * (P_TERM) ) + (integral*(I_TERM)) + (derivative*(D_TERM)) ;
            
            // Compute new speeds   
            right = speed+power;
            left  = speed-power;
            
            // limit checks
            if (right < MIN)
                right = MIN;
            else if (right > MAX)
                right = MAX;
                
            if (left < MIN)
                left = MIN;
            else if (left > MAX)
                left = MAX;
                
           // set speed 
            m3pi.left_motor(left);
            m3pi.right_motor(right);
            
            
            
        m3pi.calibrated_sensor(LapTest);
        
        
        
        s1 = LapTest[0];
        s2 = LapTest[1];
        s3 = LapTest[2];
        s4 = LapTest[3];
        s5 = LapTest[4];
        
        if (s1 > 500 and s5 > 500) {
            checkvar = 1;
            }
            
        if (s1 < 500 and s5 < 500 and checkvar == 1 and counter == -1) {
            LapTimer.start();
            }
            
        if (s1 < 500 and s5 < 500 and checkvar == 1) {
            counter = counter + 1;
            m3pi.cls();
            m3pi.printf("%d", counter);
            checkvar = 0;
            switch (counter) {
                case 1: {
                    Time1 = LapTimer.read();
                    LapTimer.reset();
                    LapTimer.start();
                    btbee.printf("Lap 1: %f \n", Time1);
                    
                    break;
                    }
                case 2: {
                    Time2 = LapTimer.read();
                    LapTimer.reset();
                    LapTimer.start();
                    btbee.printf("Lap 2: %f \n", Time2);
                
                    break;
                    }
                case 3: {
                    Time3 = LapTimer.read();
                    LapTimer.reset();
                    LapTimer.start();
                    btbee.printf("Lap 3: %f \n", Time3);
    
                    break;
                    }
                case 4: {
                    Time4 = LapTimer.read();
                    LapTimer.reset();
                    LapTimer.start();
                    btbee.printf("Lap 4: %f \n", Time4);
                    
                    break;
                    }
                case 5: {
                    Time5 = LapTimer.read();
                    LapTimer.reset();
                    LapTimer.start();
                    btbee.printf("Lap 5: %f \n", Time5);
                    
                    break;
                    }
                }    
            }
            
            ZeTimes[0]= stuff;
            ZeTimes[1] = power;
            Data.push_back(ZeTimes);
            
            loopcounter++;
    
            
            timer = LoopTime.read();
            
            if(timer < 0.005) {
                wait(0.005 - timer);
            }
        
        timer = 0;
        LoopTime.reset();
            
        if (loopcounter == 10) {
            m3pi.stop();
            m3pi.cls();
            m3pi.locate(0,0);
            m3pi.printf("Ave time");
            TimeAve = (Time1 + Time2 + Time3 + Time4 + Time5)/5.0;
            m3pi.locate(0,1);
            m3pi.printf("%f", TimeAve);
            btbee.printf("Average time per lap: %f ", TimeAve);
            btbee.printf("\n");
            btbee.printf("Printing to USB");
            
            WriteTime.start();
            
            DIR *d;
            struct dirent *p;
            d = opendir("/" FSNAME);
            FILE *fp = fopen( "/" FSNAME "/Genau.txt", "w"); //file name
            if ( fp == NULL ){
                m3pi.leds(1);
                }
        
            for(int i = 0; i < 10; i++) {
                for( int j = 0; j < 2; j++) {
                    junk = Data[i][j];
                    fprintf(fp,"%f        ", junk);
                    }
                fprintf(fp,"\r\n");
                }
            m3pi.cls();
            TimeToWrite = WriteTime.read();
            btbee.printf("%f    \n", TimeToWrite);
            WriteTime.reset();
        
            btbee.printf("Printed");
            m3pi.cls();
            m3pi.printf("Printed");
        
            fclose(fp);
            
            exit(1);
        }
    
    
    
    }
        
    }
    
    }