Sadly Yellow Plane was lost on a test flight and as yet has not been found. It flew reasonably well, but still a bit heavy. She was in the air nearby but over water I think when I lost orirntation and then she was gone.
Lost a key fob cam 6ch RX and 2200mAh Lipo. As its probebly went in the drink its very likley sunk in the mud by now. Pitty as the video would have shown snow on the hills nearby as it was a frosty Autum morning.
Take off Mass 1536 Grams
Turnigy L3010C-1300kv (420w)
H-KING 50A Fixed Wing ESC
10 X 6 Windsor Propeller S2 Series Master Air Screw Sabre Shaped blades
Turnigy 3C 2200mAh discharge 20C
Thrust test results
1632 Grams, 415 Watts, 37.6 Amps Grams/Watts 3.93
1490 Grams, 356 Watts, 31.5 Amps Grams/Watts 4.18
1231 Grams, 264 Watts, 23.1 Amps Grams/Watts 4.66
1071 Grams, 214 Watts, 18.2 Amps Grams/Watts 5.00
750 Grams, 139 Watts, 11.6 Amps Grams/Watts 5.39
Stability system test
Arduino code for receiver
void UpdateServos()
{
//Digital inputs TX code helper
//TxVal[8] |= (digitalRead(5) << 0);//joy 2 push
//TxVal[8] |= (digitalRead(6) << 1);//pb
//TxVal[8] |= (digitalRead(7) << 2);//slide
//TxVal[8] |= (digitalRead(8) << 3);//toggle
//Throttle TxVal[1]
//Rotary pot TxVal[2]
//Joy 1 X TxVal[3]
//Joy 1 Y TxVal[4]
//Joy 2 X TxVal[5]
//Joy 2 Y TxVal[6]
//rssi TxVal[7]
//digital TxVal[8]
//micros() TxVal[9]
//Use the pot as the gain for all channels for now
float GainPot = (float)(TxVal[2]) * 0.001f;
//Get the target values from the TX
int PitchTarg = (TxVal[3] / 10);
int RollTarg = (TxVal[4] / 10);
int YawTarg = (TxVal[6] / 10);
//Prime the Target WOZ values
if(PitchTargWOZ == 9999)
PitchTargWOZ = PitchTarg;
if(RollTargWOZ == 9999)
RollTargWOZ = RollTarg;
if(YawTargWOZ == 9999)
YawTargWOZ = YawTarg;
//Get the Centered target values
float PitchTargCentred = (float)(PitchTarg - PitchTargWOZ);
float RollTargCentred = (float)(RollTarg - RollTargWOZ);
float YawTargCentred = (float)(YawTarg - YawTargWOZ);
//Calculate gains
float PitchGain = GainPot * 1.0f;
float RollGain = GainPot * 1.0f;
float YawGain = GainPot * 1.0f;
//Get Gyro values
float PitchGyro = (float)(AnIn[2] - AnInWOZ[2]);
float RollGyro = (float)(AnIn[1] - AnInWOZ[1]);
float YawGyro = (float)(AnIn[0] - AnInWOZ[0]);
//Calc P error
float PitchError = (float)PitchTargCentred + PitchGyro;
float RollError = (float)RollTargCentred + RollGyro;
float YawError = (float)YawTargCentred + YawGyro;
//Apply gains
int PitchTrim = (int)(PitchError * PitchGain);
int RollTrim = (int)(RollError * RollGain);
int YawTrim = (int)(YawError * YawGain);
//Constaring trim authority
PitchTrim = constrain(PitchTrim, -30, 30);
RollTrim = constrain(RollTrim, -30, 30);
YawTrim = constrain(YawTrim, -30, 30);
//Dump the trim value
if((TxVal[9] & 0x4) == 0)
{
PitchTrim = 0;
RollTrim = 0;
YawTrim = 0;
}
//Calc flap anglke
int Flaps = 0;
//Apply flaps
if((TxVal[9] & 0x8) == 0)
Flaps = -25;
//Throttle
val = TxVal[1] / 10;
val = map(val, 1, 179, 30, 179);
val = constrain(val, 1, 165); // scale it to use it with the servo (value between 0 and 180)
servo[0].write(val); // sets the servo position according to the scaled value
//Vee tail
//Left Elevator Joy 1 Y TxVal[4]
val = (YawTarg + YawTrim) + (PitchTargCentred + PitchTrim);
val = constrain(val, 15, 165);
val = map(val, 0, 179, 135, 45); // scale it to use it with the servo (value between 0 and 180)
servo[1].write(val); // sets the servo position according to the scaled value
//Right Elevator Joy 1 Y TxVal[4]
val = (YawTarg + YawTrim) - (PitchTargCentred + PitchTrim);
val = constrain(val, 15, 165);
val = map(val, 0, 179, 135, 45); // scale it to use it with the servo (value between 0 and 180)
servo[2].write(val); // sets the servo position according to the scaled value
//Left Flaperon
val = 90 + (RollTargCentred + Flaps) + RollTrim;
val = constrain(val, 15, 165);
val = map(val, 0, 179, 165, 15); // scale it to use it with the servo (value between 0 and 180)
servo[3].write(val); // sets the servo position according to the scaled value
//Right Flaperon
val = 90 + (RollTargCentred - Flaps) + RollTrim;
val = constrain(val, 15, 165);
val = map(val, 0, 179, 165, 15); // scale it to use it with the servo (value between 0 and 180)
servo[4].write(val); // sets the servo position according to the scaled value
//Joy 2 x nose Wheel
val = (TxVal[6] / 10);
val = map(val, 0, 179, 55, 125);
servo[5].write(val); // sets the servo position according to the scaled value
}
Yellow Plane 1 this planes sister, on a windy day for her maiden flight. Learned a lot from this design, mostly keep it light
http://subsonichobby.blogspot.com/2012/12/diy-subsonicdrone-v1.html
Any advice?
Log In to reply
Log In to reply
Initialy I made the planes way to strong and heavy :) over engineered somewhat.
With the planes I found thet doing some sums helps with design decisions
My Calcs Sheet is here
https://docs.google.com/spreadsheet/ccc?key=0AsmGA5b7qZ15dFF1U0JCMVFnTXlPNlFrYWxKVjlmSlE
Wing loading is the key to how the plane will fly, floater fast ect.
I used this Guide
Wing Loading Guide oz/ft² kg / m²
Gliders 3.05 10
Trainers 4.58 15
Sport Planes 6.10 20
Warbirds 7.63 25
If you look here
https://docs.google.com/spreadsheet/ccc?key=0AsmGA5b7qZ15dEJVLXZkaTJ4MUY5T2c0NFVpb3c2Tmc
You can see how different combinations of materials can work together to make the plane lighter.
Log In to reply
Log In to reply
The battery location is the easy option for adjusting CG as I'm sure you aware.
Also I had to extend the nose more than I expected from my MK1 design, which gives more space inside and allow more flexible battery location.
Log In to reply
Log In to reply
Log In to reply
Log In to reply
Log In to reply
Log In to reply