Making an ESP32-based quadcopter from scratch
Loading README and project media…
Flix (flight + X) — making an open source ESP32-based quadcopter from scratch.
¹ — planned.
See detailed demo video: https://youtu.be/hT46CZ1CgC4.
Version 0 demo video: https://youtu.be/8GzzIQ3C6DQ.
Usage in education (RoboCamp): https://youtu.be/Wd3yaorjTx0.
See the user builds gallery:
The simulator is implemented using Gazebo and runs the original Arduino code:
| Type | Part | Image | Quantity |
|---|---|---|---|
| Microcontroller board | ESP32 Mini | 1 | |
| IMU (and barometer²) board | GY‑91, MPU-9265 (or other MPU‑9250/MPU‑6500 board)ICM20948V2 (ICM‑20948)³GY-521 (MPU-6050)³⁻¹ | 1 | |
| Buck-boost converter (recommended) | To be determined, output 5V or 3.3V, see user-contributed schematics | 1 | |
| Motor | 8520 3.7V brushed motor (shaft 0.8mm).Motor with exact 3.7V voltage is needed, not ranged working voltage (3.7V — 6V). | 4 | |
| Propeller | Hubsan 55 mm | 4 | |
| MOSFET (transistor) | 100N03A or analog | 4 | |
| Pull-down resistor | 10 kΩ | 4 | |
| 3.7V Li-Po battery | LW 952540 (or any compatible by the size) | 1 | |
| Battery connector cable | MX2.0 2P female | 1 | |
| Li-Po Battery charger | Any | 1 | |
| Screws for IMU board mounting | M3x5 | 2 | |
| Screws for frame assembly | M1.4x5 | 4 | |
| Frame main part | 3D printed⁴:flix-frame-1.1.stl flix-frame-1.1.stepRecommended settings: layer 0.2 mm, line 0.4 mm, infill 100%. | 1 |
² — barometer is not used for now.
³ — change MPU9250 to ICM20948 or MPU6050 in imu.ino file for using the appropriate boards.
³⁻¹ — MPU-6050 supports I²C interface only (not recommended). To use it change IMU declaration to MPU6050 IMU(Wire).
⁴ — this frame is optimized for GY-91 board, if using other, the board mount holes positions should be modified.
⁵ — you also may use any transmitter-receiver pair with SBUS interface.
Tools required for assembly:
Feel free to modify the design and or code, and create your own improved versions of Flix! Send your results to the official Telegram chat, or directly to the author (E-mail, Telegram).
(Dashed is optional).
Motor connection scheme:
You can see a user-contributed variant of complete circuit diagram of the drone.
See assembly guide for instructions on assembling the drone.
Power ESP32 Mini with Li-Po battery using VCC (+) and GND (-) pins.
Connect the IMU board to the ESP32 Mini using VSPI, power it using 3.3V and GND pins:
| IMU pin | ESP32 pin |
|---|---|
| GND | GND |
| 3.3V | 3.3V |
| SCL (SCK) | SVP (GPIO18) |
| SDA (MOSI) | GPIO23 |
| SAO (MISO) | GPIO19 |
| NCS | GPIO5 |
Solder pull-down resistors to the MOSFETs.
Connect the motors to the ESP32 Mini using MOSFETs, by following scheme:
| Motor | Position | Direction | Wires | GPIO |
|---|---|---|---|---|
| Motor 0 | Rear left | Counter-clockwise | Black & White | GPIO12 (TDI) |
| Motor 1 | Rear right | Clockwise | Blue & Red | GPIO13 (TCK) |
| Motor 2 | Front right | Counter-clockwise | Black & White | GPIO14 (TMS) |
| Motor 3 | Front left | Clockwise | Blue & Red | GPIO15 (TD0) |
Counter-clockwise motors have black and white wires and clockwise motors have blue and red wires.
Optionally connect the RC receiver to the ESP32's UART2:
| Receiver pin | ESP32 pin |
|---|---|
| GND | GND |
| VIN | VCC (or 3.3V depending on the receiver) |
| Signal (TX) | GPIO4⁶ |
⁶ — UART2 RX pin was changed to GPIO4 in Arduino ESP32 core 3.0.
Default IMU orientation in the code is LFD (Left-Forward-Down):
In case of using other IMU orientation, modify the rotateIMU function in the imu.ino file.
See FlixPeriph documentation to learn axis orientation of other IMU boards.
Subscribe to the Telegram channel on developing the drone and the flight controller (in Russian): https://t.me/opensourcequadcopter.
Join the official Telegram chat: https://t.me/opensourcequadcopterchat.
Detailed article on Habr.com about the development of the drone (in Russian): https://habr.com/ru/articles/814127/.
See the information on the obsolete version 0 in the corresponding article.
This is a fun DIY project, and I hope you find it interesting and useful. However, it's not easy to assemble and set up, and it's provided "as is" without any warranties. There’s no guarantee that it will work perfectly — or even work at all.
⚠️ The author is not responsible for any damage, injury, or loss resulting from the use of this project. Use at your own risk!
| Frame top part | 3D printed:esp32-holder.stl esp32-holder.step | 1 |
| Washer for IMU board mounting | 3D printed:washer-m3.stl washer-m3.step | 2 |
| Controller (recommended) | CC2500 transmitter, like BetaFPV LiteRadio CC2500 (RC receiver/Wi-Fi).Two-sticks gamepad (Wi-Fi only) — see recommended gamepads.Other⁵ | 1 |
| RC receiver (optional) | DF500 or other⁵ | 1 |
| Wires | 28 AWG recommended |
| Tape, double-sided tape |