madflight is a toolbox to build high performance flight controllers with Aduino IDE or PlatformIO for ESP32-S3 / ESP32 / RP2350 / RP2040 / STM32. A functional DIY flight controller can be build for under $10 from readily available development boards and sensor breakout boards.
Flight tested example programs for quadcopter and airplane are included. The example programs are only a couple hundred lines long, but contain the full flight controller logic. The nitty-gritty low-level sensor and input/output management is done by the madflight library.
Your Feedback is Welcome
If you like madflight, give it a ☆ star on GitHub, or fork it and contribute. Thanks!
Required Hardware
- Development board:
- RP2350/RP2040 (e.g. Raspberry Pi Pico2)
- ESP32-S3/ESP32 (e.g. Espressiv ESP32-S3 DevKitC)
- STM32 (e.g. Black Pill or a commercial flight controller)
- SPI IMU sensor (BMI270, MPU9250, MPU6500, or MPU6000), if not available then use an I2C IMU sensor (MPU6050 or MPU9150)
- RC Receiver: ELRS, CRSF, SBUS, DMSX, or PPM
- BEC or DC-DC converter to power your board from a battery
- ESC (OneShot125 or 50-490Hz PWM) and/or servos (50-490Hz PWM)
Optional Hardware
- GPS Module (Serial)
- Barometer (I2C BMP280, MS5611)
- Magnetometer (I2C QMC5883L)
- Current/Voltage Sensor (ADC or I2C INA226)
- Optical Flow Sensor (I2C)
Getting Started
- Connect the required hardware to your controller board:
- See RP2350/RP2040 pinout and instructions
- -or- ESP32-S3/ESP32 pinout and instructions
- -or- STM32 pinout and instructions
- Connect your IMU (gyro/acceleration) sensor as shown below.
- Connect your radio receiver according to the configured pins.
- Install the madflight library in Arduino IDE. (Menu Tools->Manage Libraries, then search for madflight)
- Open Examples for custom libraries->madflight->Quadcopter.ino in the Arduino IDE.
- Edit the HARDWARE section in madflight_config.h to enable the connected peripherals.
- If you're not using the default pinout then setup your board pinout in the CUSTOM PINS section.
- Compile Quadcopter.ino and upload it to your board. Connect the Serial Monitor at 115200 baud and check the messages. Type
help
to see the available CLI commands. - Type
calradio
and follow the prompts to setup your RC radio receiver. - IMPORTANT: Use CLI
calimu
andcalmag
to calibate the sensors. - Use CLI commands
pimu
,pahrs
,pradio
,pmot
, etc. and check that IMU sensor, AHRS and RC Receiver are working correctly. - Connect motors (no props) and battery and check that motors are spinning correctly.
- Mount props, go to an wide open space, and FLY!
Safety First!!!
By default madflight has these safety features enabled:
- Motors only rotate when armed.
- Arming Procedure: set throttle low then flip the arm switch from disarmed to armed.
- Kill Switch: when the arm switch is in the disarm position, disarm and stop motors until re-armed.
- Failsafe: when radio connection is lost, disarm and stop motors until re-armed.
- Armed Low Throttle: motors run at low speed, to give visible armed indication.
- LED armed/disarmed indicator.
Software Design
- Keep it simple!!!
- Based on dRehmFlight
- Coded primarily for readability, then for speed and code size.
- No external dependencies, all modules are included in the
src/madflight
directory. - The madflight flight controller runs standard
setup()
andloop()
. - It mainly uses plain Arduino functionality: Serial, Wire, and SPI. One custom hardware dependent library is used for PWM. Therefor, it can fairly easily ported to other 32 bit microcontrollers that support the Arduino framework. Also porting to other build environments like PlatformIO or CMake should not be a huge effort.
- The following modules are used:
ahrs
Attitude Heading Reference System, estimates roll, yaw, pitchbaro
Barometer sensorbat
Battery monitorbb
Black Box data loggercfg
Read and save configuration to flashcli
Command Line Interface for debugging, configuration and calibrationgps
GPS receiverhw
Hardware specific code for STM32, RP2040 and ESP32imu
Inertial Measurement Unit, retrieves accelerometer, gyroscope, and magnetometer sensor dataled
LED drivermag
Magnetometer sensor (external)out
Output to motors and servosrcin
RC INput, retrieves RC receiver data
- Most modules are interfaced through a global object, for example the
imu
object has propertyimu.gx
which is the current gyro x-axis rate in degrees per second for the selected IMU chip. - For a quick overview of the objects, see header
src/madflight/interfaces.h
which defines the module interfaces. - The module implementations are in subdirectories of the
src/madflight
directory. Here you find the module header file, e.g.src/madflight/imu/imu.h
. In theextras
directory your find test programs for the modules, e.g.extras/TestMadflight/imu.ino
. - The module files are usually header only, that is, the header also includes the implemention.
Connecting the IMU Sensor
madflight requires the interrupt pin (IMU_EXTI) connected.
SPI sensor: (highly recommended over I2C)
Sensor Dev Board
SCL/SCLK <---> SPI_SCLK
SDA/SDI <---> SPI_MOSI
ADD/SDO <---> SPI_MISO
NCS <---> IMU_CS
INT <---> IMU_EXTI
VCC <---> 3V3
GND <---> GND
I2C sensor:
Sensor Dev Board
SCL <---> I2C_SCL
SDA <---> I2C_SDA
INT <---> IMU_EXTI
VCC <---> 3V3
GND <---> GND
Changes from dRehmFlight
- Add support for RP2350, RP2040, ESP32, ESP32-S3, and STM32
- Dropped Teensy support, but could be re-added by creating a hw_TEENSY.h file. (I just don't have the hardware to test on)
- Moved all hardware specific code to hw_XXX.h and added hardware specific libraries
- Reduced the number of global variables
- Oneshot is implemented as PWM up to 3.9kHz
- New libs for IMU sensors
- Changed arming logic
- Loop rate set to 1kHz to match IMU sensor rate
- Interrupt driven IMU operation by default, but setup/loop still possible
Flight Controllers on Github
In (approximate) increasing order of complexity.
Flight Controller | Features | Development Environment | Microcontroller |
---|---|---|---|
drone-flight-controller | Single 700 line ino file, no libs | Arduino | ATmega328P |
dRehmFlight | Quad, Plane, VTOL | Arduino | Arduino Teensy 4 |
madflight | Quad, Plane, VTOL, based on dRehmFlight | Arduino | ESP32, RP2040, and STM32 |
esp-fc | FPV Quad | PlatformIO | ESP32 |
Crazyflie | FPV Quad | STM32F405 | |
esp-drone | FPV Quad, based on Crazyflie | ESP32 | |
Betaflight | FPV Quad, based on cleanflight | STM32 F4/F7/H7 | |
EmuFlight | Multi-rotor, based on cleanflight | STM32 F4/F7 | |
inav | Plane, based on cleanflight | STM32 F4/F7/H7 | |
Ardupilot | Quad, Plane, VTOL | Linux waf | STM32 F4/F7/H7 or Linux based |
PX4-Autopilot | Quad, Plane, VTOL | STM32 F4/F7/H7 |
Disclaimer
This code is a shared, open source flight controller for small micro aerial vehicles and is intended to be modified to suit your needs. It is NOT intended to be used on manned vehicles. I do not claim any responsibility for any damage or injury that may be inflicted as a result of the use of this code. Use and modify at your own risk. More specifically put:
THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Logo image copyright (c) 1975 Deutsches MAD Magazine. This project is not associated with MAD Magazine.