Spring 2014, ECE 4180 project, Georgia Institute of Technolgoy. This is the autonomous driver program for the Robotics Cat and Mouse program.

Dependencies:   IMUfilter ADXL345_I2C mbed ITG3200 USBHost mbed-rtos

main.cpp

Committer:
Strikewolf
Date:
2014-04-27
Revision:
0:84d5aa80fd77

File content as of revision 0:84d5aa80fd77:

#include "mbed.h"

//Radio Calibration Signals - Need to implement calibration routine...
#define CHAN2_MID 1470  //Elevator Midpoint
#define CHAN1_MID 1470  //Rudder Midpoint
#define DEADZONE 105
#define MAXMIN_OFFSET 400

//Drive Modes
typedef enum {FORWARD, REVERSE, STOP, CENTERLEFT, CENTERRIGHT} DRIVEMODE;
DRIVEMODE mode;
float xpwm, ypwm;

//H-bridge
PwmOut rightMotorPWM(p22);  //Channel A
PwmOut leftMotorPWM(p21);   //Channel B
DigitalOut leftMotor1(p23);
DigitalOut leftMotor2(p24);
DigitalOut rightMotor1(p25);
DigitalOut rightMotor2(p26);

//Radio 
Serial pc(USBTX, USBRX);
DigitalIn rudder(p11);
DigitalIn elevator(p12);

//Xbee
Serial xbee(p13, p14);
DigitalOut xbeeReset(p15);

void setTurnLeft(float speed) {
    //Set speed
    rightMotorPWM = speed;
    leftMotorPWM = speed;
    
    //Set motor function
    leftMotor1 = 0;
    leftMotor2 = 1;
    rightMotor1 = 1;
    rightMotor2 = 0;
}

void setTurnRight(float speed) {
    //Set speed
    rightMotorPWM = speed;
    leftMotorPWM = speed;
    
    //Set motor function
    leftMotor1 = 1;
    leftMotor2 = 0;
    rightMotor1 = 0;
    rightMotor2 = 1;
}

//Stop with braking
void stop() {
    rightMotorPWM = 0;
    leftMotorPWM = 0;
    leftMotor1 = 0;
    leftMotor2 = 1;
    rightMotor1 = 1;
    rightMotor2 = 0;
}


int getRadioX() {
    Timer timer;
    timer.reset();
    int dur;
    while(!rudder);
    timer.start();
    while(rudder);
    dur = timer.read_us();
    return dur;
}

int getRadioY() {
    Timer timer;
    timer.reset();
    int dur;
    while(!elevator);
    timer.start();
    while(elevator);
    dur = timer.read_us();
    return dur;
}

//Primary function for setting motors for radio driving
void radioDrive() {
    int radioY = getRadioY();
    int radioX = getRadioX();
    
    //Identify drive mode from radio values
    if (radioY < CHAN2_MID - DEADZONE)
        mode = FORWARD;
    if (radioY > CHAN2_MID + DEADZONE)
        mode = REVERSE;
    if (radioY < CHAN2_MID + DEADZONE && radioY > CHAN2_MID - DEADZONE &&
        radioX < CHAN1_MID - DEADZONE)
        mode = CENTERLEFT;
    if (radioY < CHAN2_MID + DEADZONE && radioY > CHAN2_MID - DEADZONE &&
        radioX > CHAN1_MID + DEADZONE)
        mode = CENTERRIGHT;        
    if (radioY < CHAN2_MID + DEADZONE && radioY > CHAN2_MID - DEADZONE &&
        radioX < CHAN1_MID + DEADZONE && radioX > CHAN1_MID - DEADZONE)
        mode = STOP;
        
    //Normalize values for PWM magnitude
    xpwm = abs((float)radioX - CHAN1_MID) / MAXMIN_OFFSET;
    ypwm = abs((float)radioY - CHAN2_MID) / MAXMIN_OFFSET;
        
    //Set Motors Accordingly
    switch(mode) {
        case FORWARD:
            //Handle variable turns
            if (radioX > CHAN1_MID + DEADZONE) {
                rightMotorPWM = ypwm - 0.8*xpwm;
                leftMotorPWM = ypwm;
            } else if (radioX < CHAN1_MID - DEADZONE) {
                rightMotorPWM = ypwm;
                leftMotorPWM = ypwm - 0.8*xpwm;
            } else {
                rightMotorPWM = ypwm;
                leftMotorPWM = ypwm; 
            }
            leftMotor1 =  0;
            leftMotor2 = 1;
            rightMotor1 = 0;
            rightMotor2 = 1;
            break;
        
        case REVERSE:
            //Handle variable turns
            if (radioX > CHAN1_MID + DEADZONE) {
                rightMotorPWM = ypwm - 0.8*xpwm;
                leftMotorPWM = ypwm;
            } else if (radioX < CHAN1_MID - DEADZONE) {
                rightMotorPWM = ypwm;
                leftMotorPWM = ypwm - 0.8*xpwm;
            } else {
                rightMotorPWM = ypwm;
                leftMotorPWM = ypwm; 
            }
            leftMotor1 =  1;
            leftMotor2 = 0;
            rightMotor1 = 1;
            rightMotor2 = 0;
            break;
            
        case CENTERRIGHT:
            rightMotorPWM = xpwm;
            leftMotorPWM = xpwm;
            leftMotor1 = 1;
            leftMotor2 = 0;
            rightMotor1 = 0;
            rightMotor2 = 1;
            break;

        case CENTERLEFT:
            rightMotorPWM = xpwm;
            leftMotorPWM = xpwm;
            leftMotor1 = 0;
            leftMotor2 = 1;
            rightMotor1 = 1;
            rightMotor2 = 0;
            break;

        case STOP:
            rightMotorPWM = 0;
            leftMotorPWM = 0;
            leftMotor1 = 0;
            leftMotor2 = 1;
            rightMotor1 = 1;
            rightMotor2 = 0;
            break;
    }
}

//Transmit position and heading
void xbeeTelemetry() {
    xbee.printf("Human Update \r\n");   
    wait_ms(10);
}

bool isGameOver() {
    return xbee.readable();
}
        


int main() {
    
    //Init Xbee
    xbeeReset = 0;
    wait_ms(1);
    xbeeReset = 1;
    wait_ms(1);
    
    while(1) {
        xbee.printf("HELLO!\r\n");
        wait(0.1);
    }
}