This is my quadcopter prototype software, still in development!

quadv3/main.cpp

Committer:
Anaesthetix
Date:
2013-07-23
Revision:
1:ac68f0368a77
Parent:
0:978110f7f027

File content as of revision 1:ac68f0368a77:

/**
 * @author Erik van de Coevering
 *
 * @section LICENSE
 *
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge and/or publish copies of the Software, and to permit
 * persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "mbed.h"
#include "ADXL345.h"
#include "ITG3200.h"
#include "math.h"
//#include "accelero.h"
#include "bma180.h"
#include "gyro.h"
#include "IOMacros.h"
#include "pwmout.h"

DigitalOut myled(LED1);

Timer trudder;
Timer tthrottle;
Timer televator;
Timer taileron;

//Rx variables
int ruddertime = 1616;
int throttletime = 1100;
int elevatortime = 850;
int ailerontime = 850;
int ruddercenter = 1616;
int elevcenter = 1616;
int aileroncenter = 1616;

//Variables for calccomp
float xcomp = 0;
float ycomp = 0;
int xcomp2 = 0;
int ycomp2 = 0;
float ruddercomp = 0;
float ratio = 0.38;
int ailer = 0;
int elev = 0;
int rud = 0;
int zcomp = 0;
int throttle = 0;
float ailer2 = 0;
float elev2 = 0;
signed int m1 = 0;
signed int m2 = 0;
signed int m3 = 0;
signed int m4 = 0;
bool armed = false;
float xsteering = 0;
float ysteering = 0;

DigitalIn rxthrottle(p25);
DigitalIn rxaileron(p26);
DigitalIn rxelevator(p29);
DigitalIn rxrudder(p30);
DigitalIn rxextra(p19);

void calccomp(void)
{
    gyrosample();

    //Scale rx channels
    ailer = ailerontime - aileroncenter;
    elev = elevatortime - elevcenter;
    rud = ruddertime - ruddercenter;
    throttle = throttletime;

    xsteering = ailer;
    ysteering = elev;
    xsteering = xsteering/8;
    ysteering = ysteering/8;
    rud = rud/3;
    throttle = ((throttle/2.2)+720);

    //Start by mixing throttle
    m1 = throttle;
    m2 = throttle;
    m3 = throttle;
    m4 = throttle;

    //Calc aileron compensation and mix with rx input
    xcomp = (((((newax)-xsteering)*(1-ratio)) + ((yag+((newax-xsteering)*0.7))*ratio))*1.10);
    xcomp2 = (xcomp*-1);
 //   xcomp2 = 0;

    //Mix aileron
    m1 = m1 - xcomp2;
    m2 = m2 + xcomp2;
    m3 = m3 + xcomp2;
    m4 = m4 - xcomp2;

    //Calc elevator compensation and mix with rx input
    ycomp = (((((neway)+ysteering)*(1-ratio)) + ((xag+((neway+ysteering)*0.7))*ratio))*1.10);
    ycomp2 = ycomp;
   // ycomp2 = 0;

    //Mix elevator
    m1 = m1 - ycomp2;
    m2 = m2 - ycomp2;
    m3 = m3 + ycomp2;
    m4 = m4 + ycomp2;

    //Calc rudder compensation and mix with rx input -> PI-controller?
    ruddercomp = (rud + (zarg*1));  //has drift
    zcomp = ruddercomp;

    //Mix rudder
    m1 = m1 - zcomp;
    m2 = m2 + zcomp;
    m3 = m3 - zcomp;
    m4 = m4 + zcomp;

    //Prevent motors from stalling
//           if(m1 < 1075 && throttle > 1000) m1 = 1280;
//           if(m2 < 1075 && throttle > 1000) m2 = 1280;
//           if(m3 < 1075 && throttle > 1000) m3 = 1280;
//           if(m4 < 1075 && throttle > 1000) m4 = 1280;

    //When throttle down or if not armed, stop motors
    if(throttle < 1350 || armed == false) {
        m1=1200;
        m2=1200;
        m3=1200;
        m4=1200;
    }

    //Stick arming
    if(throttle < 1325 && rud > 120) {
        armed = true;
        myled = 1;
    }
    if(throttle < 1325 && rud < -105) {
        armed = false;
        myled = 0;
    }

    m3 += 20;

    if(m1 > 1640) m1 = 1640;
    if(m2 > 1640) m2 = 1640;
    if(m3 > 1640) m3 = 1640;
    if(m4 > 1640) m4 = 1640;

    //Output to motors
    setpwm(m1, m2, m3, m4);
}



int main()
{
    bool rudderflag = false;
    bool throttleflag = false;
    bool elevatorflag = false;
    bool aileronflag = false;
    bool extraflag = false;
    bool exitflag = true;

    int th = 0;
    int ai = 0;
    int el = 0;
    int ru = 0;

    myled = 0;

    startpwm();
    //  accstart();
    acc1.init();
    acc1.range(0);
    acc1.bw(7);
    gyrostart();
    wait(1);
    gyrocal();

    while(1) {
        if(!throttleflag && rxthrottle) {
            tthrottle.start();
            throttleflag = true;
            extraflag = false;
            calccomp();
        }

        if(!aileronflag && rxaileron) {
            th = tthrottle.read_us();
            if(th > 1000 && th < 2200) throttletime = th;
            taileron.start();
            tthrottle.reset();
            aileronflag = true;
            throttleflag = false;
            calccomp();
        }

        if(!elevatorflag && rxelevator) {
            ai = taileron.read_us();
            if(ai > 1000 && ai < 2200) ailerontime = ai;
            televator.start();
            taileron.reset();
            elevatorflag = true;
            aileronflag = false;
            calccomp();
        }

        if(!rudderflag && rxrudder) {
            el = televator.read_us();
            if(el > 1000 && el < 2200) elevatortime = el;
            trudder.start();
            televator.reset();
            rudderflag = true;
            elevatorflag = false;
            calccomp();
        }

        if(!extraflag && rxextra) {
            ru = trudder.read_us();
            if(ru > 1000 && ru < 2200) ruddertime = ru;
            trudder.reset();
            extraflag = true;
            rudderflag = false;
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
            wait_us(500);
            calccomp();
        }
    }
}