Mobile Robot Project

Dependencies:   RGB_LED m3pi mbed

main.cpp

Committer:
wqz9822
Date:
2015-10-29
Revision:
0:541dc12fcbf0

File content as of revision 0:541dc12fcbf0:

#include "mbed.h"
#include "m3pi.h"
#include "rgbLed.h"
#include "color.h"

m3pi m3pi;
Timer timerA;
Serial Wixel(p28, p27); // tx, rx
AnalogIn analog (p20); // Randomness generator
AnalogIn resistorAin (p16); // Voltage divider reads

//Setup RGB led using PWM pins and class
RGBLed myRGBled(p23,p22,p21); //RGB PWM pins

//setup some color objects in flash using const's
const LEDColor red   (255, 0, 0);
const LEDColor green (0, 255, 0);
const LEDColor blue  (0, 0, 255);
const LEDColor yellow(255 ,255 ,0);
const LEDColor white (255 ,255, 255);

DigitalOut PIN15 (p15);
DigitalOut PIN17 (p17);
DigitalOut PIN18 (p18);
DigitalOut PIN19 (p19);
DigitalOut PIN20 (p20);

int behaviour; // Behaviour switcher
float voltage;
int voltageCounter = 0; // To elmimate ADC spike noise
float timerThreshold;


unsigned int random_generator (void){
    unsigned int x = 0;
    unsigned int iRandom = 0;
 
    for (x = 0; x <= 32; x += 2)
    {
        iRandom += ((analog.read_u16() % 3) << x);
        wait_us (10);
    }
    
    return iRandom;
}

void forward(float amount) {
    float speed = amount/5.0 + .075;
    m3pi.left_motor(-speed);
    m3pi.right_motor(-speed);
    timerThreshold = 1;
}

void backward(float amount) {
    float speed = amount/5.0 + .075;
    m3pi.left_motor(speed);
    m3pi.right_motor(speed);
    timerThreshold = 1;
}

void turnLeft(float amount) {
    // try to anchor it so that 1 means 90 degree turn
    float right_speed = amount/5.0 + .075;
    m3pi.left_motor(right_speed);
    
    m3pi.right_motor(-right_speed);
    timerThreshold=.5;
}

void turnRight(float amount) {
    float left_speed = amount/5.0 + .075;
    m3pi.right_motor(left_speed);
    m3pi.left_motor(-left_speed);
    timerThreshold=.5;
}

/*void shakeHead() {
    m3pi.left_motor(.15);
    m3pi.right_motor(-.15);
    wait(.3);
    for(int i = 0; i < 3; i++) {
        if(i % 2 == 0) {
            m3pi.left_motor(-.15);
            m3pi.right_motor(.15);
        } else {
            m3pi.left_motor(.15);
            m3pi.right_motor(-.15);
        }
        timerThreshold = .6);
    }
    m3pi.left_motor(.15);
    m3pi.right_motor(-.15);
    wait(.3);
}*/

void actLikeYoureInLove() {
    myRGBled = red;
    m3pi.left_motor(0.0);
    m3pi.right_motor(0.0);
    wait(1);
    m3pi.left_motor(-0.1);
    m3pi.right_motor(-0.1);
    wait(.5);
    while(1) {
        m3pi.left_motor(.2);
        m3pi.right_motor(-.2);

    }
}

void init()
{
    Wixel.baud(9600);
    timerA.start();
    myRGBled = green;
    srand (random_generator()); // Using ADC value to generate random seed
}

int main() 
{
     
    init();

    while(1)  
    {
        voltage = resistorAin;
        Wixel.printf("Voltage %f \n",voltage);
        
        if (( voltage > 0.45) & ( voltage < 0.7))
        {
            voltageCounter ++;
            if (voltageCounter == 2){
                actLikeYoureInLove();
            }
        }

        //Wixel.printf("%f seconds\n", timerA.read());

        if( timerA.read() >= timerThreshold)
        {
            behaviour = rand() % 5 + 1;  // Generate num between 1 and 5
            //Wixel.printf("Behavior &d\n", behaviour);
            float speed = rand()/double(RAND_MAX);

            switch (behaviour) 
            {
                case 1:
                    forward(1);
                    break;
                case 2:
                    turnLeft(speed);
                    break;
                case 3:
                    turnRight(speed);
                    break;
                case 4:
                    backward(1);
                    break;
                case 5:
                    //Do noting
                    break;
            }
            timerA.reset();
        }
    }
}