Introduction: Boeing 737NG Lights Overhead Panel for FSX

I decided to start this project for my 18yo son, addicted to flying and airplanes (ok, I influenced him a bit...). He knows my passion for electronics and Arduino, so he asked me to create a Boeing 737 panel for his MS Flight Simulator X, his first choice was overhead lights and engine starters. It is a relatively simple panel compared with others, as made up of switches, but I accepted the challenge and try to make it as similar as possible to the original, and interface it to Arduino and then to FSX. Obviously the goal was to use cheap components: there are already many good panels for FSX in the market but they are pretty expensive, especially the most realistic ones.

But the challenge to design and build something from scratch is priceless...

Current project aims to reproduce 737NG panel and its controls on FSX, but you can change it a bit to any other aircraft model/type.

My next project will be the 737 MCP (autopilot), but it's pretty complex (it includes 7-segment displays, rotary encoders, backighted pushbuttons, etc...) and it will take me more time...

Step 1: Project Start

It all started with a sketch made by hand over a paper sheet. The panel has a trapezoidal shape, and after a quick Google search to find the size of the real panel, I started to design a slightly smaller version to make it easier to handle. To create base frame I chose wood strips, while for the front panel the solution I decided to realize was two plexiglass sheets with a simple printed paper sheet between them.

Given that it is an "overhead" panel, it should be placed above the monitor so in my project I simply used a wooden plate to be placed on a shelf (perhaps under some book to keep it steady, or screwed with a couple of bolts if you can make holes in the shelf), and the panel tilted down 45 degrees to simulate plane ceiling. Obviously, the choice of where/how you'll position the panel will change the shape of the support: make the choice that best suits your needs. Here we area to the materials used in the project:

  • 1 x wooden slat 2mt long 4x1.5cm
  • 1 x plexiglass sheet 50x25cm, 2mm thickness
  • 1 x Arduino Nano v3 ATMega328
  • 9 x ON-OFF or ON-ON 1-way lever switches
  • 5 x ON-OFF-ON 1-way lever switches
  • 2 x rotary switches, 12 positions 1 way
  • 2 x knobs for rotary switches (grey or cream)
  • 1 x mini breadboard or perfboard
  • 2 x pin headers 12-pin male
  • USB cable, wires, wood glue, wood screws
  • various tools: cutter, ruler, drill, iron drill bits...

First of all I made a drawing of the panel, with all its labels:

Because it seems that the font used in 737 panels is reserved and owned by Boeing only (sic), I chose a similar font. I chose my panel width (50 centimeters) to be the same of small sizes plexiglass panels I found.

Step 2: Wooden Frame

First of all, check the size of the pieces to be cut from the wooden slat:

  • 1 x 50 cm for the upper crossbar
  • 1 x 28 cm for the lower crossbar
  • 2 x 5 cm for the two vertical reinforcing uprights
  • 2 x 11 cm for the lower diagonal sections
  • 2 x 2 cm side blocks

Before assembling the frame, print the panel faceplate. Since it is larger than an A4 sheet, I divided it into three parts (see file "", where you can find full size PNG pictures, ready to be printed) which I then cut and joined with adhesive tape on the back to form a single 50cm wide mask. Then manually assemble the wooden pieces on a table, and place the paper mask to check the size and positioning.

When everything is ok, first of all mark the position of the two vertical 5 cm uprights, paying attention not to make them overlap any of the switches. During the design I have also made a diagram of the "internal" parts (you can see its picture above) including uprights, to precisely determine their position. Using some glue assemble top and bottom crosbars with the two uprights and press together for a few minutes, then use 4 wood screws to definitely fix them. Other two wood screws are used to fix the two side blocks, then with hot glue fix the lower diagonal sections and you're done.

At the end check again if the paper mask fits properly with the wood frame.

Step 3: Plexiglass Panel: How to Cut and Drill It

Now we have our wooden frame and the mask as a reference, so we can get on with plexiglass panel.

This is undoubtedly the most delicate phase. Without removing the protective film on the sheet of plexiglass, draw with a pencil or marker twice the mask shape, forming the two transparent sides which will contain the printed mask. I suggest to make use of the two upper and lower plexiglass sheet edges as the widest part of the panel (the one corresponding to the 50 cm crossbar, the same as the sheet width). Remember that plexiglass is very delicate, even though with the protective film, so take care not to scratch it or bend it during processing. By the way, a sheet of 50x25 sheet at a DIY department store is quite cheap, less than 3 Euros.

To cut the plexiglass you can use special saws, but the easiest thing in case of simple linear cuts over thin sheets is to break it: using just a metal ruler (or a straight strip of wood) and a cutter. Position the ruler over a line then start carefully marking with the cutterthe entire width of the slab. Repeat the process with patience and precision at least ten times, to engrave it deeper and deeper: do not use excessive force to avoid breaking the plexiglass. Do the same on the opposite side, then place it on the edge of a table and with one hand press the ruler along the edge, with the other hand gently bend the sheet of plexiglass: if you did everything correctly, it will simply break exactly along the incision. Now you will get a rectangle of 50cm to 8cm. Repeat for the other plate 50x8. Do the same to make the triangular bottom cuts. In this case the operation will be a little more critical because of the angle: if the cut is not be perfect, use the cutter to trim it.

Now you have the two plexiglass panels ready for drilling. Using a battery drill set to low speed with iron drill bit. Make the first pilot holes of each switch using a little drill bit (eg. 2.5 or 3 mm), following the marks on the mask. Like cutting, drilling plexiglass is not difficult but it is critical, it takes no time to form a very bad crack so use LOW SPEED rotation, and DON'T PUSH too much, be light like a butterfly! You need to have patience especially when the drill is coming out from the back.

I suggest you keep both sheets one over the other, with paper mask inside, all lined up on the wooden frame and start making the screw holes: this way you can insert the screws and proceed to drill the two panels at the same time making holes always perfectly aligned.

If a plexiglass sheet shown some cracks around a hole do not worry, it will be the inner panel so you will not see the cracks.

Once you made all the pilot holes, switch to a bigger drill, depending on the size of your switches. In my case the 6mm one was perfect. After the first hole try a switch into it before continuing with others, to check hole size.

Rotary switches require a bigger drill, in my case was a 10mm but I recommend you to make a hole with the 6mm drill before.

Step 4: Assemble the Switches

Now we have the frame and the panel, we need to plan the connections.

Attached there is an Excel file ("Connessioni Lights.xlsx") with the list of all switch names (in sequence from left to right), the switch type (ON-ON, ON-OFF-ON, and Rotary), the wire color/number (you'll need to edit this column to suit your wires). Just for now, ignore the rightmost columns as they are the FSX codes, you'll need them later.

I decided to set all Arduino digital inputs with internal pullup to avoid using external resistors: this means that we will read HIGH (+5V) if the pin is NOT connected, and LOW (0V or GND) when we trigger switch, bringing the pin to ground. All ON-ON (or ON-OFF) switches are connected to ground on one side, and the central goes directly to Arduino digital pin. This way when the switch is in "OFF" position we will read HIGH (or "1") value, while in the "ON" position it will be connected to ground and then we will read LOW (or "0").

To reduce the number of needed input pins, for each ON-OFF-ON switches and the two rotary switches I used one analog input thanks to resistive dividers which will give different voltage values depending on the position of the switch (see figures). This way we only need 7 analog pins, instead of 18! And Arduino Nano can fit the project better than UNO, thanks to its 8 analog inputs, two more than UNO.

The panel is internally divided into three sections delimited by the two uprights, so better wire switches in three separate groups. Each wire is then welded to a pin of one of the two headers, corresponding to Arduino pins, see the scheme in the Excel spreadsheet.

Step 5: Edit the Program and Link2FS Configuration

Load Arduino IDE and open the program FSX737LightsPanel.ino you find linked to this step.

The code is set for the use of PMDG 737NGX aircraft, so if you intend to use it no changes are required, but in any case I describe in this step the entire configuration to let you better understand the way it works. If you want to use it with any other aircraft you probably need to customize the codes sent to Link2FS and this to FSX. First of all, open the Excel file that you downloaded from the previous step ("Connessioni Lights.xlsx"), and look at the columns labeled Code, Cmd, and the four "SimConnect".

  • - "Code" contains the FSX event code corresponding to the command (e.g. Event #69749 corresponds to the lights for taxing).
  • - "Cmd" contains the code that Arduino sends to Link2FS
  • - 4 SimConnect columns are the additional parameter to Cmd, to give FSX the switch status

For example, Taxi lights Cmd is "Y09", so the command sent to Link2FS will be "Y091" to turn them "on" or "Y090" to switch them off, or if I have motor switch 1 in position 3 (FLT) the command is "Y063".

Link2FS will interpret such command+state and sends to FSX the corresponding event code, followed by the state.

This means that if your plane has specific custom codes different from 737NGX ones, you need to find the corresponding event codes and insert them in the "Code" column, then program Link2FS to associate one of the "Yxx" in the "Inputs SimConnect" screen under tab "Expert", and write them down on the sheet on corresponding "Yxx" command. In the attached "SimConnectExpert.png" you can see current settings of Link2FS for 737NGX, corresponding to commands from the Excel spreadsheet.

Finally, you must set up the codes in the following three lines of code:

  • S1Cmd String [] = {"Y07", "Y08", "Y03", "Y04", "Y09", "Y10", "Y11", "Y12", "Y16"};
  • S3Cmd String [] = {"Y01", "Y02", "Y05", "Y14", "Y13"};
  • R4Cmd String [] = {"Y06", "Y15"};

These rows correspond to the three types of switches (see TYPE column on the Excel spreadsheet): the first is related to ON-ON (2 positions) switches, the second to ON-OFF-ON (3-positions) ones, and the third to the two rotary 4-positions switches.

The order is from left to right while looking the front panel (see numbering reference in the Excel spreadsheet).

If you use the 737NGX you only need to set the codes shown in the "SimConnectExpert.png" picture, or directly copy "expertsettings.ini" file under Link2FS Expert directory, making sure Link2FS is not running.

Step 6: Configure Link2FS And... Fly!

Now we simply need to plug our Arduino Nano, check cables and connections, install Arduino USB serial drivers if needed, connect USB cable and upload Arduino sketch.

Now run FSX, run Link2FS, and... HAPPY FLYING!

PS: For any question or problem, use comments or PM. Thanks!