OpenTx - Key Concepts

Mike Shellim 25 July 2014
Updated: 14 March 2018

Para nuestros amigos hispano-hablantes: traducción al español en formato PDF. Muchas gracias a Jorge Brun.


OpenTx is a uniquely flexible operating system, and if you've come from a brand like Futaba or Spektrum then you'll find the way of working unfamiliar. My aim with this article is to shed some light on how it works, and to enable you to design your own setups with confidence. I'll cover the following topics:

Examples will be illustrated either with screenshots or as text boxes, as appropriate.


OpenTx has just seven programming menus, and each is completely generic. This concept of generic simplicity extends to the mixers. Rather like Lego, these simple elements can be used to build powerful solutions limited only by your imagination.

However, as with any new system, it pays to do a little homework. So without further ado, let's learn look at some basic concepts.

OpenTx: the processing loop

The core of OpenTx (as with any RC system) is the 'processing loop'. This is a sequence of operations repeated several times a second - fast enough to provide a smooth response.

With each cycle, the position of all the controls are read, mixing is applied, and the commands for each channel are calculated. At the end of the cycle, the channel commands are passed to the RF module for transmission.


Within the processing look, there are three key processing steps which are marked in blue. Each of these has an associated menu ('INPUTS', 'MIXERS' and 'OUTPUTS'). A change in one step propagates to all subsequent steps.

The starting point: Sources

All computer programs require data, and the data for OpenTx are the sources, a generic terms for your transmitter's sticks, trims and pots. Each source has a unique identifier, for example,

At the start of the processing cycle, OpenTx reads the position of each source, and assigns a value between -100 and 100 according to its position. For sticks, centre is zero; left/down is negative; right/up is positive. For switches, centre is zero, up is negative, down is positive.

So for example,

Source values can be monitored in real time in the ANALOG INPUTS menu.

Channels (OUTPUTS menu)

The Taranis can command up to 32 channels. Channels may be freely assigned. The lowest numbered channels are normally assigned to devices such as servos, ESCs, flight controllers etc. A channel which is not assigned to any device may be left unused, or employed as a 'high channel'.

Management of channels is split between the MIXERS and OUTPUTS menus. The OUTPUTS menu is the one you'll visit first - it's where you give the channel a memorable name. If it drives a servo, then you'll also configure the servo centre and limits.

Here's a view of the OUTPUTS menu showing a typical channel configuration for an 'RES' sailplane. I've named the channels 'Rudder', 'Elev' and 'Spoilr' to describe their function:


Note that this menu doesn't say anything about how each channel is driven - or even that it's driven at all! For that, we need to define some mixers...

Linking an output to a source: introduction to Mixers

So far we've looked at sources and channels, but only in isolation. We need some way to link them. That is the job of a mixer. Mixers act as the 'wiring' between sources and channels; they define which channels should respond as you move the sticks, also how the channels should respond.

Unlike the complex mixers Futaba, JR and other traditional systems, a mixer in OpenTx mixers is a very simple construct:

As each mixer can be individually configured, this provides much more flexibility!

The MIXERS menu

The MIXERS menu lists all the channels and any associated mixers. For example: the following screen shows the first seven channels. Only CH1 has a single mixer associated.

In the mixer line, Column 1 is the channel number (1-32). Column 3 is the source (stick, knob etc). Column 2 is the weight expressed as a percentage. The weight represents the volume or strengh of the mix. 100% means maximum effect, 0% means zero effect. A negative weight reverses the effect.

Three mixing scenarios

In the following screen shots, we'll look at three basic mixing scenarios which will form the basic building blocks of your setup.

1 source -> 1 channel

The screenshot below shows a single mix. Channel 1 is driven by the aileron stick. 100% of the aileron command is passed through:

1 source -> multiple channels

The same source can drive more than one output. So in the following example, the aileron stick drives both CH1 and CH5 (a popular configuration for dual ailerons):

Multiple sources -> 1 channel

A channel may be driven by more than one source. A common example is the V-tail - each servo is driven by both Rudder and Elevator inputs, as in the following example:

Note the '+' sign against the Ele line, this indicates that the interactions are added together to produce the final output for CH5. Other operators like multiply and replace can also be used, we'll look at those later.

Designing a setup from scratch

It's one thing to know how mixers work, but quite another to understand how to combine them in order to build a complete working system. So here's a simple 6-step design method which I use and recommend for all applications, be they simple or complex.

To illustrate the method, I'll use the example of a 2-channel flying wing. While almost trivially simple, it shows the elegance and power of OpenTx's mixing model.

Step 1. List the sources

The first step is to list all the controls that you'll use to control the model in flight. These will include the sticks, but also any sliders or knobs (e.g. for camber control).

Our flying wing uses just two controls, the aileron and elevator sticks:

Trims are included by default, so there is no need to list these separately. Also, ignore any special switches, flight modes etc.

Step 2. List the servo channels

The second step is to define the servo channels in the OUTPUTS menu. the channel numbers should correspond to the numbers on the receiver.

For our flying wing, we'll assign the first two channels, and call them 'RtEvon' and 'LtEvon' like so:


Step 3. Identify interactions

In this key step, we must identify all the interactions between the sources and the channels:

For our flying wing, the first source is Ail and it affects both channels. So the interactions can be written as:

Similarly, the interactions for the second source (Ele) are as follows:

So for our flying wing there will be four mixes in total. In this step we're not interested in how the channels are affected, just the fact that the interactions exist.

Step 4: Convert interactions into mixer definitions

Next, swap the left and right sides of each interaction so that they read as "channel is affected by source".

Step 5: Reorder interactions by channel number

Now, re-order the mixer definitions so that they're grouped by channel.

Step 6: Enter definitions into the MIXER menu

Finally, enter the interactions as mixer definitions:

The '+=' means on each line shows that the mixes are additive.

Adjusting control surface travel

So far we haven't said anything about control surface travel. Two menus which influence this are INPUTS and MIXERS via their weight parameters. Weights in the INPUTS layer propagate through to the MIXERS layer and are multiplied by the mixer weights. In this section, we'll consider the MIXERS menu only.

Setting mixer weights

In general for a flying wing, roll (aileron) commands requires more movement than pitch (elevator), so:


CH1 (right elevon)

Src = 'Ail', weight=90%
Src = 'Ele', weight=30%


CH2 (left elevon)

Src = 'Ail', weight=-90%
Src = 'Ele, weight=30%

Note that we gave the second Ail source a negative weight, this is because the ailerons move in opposite directions.

That's our flying wing setup completed! But hey, it can be improved...

Using Inputs (INPUTS menu)

Our flying wing setup will work, but has a shortcoming: in order to adjust the rate, we have to alter both CH1, and CH2:


CH1 (right elevon)

Src = 'Ail', weight=90%
Src = 'Ele', weight=30%


CH2 (left elevon)

Src = 'Ail', weight=-90%
Src = 'Ele, weight=30

Wouldn't it be nice if we could make a single adjustment? We can, by using Inputs (introduced in OpenTx v. 2.0).

An input is the same as a regular source, except it has weight and expo pre-defined. Inputs are managed in the INPUTS menu.

Here's a screenshot of an input based on the aileron stick (Ail), with weight=90% and expo=10%:

Note how input names are displayed with an inverted leading 'I' in the menu e.g. [I]Ail.

Inputs can be used instead of 'raw' sources almost everywhere. Later, we'll see later how inputs can be applied to the flying wing example. First let's see how to create and manage inputs in more detail:

Managing inputs

OpenTx provides a maximum of 32 inputs. These are managed in the INPUTS menu.

Each input has a label of the form [I1], [I2]. The number is an internal index, and is unrelated to channel numbers.

Inputs are initially blank. In order to do anything useful, you must:

When you create a new model, OpenTx automatically sets up inputs for the main flight controls: [I1]Ail, [I2]Ele, [I3]Thr, [I4]Rud. It also creates four mixers to link these inputs to specific channels. You can alter the mapping between inputs, mixers and channels. You can also define your inputs, and clear any which are not needed.

The use of inputs is optional; just because they're defined doesn't mean you have to use them - you can still use the raw stick as source where it's more appropriate. Futhermore, it's a good idea to clear unused inputs so they don't clutter up the INPUTS screen.


Using inputs (flying wing example)

Let's modify our flying wing example to use inputs.

First, we define a couple of inputs. We'll name the inputs '[I]Ail' and '[I]Ele', and set the sources to Ail and Ele. Finally, we set values for weight and expo:


The next task is to modify the mixers. Previously, they used Ail and Ele as sources, we change these to '[I]Ail' and '[I]Ele'. Also, since the control movements are now specified in inputs, we reset the mixer weights to +/-100%.


The OUTPUTS menu remains unchanged:


Now, in order to alter elevon travel, we only need to alter the input weight - a single adjustment!

Choosing between Inputs and sticks

When creating a mix, you need to make a choice whether to use a raw source (Ail) or an input ([I]xxx). So which to choose? A good rule of thumb is as follows:

Mixer and channel outputs

In this section we'll look in more detail how OpenTx converts stick movements into position commands. An understanding will be useful when debugging.

OpenTx performs two stages of calculation, first at the level of the mixers, and then for the channel as a whole.

Mixer output values

For each mix, OpenTx calculates the mixer output according the weight (and other parameters we'll look at later). Taking our flying wing example, at any moment the mixer outputs are as follows:

Channel 1

mix_output_1 = Ail_stick_value x 90%

mix_output_2 = Ele_stick_value x 30%


Channel 2

mix_output_1 = Ail_stick_value x -90%

mix_output_2 = Ele_stick_value x 30%

Channel values

OpenTx then aggregates the mixer outputs for each channel. The result is the channel output value. This represents the commanded position. Using our flying wing:

ch1_output = (Ail_stick_val x 90%)+(Ele_stick_val x 30%)
ch2_output = (Ail_stick_val x -90%)+(Ele_stick_val x 30%)

Let's enter some numbers for our flying wing example. Recall that stick values vary between -100 and +100, with zero in the centre:

Aileron Elevator CH1 CH2
(centre) 0  (centre) 0 0 0
(full  right) 100% (centre) 0 90+0=90 -90+0=-90
(full left) -100%  (centre) 0  -90+0=-90 90+0=90
(centre) 0 (full forward) 100% 0+30=30 0+30=30
(half right) 50% (half forward) 50%  45+15=60 -45+15=-30
(full  right) 100% (full forward) 100% 90+30=120 -90+30=-60

More about mixers

OpenTx offers a number of mechanisms for conditioning the output of a mix. We've already looked at weight. We'll now investigate offset, expo, diff, functions and curves.


The offset parameter adds a positive or negative value after the weight has been applied. The governing equation is:

Output = (Source * weight) + Offset

In the following mixer line, the output varies from -80 to +120 as S1 is rotated.

Src = 'S1', wt=100%, offset=20

When you create a new mix, default are: weight=100% and offset=0 i.e. the source value is passed through unchanged.

Offsets example

The motor lever differs from the main flight controls in that the idle positions is with the stick forward i.e. Thr=100. When motor is used as the source of a mix, we usually want the mix to have no effect when at the idle position. In order to do this, we must specify an offset.

Example: elevator channel on an electric sailplane.

The elevator channel in an electric mode will typically have two mixes:


CH2 (elevator)

Src=Ele, wt=100%, offset = 0

Src=Thr, wt=20%, offset=20

To reverse the idle position, change the sign of weight.

Diff, expo, functions and curves

In addition to weight & offset, OpenTx provides one additional option from the following:

The 'Curve' option provides the most granularity - it can implement all the other options, but requires the most data entry.

Using the 'diff' option

Gliders often use aileron differential, in order to reduce the travel of the downgoing aileron. First, here's the wrong way of doing it:



Src=Ail, wt=90%, expo=10, diff=20



CH1 (right elevon)

Src = [I1], wt=100%


CH2 (left elevon)

Src = [I1], wt=-100%

The problem: diff is applied at the input level, so the aileron stick will have a higher rate on one side than the other.

The correct way:



Src=Ail, wt=90%, expo=10, diff=0



CH1 (right elevon)

Src = [I1], wt=100%, diff=20%


CH2 (left elevon)

Src = [I1], wt=-100%, diff=20%

To summarise: specify diff separately for each aileron channel. Do not specify diff at the Input level.


Including/excluding trims

By default, trim values are included in sources. You can exclude trims on a per-mixer basis by unchecking "Include Trim" in the mixer dialog.

For our flying wing example, aileron and elevator trims must always be active, so we'll use the default settings.

Order of processing

When calculating the output of a mix, OpenTx first applies source trims (if enabled for the mix). Then it applies the function (diff, function, curve, expo), followed by weight, and finally adds the offset. Order may be important when combining operators especially where offsets are involved.


We've seen how the channel output is calculated as the sum of all these the mixer outputs:

CHxOutput = SUM (CHxMixerOutput1, CHxMixerOutput2, ...)

There's are a couple of further stages to go through.

Channel clipping

If a channel has several mixers active, and simultaneous control inputs are applied, then the commanded position could potentially exceed the safe limits of the servo. To avoid this, OpenTx limits ('clips') channel values to +/- 100 before passing them to the OUTPUTS stage. If the sum of the mixer outputs is outside the limits, the channel value is adjusted to the limit. Clipping manifests itself as deadband at the transmitter control.

Channel scaling

Finally, OpenTx applies a scaling and offset to each channel command according to the Min, Max and Subtrim parameters specified in the OUTPUTS menu. You'll normally set these up as part of a servo calibration routine. Here's a screenshot of the Outputs menu on an X9D, showing the various parameters:


The key fields are MIN, MAX and SUBTRIM, and CURVE

By setting appropriate end points, you can prevent damage to your linkages from excess servo movement.

Where to adjust weights

Each of the three processing layers (Inputs, Mixers, and Outputs) apply a weight to their inputs. As a source value propagates through these layers, each rate is applied to the result of the previous layer. The the final servo command will be the product of at least three rates:

OutputValue = SourceValue x Rateinput x Ratemix x Rateoutput

Clearly there is an infinite combination of rates which will produce the same movement at the servo. So where should you set them? This is the procedure I recommend:

  1. Set all weights and all min/max to their default values (100%).
  2. Calibrate your servos first. This will entail setting up Min/Max/Subtrim in the OUTPUTS menu. The aim is to define the widest possible operating range of your control surfaces consistent with left/right and up/down symmetry. Calibration should be done with inputs and mixer weights at their defaults (100%), and all trims to centre.
  3. Set desired control rates in the INPUTS.
  4. Any remaining mixer interactions can be adjusted in the MIXERS menu.

More advanced stuff

Mixer operators

So far, we've assumed that mixer outputs are always added together in order to calculate the channel output.

In fact OpenTx is a good deal more flexible - it also permits multiplication and replace operations on mixer outputs. These can be extremely useful. For example, multiplication is key to implementing in-flight adjusters, and 'replace' can be used to implement throttle safety switches.

The mixer operation is specified in the mixer's MULTIPLEX parameter. The options are 'ADD' (the default), 'REPL' and 'MULT'. When calculating a channel value, OpenTx steps through the active mixers, starting with the first mix in the channel:


Example: The following mixer lines illustrate the effect of the various MULTIPLEX parameters and the importance of mixer order.

Src = I1, op=ADD

Src = I2, op=ADD

output = I1 + I2

Src = I1, op=ADD

Src = I2, op=ADD

Src = I3, op=MULT

output = (I1 + I2) * I3

Src = I1, op=ADD

Src = I2, op=MULT

Src = I3, op=ADD

output = (I1 * I2) + I3

Src = I1, op=ADD

Src = I2, op=MULT (disabled)

Src = I3, op=ADD

output = I1 + I3

Src = I1, op=ADD

Src = I2, op=REPL

Src = I3, op=ADD

output = I2 + I3

Src = I1, op=ADD

Src = I2, op=REPL

Src = I3, op=MULT

output = I2 * I3

Src = I1, op=ADD (disabled)

output = 0

The 'MAX' source

MAX is a special source which doesn't correspond to a physical control. Instead, MAX supplies a fixed value of +100. In conjunction with weight, it can be used to simulate the effect of a fixed stick position.

Src = MAX, wt =100 -- output = 100%

Src = MAX, wt=50 -- output = 50%

Src = MAX, wt=-100 -- output = -100%

Here's a simple example, showing a crude motor arming system. The motor is armed when SA is down.


CH7 (motor)

Src = MAX, wt=-100%

Src = Thr, wt=100%, switch=SA-DOWN, multiplex = REPL

F3X sailplane mixer scheme

If you're familiar with F3X sailplanes, you may wish to look at interactions and mixes for F3X sailplanes. Such a scheme will normally be optimised by means of Inputs (described later in this article), GVARs and cascading mixers.


LapinFou has produced some useful data flow diagrams which describe the internal workings of OpenTx (Note: at the time of writing, there are one or two errors in the order of processing of curves).