Quadcopter software. Flying - Contact me for more details or a copy of the PC ground station code

Dependencies:   ConfigFile PID PPM MODSERIAL mbed-rtos mbed MaxbotixDriver TinyGPS filter

hardware.h

Committer:
joe4465
Date:
2014-09-18
Revision:
3:82665e39f1ea
Parent:
2:b3b771c8f7d1
Child:
6:4c207e7b1203

File content as of revision 3:82665e39f1ea:

#include "mbed.h"
#include "rtos.h"
#include "FreeIMU.h"
#include "PID.h"
#include "ConfigFile.h"
#include "beep.h"
#include "PPM.h"
#include <sstream>

#ifndef HARDWARE_H
#define HARDWARE_H

//Constants
#define             IMU_YAW_ANGLE_MAX 180
#define             IMU_YAW_ANGLE_MIN -180
#define             IMU_ROLL_ANGLE_MAX 90
#define             IMU_ROLL_ANGLE_MIN -90
#define             IMU_PITCH_ANGLE_MAX 90
#define             IMU_PITCH_ANGLE_MIN -90
#define             IMU_YAW_RATE_MAX 360
#define             IMU_YAW_RATE_MIN -360
#define             IMU_ROLL_RATE_MAX 360
#define             IMU_ROLL_RATE_MIN -360
#define             IMU_PITCH_RATE_MAX 360
#define             IMU_PITCH_RATE_MIN -360

#define             RC_CHANNELS 8
#define             RC_THROTTLE_CHANNEL 3
#define             RC_IN_MAX 1900
#define             RC_IN_MIN 1000
#define             RC_OUT_MAX 1
#define             RC_OUT_MIN 0
#define             RC_YAW_RATE_MAX 180
#define             RC_YAW_RATE_MIN -180
#define             RC_ROLL_RATE_MAX 180
#define             RC_ROLL_RATE_MIN -180
#define             RC_PITCH_RATE_MAX 180
#define             RC_PITCH_RATE_MIN -180
#define             RC_ROLL_ANGLE_MAX 45
#define             RC_ROLL_ANGLE_MIN -45
#define             RC_PITCH_ANGLE_MAX 45
#define             RC_PITCH_ANGLE_MIN -45
#define             RC_THRUST_MAX 1
#define             RC_THRUST_MIN 0

#define             MOTORS_OFF 0
#define             MOTORS_ARMED 1000
#define             MOTORS_MIN 1060
#define             MOTORS_MAX 1860

#define             RATE_PID_CONTROLLER_OUTPUT_MAX 100
#define             RATE_PID_CONTROLLER_OUTPUT_MIN -100

#define             FLIGHT_CONTROLLER_FREQUENCY 500
#define             MOTOR_PWM_FREQUENCY 500
#define             RC_COMMANDS_FREQUENCY 50
#define             SERIAL_MONITOR_FREQUENCY 10
#define             PING_FREQUENCY 10
#define             PIXY_CAM_FREQUENCY 10
#define             STATUS_LIGHTS_FREQUENCY 10

//Shared Functions
void ZeroPitchRoll();
void Arm();
void Disarm();
float Map(float input, float inputMin, float inputMax, float outputMin, float outputMax);

//Shared Variables
float               _yawRatePIDControllerP, _yawRatePIDControllerI, _yawRatePIDControllerD, _pitchRatePIDControllerP, _pitchRatePIDControllerI, _pitchRatePIDControllerD, _rollRatePIDControllerP, _rollRatePIDControllerI, _rollRatePIDControllerD;
float               _yawStabPIDControllerP, _yawStabPIDControllerI, _yawStabPIDControllerD, _pitchStabPIDControllerP, _pitchStabPIDControllerI, _pitchStabPIDControllerD, _rollStabPIDControllerP, _rollStabPIDControllerI, _rollStabPIDControllerD;
float               _zeroValues[3] = {0,0,0}; //Yaw, pitch, roll
float               _rcMappedCommands[4] = {0,0,0,0}; //Yaw, pitch, roll, thrust
//float               _gpsValues[5] = {0,0,0,0,0}; //Latitude, longitude, altitude, course, speed
bool                _armed = false;
bool                _rate = false;
bool                _stab = true;
bool                _initialised = true;
//bool                _gpsConnected = false;
float               _motorPower [4] = {0,0,0,0};
float               _gyroRate[3] ={}; // Yaw, Pitch, Roll
float               _ypr[3] = {0,0,0}; // Yaw, pitch, roll
float               _ratePIDControllerOutputs[3] = {0,0,0}; //Yaw, pitch, roll
float               _stabPIDControllerOutputs[3] = {0,0,0}; //Yaw, pitch, roll
    
//PID controllers
PID                 *_yawRatePIDController;
PID                 *_pitchRatePIDController;
PID                 *_rollRatePIDController;
PID                 *_yawStabPIDController;
PID                 *_pitchStabPIDController;
PID                 *_rollStabPIDController;

//Threads
Thread              *_statusThread;
Thread              *_serialPortMonitorThread;
Thread              *_flightControllerThread;
Thread              *_rcCommandMonitorThread;

//Config file
LocalFileSystem     local("local");
ConfigFile          _configFile;

//HARDWARE////////////////////////////////////////////////////////////////////////////////////
// M1  M2
//  \  /
//   \/
//   /\
//  /  \
// M3  M4
 
//Motors
PwmOut              _motor1(p22);
PwmOut              _motor2(p23);
PwmOut              _motor3(p24);
PwmOut              _motor4(p25);

//USB serial
Serial              _wiredSerial(USBTX, USBRX);

//Wireless Serial
Serial              _wirelessSerial(p9, p10);

//GPS Serial
//Serial              _gpsSerial(p28, p27);

//PPM in
PPM *_ppm;
InterruptIn *_interruptPin = new InterruptIn(p5);

//Battery monitor
//DigitalIn           _batteryMonitor(p8);

//Onboard LED's
DigitalOut          _led1(LED1);
DigitalOut          _led2(LED2);
DigitalOut          _led3(LED3);
DigitalOut          _led4(LED4);

//Outputs
DigitalOut          _output1(p11);
DigitalOut          _output2(p12);
DigitalOut          _output3(p5);
DigitalOut          _output4(p6);

//Buzzer
Beep                _buzzer(p26);

//IMU
FreeIMU             _freeIMU;

//Functions///////////////////////////////////////////////////////////////////////////////////////////////
//Zero gyro, zero yaw and arm
void Arm()
{
    //Zero gyro
    _freeIMU.zeroGyro();
    
    //Set armed to true
    _armed = true;   
}

//Set all RC to 0 and disarm
void Disarm()
{
    //Set all RC to 0
    _rcMappedCommands[0] = 0;
    _rcMappedCommands[1] = 0;
    _rcMappedCommands[2] = 0;
    _rcMappedCommands[3] = 0;
    
    //Set armed to false
    _armed = false;   
}

//Zero pitch and roll
void ZeroPitchRoll()
{  
    //Zero pitch and roll
    float totalPitch = 0;
    float totalRoll = 0;
    float ypr[3] = {0,0,0}; // Yaw, pitch, roll
    for(int i = 0; i < 500; i++)
    {
        _freeIMU.getYawPitchRoll(ypr);
        totalPitch += ypr[1];
        totalRoll += ypr[2];
    }
    
    _zeroValues[1] = totalPitch/500;
    _zeroValues[2] = totalRoll/500;
    printf("Pitch %f\r\n", _zeroValues[1]);
    printf("Roll %f\r\n", _zeroValues[2]);
}

float Map(float input, float inputMin, float inputMax, float outputMin, float outputMax)
{
    return (input - inputMin) * (outputMax - outputMin) / (inputMax - inputMin) + outputMin;
}    

#endif