cross-cross and t-cross problem

Dependencies:   m3pi_ng mbed btbee

main.cpp

Committer:
jomkippur
Date:
2013-05-16
Revision:
0:1e2ff5ae5204
Child:
1:f4dd7bc26785

File content as of revision 0:1e2ff5ae5204:

#include "mbed.h"
#include "m3pi_ng.h"


// Minimum and maximum motor speeds
#define MAX 0.1
#define MIN 0

// PID terms
#define P_TERM 1
#define I_TERM 0
#define D_TERM 20





// Declaration pi is of the classtyp m3pi
m3pi pi;

//  shows the battery voltage in first line for a little? time , how long takes one for
    void battery_voltage()
    {
       float voltage;
       // 
       for(int i=0;i<100;i++) 
        {
        voltage=pi.battery();
        pi.locate(0,0);
        pi.printf("%f",voltage);
        pi.locate(0,1);
        pi.printf("%i",i);
        }
        pi.cls();
     } 
 
// calibration with c for complete on screen
    void calib()
    {
        char complete=pi.sensor_auto_calibrate();   //wozu denn?
        pi.locate(0,0);
        pi.printf("%c",complete);
        wait(2);
        pi.cls();
    }
    
    
    
    
    
    
// function gives back 1 if outer sensors on black surface //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
//parameter "black_or_white" is a pointer, argument has to be a address

int outer_sens()//int* outer_b_or_w)
    {
    int outer_b_or_w;
    // read raw sensor values  
    //        
    int raw_sens_values[5];
    pi.raw_sensor(raw_sens_values);
    
    // give the raw sensorvalue in 1. line                                                       
    /*    
    pi.locate(0,0);
    ///////////////////////////////////////
    wait(0.2);//value meassurement with delay (not good but good for representation of the values on scream    
    ///////////////////////////////////////
    
    pi.cls(); // ohne clear display zeigt er Werte über 2000 an
    pi.printf("%d",raw_sens_values[0]);    
    // array entspricht pointer
    */
    
    if (raw_sens_values[0]> 1000 & raw_sens_values[4]> 1000)// solange
    //auf saal:white = ca. 400; black = ca. 2000;
        {
        //pi.locate(0,1);
        //pi.printf("%i",1);
         outer_b_or_w=1;          //1 is put to the address where the
         } //black              // pointer is pointing at    
        else 
        {
         //  pi.locate(0,1);
         //  pi.printf("%i",0);
          outer_b_or_w=0;  
                               
        } //white
        
      // return by ??? 
      // return by value is slow far structures and arrays !!!!!!!!!!!!!!!!!!???????????????????
      return outer_b_or_w;
    }

// function gives back 1 if inner sensors on black surface //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
//parameter "black_or_white" is a pointer, argument has to be a address

int inner_sens()
    {
    int inner_b_or_w;        
    int raw_sens_values[5];
    pi.raw_sensor(raw_sens_values);
    
    
    if (raw_sens_values[2]> 1000)// solange
    //white = ca. 400; black = ca. 2000;
        {
         inner_b_or_w=1;          //1 is put to the address where the
         } //black              // pointer is pointing at    
        else 
        {
          inner_b_or_w=0;  
                               
        } 
      return inner_b_or_w;
    }


    
    
/////////////////////////////////////////////////////////////////////////////////// 
// function line_follow ///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////

//void line_follow(const int* ON)// runs only if ON points to a integer 1
  void line_follow()
// argument passed by address, ON is a pointer that points to an address 
{


    // Defines on top



    
    pi.locate(0,1);
    pi.printf("Line PID");
    
    //wait(2.0);
    

    float right;
    float left;
    float current_pos_of_line = 0.0;
    float previous_pos_of_line = 0.0;
    float derivative,proportional,integral = 0;
    float power;
    float speed = MAX;
    

        // Get the position of the line.
        current_pos_of_line = pi.line_position();        
        proportional = current_pos_of_line;
        
        // 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 
        pi.left_motor(left);
        pi.right_motor(right);

    } 

/////////////////////////////////////////////////////////////////////////////////// 
// function turn right ///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void turn_right()
    {
    float turn_speed = MAX;
     pi.left_motor(-turn_speed);// look on the wheel, pos speed => wheel turns clockwise
     pi.right_motor(turn_speed);
     wait (0.9);
    }  
///////////////////////////////////////////////////////////////////////////////////        
// main        
///////////////////////////////////////////////////////////////////////////////////



main() 
{
    
    float cross_speed = MAX*0.9;
    
    
    battery_voltage();
    calib();
      
    while(true)
    {         
        
      if(outer_sens()==0 && inner_sens()==1)//outer white, inner black
      {
        pi.locate(0,0);
        pi.printf("while %i",outer_sens());
        pi.cls();
        line_follow();
       }
       else if(outer_sens()==1 && inner_sens()==1 )// outer black, inner black 
       {   
        pi.cls();
        pi.stop();   
        pi.locate(0,0);
        pi.printf("stop");
        wait(0.2);         
        // move just little further
        pi.left_motor(cross_speed);
        pi.right_motor(cross_speed);
        wait(0.5); 
            //die zeit die erbraucht für den halben durch messer
            // 9.5/2cm=4.25cm
            // 0 < speed < 1
            // measure: speed=0.1 s=42cm t=5.5s voltage=4.4 V
            // real speed=42/5.5 cm/s=7.6 cm/s
            // dt=4.25/7.6=0.6
                        
            /////////////////////////////////////////////////////////////////////////
            // t-cross?
            if(outer_sens()==0 && inner_sens()==0 )// outer white, inner white 
            //////////////////////////////////////////////////////////////////////////
            {
            pi.cls();
            pi.stop();   
            pi.locate(0,0);
            pi.printf("T end");
            }       
            else 
            /////////////////////////////////////////////////////////////////////////
            // cross-cross
            if(outer_sens()==0 && inner_sens()==1 )// outer white, inner black 
            {//turn_right();
            }
        }              
    }
}