NR18 Active Aero Code

Dependencies:   BNO055 NeoStrip Servo mbed

main.cpp

Committer:
m181878
Date:
2018-05-14
Revision:
0:10a064cee806

File content as of revision 0:10a064cee806:

//#include "madpulse.h"
#include "Servo.h"
#include "mbed.h"
#include "BNO055.h"
//#include "NeoStrip.h"
#define BUFFER_SIZE 1024
#define FIVE_HZ_LOOP 5.0
#define LOG_LOOP_FREQ 25.0 // Four messages are taking turns logging, it should be about 25Hz overall
#define CTRL_LOOP_FREQ 100.0
#define MAIN_LOOP_FREQ 300.0
#define PI (3.14159)
//Mad Pulse IMU code definitions
#define STAT_RATE 1.0
#define IMU_RATE 50.0
#define LOOP_RATE 200.0
#define CMD_TIMEOUT 1.0
Timer t;    // Create Timer
CAN can1(p30, p29);
float t_start,t_log,t_ctrl,t_5hz,t_run; // Create timer variables
float dt;
float wrapTo2pi(float ang);
float wrapTopi(float ang);
bool rc_conn,auto_flag,log_flag;
float RPM, TP, FOT, IA;         //PE1
float BAR, MAP, Lambda;         //PE2
float An1, An2, An3, An4;       //PE3
float An5, An6, An7, An8;       //PE4
float F1, F2, F3, F4;           //PE5
float BV, AT, CT;               //PE6
float A5T, A7T;                 //PE7
float RPMR, TPSR, MAPR, MAFLR;  //PE8
float L1M, L2M, TL;             //PE9
float DC1, DC2, DC3, DC4, DC5, DC6, DC7, DC8;   //PE10
float PS, DWRC, DPS;            //PE11
float DAWS, NDAWS, IC, ICP;     //PE12
float DWS1, DWS2, NDWS1, NDWS2; //PE13
float FCA, FCS, FCAT, FCCT;     //PE14
float FCB, FCM;                 //PE15
float ICAT, ICCT, ICB, ICM;     //PE16
float FR1, FL1, RR1, RL1;           //Linear Pots
// Instantiate Serial Ports
//Serial pc(USBTX, USBRX, 115200);           // USB UART Terminal
//Serial xbee(p28,p27,115200);
Serial pc(USBTX, USBRX, 9600);           // USB UART Terminal
Serial xbee(p28,p27,9600);
// Initiate Class Objects
BNO055 imu(p9,p10);             // BNO055 Class Object I2C(SDL,SCL)
Ticker ctrl_ticker;
Servo WingL(p26); //Left Servo
Servo WingR(p25); //Right Servo...if we need one
DigitalIn tps(p17); //Throttle Position Sensor
float tp = 0;
float tpp = 0;
DigitalOut streamline(LED1); //LED on mbed
DigitalOut closed(LED2); //LED on mbed
AnalogIn FR(p15);      //initialize linear pots
AnalogIn FL(p16);
AnalogIn RR(p20);
AnalogIn RL(p19);
// ============================================
// Data Log
// ============================================
// Print data to Xbee serial port (115200 Baud)
void dataLog()
{
    imu.get_accel();
    imu.get_angles();
}
int main()
{
    pc.baud(9600);
    xbee.baud(9600);
    t.start();
    t_start = t.read();
    t_log = t.read();
    t_ctrl = t.read();
    t_5hz = t.read();
    can1.frequency(250000);
    CANMessage msg;
    //Test of wing movement,
    //this was important to know when the car turned on that active aero
    //was functioning, and it looks cool
    WingL = 1.0;
    wait(1.5);
    WingL = 0.75;
    wait(1.5);
    WingL = 1.0;
    wait(1.5);
    WingL = 0.75;
    while(1) {
        tp = tps.read(); //read in raw analog input of throttle position sensor (0 to 1)
        FR1=FR.read();
        FL1=FL.read();
        RR1=RR.read();
        RL1=RL.read();
        //tpp = (tp - 0.0249)/(0.1116); //Calibrating the reading to a percentage
        dataLog();
        //xbee.printf("$DAQ, %.3f, %.3f, %.3f, %.1f, %.2f, %.1f, %.1f\r\n", imu.accel.x/9.81, imu.accel.y/9.81, imu.accel.z/9.81, RPM, tpp, FOT, IA);
        xbee.printf("$DAQ, %.1f, %.2f, %.1f, %.1f, %.1f, %.1f, %.1f, %.1f,%.1f \r\n", RPM, TP, An1, An2, FR1, FL1, RR1, RL1, WingL);
        wait(0.01);
        //Active aero control algorithm (wings open)
        //+/- .7 G's lateral is the number I had chosen for active aero arbitrarily. Test with the IMU
        //This code reads the IMU value and the Throttle position directly from the TPS. This is the code you want to use. Worst case, use safe active aero
        /* if(((imu.accel.x/9.81) >= -0.7) && ((imu.accel.x/9.81) <= 0.7) && (tpp >= 0.5) ) {
             streamline = 1; //LED1
             WingL = 1.0; //subject to change with testing
             //Active aero control algorithm (wings closed)
             //basically any time the wings are not in a condition to open, keep them closed
         } else {
             closed = 1; //LED2
             WingL = 0.75; //subject to change with testing
         }*/
        // SAFE ACTIVE AERO
        if (TP > 85) { //USES CAN BUS THROTTLE POSITION VALUE
            //open
            streamline = 1;
            WingL=1.0;

        } else {
            //closed
            closed = 1;
            WingL=0.75;
        }

        if(can1.read(msg)) {    //This is the loop that it won't enter********
            if (msg.id==218099784) { //PE1
                //RPM
                RPM=(msg.data[0]+256*msg.data[1]);
                //TPS
                if ((msg.data[2]+256*msg.data[3])>32767) {
                    TP=0.1*(msg.data[2]+256*msg.data[3])-65536;
                } else {
                    TP=0.1*(msg.data[2]+256*msg.data[3]);
                }
                //FOT
                if ((msg.data[4]+256*msg.data[5])>32767) {
                    FOT=0.1*(msg.data[4]+256*msg.data[5])-65536;
                } else {
                    FOT=0.1*(msg.data[4]+256*msg.data[5]);
                }
                if ((msg.data[6]+256*msg.data[7])>32767) {
                    IA=0.1*(msg.data[6]+256*msg.data[7])-65536;
                } else {
                    IA=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            /*if (msg.id==218100040)  //PE2
            {
                // BAR
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    BAR=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    BAR=0.1*(msg.data[0]+256*msg.data[1]);
                }
                //MAP
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    MAP=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    MAP=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Lambda
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    Lambda=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    Lambda=0.1*(msg.data[4]+256*msg.data[5]);
                }
            }
            */
            if (msg.id==218100296) { //PE3
                // A1
                if ((msg.data[0]+256*msg.data[1])>32767) {
                    An1=0.1*(msg.data[0]+256*msg.data[1])-65536;
                } else {
                    An1=0.1*(msg.data[0]+256*msg.data[1]);
                }
                //A2
                if ((msg.data[2]+256*msg.data[3])>32767) {
                    An2=0.1*(msg.data[2]+256*msg.data[3])-65536;
                } else {
                    An2=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // A3
                if ((msg.data[4]+256*msg.data[5])>32767) {
                    An3=0.1*(msg.data[4]+256*msg.data[5])-65536;
                } else {
                    An3=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // A4
                if ((msg.data[6]+256*msg.data[7])>32767) {
                    An4=0.1*(msg.data[6]+256*msg.data[7])-65536;
                } else {
                    An4=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            /*
            if (msg.id==218100552)  //PE4
            {
                // A5
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    An5=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    An5=0.1*(msg.data[0]+256*msg.data[1]);
                }
                //A6
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    An6=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    An6=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // A7
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    An7=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    An7=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // A8
                if ((msg.data[6]+256*msg.data[7])>32767)
                {
                    An8=0.1*(msg.data[6]+256*msg.data[7])-65536;
                }
                else
                {
                    An8=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            if (msg.id==218100808)  //PE5
            {
                // F1
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    F1=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    F1=0.1*(msg.data[0]+256*msg.data[1]);
                }
                //F2
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    F2=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    F2=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // F3
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    F3=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    F3=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // F4
                if ((msg.data[6]+256*msg.data[7])>32767)
                {
                    F4=0.1*(msg.data[6]+256*msg.data[7])-65536;
                }
                else
                {
                    F4=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            if (msg.id==218101064)  //PE6
            {
               // Battery Voltage
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    BV=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    BV=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Air Temperature
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    AT=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    AT=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Coolant Temp
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    CT=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    CT=0.1*(msg.data[4]+256*msg.data[5]);
                }
            }
            if (msg.id==218101320)  //PE7
            {
               // Analog Input #5 Thermistor
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    A5T=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    A5T=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Analog Input #7 Thermistor
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    A7T=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    A7T=0.1*(msg.data[2]+256*msg.data[3]);
                }
            }
            if (msg.id==218101576)  //PE8
            {
                // RPM Rate
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    RPMR=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    RPMR=0.1*(msg.data[0]+256*msg.data[1]);
                }
                //TPS Rate
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    TPSR=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    TPSR=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // MAP Rate
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    MAPR=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    MAPR=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // MAF Load Rate
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    MAFLR=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    MAFLR=0.1*(msg.data[4]+256*msg.data[5]);
                }
            }
            if (msg.id==218101832)  //PE9
            {
                // Lambda #1 Measured
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    L1M=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    L1M=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Lambda #2 Measured
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    L2M=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    L2M=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Target Lambda
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    TL=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    TL=0.1*(msg.data[4]+256*msg.data[5]);
                }
            }
             if (msg.id==218102344)  //PE11
            {
                // Percent Slip
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    PS=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    PS=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Driven Wheel Rate of Change
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    DWRC=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    DWRC=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Desired Percent Slip
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    DPS=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    DPS=0.1*(msg.data[4]+256*msg.data[5]);
                }
            }
            if (msg.id==218102600)  //PE12
            {
                // Driven Avg Wheel Speed
                DAWS=0.1*(msg.data[0]+256*msg.data[1]);
                // Non-Driven Avg Wheel Speed
                NDAWS=0.1*(msg.data[2]+256*msg.data[3]);
                // Ignition Comp
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    IC=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    IC=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // Ignition Cut Percent
                if ((msg.data[6]+256*msg.data[7])>32767)
                {
                    ICP=0.1*(msg.data[6]+256*msg.data[7])-65536;
                }
                else
                {
                    ICP=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            if (msg.id==218102856)  //PE13
            {
                // Driven Wheel Speed #1
                DWS1=0.1*(msg.data[0]+256*msg.data[1]);
                // Driven Wheel Speed #2
                DWS2=0.1*(msg.data[2]+256*msg.data[3]);
                // Non-Driven Wheel Speed #1
                NDWS1=0.1*(msg.data[4]+256*msg.data[5]);
                // Non-Driven Wheel Speed #2
                NDWS2=0.1*(msg.data[6]+256*msg.data[7]);
            }
            if (msg.id==218103112)  //PE14
            {
                // Fuel Comp Accel
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    FCA=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    FCA=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Fuel Comp Starting
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    FCS=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    FCS=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Fuel Comp Air Temp
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    FCAT=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    FCAT=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // Fuel Comp Coolant Temp
                if ((msg.data[6]+256*msg.data[7])>32767)
                {
                    FCCT=0.1*(msg.data[6]+256*msg.data[7])-65536;
                }
                else
                {
                    FCCT=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }
            if (msg.id==218103368)  //PE15
            {
                // Fuel Comp Barometer
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    FCB=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    FCB=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Fuel Comp MAP
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    FCM=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    FCM=0.1*(msg.data[2]+256*msg.data[3]);
                }
            }
            if (msg.id==218091592)  //PE16
            {
                // Ignition Comp-Air Temp
                if ((msg.data[0]+256*msg.data[1])>32767)
                {
                    ICAT=0.1*(msg.data[0]+256*msg.data[1])-65536;
                }
                else
                {
                    ICAT=0.1*(msg.data[0]+256*msg.data[1]);
                }
                // Ignition Comp-Coolant Temp
                if ((msg.data[2]+256*msg.data[3])>32767)
                {
                    ICCT=0.1*(msg.data[2]+256*msg.data[3])-65536;
                }
                else
                {
                    ICCT=0.1*(msg.data[2]+256*msg.data[3]);
                }
                // Ignition Comp-Barometer
                if ((msg.data[4]+256*msg.data[5])>32767)
                {
                    ICB=0.1*(msg.data[4]+256*msg.data[5])-65536;
                }
                else
                {
                    ICB=0.1*(msg.data[4]+256*msg.data[5]);
                }
                // Ignition Comp-MAP
                if ((msg.data[6]+256*msg.data[7])>32767)
                {
                    ICM=0.1*(msg.data[6]+256*msg.data[7])-65536;
                }
                else
                {
                    ICM=0.1*(msg.data[6]+256*msg.data[7]);
                }
            }*/
        }
        wait(0.01);
    }
} // End Main Function