Posts | Comments

Planet Arduino

Archive for the ‘scratch build’ Category

Jan
10

20 minute quad copter

24gram motors, Quadcopter, scratch build Comments Off on 20 minute quad copter 

Made a new frame from carbon only 16 Grams 


Crash at the end of the flight was intentional so I didn't hit the student that walked past as the crooked frame and wind was pushing it toward the library building.

Built while diner was cooking a bit of old wood from the garden and some hot glue.



+Quad config
AUW 354 Grams without camera
340 between prop centers


Some sustatined flight frame is not too straight so it tended to wander also pretty gusty wind

Jan
05

Better 30mm Jet Pump

30mm pump, 4 Blade Impeller, jet pump, scratch build Comments Off on Better 30mm Jet Pump 

Did a trial run in the surf at Purau bay, no video but ran pretty well primes much better on the waves then the NQD unit.

The pump can dissipate way more power than I currently have in it, in fact my old 4500kv Cyclone motor with water cooling died a flaming death on 3C having ran well on a 2C for a while:)  Should have known better I measured 68A on a 53A  motor in the bath, I tried to keep out of the top of the throttle but obviously not enough.

I have 2 options a 600W 2900kv on a 2 or 3C, and a 910W 1100kv which can run a on 6C 
I also have a gaggle of alternate props I will be turning down to fit the pump, the current pitch is 31mm I have a 22mm which should be interesting.


The tip clearance is around 0.8 mm there is a wear ring not shown here which fills in 0.5mm of the 0.8mm. 

Looks like the 2 blade polycarbonate prop is the winner thrust wise finaly its ready for her second time, the first time (her maiden) is never that special :)


Please see Original Design The 4 blade impeller shown is not as efficient as the 2 blade modified prop alternate, until I curved the blades more and got 38 Amps draw with the 2900kv 600 Watt
heli motor. The 2 blade was drawing 59 Amps on the 600 Watt heli.
The stator is somewhat similar to a Graupner units shown below making jet boat impeller







Left: Very pitchy 2 blabe Graupner Impeller





Right: One of my other models with a home made 4 blade impeller, works well



Cutaway of Graupner pump
My impeller very simple will be intersting to see how it performs, I have a 2 blade impeller also
Steering mechinism



New Yellow Boat 3 Jet pump

Yellow Boat Maiden


First Yellow Boat failures ESC's died in both boats  very high ambient today over 31°C , at the lake, burned out FET's after all the surfing at Sumner I'm surprised after all the reliable running, still we live and learn air cooled in a closed space like the hull was a bit too good to be true.

Fitted 50 Amp water cooled ESC, which is a marinized aero ESC to Henry's boat, as the HK 50A boat ESC's don't seem that great, lots of motor noise and heating, regardless of settings it seems.

Changes:
Replaced faulty servo with metal gear type
New improvedWater cooled ESC
Water cooling for motor
Water cooling pump

Thrust vectoring modification


Thrust vectoring in action


Thrust vectoring trim tab

Archimedes screw type pump and cooling system for motor.

 Flexible coupling for thrust vectoring servo push rod.

ESC installed aft as the boat trims very bows down note the water cooling, water is pumped and scooped (when moving) from under the boat, and flows through the motor then the ESC and out of the transom so you can see that it is working.

Cooling pump switch, always turn on before launch, it takes a while to prime usually after a bit of forward motion you should see a flow from the outlet. Forward motion will also generate flow but the pump will stop over heating when you stop so you can stop and start as much as you like.
Radio is mounted to avoid water. Both servos are Turnigy 180 degree metal gear type

New Parts

H-KING 50A Fixed Wing Brushless Speed Controller
Turnigy TGY-R5180MG 180 Degree Metal Gear Analog Servo
ESC
Amp rating: 50A
Burst Rate (15sec): 55ABEC Current: 2A, 5V (Linear)
Voltage: (2-4 cell Lipo)
I added two Aluminium cooling tubes boned to its heat sink





Weight: 12g
Size: 23.2mmx12.0mmx21.6mm
Torque: 2.0kg.cm (6.0v)
Speed: 0.12sec/60deg (4.8v) - 0.10 sec/60deg (6.0v)
Voltage: 4.8-6.0vType: Analog MicroGear Train: Metal
Ball Bearing: NoLead Length: 180mm
Plug: JR/Futaba





The water pump showing the motor out on an old servo left, and the intake scoop, you can see the end of the screw


The pump used an ancient Greek idea the Archimedes' screw


This is the screw I used its for GIB board 
Principal of operation














Dec
25

500mm Foam Polyhedral Bi Plane

2150kv, biplane, christmas, esc, foam, scratch build, servo, xmas Comments Off on 500mm Foam Polyhedral Bi Plane 

My 500 mm Foam Bi Plane Christmas day 2012 Le Bons bay New Zealand
Took the camera off after this flight as its 19 Grams to much for the tiny bi-plane.

Scratch built for Xmas day. It was fun little plane for the day. It was a bit windy for it so without ailerons a few crashes, nothing that couldn't be taped up however until the ESC caught fire :)

Span 550mm with flip ups
Airframe weight 74 Grams Extruded Polystyrene and Bamboo 
Batts 52 Grams 180mAh Nano Tech's
Motor and prop 52 Grams
RX 10 Grams
ESC 9 Grams eith wires and connector Hobbyking SS Series 8-10A
2 X 6 Gram servos
AUW 209 Grams
Wing loading around 11 Oz/ft² assuming you count both wings as wing area for a bi-plane. Some say the effective wing area is 75% of the total giving around 15 Oz/ft²
Rudder and elevator (no ailerons which was s shame) 

Lots of lift from chunky wings, its over powered with a 44 gram AXN-2208-2150 2150kv you could induce a roll with the throttle. The polyhedral flip ups were not big enough I suspect, and it was windy but is flew Ok, the beach is a good place to crash, landed in a tree at one point the big motor kicked her free however. 

Getting some Hextronic 24 Gram 1500kv for these smaller models as recommended by 


Getting into flextures, not enough flextures ind RC models in my opinion. They work well and don't backdrive the servos like metal wire, fine on these tiny planes. 

Note the bamboo push rods, which weigh nothing.

Cooked the ESC by the end of the session as the two 180mAh Nano Tech's ran dry I taped on a 1300mAh, to heavy to many amps.

Might build a little plane like this for indoors with a tiny motor  like a C10 2900kv which is around 8 Grams .

Indoor foamy spec
Yank and bank bi-plane 50 Watts should get around 150 - 200 Grams of thrust so plenty 

Air frame 60 grams 
50 Watt Motor  C10 Micro brushless outrunner 2900kv  and 4.75 x 4.75 prop 12 Grams
Battery Turnigy nano-tech 460mah 2S 25~40C Lipo Pack 33 Grams
ESC wires ect Hobbyking SS Series 8-10A ESC 9 Grams
AUW 134 Grams














Dec
22

Yellow Boat 3 Power Test Scratch Built hull, water jet and cooling pump made from Coroplast and junk

100A ESC, 500 watt motor, heli motor, jet pump, scratch build, scratch built jet, yellow boat Comments Off on Yellow Boat 3 Power Test Scratch Built hull, water jet and cooling pump made from Coroplast and junk 

Yellow Boat 3 Power Tests with Turnigy 500W H450 2100kv





Scratch Built hull, water jet and cooling pump made from Coroplast and junk Yellow Boat 3 Power Test

Cooling pump testing here 

Test results

Dynamic losees
29.5 Watts
2.3 Amps

Peak power
532 Watts
47.5 Amps on a 3C 

Impeller
30 X 30 two blade 

Quite pleased with test results pretty good match motor to impeller it seems. Tried a 30 X 35R impeller which drew too much current the 30 X 30 seems just about optimal.

Home brew cooling small centrifugal pump made from junk, with a scoop on the hull. The pump is mounted directly above the scoop and primes its self with the standard trim at rest.

I also found that if I re-introduce the out let from the cooling circuit into the jet ramp, there is a tendency for the water to be sucked through by the main drive when the throttle is up thus improving cooling flow at high loads, a win win. I wanted a pump because taking a tap from the pressure side of the jet outlet uses some thrust and is only available at speed, with low throttle or stopped there is no flow and this I thought would cause over heating when stopping after a long high power burst, which I do when surfing at Sumner.

The tiny pump on test


The cooling circuit. I found that if I re-introduce the out let from the cooling circuit into the jet ramp it helps with coolant flow. 


Turnigy 450 H2218 Brushless outrunner 2100KV with water cooling added, big bore pipes just because that the brass I had in stock. 

Spec.
Model: 2218 
Turns: 6
Cells: 2~4S
Kv: 2100rpm/V
No load Current: 1.9A/10V
Max power: 500W
Weight: 67g
Shaft diameter: 3.17mm
Dimensions: 27.2 x 36.5mm
Recomended ESC: 2~4S/50A

Hobbyking SS Series 90-100A ESC with a water cooling plate added its an overrated ESC so should do the job easy. Will need a BEC I have a 5A in stock also.



Spec.
Weight: 85g
Size: 70x50x13mm
Cells: 2-7S Li Po 
Max Current: 90A [over 70A use 6S only]
Burst : 100A
No BEC



Generally the larger jet is much more effective at lower throttle in  the bath, this will be better for trolling in the swamp. On the lake speed remains to be seen, but I can't believe it will be disappointing given the flow and power levels I'm getting on test. I suppose its possible the nozzel velocity is lower than the NQD jet, that said I have read that if the ratio of nozzel velocity is greater then 6:1 then all will be well with the world. 


Given the area increase from 3.14159 cm² to 4.818 cm² which is an area increase of 1.533 at the same nozzel velocity the mass flow would increase by 1.533 times.

So every second the following would seem to add up

So as we know the NQD 20 mm jet pushed around 950 grams on Yellow Boat 1, the nozzel velocity  must be around 3.023 Meters / Second with no losses? This is where I get into the realm of I don't understand :O fluid dynamic being so complex, although non compressible fluids like water are less complex mathematically than the calculations for air for example 

Just for fun with an exhaust velocity of 22.5 Meters per Second that's around 80 kph

Every second a bar of water from the 20 mm jet has a volume of  7069 cm³ So the mass flow would be 7.069 Liters per second so 7.069 Kgs sec

Every second a bar of water from the 30 mm jet  has a volume of  10841 cm³ So the mass flow would be 10.841 Liters per second so 10.841 Kgs sec


Definition from Wikipedia

One watt is the rate at which work is done when an object's velocity is held constant at one meter per second against constant opposing force of one newton.


So transpose the above to make kg the subject
With no losses I recon 500 Watts could move 22.22 Kgs to 22.5 Meters a second in one second. Sounds like a lot of water 22.2 Liters Umm???

However the impeller is probably only 60% efficient this is true in air a turbine can only be 59.8 % efficient its called the Betts limit I think.

So 22.2 X 0.6 = 13.33 umm 13 Liters a second sounds like a lot ?

One way to test this is to measure the amount of water the pump moves over a fixed period of time, simple then to workout all the things we want to know.







Dec
16

SNAP

coroflute, coroplast, Corriboard, scratch build Comments Off on SNAP 


Ding Bat Remnants


Yellow Plane 1
New Code
Kalman Filter



This is the code in the main loop UpdateServos()


    unsigned long msDelta = LastMicros - micros();
    LastMicros = micros();
    
    //Measure time since last cycle
    double dt = (double)msDelta / 1000000.0;
    
      
    // The angle should be in degrees and the rate should be in degrees per second and the delta time in seconds    
    double X_Angle = (double)AnIn[0];
    double X_Rate = (double)AnIn[4];
    double Kalman_X = kalman[0].getAngle(X_Angle, X_Rate, dt);
    
    double Y_Angle = (double)AnIn[1];
    double Y_Rate = (double)AnIn[5];
    double Kalman_Y = kalman[1].getAngle(Y_Angle, Y_Rate, dt);
    
    double Z_Angle = (double)AnIn[2];
    double Z_Rate = (double)AnIn[6];
    double Kalman_Z = kalman[2].getAngle(Z_Angle, Z_Rate, dt);






/* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.

 This software may be distributed and modified under the terms of the GNU
 General Public License version 2 (GPL2) as published by the Free Software
 Foundation and appearing in the file GPL2.TXT included in the packaging of
 this file. Please note that GPL2 Section 2[b] requires that all works based
 on this software must also be made publicly available under the terms of
 the GPL2 ("Copyleft").

 Contact information
 -------------------

 Kristian Lauszus, TKJ Electronics
 Web      :  http://www.tkjelectronics.com
 e-mail   :  kristianl@tkjelectronics.com
 */

#ifndef _Kalman_h
#define _Kalman_h

class Kalman {
public:
    Kalman() {
        /* We will set the varibles like so, these can also be tuned by the user */
        Q_angle = 0.001;
        Q_bias = 0.003;
        R_measure = 0.03;
        
        bias = 0; // Reset bias
        P[0][0] = 0; // Since we assume tha the bias is 0 and we know the starting angle (use setAngle), the error covariance matrix is set like so - see: http://en.wikipedia.org/wiki/Kalman_filter#Example_application.2C_technical
        P[0][1] = 0;
        P[1][0] = 0;
        P[1][1] = 0;
    };
    // The angle should be in degrees and the rate should be in degrees per second and the delta time in seconds
    double getAngle(double newAngle, double newRate, double dt) {
        // KasBot V2  -  Kalman filter module - http://www.x-firm.com/?page_id=145
        // Modified by Kristian Lauszus
        // See my blog post for more information: http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it
                        
        // Discrete Kalman filter time update equations - Time Update ("Predict")
        // Update xhat - Project the state ahead
        /* Step 1 */
        rate = newRate - bias;
        angle += dt * rate;
        
        // Update estimation error covariance - Project the error covariance ahead
        /* Step 2 */
        P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle);
        P[0][1] -= dt * P[1][1];
        P[1][0] -= dt * P[1][1];
        P[1][1] += Q_bias * dt;
        
        // Discrete Kalman filter measurement update equations - Measurement Update ("Correct")
        // Calculate Kalman gain - Compute the Kalman gain
        /* Step 4 */
        S = P[0][0] + R_measure;
        /* Step 5 */
        K[0] = P[0][0] / S;
        K[1] = P[1][0] / S;
        
        // Calculate angle and bias - Update estimate with measurement zk (newAngle)
        /* Step 3 */
        y = newAngle - angle;
        /* Step 6 */
        angle += K[0] * y;
        bias += K[1] * y;
        
        // Calculate estimation error covariance - Update the error covariance
        /* Step 7 */
        P[0][0] -= K[0] * P[0][0];
        P[0][1] -= K[0] * P[0][1];
        P[1][0] -= K[1] * P[0][0];
        P[1][1] -= K[1] * P[0][1];
        
        return angle;
    };
    void setAngle(double newAngle) { angle = newAngle; }; // Used to set angle, this should be set as the starting angle
    double getRate() { return rate; }; // Return the unbiased rate
    
    /* These are used to tune the Kalman filter */
    void setQangle(double newQ_angle) { Q_angle = newQ_angle; };
    void setQbias(double newQ_bias) { Q_bias = newQ_bias; };
    void setRmeasure(double newR_measure) { R_measure = newR_measure; };
    
private:
    /* variables */
    double Q_angle; // Process noise variance for the accelerometer
    double Q_bias; // Process noise variance for the gyro bias
    double R_measure; // Measurement noise variance - this is actually the variance of the measurement noise
    
    double angle; // The angle calculated by the Kalman filter - part of the 2x1 state matrix
    double bias; // The gyro bias calculated by the Kalman filter - part of the 2x1 state matrix
    double rate; // Unbiased rate calculated from the rate and the calculated bias - you have to call getAngle to update the rate
    
    double P[2][2]; // Error covariance matrix - This is a 2x2 matrix
    double K[2]; // Kalman gain - This is a 2x1 matrix
    double y; // Angle difference - 1x1 matrix
    double S; // Estimate error - 1x1 matrix
};

#endif



New parts
Turnigy L3010C-1300kv (420w)

H-KING 50A Fixed Wing Brushless Speed Controller
ZIPPY Compact 2700mAh 3S 25C Lipo Pack
HobbyKing 929MG Metal Gear Servo 2.2kg/ 12.5g/ 0.10sec

Dimentions

1200 mm Wing span
280 mm cord
14% Clark Y
Length 950 mm




 AUW 1521 Grams Wing loading 14.83 oz/ft²  power to weight 270 Watts A Kg should perform much better than Yellow plane one.

Missing battery and camera box have a design which should weigh 140 grams empty.
The assembly shown below weighs 684 Grams no motor or electronics.
Electronics shown weigh 110 grams ESC Arduino board, Xbee, antenna and Gyro board
Motor and prop another 120 Gram




The code with the mixing and stability feedback, all looks Ok on the bench

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

}
















14% Clark Y more or les given the limitations of the Coroplast









  • Newsletter

    Sign up for the PlanetArduino Newsletter, which delivers the most popular articles via e-mail to your inbox every week. Just fill in the information below and submit.

  • Like Us on Facebook