ESE350 project, Spring 2016, University of Pennsylvania

Dependencies:   Adafruit9-DOf Receiver mbed-rtos mbed

Committer:
ivo_david_michelle
Date:
Fri Apr 15 19:33:14 2016 +0000
Revision:
29:ae765492fa8b
Parent:
27:11116aa69f32
Child:
31:d473eacfc271
refactored

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ivo_david_michelle 6:6f3ffd97d808 1 #ifndef QUADCOPTER_H
ivo_david_michelle 6:6f3ffd97d808 2 #define QUADCOPTER_H
ivo_david_michelle 6:6f3ffd97d808 3
ivo_david_michelle 7:f3f94eadc5b5 4 #include "mbed.h"
ivo_david_michelle 7:f3f94eadc5b5 5 #include "Adafruit_9DOF.h"
ivo_david_michelle 9:f1bd96708a21 6 #include "Serial_base.h"
ivo_david_michelle 14:64b06476d943 7 #include "MRF24J40.h"
ivo_david_michelle 14:64b06476d943 8
ivo_david_michelle 13:291ba30c7806 9 // a few struct declarations. Can possibly eliminated using the vector class in STL
ivo_david_michelle 7:f3f94eadc5b5 10 struct state {
ivo_david_michelle 10:e7d1801e966a 11 double phi; // roll
ivo_david_michelle 10:e7d1801e966a 12 double theta; // pitch
ivo_david_michelle 10:e7d1801e966a 13 double psi; // yaw
ivo_david_michelle 10:e7d1801e966a 14 double p; // omega x
ivo_david_michelle 10:e7d1801e966a 15 double q; // omega y
ivo_david_michelle 10:e7d1801e966a 16 double r; // omega z
ivo_david_michelle 6:6f3ffd97d808 17 };
ivo_david_michelle 7:f3f94eadc5b5 18
ivo_david_michelle 10:e7d1801e966a 19 struct controlInput {
ivo_david_michelle 10:e7d1801e966a 20 double f;
ivo_david_michelle 10:e7d1801e966a 21 double mx;
ivo_david_michelle 10:e7d1801e966a 22 double my;
ivo_david_michelle 10:e7d1801e966a 23 double mz;
ivo_david_michelle 7:f3f94eadc5b5 24 };
ivo_david_michelle 7:f3f94eadc5b5 25
ivo_david_michelle 14:64b06476d943 26 typedef struct {
ivo_david_michelle 24:e220fbb70ded 27 double gyro_x;
ivo_david_michelle 24:e220fbb70ded 28 double gyro_y;
ivo_david_michelle 24:e220fbb70ded 29 double gyro_z;
ivo_david_michelle 24:e220fbb70ded 30 double roll;
ivo_david_michelle 24:e220fbb70ded 31 double pitch;
ivo_david_michelle 24:e220fbb70ded 32 double heading;
ivo_david_michelle 14:64b06476d943 33 } offset;
ivo_david_michelle 7:f3f94eadc5b5 34
ivo_david_michelle 11:5c54826d23a7 35 struct motors {
ivo_david_michelle 11:5c54826d23a7 36 double m1;
ivo_david_michelle 11:5c54826d23a7 37 double m2;
ivo_david_michelle 11:5c54826d23a7 38 double m3;
ivo_david_michelle 11:5c54826d23a7 39 double m4;
ivo_david_michelle 13:291ba30c7806 40 };
ivo_david_michelle 10:e7d1801e966a 41
ivo_david_michelle 10:e7d1801e966a 42
ivo_david_michelle 24:e220fbb70ded 43 class Quadcopter
ivo_david_michelle 24:e220fbb70ded 44 {
ivo_david_michelle 6:6f3ffd97d808 45 private:
ivo_david_michelle 14:64b06476d943 46 Serial *pc_; // use for printing
ivo_david_michelle 24:e220fbb70ded 47
ivo_david_michelle 14:64b06476d943 48 // allow for remote communication
ivo_david_michelle 14:64b06476d943 49 MRF24J40 *mrf_;
ivo_david_michelle 14:64b06476d943 50 int rcIterations_;
ivo_david_michelle 14:64b06476d943 51 int rcLength_;
ivo_david_michelle 14:64b06476d943 52 Timer rcTimer_;
ivo_david_michelle 14:64b06476d943 53
ivo_david_michelle 8:326e7009ce0c 54 state state_;
ivo_david_michelle 10:e7d1801e966a 55 state desiredState_;
ivo_david_michelle 29:ae765492fa8b 56 double F_des_; // desired thrust force (excluding weight compensation)
ivo_david_michelle 10:e7d1801e966a 57 controlInput controlInput_;
ivo_david_michelle 11:5c54826d23a7 58 motors motorPwm_;
ivo_david_michelle 24:e220fbb70ded 59
ivo_david_michelle 13:291ba30c7806 60 // declarations for IMU use
ivo_david_michelle 10:e7d1801e966a 61 Adafruit_9DOF dof_;
ivo_david_michelle 10:e7d1801e966a 62 Adafruit_LSM303_Accel_Unified accel_;
ivo_david_michelle 10:e7d1801e966a 63 Adafruit_LSM303_Mag_Unified mag_;
ivo_david_michelle 10:e7d1801e966a 64 Adafruit_L3GD20_Unified gyro_;
ivo_david_michelle 10:e7d1801e966a 65 sensors_event_t accel_event_;
ivo_david_michelle 9:f1bd96708a21 66 sensors_event_t mag_event_;
ivo_david_michelle 9:f1bd96708a21 67 sensors_event_t gyro_event_;
ivo_david_michelle 9:f1bd96708a21 68 sensors_vec_t orientation_;
ivo_david_michelle 24:e220fbb70ded 69 offset* initial_offsets_;
ivo_david_michelle 9:f1bd96708a21 70
ivo_david_michelle 10:e7d1801e966a 71 double g_; // gravity [m/s^2]
ivo_david_michelle 10:e7d1801e966a 72 double m_; // mass [kg]
ivo_david_michelle 20:efa15ed008b4 73 double l_; // arm lenght [m]
ivo_david_michelle 20:efa15ed008b4 74 double gamma_; // relation between moment coefficient and force coefficient.
ivo_david_michelle 24:e220fbb70ded 75
ivo_david_michelle 10:e7d1801e966a 76 // proportional attitude control gains
ivo_david_michelle 21:336faf452989 77 double kp_f_; // gain converting radio input to thrust.
ivo_david_michelle 10:e7d1801e966a 78 double kp_phi_;
ivo_david_michelle 10:e7d1801e966a 79 double kp_theta_;
ivo_david_michelle 10:e7d1801e966a 80 double kp_psi_;
ivo_david_michelle 10:e7d1801e966a 81
ivo_david_michelle 10:e7d1801e966a 82 // derivative attitude control gains
ivo_david_michelle 10:e7d1801e966a 83 double kd_phi_;
ivo_david_michelle 10:e7d1801e966a 84 double kd_theta_;
ivo_david_michelle 10:e7d1801e966a 85 double kd_psi_;
ivo_david_michelle 27:11116aa69f32 86
ivo_david_michelle 27:11116aa69f32 87 double zeroVelPwm;
ivo_david_michelle 27:11116aa69f32 88 double maxPwm;
ivo_david_michelle 27:11116aa69f32 89
ivo_david_michelle 14:64b06476d943 90 public:
ivo_david_michelle 15:90e07946186f 91 Quadcopter(Serial *pcPntr, MRF24J40 *mrfPntr); // constructor
ivo_david_michelle 7:f3f94eadc5b5 92
ivo_david_michelle 8:326e7009ce0c 93 void controller();
ivo_david_michelle 8:326e7009ce0c 94 void readSensorValues();
ivo_david_michelle 14:64b06476d943 95 void readRc();
ivo_david_michelle 14:64b06476d943 96
ivo_david_michelle 11:5c54826d23a7 97 motors getPwm();
ivo_david_michelle 24:e220fbb70ded 98 state getState();
ivo_david_michelle 24:e220fbb70ded 99 Adafruit_LSM303_Accel_Unified getAccel();
ivo_david_michelle 24:e220fbb70ded 100 Adafruit_LSM303_Mag_Unified getMag();
ivo_david_michelle 24:e220fbb70ded 101 Adafruit_L3GD20_Unified getGyro();
ivo_david_michelle 24:e220fbb70ded 102 Adafruit_9DOF getIMU();
ivo_david_michelle 24:e220fbb70ded 103 offset* getOffset();
ivo_david_michelle 27:11116aa69f32 104 double getForce();
ivo_david_michelle 6:6f3ffd97d808 105 };
ivo_david_michelle 7:f3f94eadc5b5 106
ivo_david_michelle 6:6f3ffd97d808 107 #endif