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
Diff: hardware.h
- Revision:
- 3:82665e39f1ea
- Parent:
- 2:b3b771c8f7d1
- Child:
- 6:4c207e7b1203
--- a/hardware.h Fri May 16 14:22:18 2014 +0000 +++ b/hardware.h Thu Sep 18 08:45:46 2014 +0000 @@ -4,73 +4,101 @@ #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_YAW_RATE_MAX 90 -#define RC_YAW_RATE_MIN -90 -#define RC_ROLL_RATE_MAX 90 -#define RC_ROLL_RATE_MIN -90 -#define RC_PITCH_RATE_MAX 90 -#define RC_PITCH_RATE_MIN -90 -#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_MIN 1060 -#define MOTORS_MAX 1860 -#define MOTORS_ARMED 1000 -#define RATE_PID_CONTROLLER_OUTPUT_MAX 1 -#define RATE_PID_CONTROLLER_OUTPUT_MIN -1 -#define UPDATE_FREQUENCY 500 -#define MOTOR_PWM_FREQUENCY 500 -#define RCMIN -127 -#define RCMAX 127 +#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 -bool _armed = false; -bool _rate = false; -bool _stab = true; -bool _initialised = true; +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; -//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; - -//Threads -Thread *_statusThread; -Thread *_serialPortMonitorThread; -Thread *_flightControllerThread; +LocalFileSystem local("local"); +ConfigFile _configFile; //HARDWARE//////////////////////////////////////////////////////////////////////////////////// // M1 M2 @@ -81,39 +109,92 @@ // M3 M4 //Motors -PwmOut _motor1(p22); -PwmOut _motor2(p23); -PwmOut _motor3(p24); -PwmOut _motor4(p25); +PwmOut _motor1(p22); +PwmOut _motor2(p23); +PwmOut _motor3(p24); +PwmOut _motor4(p25); //USB serial -Serial _wiredSerial(USBTX, USBRX); // tx, rx +Serial _wiredSerial(USBTX, USBRX); //Wireless Serial -Serial _wirelessSerial(p9, p10); +Serial _wirelessSerial(p9, p10); -//PPM -InterruptIn _PPMSignal(p7); +//GPS Serial +//Serial _gpsSerial(p28, p27); + +//PPM in +PPM *_ppm; +InterruptIn *_interruptPin = new InterruptIn(p5); //Battery monitor -DigitalIn _batteryMonitor(p8); +//DigitalIn _batteryMonitor(p8); //Onboard LED's -DigitalOut _led1(LED1); -DigitalOut _led2(LED2); -DigitalOut _led3(LED3); -DigitalOut _led4(LED4); +DigitalOut _led1(LED1); +DigitalOut _led2(LED2); +DigitalOut _led3(LED3); +DigitalOut _led4(LED4); -//External LED's -DigitalOut _output1(p11); -DigitalOut _output2(p12); -DigitalOut _output3(p5); -DigitalOut _output4(p6); +//Outputs +DigitalOut _output1(p11); +DigitalOut _output2(p12); +DigitalOut _output3(p5); +DigitalOut _output4(p6); //Buzzer -Beep _buzzer(p26); +Beep _buzzer(p26); //IMU -FreeIMU _freeIMU; +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 \ No newline at end of file