My modifications/additions to the code

Dependencies:   ADXL345 ADXL345_I2C IMUfilter ITG3200 Servo fishgait mbed-rtos mbed pixy_cam

Fork of robotic_fish_ver_4_8 by jetfishteam

MainController.cpp

Committer:
rkk
Date:
2014-05-22
Revision:
18:9ba4566f2361
Parent:
17:6970aef8154b
Child:
19:655db88b045c

File content as of revision 18:9ba4566f2361:

#include "MainController.h"

MainController::MainController()
    :ch1(p18,0.054,0.092), // pitch
     ch2(p30,0.054,0.092), // roll
     ch3(p16,0.054,0.092), // frequency
     ch4(p17,0.055,0.092), //rudder
     ch6(p15,0.055,0.092), //volume
     mcon(p22, p6, p7), // change pin p5 to p7, because p5 is burned through
     ap(p25, p26)//,
     //leftservo(p21),
     //rightservo(p22)
     
{
    wait_ms(50);
    vol = 0.0;
    frq = 1.0;
    rud = 0.5;
    pitch = 0.5;
    frqMin = 0.4; // hardcoded
    frqMax = 2.5; //hardcoded
    change = 0;
    state = 0;
    //goofftime = 0.0;
    //switched = false;
}

void MainController::control()
{
    curTime = timer1.read();
    
    if(curTime > 1/frq) {
        //read new inputs
        vol = this->calculateVolume();
        frq = this->calculateFrequency();
        rud = this->calculateRudder();
        timer1.reset();
        curTime = 0.0;

        // rudder value used to define the trapezoid shape
        // amplitude = vol * ( 2* rud + 1.0); // varied from 1 to 5
        amplitude = vol * 4.0;
        
        //reset change to zero
        change = 0;
        
        if(state == 1) {
            if(rud < 0.75) {
                change = -1;
                state = 0;
            }
        } 
        else if (state == -1) {
            if(rud> 0.25) {
                change = 1;
                state = 0;
            }
        } 
        else {
            if(rud < 0.25) {
                change = -1;
                state = -1;
            } else if(rud > 0.75) {
                change = 1;
                state = 1;
            }
        }
        //switched = false;
        //goofftime = (vol/(2*frq));    
    }
    
    //Set Servo Values
    //pitch = this->calculatePitch();
    //leftservo = pitch;
    //rightservo = 1.0 - pitch;
       
//    if (curTime > 1/(2*frq) && (switched == false))
//    {
//        switched = true;
//        amplitude = -1.0;
//     }
//        
//    if(!switched)
//    {
//        if(curTime > goofftime )
//        amplitude = 0.0;
//    }
//    else
//    {
//        if(curTime > (1/(2*frq)+goofftime))
//        amplitude = 0.0;
//    }

    // saturate ensures the duty cycle does not exceed 1, 
    
    if((change == 1) && (curTime > 1/(2*frq))) {
        dutyCycle = 0.0;
    } else if((change == -1) && (curTime < 1/(2*frq))) {
        dutyCycle = 0.0;
    } else {
        dutyCycle = saturate(amplitude * sin( 2.0 * MATH_PI * frq * curTime ));
    }
    mcon.setpolarspeed(dutyCycle);
}

float MainController::calculateFrequency()
{
    return ((frqMax - frqMin) * ch3.dutycyclescaledup() + frqMin);    
}

float MainController::calculateVolume()
{
    return (ch6.dutycyclescaledup());
}

float MainController::calculateRudder()
{
    return (ch4.dutycyclescaledup());
}

float MainController::calculatePitch()
{
    return (ch1.dutycyclescaledup());
}

void MainController::start()
{
    timer1.start();
    
    ticker1.attach(this, &MainController::control,0.001);
    //Autopilot guardian
    //ap.calibrate();
    //ap.set2D();
    ap.setoff();
    
}

void MainController::stop()
{
    timer1.stop();
    ticker1.detach();
    mcon.setpolarspeed(0.0);
}

float MainController::getDutyCycle()
{
    return dutyCycle;
}

float MainController::getAmplitude()
{
    return amplitude;
}


float MainController::getFrequency()
{
    return frq;
}

float MainController::getVolume()
{
    return vol;
}

float MainController::getRudder()
{
    return rud;
}

float MainController::getPitch()
{
    return pitch;
}

//signum function
float MainController::signum(float input)
{
    if (input>0.0)
        return 1.0;
    else if (input<0.0)
        return (-1.0);
    else
        return 0.0;
}

//saturate function
float MainController::saturate(float input)
{
    if (input > 1.0)
        return (1.0);
    else if (input < -1.0)
        return (-1.0);
    else
        return input;
}