ArduPilot FAQ
The problems that come up most often on an ArduPilot build, with the actual parameter names and the actual messages the firmware prints.
If you are setting an aircraft up for the first time and nothing has gone wrong yet, start with ArduPilot Basic Configuration instead — this page assumes something already has.
How do I back up and restore my parameters?
Everything an aircraft knows about itself is in its parameter list, and the list is a file you can keep.
In Mission Planner, Config → Full Parameter List. The buttons down the right-hand side:
| Button | What it does |
|---|---|
| Save to file | writes the aircraft's current parameters to a file on your computer |
| Load from file | reads a file into the table — it does not send it to the aircraft |
| Write Params | sends everything in the table to the aircraft and saves it there |
Loading from a file is a two-step operation and the second step is easy to forget. The file fills the table; Write Params is what commits it.
Save a copy of the parameters when an aircraft is flying the way you want. Every later session of experimenting then has a known-good state to return to.
Why will my flight controller not arm?
First, check the aircraft is actually being asked to arm. ArduPilot prints its refusal in the messages area and on the HUD, always beginning with PreArm:. If no such message appears when you try, the arming command never reached the flight controller — check the stick gesture, the arming switch, and that the radio link is alive.
If you do see a message, it is telling you precisely what is wrong. These are the common ones, with ArduPilot's exact wording:
| Message | What it means | What to do |
|---|---|---|
PreArm: Motors: Check frame class and type | FRAME_CLASS is still 0, or the class and type do not make a valid mixer | Set FRAME_CLASS and FRAME_TYPE, then reboot |
PreArm: GPS 1: Bad fix | the GPS is connected but has not got a usable fix | Go outside with a clear sky view and wait, or relax the GPS arming check for indoor bench work |
PreArm: Need Position Estimate | arming in Loiter or PosHold with no usable position source | Check the position source is present and working. Arm in Stabilize to isolate the problem |
PreArm: Need Alt Estimate | the same, for height | Usually the barometer, or an EKF that has not settled yet |
PreArm: AHRS: EK3 sources require GPS | the EKF source parameters name GPS and there is no GPS | Connect one, or change EK3_SRC to the sensors the aircraft actually has |
PreArm: GPS glitching | the position is jumping around | Wait. Usually poor sky view, reflections off buildings, or interference |
PreArm: Check EK3_SRC1_POSXY (or VELXY, POSZ, VELZ, YAW) | that source parameter is set to something invalid | Read the value — it is naming a sensor type the firmware cannot use there |
PreArm: GCS failsafe on | the ground station link has dropped | Reconnect, or clear the failsafe |
The same words appear with Baro, Compass, Beacon or OpticalFlow in place of GPS in the EKF message, and they always mean the same thing: the source configuration names a sensor that is not present.
Most pre-arm checks can be switched off. That one is not on the list — ArduPilot runs it unconditionally, because without a valid mixer it has no way to drive the motors at all. If you see it, relaxing the arming checks will not help.
How do I relax the arming checks?
For bench testing, sometimes reasonably. The parameter changed in ArduPilot 4.7, and the two are inverted:
| Firmware | Parameter | The bitmask lists | Default |
|---|---|---|---|
| 4.7 and later | ARMING_SKIPCHK | checks to skip | 0 — skip nothing |
| 4.6 and earlier | ARMING_CHECK | checks to perform | 1 — the "All" bit |
Upgrading converts your old value automatically. The trap is following an older guide on newer firmware — its numbers will disable precisely the checks it was telling you to keep.
Use the tick-box editor rather than typing a number, and put them back before you fly. A check that will not pass is describing a real problem with the aircraft.
I am armed, but the motors do not spin
This is an ESC protocol mismatch about nine times in ten, and nothing reports an error because nothing is broken — the two ends are simply speaking different languages.
| Your ESCs | Set MOT_PWM_TYPE to | Also |
|---|---|---|
| Bluejay, AM32, BLHeli_32, BLHeli_S | 5 (DShot300) | reboot; no ESC calibration needed |
| Older analogue ESCs | 0 (Normal PWM) | reboot, then calibrate the ESCs |
Then check the ordinary things: the flight battery is connected (USB powers the flight controller but not the ESCs), and the safety switch, if the board has one, is released.
How do I put an ArduPilot OSD on a DJI air unit?
DJI's digital systems — O3, O4 and the older Vista — accept an overlay over MSP DisplayPort, so ArduPilot can draw its OSD into the goggles.
OSD_TYPE = 5 # MSP_DISPLAYPORT
SERIALn_PROTOCOL = 42 # DisplayPort
SERIALn_BAUD = 115200
MSP_OPTIONS = 4 # EnableBTFLFonts
Replace n with the serial port the air unit is wired to. On a board whose video connector is Serial 2, that means SERIAL2_PROTOCOL and SERIAL2_BAUD. Reboot afterwards.
MSP_OPTIONS = 4 is bit 2 of a bitmask, EnableBTFLFonts: it tells ArduPilot to use Betaflight's character indexes rather than its own. DJI goggles ship with Betaflight fonts, so without it the OSD appears as the wrong characters rather than not at all — which is a confusing symptom if you do not know to expect it.
How do I enable bidirectional DShot?
Bidirectional DShot lets the ESCs send their measured RPM back to the flight controller. That is what feeds the RPM-driven harmonic notch filter, which is the single most effective vibration filter ArduPilot has, because it tracks the motors instead of guessing at a fixed frequency.
- Set
MOT_PWM_TYPEto a DShot rate — DShot300 is the sensible choice. - Set
SERVO_BLH_BDMASKto the outputs the motors are on. It is a bitmask, one bit per channel starting at bit 0 for channel 1, so outputs 1–4 is 15. - Reboot, then power the aircraft normally.
With the aircraft armed and the throttle just off idle, live RPM values appear in the ground station.
The ESC has to support it. AM32, Bluejay and BLHeli_32 do. BLHeli_S and most closed-source ESCs do not, and on those the mask simply produces no telemetry.
How do I talk to a GPS or sensor through the flight controller?
Normally the flight controller parses everything arriving on its serial ports. Serial passthrough switches that off for one port and bridges it straight to USB, so a configuration tool on your computer can talk directly to a GPS, optical flow sensor or rangefinder without unplugging it from the aircraft.
- Connect the flight controller over USB and open the full parameter list.
- Set
SERIAL_PASS2to the serial port number the device is on —4for a sensor on Serial 4. - Write Params, then disconnect the ground station — but leave the USB cable plugged in.
- Open your configuration tool, select the flight controller's COM port, set the right baud rate, and connect.
Three details that are not obvious:
SERIAL_PASS1defaults to 0, the USB console side of the bridge. That is the value you want, so onlySERIAL_PASS2normally needs setting.SERIAL_PASS2resets to −1 on reboot, disabling passthrough, unlessSERIAL_PASSTIMOis set to −1.SERIAL_PASSTIMOdefaults to 15 seconds. Passthrough ends when no data has arrived from the first port for that long, and the port reverts to its normal job. If a bridge seems to work and then quietly stops, this is why.
How do I configure my ESCs through the flight controller?
ESC passthrough does the same trick for the motor outputs, so an ESC configurator can read and write ESC settings without you unsoldering anything.
- Set
SERVO_BLH_AUTOto1. - Set
SERVO_BLH_MASKto the outputs the motors are on —15for a quad on outputs 1 to 4. - Make sure the ESC protocol is a DShot rate. Passthrough does not work over PWM.
- Write parameters and reboot.
- Close the ground station, connect to the flight controller's USB port from an ESC configurator, and connect.
Most ESCs need the flight battery connected for this; an all-in-one board with the ESC on the same PCB will usually manage on USB power alone.
SERVO_BLH_AUTO and SERVO_BLH_MASK are for the duration of a configuration session. Leaving passthrough enabled can stop the ESCs being driven properly in flight.
Configure ESC Parameters covers what to change once you are connected.
Related guides
- ArduPilot Basic Configuration
- MicoAir F405 V2 — Beginner ArduPilot Setup Guide
- Flight Controller Firmware Flashing Guide
- Configure ESC Parameters
- External Compass Orientation
- ArduPilot — Telemetry Setup Guide
Written and maintained by the Robofusion engineering team.