CCPM for Taranis
Your Presenter: Craig Oakley (HeliFreak)
For a PDF copy of this lesson, click here: Taranis-CCPM
After helping numerous people on HeliFreak with CCPM on Taranis, I have decided to put together a lesson on how to do it.
My heli setup is fine. Why do I need this CCPM stuff?
In short, you probably don’t. CCPM mixing in the transmitter is only required for flybared helicopters where the receiver directly controls the swash servos OR particular flybarless controllers (like 3GX) that derive inputs from a CCPM mix.
Most FBL controllers (BeastX, AR7200BX, vBar, iKon, Skookum, Naza, Bavarian Demon, Sprint, AS3X, etc.) DO NOT need transmitter CCPM.
For those controllers that need transmitter CCPM, this lesson is for you!
The objective of this lesson is to be able to set up a Taranis model with CCPM 120 instead of the standard Aileron, Elevator and Collective controls.
You will first need OpenTX 2.0.13 or later and Companion to create edit the model.
This is quite detailed and does go through everything about how CCPM works for Taranis.
Quick list for the impatient
This is for those that know all about CCPM, but just want a checklist of what to do and where to change stuff.
- Program Ail, Ele and Col independent of mixing (-100 to +100)
- Assign phantom channel in Mixes to adjust weight of collective. (Col pitch/Col+Cyc pitch)
- Change weight of Inputs for Ail and Ele. (Cyc pitch/Col+Cyc pitch)
- In Heli screen set swash type (ie. 120), collective channel input and optionally swash ring.
- In Mixes set 100 weights for Cyc1, Cyc2 and Cyc3 on the channels that control the cyclic servos. Cyc1 must be on the center line of the helicopter.
- Bind to heli and on the Servo screen reverse one channel if there is an “odd man out” when moving collective.
- Use the Heli page reverses to make the blade angles move in the expected manner for the controls (up/down, forwards/backwards, left/right).
- Use the Servo page to set PPM center at mid collective so servo horns are 90 degrees to pushrods (zero out cyc1, cyc2 and cyc3 temporarily to assist with this).
- Mechanically adjust swash height to mid-travel by altering servo/swash pushrod lengths.
- Mechanically adjust mid-collective pitch by altering swash/grip pushrod lengths.
- Use the Servo page to adjust min and max servo values for cyclic servos to obtain desired min and max collective pitch (remove the zeroing out of cyc1, cyc2 and cyc3).
- Test the cyclic pitch is as expected at min, mid and max collective pitch. Adjust by changing the collective weight and the cyclic weights.
What is CCPM.
For collective pitch RC helicopters, the direction the helicopter will travel and the amount of lift is governed by a swash plate. The bottom part of the swash plate stays aligned with the helicopter body, the top part of the swash plate turns with the helicopter blades. The top part of the swash plates determines the angle of the blades on each rotation of the blades.
Three or more servos vary the height and angle of the swash plate. The group of 3 or more servos that change the swashplate height and angle are called cyclic servos. This causes a problem with raw signals. For example, a single aileron signal one cyclic servo must go up and another must go down. This changing of the control signals to cyclic signals is called CCPM.
CCPM is cyclic collective pitch mixing. Strictly speaking, cyclic is the combination of Aileron and Elevator. Collective is the angle of the main blades.
But I said before that the 3 servos are called cyclic servos and cyclic is only the combination of aileron and elevator. In older helicopters, cyclic used to just change the angle of the swash plate using 2 servos (one lateral, one horizontal) and a separate mechanical servo used to raise and lower the entire swash cyclic mechanism. To simplify the mechanism, instead of mechanically moving servos (which takes a lot of power), all servos were linked directly to the swash plate and the vertical movement was added to the mix. So all 3 (or more) servos together control the cyclic, so cyclic servos.
The boring math bit of 120 CCPM.
You can skip this if you want, but some want to know how you change aileron(x), elevator(y) and collective(z) signals into cyclic signals (cyc1, cyc2 and cyc3) for servos spaces at 120 degrees around the swash plate.
Imagine a circle marked in compass points North is 0 degrees, East is 90 degrees, South 180 degrees and West 270 degrees. Now imagine cyc1 connected to North (0 degrees), cyc2 connected at ESE (120 degrees) and cyc3 connected at WSW (240 degrees).
If we push elevator forwards(positive), cyc1 will go down (negative) and cyc2 and cyc3 will go up (positive). So:
cyc1 = -cos(0)*ele
cyc2 = -cos(120)*ele
cyc3 = -cos(240)*ele
Remember your trigonometry from school?
cos(120) = -0.5
cos(240) = -0.5
Now if we pull aileron left(positive), cyc1 will stay level, cyc2 will go up (positive), cyc3 will go down (negative). So:
cyc1 = sin(0)*ail
cyc2 = sin(120)*ail
cyc3 = sin(240)*ail
Again, recall from your high school trigonometry:
sin(120) = 0.866
sin(240) = -0.866
Now if we push collective up, cyc1, cyc2 and cyc3 will go up. So:
cyc1 = col
cyc2 = col
cyc3 = col
So if we add all the formulas together, we get:
cyc1 = (-cos(0)*ele) + (sin(0)*ail) + col
cyc2 = (-cos(120)*ele) + (sin(120)*ail) + col
cyc3 = (-cos(240)*ele) + (sin(240)*ail) + col
or when reduced for 120 CCPM:
cyc1 = col – ele
cyc2 = col + 0.5*ele + 0.866*ail
cyc3 = col + 0.5*ele – 0.866*ail
This is the current CCPM mix in OpenTX.
In OpenTX, you can reverse the inputs of aileron, elevator or collective. These reverses are done prior to the CCPM mix. This comes in important later when getting the orientation of the servos right.
As an aside, with this mathematics, you can change the position angles and find values for any positions (or even add phasing). 120X would be (90, 210, 330), 140 would be (0, 110, 250), 130 would be (0, 115, 245), 120 with 5 degree phasing would be (5, 125, 245). Remember, the CCPM number is the angle difference between the two aileron servos (so 140 = 110, 140, 110 as angles between cyc1:cyc2, cyc2:cyc3 and cyc3:cyc1 respectively)
From this, for CCPM 120, you also note that cyc1 is directly related to elevator and not concerned with aileron. For the CCPM 120 mix, the cyc1 servo must be in line with the mid-line of the helicopter.
One problem with the current OpenTX implementation is there are no weights for the CCPM Mix. cyc1, cyc2 and cyc3 are limited to -100/+100 (even with extended limits). ail, ele and col are also limited to -100/+100. If col is +100 (max pitch) and ele is -100 (full nose up), then cyc1 = 100 + 100 = 200, but this is then clipped to +100 (as it cannot go higher). So to keep resolution you need to manually reduce aileron, elevator and collective before they can be used in the calculation. Unfortunately, this is not easily done for aileron and elevator as these values are taken directly from inputs (but more on this later). There is an open issue with OpenTX development (issue #2032 – https://github.com/opentx/opentx/issues/2032 – Please add a support comment if you want the resolution to this raised in priority for a subsequent build).
Programming the model.
Theory and math out of the way, down to brass tacks.
Please note: I assume you have a model that has elevator, aileron and collective programmed.
1) Adding weights
First we need to program around the lack of weighting in the CCPM mix (issue #2032 – https://github.com/opentx/opentx/issues/2032 – Please add a support comment if you want the resolution to this raised in priority for a subsequent build).
How to determine the weights? If you want a collective pitch of 12 degrees and a cyclic pitch of 6 degrees, this is a total of 18 degrees. So 66.6% will be collective and 33.3% will be cyclic. Therefore the cyclic weight should be 66% (round collective down) and MAX cyclic DR (elevator or aileron) should be 34% (round cyclic up). To avoid clipping collective plus cyclic should be no more than 100.
To add weight to collective, create a phantom collective channel. For the example I will use channel 20. This channel takes the collective channel as an input and just reduces it’s throw with a weight. Make it’s input the mixed collective channel (output of all the curves) and set that as the input to the weight channel. Set the weight to 67%.
To add weight to cyclic is trickier. CCPM input is taken from the LAST channel to use the stick input. So if you use multiple inputs that draw weight from Ail, the last one will be used for input to the CCPM algorithm. If you want to use a buddy box, you cannot fulfil this criteria, so if using buddy box the slave must send a CCPM mixed signal to be used (less than desirable).
Lets assume you use max DR on one of your aileron and elevator inputs. For each of these, set the weight to 34%.
If you have multiple weights, like DR 100, 90 and 80. The weights would be 34%, 31% and 27% respectively (34 * 100%, 34 * 90% and 34 * 80% respectively).
You may also notice I have NoTrim for the collective inputs. This prevents any trim entered by the trim added through the throttle trim tab from affecting collective. I also do the same for throttle. This will come in more important in the lesson on internal combustion (Nitro) helicopter setup.
2) Setting the Heli mix
You have the weights entered, next is the swash type on the heli screen.
None means no mix (the normal). Otherwise is supposed to represent the degrees between the aileron servos. 120 is evenly spaces around the swash, 140 is a spacing of 110 between cyc1 and cyc2 (or cyc3), 90 is a spacing of 110 between cyc1 and cyc2 (or cyc3). 120X means cyc1 is rotated 90 degrees (so aileron is in line with cyc1 instead of elevator movement). The formula for this is 180 – (degrees / 2). So for 140 spacing = 180 – (140 / 2) = 180 – 70 = 110.
(I say supposed to because there is another outstanding issue that needs solving: #2042 – Helicopter CPPM140 not correct – https://github.com/opentx/opentx/issues/2042)
From here on I assume you will be using 120. It’s the one that works 🙂
Next tell the Heli screen which channel is the collective channel source. (In the example I use CH20).
Lastly is the swash ring.
Swash ring ensures the combination of aileron and elevator STICKS, excluding trim, are no more than the distance specified from the center. It’s exactly like you have put a virtual limiting ring over a mode 2 right stick (ail and ele on the one stick). The way it does this is check the non-trim value of the sticks. If (Ail * Ail) + (Ele * Ele) > (ring * ring), then do some math magic to reduce Ail and Ele to fit.
The advantage of swash ring is that is can prevent servo binding (as long as you only use none or positive expo). The disadvantage is that if positive expo is used, then the only place you can reach limits is on Elevator only. As ring only affects pre-expo (and pre-trim) inputs, both expo and trim can push outside the swash ring imposed limits.
Note that there are two meanings for the term binding:
- Binding: A “handshake” procedure to connect communications between a TX and a given RX. The TX may bind with multiple RX’s, but a given RX may only bind with one TX.
- Servo binding: Servo binding is when the servo meets resistance by hitting a physical limit. This makes the servo draw extra current from the battery for no gain. Servo binding can cause brownouts and servo failures if allowed to persist.
I use a swash ring of 100. It is personal preference as to what you want to use.
The reverses will be dealt with later.
3) Setting the Mixes
Now that the swash type has been set to 120 and the collective input has been set, now is time to configure the mixes to send the output of the swash mix to the servos.
OpenTX uses CYC1, CYC2 and CYC3 as the outputs of the swash mix. These need to be assigned to channels in the mixer. Always assign these at weight 100% and offset 0. These are never mixed with anything else. Remember each one of these outputs has an effect on collective and cyclic response of the model.
If you need to limit the results of the CCPM mix, it is done in the Servos tab (and is done so evenly). If you want to alter the mix of elevator to aileron, it is done in the Inputs tab.
For Spektrum, the normal order is Ail is assigned CYC2, Ele is assigned CYC1 and Col is assigned CYC3. The most important part is that the CYC1 channel is the one that controls the swash point on the center line of the model.
4) Setting the Servo reverses
Now that the mixes have been done, it’s time to turn on the helicopter and test the swash directions.
Ensure the motor of the model cannot turn the blades (for an electric heli with BEC (no separate receiver battery), the easiest way is often to disconnect the motor from the ESC). Leave the rotor blades on (as they will assist in determining blade pitch). Make sure that your transmitter is bound to the receiver.
Download the programmed model from Companion into your transmitter. Bind the transmitter to the model as setting the following steps needs to be done on the model to ensure correctness.
Once the transmitter is turned and bound to the model you need to navigate to the Servo page.
Move the collective up and down to determine if there is a servo that moves in an opposite direction to the other two. If so, reverse the one servo that goes the wrong way in the servo tab. Only change one servo, even if all servos then seem to travel in the wrong direction. This is also known as finding the “odd man out”.
You could do 0 pitch adjustment here, but ideally this should be done a little later once movement directions are all correct.
5) Setting the CCPM reverses
Now you are going to make the swash move in the right direction. Do not move to full limits of the sticks when doing this as the servo weights have not been set.
On the transmitter use long press on the “page” button to go back to the heli page.
Use the pitch of the blades to test direction, not the swash. Some configurations, the swash will move in an opposite vertical direction due to flybar mechanisms (Blade 450 3D comes to mind). Left/right, forward/backward can be reversed too dependant on leading or trailing edge control of the grips. In short, do not trust the swash, trust the blades. (Remember for cyclics, max pitch change happens approximately 90 degrees BEFORE where it will be observed for movement on a heli. ie. On CW swinging blades, to go forward, max pitch occurs on the right.)
First test up and down. If at up collective, the blades reduce pitch (leading edge twists down), change the “Coll. Pitch direction” to “INV”. Change should happen immediately. Try again and confirm correct.
Next, center the collective and test nose up, nose down on the elevator control. Move the blades so a blade is 90 degrees to the normal direction of travel with the leading edge of the blade facing toward the nose of the helicopter. Elevator stick down (nose up) should twist the leading edge of this blade up. If the blade twists opposite to the expected direction, then change the “Long. Cyc. direction” to “INV”. Change should happen immediately. Try again and confirm correct.
Lastly confirm the aileron control is correct. Move the blades so a blade is directly over the tail boom. Move the aileron stick in the opposite direction of the leading edge of the blade (for a heli who’s main blades rotate CW this is right, for a heli who’s main blades rotate CCW this is left). This should tilt the leading edge of the blade up. If the blade twists opposite to expected, then change the “Lateral Cyc. direction” to “INV”. Change should happen immediately. Try again and confirm correct.
Now that the directions are set, it’s time to set the servo limits. This is also the ideal time to level the swash and mechanically set the swash limits.
First operation is to level the swash at mid-collective. To help with this, temporarily set the weights for cyc1, cyc2 and cyc3 to 0 on the Mixer page.
Now navigate to the Servo page on the transmitter so the PPM center can be adjusted for the CCPM channels. Use PPM center, not sub-trim as sub-trim will move the center and not the limits. PPM center moves the center and the limits.
For each servo, the servo arm should be 90 degrees to the servo/swash pushrod. First re-mount the servo arm as close as possible to 90 degrees so the PPM center adjustment is as small as possible (if required). Once the servo arm is adjusted to 90 the degrees, the servo/swash pushrod lengths should be adjusted to level the swash in the middle of its maximum negative/positive movement range.
Once the swash mid-height is adjusted, then the swash/grip link lengths should be altered to ensure the desired blade pitch is attained at mid-collective. For most RC heli pilots, this would be 0 degrees blade pitch, for scale pilots who may have blade pitches like -3 to +9, mid collective would be +3 degree pitch. Test pitch on each blade to help ensure tracking is correct, adjust by altering the swash/grip link lengths (I assume you had previously matched the weights and CoG of each blade).
Now that mid-collective is done, navigate back to the Mixer page and adjust the weights of cyc1, cyc2 and cyc3 back to 100.
Navigate back to the Servo page and put the collective stick to it’s bottom level (ensure you are in a flight mode that will give the lowest collective pitch pre-mixing). While at this state, ensure that the same expected low pitch is maintained by all swash servos. Adjustments can be made to this by altering the Servo Min (or Max if “Coll. Pitch direction” is set to “INV”).
Next move the collective stick to the maximum positive collective (in a flight mode that will allow greatest positive collective pre-mixing). While at this state, ensure that the same expected high pitch is maintained by all swash servos. Adjustments can be made to this by altering the Servo Max (or Min if “Coll. Pitch direction” is set to “INV”).
If you find that you cannot get the pitch you desire by adjusting Min and Max servo signals, you may need to move the ball links on all the cyclic servos further towards the end of the servo arms (lengthen distance from servo hub to ball).
Similarly if you find that you need to reduce the Min and Max servo signals in too much, you may need to move the ball links on all the cyclic servos further towards the servo spline (shorten distance from servo hub to ball).
This shortening and lengthening works even if using a bell crank servo with 2 attachment points as a cyclic servo will usually only move, at most, between -60 and +60 degrees.
With servos, you want the greatest amount of movement being used because this gives greatest control resolution. Servos are rated on speed to move 60 degrees. A cyclic servo on an RC helicopter should be no slower than 0.15s to move the full 60 degrees. Most like cyclic servos to move a little faster at around 0.10s. Too slow and the controls will feel sloppy. Tail servos should be faster again (0.10s to 0.05s).
If you alter the ball links on a cyclic servo, you should do it on all cyclic servos to maintain control resolution. Also, you will need to go through the levelling process again to ensure center and travel are to the expected limits.
Since servo extents have now been set, you can check for cyclic pitch are max, mid an low collective. While still at maximum collective, test the max cyclic pitches work as required and there is no mechanical or servos binding in any direction. Then move to mid-collective and re-test, then finally at minimum collective.
Should the cyclic pitch variations be incorrect and less than required, the ratio between the collective pitch and the cyclic pitch must be re-calculated and applied. The reason why is because the Taranis CCPM mix is limited to -100/+100. This may require a re-adjustment of the servo limits too.
Should the cyclic pitch variations be incorrect and more than required, the collective pitch can be adjusted down by altering the Ail and Ele Input rates. The reason why more does not need re-adjustment is that reducing Ail and Ele Input rates will not hit the limits of the CCPM mix. If it is a long way out, then you way want to re-calculate the weights and re-balance to regain resolution.
Congratulations! Your CCPM mix is complete!
Lets see If you have been paying attention.
- What is CCPM?
- What should you alter to adjust the servo midpoint in OpenTX?
- In CCPM, what is “the odd man out”?
- What would be CCPM weighting ratio for a collective:cyclic pitch of 10:6?
- Why should you test CCPM directions against blade pitch, not swash?
- Cyclic, Collective Pitch Mixing (controlling the swash plate movement using only servos and no other mechanical method).
- Servo tab, PPM Center
- The method for determining which one of the cyclic servos needs reversing, if required. CCPM should only need at most one cyclic servo reversed since the collective input can be reversed before processing by the CCPM equations.
- 10:6 = 62:38
(10/(10+6)*100 : (6/(10+6))*100 = (10/16)*100 : (6/16)*100 = 0.625*100 : 0.375*100
- Some helicopter head mechanisms require swash movement down to add collective. By testing against the blade movement ensures the controls will make the helicopter do what is intended.
Here are a few links that might come in handy:
“Newbies guide to the DX6i for RC helicopters” – http://www.helifreak.com/showthread.php?t=580508
“Beginners Taranis programming guide for RC helis” – http://www.helifreak.com/showthread.php?t=598718 (Although this is for another make of transmitter, it covers all the concepts as to how and why a transmitter works in relation to an RC helicopter).
“HeliFreak” – RC helicopter specific resource on the net – http://www.helifreak.com/
“HeliFreak OpenTX forum” – http://www.helifreak.com/forumdisplay.php?f=353
“RC Groups” – Lots of discussion on RC aircraft and helicopters – http://www.rcgroups.com
“FrSky Taranis with OpenTX 2.0 and beyond” – http://www.rcgroups.com/forums/showthread.php?t=2178865
“FRSKY Taranis ‘How to’ Thread” – http://www.rcgroups.com/forums/showthread.php?t=1914834
“Freddy Can Fly – 3GX setup video series” – http://www.youtube.com/watch?v=MiHpiMnJPQs
The file contains two model profiles:
CCPMHeli – The one used in the lesson