code using the sonic sensor to activate motor when the distance value dips beneath 50cm, seems to be a problem compiling with the else if statement. Apparently an unclosed bracket.

Dependencies:   SRF02 Servo mbed

main.cpp

Committer:
mspeed93
Date:
2017-04-24
Revision:
1:b74e9a2a3fa5
Parent:
0:928ee2609d39
Child:
2:9179421b2288

File content as of revision 1:b74e9a2a3fa5:

#include "mbed.h"
#include "SRF02.h"
#include "Servo.h"

//Serial pc(USBTX, USBRX); //tx, rx
SRF02 Fsensor(p28,p27, 0xE0); //front flame sensor
SRF02 Lsensor(p28,p27, 0xE4); //left flame sensor
SRF02 Rsensor(p28,p27, 0xE2); //right flame sensor
Servo cr_srv_L(p21); //left servo
Servo cr_srv_R(p22); //right servo
DigitalIn RFlame (p5); //right flame sensor
DigitalIn LFlame (p7); //left flame sensor
DigitalOut relay(p8); // Relay for controlling the fan
DigitalIn PUSH_BUTTON(p20); //push button to start program
DigitalOut myled(LED1); //on board led used to test functionality of systems


/* function that creates a start stop sequence for the main program by monitoring the state of the push button.
    when the push button goes from 0 to 1 the value state of push button is updated and then the program breaks from the function and continues
    with the rest of the program*/
    
void wait_for_one_press(){
    int count = 0;
    int OLD_PUSH_BUTTON = 0;                                  
    int NEW_PUSH_BUTTON;
    while(1){
      NEW_PUSH_BUTTON = PUSH_BUTTON;
      if ((NEW_PUSH_BUTTON == 1) && (OLD_PUSH_BUTTON ==0)){
          count++;
          OLD_PUSH_BUTTON = NEW_PUSH_BUTTON;
          break ;}          
    }
}

void init_servo(){
    //calibrate the servos for +/-45deg
    cr_srv_L.calibrate(0.0005,45);
    cr_srv_R.calibrate(0.0005,45);
    }
    
void Forward_Drive(){
    float R_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float L_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    R_cr_srv_cmd = 0.465;   //moderately fast clockwise rotation
     L_cr_srv_cmd = 0.535;  //moderately fast anti-clockwise rotation
     cr_srv_L.write(L_cr_srv_cmd);
     cr_srv_R.write(R_cr_srv_cmd); //writes the speed commands to the servos
     }
     
void Stop_Motors(){
    float cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    cr_srv_cmd = 0.5 ; //holds the motors still
     cr_srv_L.write(cr_srv_cmd); //write to the servo
     cr_srv_R.write(cr_srv_cmd); //write to the servo
     }
     
void Turn_left(){
    float R_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float L_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    R_cr_srv_cmd = 0.48;    //moderate speed to control the angle of turn
     L_cr_srv_cmd = 0.48;
     cr_srv_L.write(L_cr_srv_cmd);
     cr_srv_R.write(R_cr_srv_cmd); //write to the servo
     }
     
void Turn_right(){
    float R_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float L_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    R_cr_srv_cmd = 0.53;    //moderate speed to control the angle of turn
     L_cr_srv_cmd = 0.53;
     cr_srv_L.write(L_cr_srv_cmd);
     cr_srv_R.write(R_cr_srv_cmd); //write to the servo
     }


void Turn_hard_right(){
    float HR_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float HL_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    HR_cr_srv_cmd = 0.6;     //full speed to ensure the robot turns 90 degrees right
     HL_cr_srv_cmd = 0.6;
     cr_srv_L.write(HL_cr_srv_cmd);
     cr_srv_R.write(HR_cr_srv_cmd); //write to the servo
     }

void Turn_hard_left(){
    float HR_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float HL_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    HR_cr_srv_cmd = 0.4;     //full speed to ensure the robot turns 90 degrees left
     HL_cr_srv_cmd = 0.4;
     cr_srv_L.write(HL_cr_srv_cmd);
     cr_srv_R.write(HR_cr_srv_cmd); //write to the servo
     }

void Turning(){                                      //function to calculate the appropriate turning response
     int Ldistance = Lsensor.getDistanceCm();        //uses the hard turning function to steer the robot clear of obstructions
     int Rdistance = Rsensor.getDistanceCm();
     if (Ldistance > Rdistance){
         Turn_hard_left();
         }
         
         else if (Rdistance > Ldistance){
             Turn_hard_right();
             }      
     }
     
     /* Sub-system used to detect the presence, lock on to the fire, and extinguish it*/
     
void Extinguish(){
    
    int on = 1,off = 0;

 
    // Loop forever, relay on/ off for 1 second each
    // LED on relay will blink on / off 
    while((RFlame == 0) || (LFlame == 0)) {
        int distanceF = Fsensor.getDistanceCm();
        int distanceR = Rsensor.getDistanceCm();
        int distanceL = Lsensor.getDistanceCm();
        
        if ((RFlame == 0) && (LFlame == 0)){      //flame sensor outputs a voltage 0 when IR light is detected 
       Forward_Drive();
       relay = on;}                              //activates the fan
       else if ((RFlame == 1) && (LFlame == 0)){ //No IR light detected input voltage = 1 
       Turn_right();                        //Turn towards the right to better align the fire with the other sensor
       relay = off;}
       else if ((RFlame == 0) && (LFlame == 1)){ //No IR light detected input voltage = 1 
       Turn_left();
       relay = off;}
       else if ((RFlame == 1) && (LFlame == 1)){
           relay = off;
           break;}
    }
}

     
     
     
     
int main() {
   
    float pos_val=0.5; //variable to hold posistion values
    float step_size=0.01; //position increment/decrement value
    float cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float R_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float L_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float HR_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    float HL_cr_srv_cmd=0.5; //continuous rotation servo command value (range: 0.0 - 1.0)
    
    int on = 1,off = 0;
    
    init_servo();
    
    
    wait_for_one_press();
    
    
    
   while(1){
      
       int Ldistance = Lsensor.getDistanceCm();    //reads the distance value the ultrasonic sensors detect
       int Rdistance = Rsensor.getDistanceCm();    // for front, left, and right sensors 
       int Fdistance = Fsensor.getDistanceCm();
    
     
     if ((RFlame == 0) || (LFlame == 0)){         //conditional statement: if one or the other flame sensors detect 
    Extinguish();}                                //fire then the extinguish function is called
    
     if  (Fdistance > 22){                        //using the distance value in front forward drive or turning functions 
                                                  //are determined
         Forward_Drive();
     pos_val = pos_val + step_size;
     
        if (pos_val > 1.0) pos_val = 0.0;
        
        wait(0.5);} 
            
     else if (Fdistance <= 22){                                     //activates turning function if front distance drops
                                                                    //beneath 22cm
         Turning();
     pos_val = pos_val + step_size;
        if (pos_val > 1.0) pos_val = 0.0;
        
     wait(0.5);}
     
      if ((Ldistance <= 20) && (Fdistance >= 22)){                  //measures the distance to the side of the robot and the front
             Turn_right();                                          //and turns away as appropriate using the slower turning functions
             
             pos_val = pos_val + step_size;
        if (pos_val > 1.0) pos_val = 0.0;
        
     wait(0.5);}
     
     else if ((Rdistance <= 20) && (Fdistance >= 22)){              //measures the distance to the side of the robot and the front
             Turn_left();                                           //and turns away as appropriate using the slower turning functions
             
        if (pos_val > 1.0) pos_val = 0.0;
        
     wait(0.5);}
     
         
    }
}