How it works
The Blueprint of Our Drone
MoonLady Beta 1 is a 450 mm quadcopter with a custom flight controller, its own transmitter and a web ground station.
Select a block to explore
Flight controller
Sensors
Pilot control
Motors
Telemetry
Try it
Move the sticks, see the motors
These bars use the same motor mixing formula as the firmware. Tilting the model is only an illustration, not a flight simulation.
Drag to rotate. 3D model for illustration.
M1 rear left (CCW) = throttle + roll - pitch + yaw
M2 rear right (CW) = throttle - roll - pitch - yaw
M3 front left (CW) = throttle + roll + pitch - yaw
M4 front right (CCW) = throttle - roll + pitch + yaw
What is inside
Airframe and propulsion
- F450 frame, 450 mm wheelbase
- EMAX XA2212 980 KV motors
- Hobbywing Skywalker 30A ESCs
- 1045 propellers, 2 CW and 2 CCW
Power
- 3S 5200 mAh 60C LiPo
- MP1584 buck converter to 5 V
- 3.3 V from onboard regulators
- Ceramic and electrolytic decoupling
Flight controller
- STM32H743VIT6
- MPU6500 and BMP280 on SPI2
- Magnetometer on I2C1
- Gains stored in internal flash
Transmitter
- ESP32 Devkit V1
- Two analog joysticks
- ADS1115 converter at 860 samples/s
- 0.96" OLED and an 18650 cell
Links
- nRF24L01+PA+LNA, 2.4 GHz, 250 kbps
- Wi-Fi via onboard ESP32
- STM32 to ESP32 at 115200 baud
- Telemetry as JSON at 5 Hz
Software
- STM32CubeIDE with C firmware
- Arduino sketches on the ESP32s
- Node.js, Socket.IO and Express
- Three.js, Chart.js, Plotly, Leaflet
Flight modes
| Mode | What it does |
|---|---|
| Stabilize | Manual throttle with attitude PID. The default. |
| Altitude hold | Holds barometer altitude, captured when entered. |
| Loiter | Holds GPS position and altitude. Needs a GPS fix. |
| Return to launch | Flies back to the GPS position set at arming. |
| Auto | Flies to one waypoint, or a survey mission of up to 50. |
Waypoint and survey modes are in the code. See the status list below for what has been shown in flight.
Built-in safety
| If this happens | The drone does this |
|---|---|
| Radio lost for 500 ms | Airborne with GPS: return to launch. Without GPS: slow descent. Idling on the ground: disarm. |
| Dashboard silent for 3 s | Abort auto mode and return to launch. |
| More than 500 m from home | Force return to launch. |
| More than 1000 m from home | Disarm immediately. |
| Extreme tilt while armed | Disarm immediately to protect people and hardware. |
| Battery below 10.2 V | Not active in the current code. The firmware has this logic, but its battery reading is fixed at 13.2 V, so it cannot trigger. Use a timer and a LiPo alarm until this is fixed. |
| GPS lost in autonomous mode | Fall back to altitude hold and descend. |
| I2C errors 5 times in a row | Reset the bus by toggling the clock line, then restart the sensor. |
Payload
A magnetometer as a metal detector
Coils are heavy and pick up motor noise, so we used a tiny digital magnetometer instead. It weighs a few grams and registers spikes in the magnetic field over concentrated metal. The readings are tagged with GPS and turned into maps on the dashboard.
We class this as a preliminary sweeping platform. It can show the general zone of an anomaly for follow-up on the ground. It cannot give depth, volume or shape, and consumer GPS adds about 2 to 5 m of position error. It only senses metals that disturb the magnetic field, mainly ferrous ones.
Dashboard
