Custom FPV Quadcopter. Designed and built by Ernesto Guemez.

MORPHEUS

I put this drone together from scratch, debugged all the issues, and finally got it in the air.

This is a 5-inch carbon fiber quadcopter weighing about 650g. I'm flying it manually right now, but making it fly autonomously is definitely the next goal. This page is a record of my build process, what went wrong, and how I figured things out.

Phase 1 · Build · done
Phase 2 · Manual flight · in progress
First flight

Morpheus flies.

[VIDEO: first hover clip]

First hover

This clip shows my first successful hover test. Before this, I had a frustrating attempt where the motors spun out and nothing lifted. I wrote about that whole saga in the engineering log.

First hover test, drifting just a little bit with the wind.

Why I built it

I really wanted to understand every single piece of this system.

I want to study aerospace engineering, and I realized a drone is a complete aircraft system in miniature. I wanted to build one so I couldn't treat any of its systems like a black box.

I had never touched a soldering iron before this. I started completely from zero and picked up the skills as the build demanded them.

The dream is to have a drone that takes off, flies a GPS route, and lands on its own using Python on a Raspberry Pi. We're not there yet, though—right now I'm flying Morpheus manually and working on the tuning.

I named it Morpheus because I liked the idea of giving form to a bunch of loose parts. Plus, the whole autonomous flight part is still a dream for now.

  1. Done

    Phase 1 · Build

    Frame, motors, soldering, electronics, configuration.

  2. In progress

    Phase 2 · Manual flight

    First flights, then tuning: drift, oscillations, PID.

  3. Planned

    Phase 3 · Autonomy

    GPS, telemetry and a Raspberry Pi running MAVLink missions.

The build

Turning a box of loose parts into a flight controller that actually listens to my radio.

Frame and motors

Structure first

I started with a Mark4 5-inch carbon frame and four EMAX ECO II 2207 2400KV motors on 16x16 mm mounts. This is exactly where I realized my first batch of motors was the wrong size—more on that in the log.

[PHOTO: frame with motors mounted]Carbon fiber frame with four motors mounted
Soldering

Twelve motor wires, one capacitor, one battery lead

I ended up soldering the motor wires and a capacitor to the ESC, the XT60 lead to the power pads, and the receiver to UART6. You have to be super careful since reversing power will instantly fry your parts, so I double-checked every single joint.

[MACRO PHOTO: finished solder joints on the ESC]Close-up of finished solder joints on the ESC
Electronics stack

Stack, insulate, test for shorts

The SpeedyBee F405 flight controller sits right on top of the ESC. Since carbon fiber conducts electricity, I had to insulate the receiver under a plastic cover. Before plugging in the LiPo, I ran a bulb test and checked for continuity just to be safe.

[PHOTO: assembled stack with receiver]Assembled flight controller and ESC stack with receiver
Configuration

Betaflight, checked against measurements

It's running Betaflight 2026.6.1 with DSHOT600 and a 4S profile. I tuned the voltage scale until Betaflight read 15.2 V against 15.3 V on my multimeter, and two of the motors were spinning backward, but I fixed that in the software (I reversed M1 and M4) so I wouldn't have to resolder anything.

[SCREENSHOT: Betaflight motor direction screen]Betaflight motor direction screen

I completely skipped the landing legs at first because the provided screws were too short. They're optional anyway, so the drone just landed on its battery strap. I eventually figured out a way to attach them though.

Engineering log

Five things that went wrong and how I actually figured them out.

I chose to highlight these five because they all required a totally different way of thinking. Fixing them was usually quick, but the diagnosis is the part I really found interesting.

Sourcing diligence

The wrong motors

[PHOTO: the wrong motors]The 2006 motors that arrived instead of 2207
Symptom
The motors showed up, but they were size 2006 instead of the 2207s I needed.
Diagnosis
I noticed it right in the middle of assembly when the specs didn't match what I had planned.
Root cause
I trusted the title on AliExpress instead of checking the specific variant I was clicking on.
Fix
I opened a dispute, ordered the right 2207 motors, and waited for them to arrive.
Lesson
The title is marketing; the variant you select is what you're actually buying.
Systems thinking

A radio that could not speak to the receiver

[PHOTO: radio menu, Internal RF options]Radio menu showing Internal RF options OFF and MULTI
[PHOTO: module stuck on "Loading"]ELRS module screen stuck on Loading
Symptom
My RadioMaster Pocket didn't have an ELRS option, but my receiver only speaks ELRS.
Diagnosis
I checked the box again and realized ELRS was a product option, and I had accidentally bought the CC2500 version.
Root cause
Since they run on completely different radio chips, no firmware update was ever going to bridge them.
Fix

I fixed it by snapping a Jumper Aion ELRS module into the external bay and switching the settings to CRSF.

But then the new module got stuck on "Loading". Turns out I needed to reseat the module properly on its data pins.

Lesson
Always check the actual chips your hardware uses, since menus and packaging can be misleading.
Methodical debugging

The drone that would not arm

[SCREENSHOT: CLI status output]Betaflight CLI status output showing arming flags
[SCREENSHOT: Modes tab, ARM range]Betaflight Modes tab with the ARM range
Symptom
The radio kept saying "armed", but the motors weren't doing anything.
Diagnosis

Instead of messing with random settings, I checked the arming flags with the CLI status command. Only CLI and MSP were set, which just come from being plugged into a computer over USB, so they're harmless. There was no RXLOSS or FAILSAFE, so the receiver link was completely fine.

Arming disable flags: CLI MSP
Root cause
The problem was that the controller wasn't getting the arm command because my ARM switch range got messed up when I swapped radio modules.
Fix
I tweaked the ARM range in the Modes tab, and the motors finally started up.
Lesson
Just because the radio says it's armed doesn't mean the drone agrees. You have to check the drone's actual flags.
Systematic elimination

Motors screaming, no lift

[PHOTO OR CLIP FRAME: the no-lift attempt]The first flight attempt with propellers mounted upside down
Symptom
On my very first try, the motors spun up at full speed but the drone just sat on the ground.
Diagnosis
Since the electronics and radio were working, it had to be a thrust issue. All four motors were failing the exact same way, which pointed straight to the propellers.
Root cause
Turns out, I had mounted all four propellers upside down.
Fix
I flipped them over, double-checked the spin directions, and it took off.
Lesson
Rule out what's working first, then find the common denominator. Checking prop direction is definitely on my checklist now.
Safety and resourcefulness

A smoke stopper from a car bulb

[PHOTO: bulb in series with the battery lead]A 12 V car bulb wired in series with the battery lead
Symptom
I was about to plug in the battery for the first time, but I didn't have a smoke stopper, and a short circuit would easily melt my wiring.
Diagnosis
I needed a way to limit the current just in case, and I didn't want to wait days for a tool to ship.
Root cause
It wasn't a failure, just a missing tool and a risk I didn't want to take.
Fix
So I wired a 12V car bulb in series with the battery. If there's a short, the bulb lights up and saves the board. I also ran a multimeter continuity test before connecting power.
Lesson
Always make sure your first power-up is survivable before you actually do it.
Also fixed

Charge-only USB cable

Betaflight couldn't see the drone because I was using a charge-only cable. Swapping to a data cable fixed it instantly.

Also fixed

CRSF missing from the firmware

The factory firmware didn't support CRSF, so I reflashed it to 2026.6.1 with CRSF enabled.

Technical architecture

Getting the radio to talk to the motors, one step at a time.

Here's the control path as it is right now. The dashed boxes are all the Phase 3 features I have planned but haven't installed yet.

Built · Phase 1 and 2
RadioMaster PocketCC2500 version, Internal RF off
Jumper Aion NanoELRS 2.4 GHz TX, external bay
HappyModel EP2ELRS receiver
SpeedyBee F405 V5Flight controller, UART6
4-in-1 ESC, 55 ADrives 4 motors
Planned · Phase 3
Beitian BN-880GPS and compass, UART4 and I2C
SiK radio 915 MHzTelemetry to the ground, UART2
Raspberry Pi Zero 2 WPython, MAVLink over USB
ArduPilot firmwareReplaces Betaflight on the F405 V5
PartWhat I used
FrameMark4 5″ carbon fiber, 5 mm arms, 16×16 mm motor mount
MotorsEMAX ECO II 2207 2400KV × 4
Flight controller / ESCSpeedyBee F405 V5 stack, 55 A 4-in-1 ESC, 30.5 × 30.5 mm
ReceiverHappyModel EP2, ELRS 2.4 GHz
RadioRadioMaster Pocket (CC2500) with external Jumper Aion ELRS Nano module
PropellersHQProp 5×4.3×3 V1S
BatteryGNB 4S 1300 mAh LiPo, 120C, XT60
FirmwareBetaflight 2026.6.1, CRSF enabled, DSHOT600, motor idle 5.5%
WeightAbout 650 g
What's next

First, get comfortable flying it manually. Then, teach it to fly itself.

Phase 2 · now

Tuning

I still need to iron out some drift and oscillation, transition into Acro mode, tune the PIDs, and turn on bidirectional DShot with RPM filtering.

Phase 3 · planned

Sensing and link

Next up is mounting the GPS and compass away from the power wires, and adding 915 MHz telemetry so I can monitor it from my laptop.

Phase 3 · planned

Autonomy

Eventually, a Raspberry Pi will send MAVLink commands via Python to handle things like takeoff and waypoints, but I'll simulate all of that first.

Phase 3 · planned

Failsafes

I also need to set up a geofence and failsafes for low battery or signal loss before I even attempt autonomous flight.

Since true autonomy requires ArduPilot—which will wipe my Betaflight tune—I'm going to finish tuning and flying in Betaflight first before making the switch.