ArduPilot firmware: install Copter, Plane, Rover or Sub on any board
ArduPilot firmware is built separately for every vehicle type and every flight controller board. FlySpark's ArduPilot firmware tool reads the official list from the ArduPilot firmware server, finds the build for your exact board, downloads it and writes it over USB from your Android phone. Copter, Heli, Plane, Rover, Sub and Antenna Tracker are all there, in stable, beta and latest development releases.
It covers both situations pilots meet. A board that already runs ArduPilot is updated through its ArduPilot bootloader with the .apj file. A board that runs Betaflight or INAV, or a brand-new board, gets a first install in DFU mode with the _with_bl.hex file, which also writes the ArduPilot bootloader. Once that is done, every later update is a normal one.
This page explains the file types, how the tool picks the right build, step-by-step guides for both install methods, the error messages you may see and how to fix them, and what to check after flashing.
This tool runs in the FlySpark app on Android. The demo works in your browser.
- Free
- Demo without hardware

In short
ArduPilot firmware is built per vehicle type and per flight controller board. FlySpark's ArduPilot firmware tool finds your board's build on the ArduPilot firmware server and writes it over USB OTG from an Android phone, either through the ArduPilot bootloader (.apj) or as a first install in DFU mode (_with_bl.hex).
Key facts
- Reads the firmware.ardupilot.org manifest, refreshed at most once an hour.
- Vehicles: Copter, Heli, Plane, Rover, Sub and Antenna Tracker, in Stable, Beta and latest development builds.
- Boards already running ArduPilot are updated with the .apj file through the ArduPilot bootloader, verified by CRC.
- First installs use the _with_bl.hex file in DFU mode, which holds both the bootloader and the firmware; .apj files cannot be used for DFU.
- Checks the image's board ID, flash size and external flash needs against the board before writing.
- Custom .apj, .px4 and .hex files can be flashed.
- Runs in the Android app with USB OTG; not on iPhone or in web browsers.
Betaflight
INAV
ArduPilot
PX4- BLHeli_S
Bluejay
AM32
ExpressLRS
EdgeTX
DroneCAN
MAVLink
ArduPilot
Features
- 01
Every vehicle and release
Copter, Heli, Plane, Rover, Sub and Antenna Tracker, each as stable, beta or development builds, with versions listed newest first.
- 02
Board search and detection
Search the full board list by name, such as MatekH743 or CubeOrange, or let FlySpark identify the board over USB from its bootloader board ID, USB name or Betaflight/INAV target.
- 03
Update through the ArduPilot bootloader
For a board that runs ArduPilot: the .apj image is written through the bootloader and verified with a CRC check. Your parameters stay on the board.
- 04
First install over DFU
For a board that runs Betaflight, INAV or nothing yet: the _with_bl.hex image is written in DFU mode, bootloader included, so later updates work without DFU.
- 05
Safety checks before writing
FlySpark compares the board ID, flash size and external flash needs of the image with the board and stops with a clear message if they do not match.
- 06
Custom files
Flash your own build or a file from a manufacturer: .apj, .px4 or .hex.
- 07
Phone-friendly
Runs over a USB OTG cable on Android, keeps a progress notification when you switch apps, and can start flashing as soon as the board is plugged in.
What ArduPilot firmware is
ArduPilot is autopilot software for many kinds of vehicles. The same project produces several firmwares: ArduCopter for multirotors, a Heli build of Copter for traditional helicopters, ArduPlane for fixed-wing aircraft and QuadPlane VTOLs, Rover for cars and boats, ArduSub for underwater vehicles and Antenna Tracker for tracking antennas. Each is compiled for each supported board, because pin maps, sensors and memory differ from board to board.
The builds are published on firmware.ardupilot.org in folders per vehicle, with stable and beta releases plus the latest development build. Picking a file by hand means knowing your exact board name, the vehicle, the release and the right file type. FlySpark reads the server's manifest, which lists every build with its board ID, vehicle, version and file format, and does the matching for you.
ArduPilot firmware file types: .apj, _with_bl.hex and .bin
An .apj file is the normal update image. It contains the firmware plus its board ID and is written through the ArduPilot bootloader, which is already on the board if it has run ArduPilot before. This is what ground stations use for updates, and it never touches the bootloader itself.
A _with_bl.hex file contains the ArduPilot bootloader and the firmware together. It is written in the chip's DFU mode, which every STM32 flight controller has in ROM. Use it the first time ArduPilot goes on a board, for example when converting a Betaflight or INAV board. DFU flashing erases the whole chip.
A .bin or .abin file is used for other routes, such as loading from an SD card on boards that support it. FlySpark uses .apj for updates and _with_bl.hex for DFU installs. In custom file mode it accepts .apj, .px4 and .hex files.
Which install method to choose
Choose Runs ArduPilot when the board already has ArduPilot on it, even an old version. FlySpark reboots it into the bootloader, checks the board ID against the image, erases, writes and verifies. Nothing outside the firmware area changes, so your parameters and calibrations stay.
Choose First install (DFU) when the board runs Betaflight or INAV, has never been flashed, or has a damaged bootloader. Put the board in DFU mode by holding its BOOT button while plugging in USB. FlySpark writes the _with_bl.hex image, which replaces everything on the chip including the bootloader. If you connect a board that runs Betaflight or INAV and pick the normal method, FlySpark tells you to use the DFU option instead, because those firmwares have no ArduPilot bootloader.
How FlySpark finds the right board
Every ArduPilot board has a numeric board ID, and every .apj image records the ID it was built for. When a board is in the ArduPilot bootloader, FlySpark reads that ID and filters the list to matching builds. Some boards share compatible IDs, and FlySpark knows those pairs.
When the board runs ArduPilot, the board name in its USB description helps narrow the list. When it runs Betaflight or INAV, FlySpark reads the target name and suggests the ArduPilot board with the same hardware where one exists. You can always search by name instead, and the search covers every board on the server.
Similar names can mean different hardware: a board and its V2 or a Pro variant often need different builds. If you are not sure, check the name printed on the board or in the manufacturer's documentation, and let FlySpark's board ID check catch a mismatch before anything is written.
Where the ArduPilot firmware tool runs
Flashing needs a wired USB connection, so the tool runs in the FlySpark app on Android with a USB OTG cable or adapter. It is not offered on iPhone, which has no USB access for apps, and it is not part of the web version. In the browser you can try a dry run against a simulated bootloader in the demo to see the steps.
Inside the ArduPilot and MAVLink ground station, Setup has its own Install firmware page. It shows the boards and vehicles, guesses your board from its boot messages, and on Android installs over USB. On a telemetry radio, Bluetooth or Wi-Fi link it lets you browse firmware but asks for a direct USB connection to install.
What to check after an ArduPilot firmware update
Updating within the same major version keeps parameters and needs no extra work. After a jump between major versions, read the release notes for parameter changes, then connect the ground station and check the Setup status chips, especially the frame type, flight modes and failsafes.
After a first install, the board starts with default parameters. Work through the mandatory setup: frame type for Copter, accelerometer, compass, radio calibration, flight modes, failsafe and, for Copter, initial tune parameters. FlySpark's ArduPilot ground station covers all of these.
At a glance
ArduPilot firmware tool specifications
| Firmware source | firmware.ardupilot.org manifest, refreshed at most once an hour |
|---|---|
| Vehicles | Copter, Heli, Plane (including QuadPlane), Rover, Sub, Antenna Tracker |
| Releases | Stable, Beta, latest development; versions newest first |
| Update method | .apj through the ArduPilot bootloader, CRC verified |
| First install | _with_bl.hex in STM32 DFU mode, whole chip erased |
| Custom files | .apj, .px4, .hex |
| Checks | Board ID (with known compatible IDs), flash size, external flash |
| Board detection | Bootloader board ID, USB product name, Betaflight or INAV target |
| Platform | FlySpark app on Android with USB OTG; demo dry run in the browser |
| Not available | iPhone and web browsers (no wired USB flashing) |
Compare
Ways to install ArduPilot firmware
| Feature | FlySpark (Android) | Mission Planner | STM32CubeProgrammer |
|---|---|---|---|
| Picks the build from firmware.ardupilot.org | Yes | Yes | Noyou download the file |
| Updates through the ArduPilot bootloader (.apj) | Yes | Yes | No |
| First install over DFU (_with_bl.hex) | Yes | ArduPilot docs point to DFU tools such as STM32CubeProgrammer | Yes |
| Runs on an Android phone | Yes | No | No |
| Runs on a desktop computer | No | Yes | Yes |
| Board ID check before writing | Yes | Yes | No |
ArduPilot
How to install ArduPilot firmware from an Android phone
Open the tool
In the FlySpark app open Tools, then ArduPilot firmware.
Choose vehicle and release
Pick Copter, Heli, Plane, Rover, Sub or Tracker, then Stable, Beta or Dev and the version.
Find the board
Plug the board in over USB OTG and tap Identify board over USB, or search by name.
Pick the method
Runs ArduPilot for an update, or First install (DFU) for a Betaflight, INAV or blank board.
Flash
Start flashing and wait for the erase, write and verify to finish before unplugging.
Set up
Reconnect in the ground station and check or complete the mandatory setup.
Guide 01
Update a board that already runs ArduPilot
Remove the propellers. You need the FlySpark app on Android, a USB OTG adapter and a USB data cable.
Open Tools, then ArduPilot firmware.
Pick the vehicle: Copter, Heli, Plane, Rover, Sub or Tracker.
Pick the release type (Stable, Beta or Dev) and the version.
Plug in the board and tap Identify board over USB, or search for the board by name.
Leave the method on Runs ArduPilot and start flashing.
Tap Allow when Android asks for access to the USB device.
Wait while FlySpark erases (this can take up to 20 seconds), writes and verifies. Do not unplug until it reports success.
Reconnect in the ArduPilot ground station and check the version in Messages and the Setup status.
Guide 02
Convert a Betaflight or INAV board to ArduPilot
Check that ArduPilot supports your board: it must appear in the board list. Save a Betaflight or INAV diff first if you might go back.
Open Tools, then ArduPilot firmware, and choose the vehicle and release.
Search for the board, or plug it in and let FlySpark suggest the ArduPilot board from its Betaflight or INAV target.
Choose First install (DFU). FlySpark selects the _with_bl.hex image.
Unplug the board, hold its BOOT button and plug USB back in. Release the button once connected.
Start flashing. The whole chip is erased and the bootloader and firmware are written.
When it finishes, unplug and replug the board. It now boots ArduPilot, and future updates use the normal method.
Guide 03
Flash a custom ArduPilot build
Use this for a build from the custom firmware server, a manufacturer file or your own compile.
Open the ArduPilot firmware tool and switch to the custom file option.
Pick the .apj, .px4 or .hex file from your phone.
For .apj or .px4, connect the board normally; for .hex, put it in DFU mode.
Start flashing. The board ID and size checks still apply to .apj images.
Troubleshooting
Common problems and fixes
Problem
This firmware is for board ID X, but the board says it is Y.
Fix
The image was built for a different board. Choose the firmware for your exact board, including its revision. Identify board over USB filters the list to matching builds.
Problem
This firmware does not fit the board.
Fix
The image is larger than the chip's flash. You picked a build for a bigger board; choose the one for your exact model.
Problem
This firmware needs external flash the board does not have.
Fix
Some builds run partly from external flash on boards that have it. Pick the build for your board variant without external flash.
Problem
The board is not answering as an ArduPilot bootloader.
Fix
The bootloader only listens for a few seconds after power-up. Unplug the board, plug it back in and start again straight away, or tick Board already in bootloader and Flash on connect, then plug it in.
Problem
The connected board runs Betaflight or INAV, which has no ArduPilot bootloader.
Fix
Switch to First install (DFU) and put the board in DFU mode with its BOOT button.
Problem
No board in DFU mode found.
Fix
Unplug the board, hold its BOOT button while plugging USB back in, and try again. Some boards have BOOT pads to bridge instead of a button.
Problem
No board appeared on USB.
Fix
Use a cable that carries data, not a charge-only cable, and check the OTG adapter. Tap Allow when Android asks about the USB device.
Problem
Verification failed (CRC).
Fix
The written image does not match. Flash again before unplugging. A board in its bootloader can always be flashed again, so nothing is lost.
Problem
Disarm the vehicle before installing firmware.
Fix
FlySpark refuses to reboot an armed autopilot. Disarm, remove the props, and start again.
Problem
Installing firmware needs a wired USB connection.
Fix
You are connected over telemetry, Bluetooth or Wi-Fi. Connect the board's own USB port to the phone with an OTG cable.
Glossary
Glossary of terms
- Bootloader
- A small program at the start of flash that lets a ground station write new firmware over USB without DFU.
- DFU
- Device Firmware Upgrade, a mode built into the STM32 chip that can write the whole flash, including the bootloader. Entered by holding BOOT at power-up.
- .apj
- ArduPilot's update image with the board ID, written through the ArduPilot bootloader.
- _with_bl.hex
- Firmware plus ArduPilot bootloader in one file, for the first install over DFU.
- Board ID
- The number that identifies an ArduPilot board design; an image only runs on its own ID.
- Manifest
- The list of every build on the ArduPilot firmware server, with vehicle, board, version and format.
- OTG
- USB On-The-Go, the adapter or cable that lets an Android phone act as a USB host.
- QuadPlane
- An ArduPlane setup with lift motors for vertical takeoff and landing; it uses the Plane firmware.
FAQ
Frequently asked questions
Where do I download ArduPilot firmware?
Official builds are on firmware.ardupilot.org, in folders per vehicle with stable, beta and latest builds. FlySpark reads that server's manifest, so you pick the vehicle, release and board and it downloads the right file for you.
Can I install ArduPilot firmware from my phone?
Yes, on Android with a USB OTG cable. The FlySpark app writes .apj updates through the bootloader and does first installs in DFU mode. iPhone apps have no USB access, so it is not available there.
Can I flash ArduPilot in the browser?
Not with FlySpark. The web version offers a dry run in the demo only. Use the Android app, or a desktop ground station.
How do I put Betaflight or INAV boards on ArduPilot?
Check the board is in ArduPilot's board list, then use First install (DFU): hold BOOT while plugging in USB, and FlySpark writes the _with_bl.hex image with the ArduPilot bootloader. Later updates do not need DFU.
What is the difference between .apj and _with_bl.hex?
The .apj is the firmware only, written through the ArduPilot bootloader. The _with_bl.hex includes the bootloader and is written over DFU, erasing the whole chip. Use .apj for updates, _with_bl.hex for a first install.
Will updating ArduPilot firmware erase my parameters?
An update through the bootloader keeps your parameters. A DFU install erases the whole chip, so the board starts with defaults. Save a .param file in the ground station before a DFU install or a big version jump.
Stable, beta or dev: which should I choose?
Stable for normal flying. Beta is a release candidate for testing new features. Dev is the latest daily build and is meant for developers and testers.
Which firmware does a QuadPlane or VTOL use?
Plane. QuadPlane support is part of ArduPlane and is turned on with parameters after installation.
Which firmware does a helicopter use?
The Heli build of Copter, listed as Heli in FlySpark. It is a separate build from the multirotor Copter firmware.
My board is not answering as an ArduPilot bootloader. What now?
The bootloader listens only briefly after power-up. Replug the board and start again straight away, or turn on Board already in bootloader and Flash on connect so FlySpark starts the moment you plug it in.
Is a failed flash dangerous?
Not if the bootloader is intact: a board in its bootloader can always be flashed again. If a DFU install is interrupted, enter DFU with the BOOT button and run it again.
Does FlySpark flash PX4?
Yes. The same flasher has a firmware choice at the top: switch it from ArduPilot to PX4 to pick a PX4 release and the .px4 build for your board, which goes through the same bootloader protocol.
References
Sources
The official documentation behind the background facts on this page.
- ArduPilot Firmware buildsArduPilot · firmware.ardupilot.org
- Loading FirmwareArduPilot · ardupilot.org
- Loading Firmware onto boards without existing ArduPilot firmwareArduPilot · ardupilot.org





