AM Mode, Green LED optimization

git-svn-id: https://arducopter.googlecode.com/svn/trunk@75 f9c3cf11-9bcb-44bc-f272-b75c42450872
This commit is contained in:
jphelirc 2010-08-12 02:36:57 +00:00
parent 84fb1f015d
commit 2fdceb1b78
1 changed files with 263 additions and 191 deletions

View File

@ -60,6 +60,16 @@ Red LED Off = No GPS Fix
#define SW2_pin 40 #define SW2_pin 40
/* *** */ /* *** */
/* AM PIN Definitions */
/* Can be changed in future to AN extension ports */
#define FR_LED 3 // Mega PE4 pin
#define RE_LED 2 // Mega PE5 pin
#define RI_LED 7 // Mega PH4 pin
#define LE_LED 8 // Mega PH5 pin
/* AM PIN Definitions - END */
/* ***************************************************************************** */ /* ***************************************************************************** */
/* CONFIGURATION PART */ /* CONFIGURATION PART */
/* ***************************************************************************** */ /* ***************************************************************************** */
@ -86,10 +96,12 @@ Red LED Off = No GPS Fix
#define OUTPUTMODE 1 //If value = 1 will print the corrected data, 0 will print uncorrected data of the gyros (with drift), 2 Accel only data #define OUTPUTMODE 1 //If value = 1 will print the corrected data, 0 will print uncorrected data of the gyros (with drift), 2 Accel only data
//Sensor: GYROX, GYROY, GYROZ, ACCELX, ACCELY, ACCELZ //Sensor: GYROX, GYROY, GYROZ, ACCELX, ACCELY, ACCELZ
uint8_t sensors[6] = {1,2,0,4,5,6}; // For ArduPilot Mega Sensor Shield Hardware uint8_t sensors[6] = {
1,2,0,4,5,6}; // For ArduPilot Mega Sensor Shield Hardware
//Sensor: GYROX, GYROY, GYROZ, ACCELX, ACCELY, ACCELZ //Sensor: GYROX, GYROY, GYROZ, ACCELX, ACCELY, ACCELZ
int SENSOR_SIGN[]={1,-1,-1,-1,1,1,-1,-1,-1}; //{-1,1,-1,1,-1,1,-1,-1,-1}; int SENSOR_SIGN[]={
1,-1,-1,-1,1,1,-1,-1,-1}; //{-1,1,-1,1,-1,1,-1,-1,-1};
int AN[6]; //array that store the 6 ADC channels int AN[6]; //array that store the 6 ADC channels
int AN_OFFSET[6]; //Array that store the Offset of the gyros and accelerometers int AN_OFFSET[6]; //Array that store the Offset of the gyros and accelerometers
@ -98,18 +110,27 @@ int gyro_temp;
float G_Dt=0.02; // Integration time for the gyros (DCM algorithm) float G_Dt=0.02; // Integration time for the gyros (DCM algorithm)
float Accel_Vector[3]= {0,0,0}; //Store the acceleration in a vector float Accel_Vector[3]= {
float Accel_Vector_unfiltered[3]= {0,0,0}; //Store the acceleration in a vector 0,0,0}; //Store the acceleration in a vector
float Accel_Vector_unfiltered[3]= {
0,0,0}; //Store the acceleration in a vector
//float Accel_magnitude; //float Accel_magnitude;
//float Accel_weight; //float Accel_weight;
float Gyro_Vector[3]= {0,0,0};//Store the gyros rutn rate in a vector float Gyro_Vector[3]= {
float Omega_Vector[3]= {0,0,0}; //Corrected Gyro_Vector data 0,0,0};//Store the gyros rutn rate in a vector
float Omega_P[3]= {0,0,0};//Omega Proportional correction float Omega_Vector[3]= {
float Omega_I[3]= {0,0,0};//Omega Integrator 0,0,0}; //Corrected Gyro_Vector data
float Omega[3]= {0,0,0}; float Omega_P[3]= {
0,0,0};//Omega Proportional correction
float Omega_I[3]= {
0,0,0};//Omega Integrator
float Omega[3]= {
0,0,0};
float errorRollPitch[3]= {0,0,0}; float errorRollPitch[3]= {
float errorYaw[3]= {0,0,0}; 0,0,0};
float errorYaw[3]= {
0,0,0};
float errorCourse=0; float errorCourse=0;
float COGX=0; //Course overground X axis float COGX=0; //Course overground X axis
float COGY=1; //Course overground Y axis float COGY=1; //Course overground Y axis
@ -121,16 +142,29 @@ float yaw=0;
unsigned int counter=0; unsigned int counter=0;
float DCM_Matrix[3][3]= { float DCM_Matrix[3][3]= {
{1,0,0} {
,{0,1,0} 1,0,0 }
,{0,0,1} ,{
0,1,0 }
,{
0,0,1 }
}; };
float Update_Matrix[3][3]={{0,1,2},{3,4,5},{6,7,8}}; //Gyros here float Update_Matrix[3][3]={
{
0,1,2 }
,{
3,4,5 }
,{
6,7,8 }
}; //Gyros here
float Temporary_Matrix[3][3]={ float Temporary_Matrix[3][3]={
{0,0,0} {
,{0,0,0} 0,0,0 }
,{0,0,0} ,{
0,0,0 }
,{
0,0,0 }
}; };
// GPS variables // GPS variables
@ -197,6 +231,11 @@ int Sonar_Counter=0;
// AP_mode : 1=> Position hold 2=>Stabilization assist mode (normal mode) // AP_mode : 1=> Position hold 2=>Stabilization assist mode (normal mode)
byte AP_mode = 2; byte AP_mode = 2;
// Mode LED timers and variables, used to blink LED_Green
byte gled_status = HIGH;
long gled_timer;
int gled_speed;
long t0; long t0;
int num_iter; int num_iter;
float aux_debug; float aux_debug;
@ -313,7 +352,8 @@ void Attitude_control_v2()
// PID control // PID control
K_aux = KP_QUAD_ROLL; // Comment this out if you want to use transmitter to adjust gain K_aux = KP_QUAD_ROLL; // Comment this out if you want to use transmitter to adjust gain
control_roll = K_aux*err_roll + KD_QUAD_ROLL*roll_D + KI_QUAD_ROLL*roll_I + STABLE_MODE_KP_RATE*err_roll_rate; ; control_roll = K_aux*err_roll + KD_QUAD_ROLL*roll_D + KI_QUAD_ROLL*roll_I + STABLE_MODE_KP_RATE*err_roll_rate;
;
// PITCH CONTROL // PITCH CONTROL
if (AP_mode==2) // Normal mode => Stabilization mode if (AP_mode==2) // Normal mode => Stabilization mode
@ -545,6 +585,11 @@ void setup()
tlmTimer = millis(); tlmTimer = millis();
Read_adc_raw(); // Initialize ADC readings... Read_adc_raw(); // Initialize ADC readings...
delay(20); delay(20);
// Switch Left & Right lights on
digitalWrite(RI_LED, HIGH);
digitalWrite(LE_LED, HIGH);
motorArmed = 0; motorArmed = 0;
digitalWrite(LED_Green,HIGH); // Ready to go... digitalWrite(LED_Green,HIGH); // Ready to go...
} }
@ -719,10 +764,13 @@ void loop(){
} }
// Control methodology selected using AUX2 // Control methodology selected using AUX2
if (ch_aux2 < 1200) if (ch_aux2 < 1200) {
gled_speed = 1200;
Attitude_control_v2(); Attitude_control_v2();
}
else else
{ {
gled_speed = 400;
Rate_control(); Rate_control();
// Reset yaw, so if we change to stable mode we continue with the actual yaw direction // Reset yaw, so if we change to stable mode we continue with the actual yaw direction
command_rx_yaw = ToDeg(yaw); command_rx_yaw = ToDeg(yaw);
@ -764,6 +812,8 @@ void loop(){
// Quadcopter mix // Quadcopter mix
// Ask Jose if we still need this IF statement, and if we want to do an ESC calibration // Ask Jose if we still need this IF statement, and if we want to do an ESC calibration
if (motorArmed == 1) { if (motorArmed == 1) {
digitalWrite(FR_LED, HIGH); // AM-Mode
#ifdef FLIGHT_MODE_+ #ifdef FLIGHT_MODE_+
rightMotor = constrain(ch_throttle - control_roll - control_yaw, minThrottle, 2000); rightMotor = constrain(ch_throttle - control_roll - control_yaw, minThrottle, 2000);
leftMotor = constrain(ch_throttle + control_roll - control_yaw, minThrottle, 2000); leftMotor = constrain(ch_throttle + control_roll - control_yaw, minThrottle, 2000);
@ -778,6 +828,9 @@ void loop(){
#endif #endif
} }
if (motorArmed == 0) { if (motorArmed == 0) {
digitalWrite(FR_LED, LOW); // AM-Mode
digitalWrite(LED_Green,HIGH); // Ready LED on
rightMotor = MIN_THROTTLE; rightMotor = MIN_THROTTLE;
leftMotor = MIN_THROTTLE; leftMotor = MIN_THROTTLE;
frontMotor = MIN_THROTTLE; frontMotor = MIN_THROTTLE;
@ -808,4 +861,23 @@ void loop(){
tlmTimer = millis(); tlmTimer = millis();
} }
#endif #endif
// AM and Mode lights
if(millis() - gled_timer > gled_speed) {
gled_timer = millis();
if(gled_status == HIGH) {
digitalWrite(LED_Green, LOW);
digitalWrite(RE_LED, LOW);
gled_status = LOW;
} }
else {
digitalWrite(LED_Green, HIGH);
if(motorArmed) digitalWrite(RE_LED, HIGH);
gled_status = HIGH;
}
}
}