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

HumanControl.h

Committer:
Strikewolf
Date:
2014-04-30
Revision:
3:0a6e4d139b86
Parent:
1:dacf7db790f6

File content as of revision 3:0a6e4d139b86:

//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
DigitalIn rudder(p11);
DigitalIn elevator(p12);

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 && !gameOver);
    timer.start();
    while(rudder && !gameOver);
    dur = timer.read_us();
    return dur;
}

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

//Primary function for setting motors for radio driving
void radioDrive()
{   
    __disable_irq(); // disable interrupts
    int radioY = getRadioY();
    int radioX = getRadioX();
    __enable_irq(); // enable interrupts

    //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 = 0.2;
                leftMotorPWM = 0.85;
            } else if (radioX < CHAN1_MID - DEADZONE) {
                rightMotorPWM = 0.85;
                leftMotorPWM = 0.2;
            } else {
                rightMotorPWM = .85;
                leftMotorPWM = .85;
            }
            leftMotor1 =  0;
            leftMotor2 = 1;
            rightMotor1 = 0;
            rightMotor2 = 1;
            break;

        case REVERSE:
            //Handle variable turns
            if (radioX > CHAN1_MID + DEADZONE) {
                rightMotorPWM = 0.2;
                leftMotorPWM = 0.85;
            } else if (radioX < CHAN1_MID - DEADZONE) {
                rightMotorPWM = 0.85;
                leftMotorPWM = 0.2;
            } else {
                rightMotorPWM = .85;
                leftMotorPWM = .85;
            }
            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;
    }
}