Robot code for searching an object and charging at it.

Dependencies:   HCSR04 Motor mbed

functions.cpp

Committer:
alex0612
Date:
2015-05-23
Revision:
7:d94d23c55015
Parent:
6:af897173cb75
Child:
10:cec68ef272cd

File content as of revision 7:d94d23c55015:

// The following file implements all the functions necessary 
// for the robot.
// Please don't modify any of these functions!

#include "mbed.h"
#include "Motor.h"
#include "hcsr04.h"
#include "functions.h"

// Two sensors are used to detect a line, line_sens1 and line_sens2
// if there is a difference between the readings of these sensors 
// the robot has detected a line.
// Setting pins for line sensor
DigitalInOut line1(p20);
DigitalInOut line2(p19);

// Setting pins for motor, as follows:
// Example: Motor____(PWM, Forward, Reverse)
Motor MotorLeft(p23, p27, p28);
Motor MotorRight(p22, p30, p29);

// Setting pins for ultrasonic sensor, as follows:
// Example: usensor(Trigger, Echo)
HCSR04 usensor(p25,p26);

// Returns value from the QRE1113
// lower numbers mean more refleacive
// more than 3000 means nothing was reflected.
int read_line1() {
    // Time to record how long input is active
    Timer temp_t;
    
    // Activate the line sensor and then read
    line1.output();
    line1 = 1;
    wait_us(15);
    line1.input();
    
    // Start timer
    temp_t.start();

    // Time how long the input is HIGH, but quit
    // after 1ms as nothing happens after that
    while (line1 == 1 && temp_t.read_us() < 1000);
    return temp_t.read_us();
}

int read_line2() {
    // Time to record how long input is active
    Timer temp_t;
    
    // Activate the line sensor and then read
    line2.output();
    line2 = 1;
    wait_us(15);
    line2.input();
    
    // Start timer
    temp_t.start();

    // Time how long the input is HIGH, but quit
    // after 1ms as nothing happens after that
    while (line2 == 1 && temp_t.read_us() < 1000);
    return temp_t.read_us();
}

int detect_line() {
    int line1val = read_line1();
    int line2val = read_line2();
    
    if ((line1val-line2val) > 50) {
        printf("Line detected from front");
        return 1;
    } else if ((line1val-line2val) < -50) {
        printf("Line detected from back");
        return -1;
    } else {
        printf("Line not detected");
        return 0;
    }
}

void reverse(float speed) {
    printf("Reverse\n");
    MotorLeft.speed((speed));
    MotorRight.speed(-(speed));
    wait_ms(1000);
    return;
}

void reverseandturn(float speed) {
    printf("Reverse and turn\n");
    MotorLeft.speed((speed-0.3));
    MotorRight.speed(-(speed-0.1));
    wait_ms(2000);
    return;
}

void charge(float speed) {
    MotorLeft.speed(speed);
    MotorRight.speed(speed);
    return;
}

void moverandom()
{
    int counter;
    int turn;
    int direction;
    float random_time;
    float random_speed;

    printf("Moving randomly\n");
    counter = rand() % 10;

    for (int i = 0; i < counter; i++)
    {
        random_time = rand() % 1000 + 1000;

        turn = rand()/(RAND_MAX);
        random_speed = (float)rand()/(float)(RAND_MAX);
        if (random_speed < 0.5) {
            random_speed = 0.5;
        } else if (random_speed > 0.8) {
            random_speed = 0.8;
        }
        
        if (turn == 0) {
            direction = rand()/(RAND_MAX);
            if  (direction == 1) { 
                MotorLeft.speed(random_speed);
                MotorRight.speed(random_speed);
                wait_ms(random_time);
            } else {
                MotorLeft.speed(-random_speed);
                MotorRight.speed(-random_speed);
                wait_ms(random_time);
            }   
        } else {
            MotorLeft.speed(-random_speed);
            MotorRight.speed(random_speed);
            wait_ms(random_time);
        }
        return;
    }
}

void stop() {
    MotorLeft.speed(0.0);
    MotorRight.speed(0.0);
    return;
}

int detect_object(int range, float speed) {
    // Start a timer - finds an object for 10 seconds
    // if it doesn't find anything returns 0
    Timer usensor_t, inner_t;
    usensor_t.start();
    
    // Variable to store sensed value
    unsigned int sense, dist, reverse;
    sense = 0;
    dist = 0;
    reverse = 0;
        
    while (usensor_t.read_ms() < 15000) {
        // Start the ultrasonic sensor
        usensor.start();
        inner_t.start();
        dist = usensor.get_dist_cm();
        
        // If an object is detected based on out set range return 1
        if (dist <= range && dist >= 1) {
            sense = 1;
            break;
        } else {
            sense = 0;
            MotorLeft.speed(speed);
            MotorRight.speed(-(speed));
        }
        
        if (inner_t.read_ms() >=100) {
            if (reverse == 2) {
                speed = 0.7;
                reverse = 0;
            } else {
                speed = 0.0;
            }
            reverse++;
            inner_t.reset();
        }
    }
    
    usensor_t.stop();
    usensor_t.reset();
    return sense;
}