EMSEngine Management System

(aka Engine Information System)

Updated: July 19, 2023

Design overview:

The idea behind this project is to create a hardware platform for continuous development and improvement of the Engine Management System through software. So, you might notice that many components in the schematic and PCB are optional and different components might be used depending of the purpose of a sensor.

The hardware designed to monitor 18 different engine parameters, including 8 temperature sensors (4-cylinder version) at very high precision (24 bits), 8 resistive sensors at 10 bits precision, two pulse-based parameters (RPM and Fuel Flow) and one discrete input.

Not all inputs are configured in the software at this stage, but the hardware provides a very flexible platform to meet large variety of requirements for engine monitoring in experimental aviation. The unit can be used for automotive engines as well.


Parameters configured to monitor and display:

  • RPM
  • Engine timer (Tacho timer)
  • Oil Temperature
  • Oil Pressure
  • Fuel level
  • Fuel Pressure
  • Fuel Flow
  • EGT X 4 (Type K sensors)
  • CHT X 4 (Type J thermocouples or Thermistors)
  • Voltmeter
  • Ampermeter x 2
  • Endurance based on current fuel flow
  • Endurance based on planned fuel flow

The EMS board communicates with the rest of the system via CAN bus. All the information sent to the display is also recorded by the Flight Data Recorder unit at the rate of 1 record per second.

The EMS built as a fully software driven and very flexible platform. The hardware has a lot of provision for lots of extra features. These will come later.

My test platform is Rotax 912 driven RV-12 aircraft. So the software will be biased towards Rotax engine. Nevertheless, the hardware can accommodate almost any 1 – 6 cylinder engine.

EMS consists of two  physically separate modules connected together via CAN bus:

  1. Sensor Unit
  2. Display Unit

Sensor Unit

Board size 100mm X 100mm.

Key components:

  • 16 Mhz ATmega328 processor (Arduino Nano),
  • LTC2983 thermocouple management chip from Linear with 24-bit ADC.
  • MCP2515 CAN chip (NeRen CAN breakout board)

CAN controller is a breakout board from eBay based on MCP2515 chip. I had to cut it a bit to save some space on the main board.

Parts list:

Part Name
ARD1Arduino Nano (Available in our Store)
 EMS Module PCB Board (Available in our Store)
MCP2515NiRen-MCP2515 CAN-Bus adapter (8Mhz) (Available in our Store)
U2LM393 Dual Comparator (Available in our Store)
LTC2983LTC2983 breakout board (Available in our Store)
U3D-Sub connector 25 pins, Female. Amphenol D25S24B6GV00LF or similar
U4D-Sub connector 9 pins, Male. Amphenol D09P24B6GV00LF or similar
U5D-Sub connector 15 pins, Male. Amphenol D15P24B6GV00LF or similar
C1-C4, C6, C7, C9, C10, C14 – C260.1 uF capacitors for thermocouples and ADC low-pass filter. SMD size 0805
C5, C8100pF capacitor for Schmidt trigger low-pass filter. SMD size 0805. Optional.
R8, R19 – R22, R26, R27, R29 – R416.8K resistors for thermocouples and ADC low-pass filter. SMD size 0805.
R5, R610K Trimpot for Schmidt trigger threshold adjustment
R17, R1810K resistor
R1, R21K – 10K resistor for resistive sensors. Choose the value that together with the maximum resistance of the sensor form a 1:5 voltage divider.
R15, R1610K pullup resistor for the Schmidt trigger. Optional
R11, R231M resistor.  SMD size 0805
R12, R1410K resistor.  SMD size 0805
R3, R4, R7, R9, R10, R24100K or 1M trimpot to form voltage divider for measuring voltage output of the sensors.  Adjust to take the maximum voltage value on the central pin to 1.1V. If you want to use the input for resistive sensors, instead of trimpot install a pullup resistor (just like R1, R2), one leg into the additional hole next to the trimpot marking and the other into the nearest hole of the trimpot marking, shortening it with the centre hole.
Q1Cold junction temperature sensor. I use transistor BC547. A diode can be used instead. Install it in a way so its body makes physical contact with the body of the 25-pin D-Sub connector.

Assembly Instructions

1.Install and solder the three D-Sub connectors on the back side of the board. Back side of the board is the one that has “Experimental Avionics” marking
2Install and solder the “cold junction” temperature sensing transistor BC547 on the back side of the board. Make sure the transistor’s body has physical contact with the 25-pin D-Sub connector.
3.Prepare the male header pins for all the holes of the Arduino Nano board by breaking away the required number of pins from the longer strip and shortening the longer pins to the same length as the the shorter ones.
4.Place the pins into the main board holes and place the Arduino board on top of them.
5.Holding the two boards aligned, start soldering the pins on the Arduino board
6.Keep the Arduino and the main board aligned. Solder the pins on the main board
7.Install and solder the LM393 Schmidt trigger. Ensure correct orientation of the chip.
8.Install and solder R5 and R6 10K trim-pots for Schmidt triggers. These trim-pots will need to be adjusted according to the level of the signal from the RPM (R6) and fuel flow sensor (R5).
9.Install R18 10k through-hole resistor. This resistor is part of the fuel flow sensor circuit. Its value might needs to be adjusted depending on the fuel flow meter.

For Hall-effect RPM sensors (ie Jabiru, etc) install 10K resistor on the R17 pads (through-hole).

For inductive RPM sensor (ie Rotax 912) instead of R17 resistor install a diode with the cathode (white band) on the side of the 15 pin D-Sub connector.
Any small rectifier diode with max reverse voltage over 100v will do the job.
Also, the inductive (coil) sensors requires some load resistor parallel to the coil. A resistor in the range of 100 Ohm – 1KOhm will be ok.
Install this resistor between the round pad of R16 and the square pad of R24. See the pic (coming soon) 

10.Install R15 4.7K resistor. This is a pull-up resistor for the open collector circuit of the FT-60 fuel flow transducer.
11.Install and solder R1 Fuel Level sensor resistor. The value of the resistor depend on the sensor type. 1K resistor is a good start.
12.Short the pads in R24 , R9 and R7 areas as per the picture:

R24 connects battery ammeter

R9 connects Alternator ammeter

R7 connects fuel pressure output

13.Install the 1K resistor for oil temperature sensor circuit as per picture above.
Make sure to short the pads on the back side of the board as per picture.Software might need to be adjusted depending on the sensor you  have. Majority of sensors are based on NTC thermistor with the resistance at 20C about 900 Ohm. If you believe the temperature shown on display is not correct, recalculate the coefficient for the Steinhart-Hart equation and update them in the Get_OilTemperature() procedure. Here is a short article on how to get the coefficients: (coming soon)
14.Install the R10, trimpot (100K)

This trim pot adjusts main buss voltage measurement. Make sure you set it to measure about 23K or less between the center pin and the ground before you connect main power (12-15v) to pin 2 on the U5 D-Sub terminal.

Failure to do this  initial adjustment may cause Arduino board failure.

You’ll need to do some fine-tuning to make sure the voltage on the display reads correctly.

15.Cut the terminating resistor pins
16.Install and solder the CAN board to the main board. Make sure the CAN board components don’t touch the main board surface.
17.Install and solder the LTC2983 breakout board. Ensure correct orientation of the board

Notes on sensors

Oil PressureReference sensor: Honeywell PX3AN1BH150PSAAX
Reference Engine: Rotax 912ULS
Sensor range: 0 to 150 PSI (0 – 10 Bar)
Sensor response: voltage 0.5 – 4.5v proportional to pressure 0 – 150PSIPressure limits for the reference engine:
Red: < 0.8 Bar (0 –  12 PSI)
Yellow: 0.8 – 2 Bar (12 – 30 PSI)
Green: 2 – 5 Bar (30 – 73 PSI)
Yellow: 5 – 7 Bar (73 – 100 PSI)
Red: >7 Bar (>100 PSI)
Oil TemperatureReference Sensor: ???? 0-150C
Reference Engine: Rotax 912 ULS
Sensor Range: 50 – 150
Sensor response:Temperature limits:
Red: < 50C
Yellow: 50C – 80C
Green: 80C – 110C
Yellow: 110C – 140C
Red: >140C
Fuel Pressure.
Coolant Temperature.
Alternator’s Current.
Battery’s Current.

Connectors pinout (boards ver. 4.0):

U3 – Thermocouples terminal 25 pins
(this terminal is for LTC2983 inputs only)
(TC – thermocouple)
Pin Function
1 Channel 1 – EGT1 TC Negative
2 Channel 3 – EGT2 TC Negative
3 Channel 5 – EGT3 TC Negative
4 Channel 7 – EGT4 TC Negative
5 Channel 9 – CHT 1 (Thermistor)
6 Channel 11 – CHT 2 (Thermistor)
7 Channel 13 – CHT 3 (Thermistor)
8 Channel 15 – CHT 4 (Thermistor)
9 Channel 19
10 Channel 17
11 +5V
12 Ground.
13 Ground.
14 Channel 2 EGT1 TC Positive
15 Channel 4 EGT2 TC Positive
16 Channel 6 EGT3 TC Positive
17 Channel 8 EGT4 TC Positive
18 Channel 10
19 Channel 12
20 Channel 14
21 Channel 16
22 Channel 18
23 +5V
24 +5V
25 Ground.
  • Channels 1 to 16 wired in a way that
    allows for differential connections of
    thermocouples and have respective
    pull up and pull down 1M resistors
  • Channels 17, 18 and 19 are wired for
    single point connections via low pass
    filter. Use it for thermistors, single
    point thermocouples or direct
    voltage measurement.
  • As of August 2021 Channels 9, 11, 13, 15
    configured (at software) for thermistors
    while being wired for differential
    Reason: plan to change to thermocouples
    for CHT in the future.
U5 – Sensors inputs 15 pins
(Analog inputs A0-A7 for Arduino Nano)
Pin Function
1 Alternator Ammeter
A1. Voltage meter via R9.
2 Main power bus voltage
A0. Voltage meter via R10
Pulse input 1. (D2, INT0)
4 Fuel Flow. 
Pulse input 2. (D3, INT1)
5 Oil Pressure
6 +5V
7 Fuel Level
A2. Resistive sensor via R1 (4.7k)
9 D7. Digital input or output.
10 Fuel Pressure
A4. Voltage via R7.
11 Battery Ammeter
A7. Voltage via R24.
12 Whatever you want
(Second fuel tank,
manifold pressure,
coolant temp., etc)
A6. Voltage via R3.
13 +5V.
14 Oil Temperature
A5. Voltage via R4.
15 GND
U4 – CAN-Bus 9 pins
Pin Function
2 CAN-Low
3 GND (Power -)
7 CAN-High
9 Vin (Power +)

Software Download

The latest version of software (Arduino) is available at GitHub https://github.com/ExperimentalAvionics/EMS_Sensor

Make sure to set CYL variable according to the number cylinders of your engine. (Line 20 in the EMS_Sensor.ino)

Currently supported values are 6 – for the 6-cylinder sensor board and 4 – for the 4 cylinder sensor board.

Also ensure the same CYL value set for the Display Unit software.

New to GitHub? – Here is a quick GitHub guide.

The software needs to be adjusted according to your engine, electric and fuel system setup.

New to Arduino? –

  • Go to YouTube
  • Search for “upload program to arduino”
  • Watch a couple of videos on how to load the software into Arduino Uno.

The workflow for other Arduino boards (Mega, Nano, etc) is practically identical.

Schematics and PCBs

Main EMS Board

EMS Schematic (PDF): EMS Schematic (PDF)

EMS Schematic DipTrace (.zip): EMS_Sensor_v40_Schematics

EMS board PCB DipTrace (.zip): EMS_Sensor_v4-4c_DipTrace

EMS board PCB Gerber (.zip): EMS_Sensor_v4-4c_gerber

LTC2983 Breakout Board

LTC2983 Breakout Board Schematics (PDF): LTC2983_Breakout_Board_Schematics_PDF

LTC2983 Breakout Board Schematics  (DipTrace .zip) LTC2983_Breakout_Board_Schem_DipTrace

LTC2983 Breakout Board PCB Gerber (.zip): EMS_LTC2983_Adapter_v2_gerber

LTC2983 Breakout Board PCB DipTrace (.zip): EMS_LTC2983_Adapter_v2_diptrace


1.Todo: Create a version of the PCB for differential connections for the thermocouples for 4-cyl or smaller engines.Done.
Termocouples connected in differential mode.
Accuracy improved significantly.
2.Add LEDs at the outputs of the comparator to indicate when pulse sensor is tuned properly 
3.Add a separate ADC with an extra connector for sensors with enough +5v pins