Adding External LED Indicators and a Piezo Beeper for Arm and GPS Status


I am using the APM 2 for both my quads and it is tricky to get the barometer covered to avoid errant airflow since it is below the daughterboard. To solve this, I ended up pretty much filling up my stack cover with breathable foam. But once that was done, I could barely see the on-board LED indicators.

Fortunately, the current code supports remote indicators without too much trouble.

If you look at the pin-out images on the Wiki, you will see that the AN pins are labeled Motor LEDs. They really don’t have a lot to do with the motors – but they do serve as pretty handy indicators.

If you look in the code, you will find defines for these pins as follows:

AN4 – Motor or Aux LED

AN5 – Motor or Beeper

AN6 – Motor or GPS

AN7 – Motor

AN8 – Motor

For my purposes, I focused on AN5 for the Beeper, AN6 for GPS indicator and AN7 as an Armed indicator.

The default seems to be to have the beeper enabled and the LEDs on. That is easy to change however. The different possibilities are set using bit masks to build the LED_mode parameter. A bit mask (if you already know, feel free to skip ahead) is simply a way of packing a bunch of on/off settings into one byte of data. A Byte is 8 bits, so you can have 8 different switches in one byte.  If you look at the following table, you will see a single bit is set to ‘1’ and the rest to ‘0’ in each row. To build the mask, you just add all the rows together and convert to a decimal number (or convert then add).

Bit Number

7              6              5              4              3              2              1              0

0              0              0              0              0              0              0              1      =      1              Motor LEDs On/Off

0              0              0              0              0              0              1              0      =      2              GPS On/Off

0              0              0              0              0              1              0              0      =      4              AUX Function On/Off

0              0              0              0              1              0              0              0      =      8              Beeper On/Off

0              0              0              1              0              0              0              0      =      16            Low Battery Flash – fast/slow

0              0              1              0              0              0              0              0      =      32            Motor LEDs NAV blink On/Off

0              1              0              0              0              0              0              0      =      64            GPS LEDs Nav Blink On/Off

1              0              0              0              0              0              0              0      =      128          Not used


Note that the NAV settings cause the LEDs (either the motor LEDs, the GPS LED, or both) to blink 3 times when you hit a waypoint in AUTO flight.

The low battery flashing defaults to fast flash so setting that bit to 1 will enable slow flash. 


I really only want the beeper, the GPS and the Motor LEDs on, so I set the mode to decimal value 11 (which is binary 00001011). This should equate to: GPS Nav blink off, Motor LED Nav blink off, low battery flash fast, beeper on, AUX off, GPS on, Motor LEDs on..


The way you set this to be the value used is through the Mission Planner.


Establish a connection with the APM and the Mission Planner software. Go to the parameters list and find LED_Mode. It should be set to something like 9. Change that to 170 (or whatever you decide to use) and write the settings to the APM.

The outputs on the APM are 5V, so for most LEDs, you’ll need a resistor on the positive lead (the longer leg of the LED). In my case, the blue LED I was using required a 100 Ohm resistor and the red one required a 150 Ohm resistor (note – not going to explain it here, but there are a ton of online resources and calculators to figure out the resistor values needed for a given LED). I soldered up the resistors and LEDs to leads and cemented them at the edge of my stack cover’s base. For the beeper, I just used a 5V piezo beeper I happened to have lying around. Radio shack sells one that will work, but it isn’t very loud. If you want volume, you may need to shop around,


When you connect to the AN outputs, you need to run the negative lead to the ground pin (the one nearest the edge of the board) and the positive lead goes to the signal pin (the one farthest from the edge of the board). The middle pin is always 5 Volts so if you plugged in there, the LED or beeper would be always on.


Beeper goes to AN5, GPS to AN6 and the ARMED light goes to any other motor LED output, but I chose to just use AN7.


That’s all there is to it. When you turn on the APM, you the LEDs will stay off until it is booted, then will flash the same as the on-board ones. When a GPS lock is achieved, the GPS LED will stay lit. When the bird is armed, the red LED will blink out and once it is fully armed, it will light a solid red. The beeper will beep twice on arming, and once on disarm.


Views: 107871

Comment by leonardthall on November 14, 2012 at 4:30am

Thanks for the write up Scott.

I couldn't find this in the wiki. Am I blind?

If it isn't in there this would be a good start!

My question is about the buzzer. Is this just a dub buzzer where the output oscillates, or do you need a smart buzzer that detects a high signal and turns on?

Thanks again!

Comment by Rob_Lefebvre on November 14, 2012 at 5:42am

Leonard, it never made it to the wiki as I was hoping I could get a nice user interface in MP so that people didn't have to do the bitmath themselves.  I asked several times but... I think Marooned started work on it recently but I don't know where he's at.

The buzzer is just on/off, so you have to use an internally driven buzzer/beeper.

I'm surprised this is working with MotorLEDs = 0.  It shouldn't be.

Comment by Kevin Klein on November 14, 2012 at 7:58am

Thanks for writing this up. I just finished figuring this all out myself and was contemplating a writeup of my own. I don't see why this can't go in the wiki - just revise it if/when an improved UI is developed.

Comment by Scott Berfield on November 14, 2012 at 10:48am

@Robert - yea, the bit 0 stuff is odd. It looks correct in the code - line 127 of led.pde has what looks like a correct conditional to me. The GPS and AUX code should work either way, but I don't see why the Motor LEDs would still work. But then again, I am not a real coder, I just play at being one on weekends.


Comment by Craig Fraser on November 14, 2012 at 2:06pm

For those who don't know what all the terms mean (like me...), simply setting LED_Mode = 3 gives you GPS LED repeat on AN6 and Armed LED repeat on AN4. Those are the important ones for me, now.

What does "NAV blink" actually mean? (I get the blink part lol.) Thanks.

Comment by SilverFox on November 14, 2012 at 2:32pm

Thanks for sharing. I had an unfortunate event with my quad on Sunday which led to a bloody finger and a desire to add something similar to my code. I want the quad to beep at me when its armed and the motors are not spinning.  That way I know its still live.

The mishap was 100% my fault, but 2 things led to the accident.  

1. I did not disarm the motors prior to handling my quad!

2. My TX was hanging from my neck and I do not have one of those neck strap adapters that help keep it balanced.  This allowed the throttle to be bumped easier when I leaned over.

My quad's battery ran out sooner than I expected, so it landed ~ 25 ft away.  I "thought" I disarmed it, but I could not see the light. By the time I walked up to it, I was already focused on swapping the batteries.  As soon as I reached down, the throttle was bumped and the Quad lifted up into my hand.  It happened so fast and I was able recover quickly, that I did not even think I was hurt.  Then I noticed the blood and I started to feel the stinging.  I was  am mad at myself.

Luckily my finger is in one piece and healing fine.  I think I counted 14 cuts. 3 of them at the knuckle went to the bone. 

Comment by Scott Berfield on November 14, 2012 at 2:37pm

Haven't tried it, but the code indicates that when enabled, the LEDs will blink 3 times when a nav waypoint is reached.

Comment by Scott Berfield on November 14, 2012 at 3:07pm

OK - obviously, my fingers and my brain were not talking last night. The value I entered is 107, not 170. 107 Decimal is actually 1101011 NOT 10101010. Duh. So David's LED code is working correctly. Not sure how to edit a blog post - but, 1101011 means:

Motor LEDs on



Beeper On

Flash fast on low battery

No NAV blink on motor LED

Nav Blink on for GPS LED


Note that to just enable the Motor LED (to show armed status), GPS LED, and Beeper, you owuld set the mode to 11.

Comment by Jani Hirvinen on November 14, 2012 at 10:39pm

Be careful when connecting external devices on those pins. As if your devices are eating too much power you might cause bad brownouts for your electronics and brownout in flying leads to disaster. That's one reason why we created jD-IOBoard to handle LEDs and others without browning out your main flight controller.

jD-IOBoard is a small separate board that can handle high voltages and it listent MAVLink messages from flight controller and acts accordingly.

Comment by leonardthall on November 15, 2012 at 5:44am

What buzzer did you use Scott?

And Jani, do you know what the maximum current draw we can have on those pins?


You need to be a member of DIY Drones to add comments!

Join DIY Drones


Season Two of the Trust Time Trial (T3) Contest 
A list of all T3 contests is here. The current round, the Vertical Horizontal one, is here

© 2019   Created by Chris Anderson.   Powered by

Badges  |  Report an Issue  |  Terms of Service