EFIS Front Panel Breakout

Today I’ve finished and tested front panel PCB.


You may find one noticable feature on this board: I’ve used MEC 3FTL buttons instead of widely available and cheap B3F-like tact switches. Theese switches are designed to embed 3mm LEDs and have longer travel distance.


Panel has total of 13 inputs distributed between 2 IDC sockets. It’s connected to control board with two ribbon cables. Backlit is powered by 12V PWM controlled signal and is connected to control board with separate 2-wire cable.

EFIS Control Board

In fact it’s not control board. It contains three MCP23S17 modules intended to be connected to MCP’s Arduino board.


MCP23S17 allows to connect up to 8 devices on single SPI line. Each device has 3 pins to set it’s address. Each EFIS can be configured as captain’s or 1st officer’s with DIP switches, that are used to set address of MCP23S17. That’s how it works.

Board installed on the EFIS module:


3D Printing Temperature

I use 3D Printer to produce some parts of my cockpit. It’s very advanced technology providing lots of opportunities for cockpit builders.

To produce parts for 2 EFIS panels I’ve changed filament from Felix to ColorFabb PLA. I’ve spent all day long trying to understand the reason, why the same type of the filament using the same printing settings and g-code does not adhere properly to printing bed.

Finally, I’ve tried to increase temperature and it gave satisfactory result. Surprisingly, not only different type of filaments, but filaments of the same type from different manufacturers require different temperatures. ColorFabb is intended to be used at 210-220 degrees of celsius, while Felix PLA – up to 200 (I usualy print at 195 for first and 190 for rest of layers).

Also, consider to use lower printing speeds with higher temperatures, especially while printing small parts. Higher printing temperature make part stronger, but less accurate.

NGConnect and Encoders

Important thing I forgot to include in program archive is encoders firmware, which has been tested with ATTINY2313. It allows to connect up to 6 encoders of 2 different types: standard and gray code. The first type also requires hardware debouncing.

Download encoders firmware here

You will need Atmel studio and your favourite programmer to upload firmware to device (Google says, that you can also use Arduino board for device programming – I’ve never tried that). This firmware is intended to be used with 16Mhz crystal, so the fuses to be used are:

Extended 0xFF

Below is drawing with generic ATTINY2313 circuit and one encoder connected (without debouncing circuit). Standard and gray code encoders are connected the same way.


As seen from schema tiny uses serial method to communicate with Arduino. Tiny’s RX goes to Arduino TX and TX goes to RX. Do not use RX0/TX0 on Arduino (they are used for USB connection).

In module configuration put serial port number (1-3 for Mega2560) into Serial Field.

Type field must contain 8-bit integer value. Each of the first 6 bits is for single encoder. 1 means gray code, while 0 is for standard type. The first encoder is in the least significant bit. For example, 0b00000010 means, that 2nd encoder is gray code and you have to put 2 in Type field. Other example: 0b00100010 means, that 2nd and last encoders are gray code, so that you have to put 34 in Type field.


Encoder offset pin mapping (ATTINY2313):

PB0 – PD6 0
PB1 – PD5 1
PB2 – PD4 2
PB3 – PD3 3
PB4 – PD2 4
PB5 – PB6 5

One of the future updates will also include gray code type variable, which will allow to connect encoders of this type directly to Arduino.


Allthough I do all tests using USB connection, in future I plan to use TCP/IP communication between all hardware.

Ethernet connection has some significant advantages in comparsion with USB:

1. It’s more stable.

2. It’s faster and TCP/IP manages data integrity.

3. Device identity (IP address) is hard-coded (or stored in EEPROM memory) so there’s no need to change serial port name every time device is reconnected.

Being now away from home (and all my hardware) I’ve decided to intergrate ethernet support into Arduino firmware and router.


The few things I’d like (and still don’t know how to) figure out are:

1. Detecting when ethernet shield is connected to arduino. Now there’s a variable telling firmware to initialize TCP/IP server and it’s required to set it to TRUE before uploading firmware.

2. Setting up IP address. The same as above – now it’s hard coded. IP address must be somehow definded at the first connection between PC and arduino (assuming there’s no access to source code or no skills to change it).

Mode Control Panel

MCP is almost finished now. The only few things not installed yet are smoked display filters, MA covers and A/P disengage switch. Later I will also replace knobs – current are 3D-printed with my old Solidoodle in poor resolution. And screws will be painted offcourse.



Front panel was ordered from Simworld. It happened before I bough own CNC machine. Probably, panel quality is the best available on the market, but not perfect at all. Paint quality is poor (it can be clearly seen when backlight is on), engraving is displaced relatively to holes. 7-segment display screens are of different thikness and translucency!

On the other hand metal back panel is awesome.


MCP is being driven by Arduino. I’m currently working on custom firmware and routing software. The idea is to build universal hardware/software interface to use cheap Arduino board (Mega2560 for as low as $10 on eBay).

There are 3 PCB’s connected to arduino:

1. 7-segment driver board based on MAX7219 drivers

2. OUTPUT board using 74HC595 shift registers and ULN2803 transistor arrays. All lights on MCP are powered by 12V. OUTPUT board also has PWM input, that allows to control lights intensity (not backlight). Output board also contains transistor-diode 28V circuit for A/T disarm solenoid.

3. INPUT board using MCP23S17 IO expanders. That’s perfect solution with price just above 1 Euro. It supports up to 16 input (or outputs) with pullup’s so it’s not required to add any resistors outside and simplifies overall circuit. INPUT board also contains ATTINY2313 with custom firmware alowing to operate 6 rotary encoders. Encoder type (incremental or gray-codeed) can be definded in router software.

A/T disarm is original (and in new condition!) switch I found on eBay for US$100.



Korrys are of very simple construction: pushbutton with lights is mounted on PCB. Faceplate is attached to 3D-printed button case. It’s divided inside allowing separate backlight for title and status indication.


With PROSIM:737 it works almost perfect. The only problem I found is small delay between any input and getting result on display or light indication. It seems, that delay is result of communication between MCP and main PROSIM modules.

It can also be connected to iFly and NGX, but FSUIPC support is not fully implemented yet in routing software.

A/T disarm video:

Brightness control using 2 PWM outputs and native dimming support in MAX7219 and routed to analog input on different Arduino by software.