Skip to content

About

Open-source palm-sized ESP32-S3 brushless camera drone - DRAFT, unbuilt and untested

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

STATUS: DRAFT - UNVERIFIED - requires human review at Gate G3

MicroScout banner: a palm-sized ESP32-S3 brushless camera drone designed to flip, survive crashes, and be easy to fly and to program. Concept render of four ducted props with an orange canopy and the battery on top. Gate G3, PCB layout drafted, nothing built or flown yet.

Flight Lab: fly it in your browser Status: draft, not built Gate G3 PCB layout in review CI checks Hardware licence CERN-OHL-S-2.0 Firmware licence GPL-3.0 Software licence MIT Docs licence CC-BY-SA-4.0

Flight Lab · Design explorer · Fly it · Program it · Schematics (G2) · PCB layout (G3) · Decisions · Checklist · Set up on Ubuntu

Warning

Nothing here has been built, powered, tested or flown. MicroScout is drafted by an AI agent and checked by a human at eight gates.

  • Gate G1 (architecture and parts) was approved on 2026-10-07.
  • Gate G2 (schematics) was approved on 2026-10-08.
  • Gate G3 (PCB layout) is drafted and waiting for review. The flight controller and ESC still have open connections (listed in the G3 package).

The 3D images are a concept model, the flights and the Flight Lab are simulations with estimated parameters, and every number is a datasheet value or an estimate.

Fly it in your browser: the Flight Lab

Recording from the Flight Lab: five simulated MicroScouts, flown by a PID cascade, an LQR controller, an MPC controller given the map, an MPC controller using only its sensors and a reinforcement-learned policy, race through five gates. A leaderboard in the corner shows each one's gates passed and time.

The Flight Lab runs MicroScout's simulator in a web page, with nothing to install:

  • Fly it yourself with the keyboard, a gamepad or touch sticks, in beginner, sport or acro mode, with one-button flips.
  • Race five autopilots through obstacle courses: PID, LQR (Linear-Quadratic Regulator), MPC (Model Predictive Control) given the map, MPC using only its own sensors, and a learned policy.
  • Build your own course in a top-down editor, then share it as a link.
  • Train it with reinforcement learning using CEM, evolution strategies, ARS or REINFORCE, and watch every attempt as it learns.
  • Make it hard: add wind, gusts, a weak motor, a payload, noisy sensors or a flat battery.
Free flight in beginner mode: the drone takes off, slides sideways, flies through the first gate with its distance-sensor rays fanning out ahead, does a back flip and carries on.
Free pilot: take off, thread a gate, back flip. The red and grey lines are the 12 simulated ToF rays.
The MPC autopilot weaving between pillars; faint purple lines show the random future paths it samples every 40 ms.
MPC in the pillar forest: the faint purple lines are the 64 futures it samples every 40 ms.

The whole Flight Lab while the cross-entropy method trains a policy from random weights: faint pink ghost paths show each iteration's attempts converging on the gates, while the learning curve in the side panel rises.
Learning from scratch: the first ~240 iterations of CEM, two per frame. Each faint line is one attempt by a member of the population; the curve on the right is the score.

How the autopilots and the learning algorithms compare (simulation, estimated parameters) Left: share of 20 random pillar-forest layouts each autopilot finished. MPC given the map 100 % with no contact; MPC with sensors only 100 %, 90 % without contact; PID 20 %; LQR 55 %, mostly after touching a pillar; the learned policy 55 %. Right: mean time to finish on three courses. Learning curves for CEM, ES, ARS and REINFORCE trained from random weights on the window course, three runs each. ARS ends highest; results vary a lot between seeds.

The map-based MPC is handed the obstacle map. The fair comparison is the sensor-only MPC, which sees only its 12 ToF (Time-of-Flight) rays, like the learned policy: it also finished every forest layout, but at 1.3 m/s instead of 2.5 m/s. Details and caveats are in docs/guide/lab.md.

Where the project is

Gate roadmap: G1 architecture and parts approved 2026-10-07; G2 schematics approved 2026-10-08; G3 PCB layout drafted with routing open; G4 fab outputs, G5 mechanical (concept CAD exists), G6 firmware and bench (SDK and simulator exist), G7 first flight and G8 release not started.

At a glance

⚡ Quick and agile 🛡️ Built to take knocks 🧑‍💻 Easy to fly and program
2S brushless (4 × 1103 11000KV), 2-inch props One-piece ducted nylon (PA11) frame acts as the bumper Beginner, sport and acro modes, one-button flips
Thrust-to-weight 3.9-5.7 (est.) Electronics soft-mounted on rubber grommets drone.takeoff() / drone.flip("back") in Python
~1000 °/s rotation, back flip in ~0.8 s (simulated) Props are the designed weak point; no-solder spares Same code for the simulator now and the drone later
~86.2 g with a 550 mAh pack (est.), ~5-6.5 min hover Hardware low-battery cut-off, current limit in firmware USB-C charging with balancing; flash over USB without a battery

Inside:

  • Compute and camera: ESP32-S3 (Wi-Fi + BLE), OV2640 camera.
  • Navigation sensors: ICM-42688-P IMU, BMP388 barometer, QMC5883P compass, Bitcraze Flow deck.
  • Ranging: four time-of-flight sensors on small satellite boards.
  • Radio: ExpressLRS receiver.
  • Motor control: an open 4-in-1 ESC (electronic speed controller) running AM32 firmware.

Try it in 30 seconds (simulator)

No install: open the Flight Lab. To program it from Python instead:

git clone https://github.com/Normansrule/microscout.git
cd microscout/software/microscout_sdk && python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
microscout demo      # take off, fly a square, turn, back flip, side flip, land
import microscout

with microscout.connect("sim") as drone:      # later: microscout.connect("udp://192.168.4.1")
    drone.takeoff(1.0)
    drone.flip("back")
    drone.land()

New machine? docs/setup-ubuntu.md covers every command from a fresh Ubuntu terminal: tools, GitHub login, pulling, publishing, the simulator and KiCad's ERC.

What it looks like (concept)

Turntable render of the concept Simulated back flip replayed on the concept model
Exploded view: canopy, flight controller, ESC board, frame, battery Front view: camera and forward 8x8 ToF sensor

Frame and canopy are parametric CadQuery geometry; motors, props, battery, boards and sensors are simplified envelopes. The flip is replayed from the SDK simulator at 2.5× slower. CAD files: mechanical/concept/ (STEP, STL, 3MF, GLB).

How it is built

G2 block diagram: battery, USB-C charger, diode-OR logic supply, soft switch, 3.3 V and 5 V bucks and the 9.6 V driver supply on the flight controller; ESP32-S3 with IMU, Flow deck, I2C sensors, camera, receiver and LEDs; ToF satellites; 4-in-1 ESC with its own 3.3 V and four motors.

Block Choice (G1 approved, drawn at G2)
Compute and radio ESP32-S3-WROOM-1-N8R2 (Wi-Fi + BLE), ExpressLRS receiver (CRSF)
Propulsion 4 × EX1103 11000KV, 2-inch 3-blade props in ducts; 4-in-1 ESC with 4 × AT32F421 (AM32), FD6288Q drivers on a 9.6 V supply
Power 2S 550 mAh LiHV on XT30; BQ25887 USB-C charger with balancing; 3.3 V and 5 V bucks; soft power switch; INA226 current monitor; hardware low-battery cut-off
Sensors ICM-42688-P, BMP388, QMC5883P, 3 × VL53L1X + VL53L5CX (8 × 8) on satellites, Flow deck v2
Frame One-piece ducted PA11 frame, TPU canopy and strap, boards on grommets

Schematics (approved at G2)

Flight-controller power sheet
Flight controller - power: charger, soft switch, bucks, cut-off, ESC supply
ESC motor 1 sheet
4-in-1 ESC - motor 1: AT32F421 + FD6288Q + 6 MOSFETs + back-EMF sensing

The schematics are generated from Python by tools/sch as KiCad 7 files: the flight controller (4 sheets), the ESC (5 sheets) and two ToF satellite boards.

  • Checks: the agent's checks report 0 errors, and KiCad's exported netlists are identical to the source.
  • KiCad 9 ERC (run by the owner): 0 errors. The warnings came from library differences between KiCad versions, so the library parts are now bundled with the project (D-056). Re-running step 6 of the setup guide should show far fewer.
  • Review: an independent review pass found 7 serious issues, and all are fixed. They are listed in review/G2/README.md.

PCB layout (Gate G3 draft)

Flight controller 3D render
Flight controller - 6 layers, 52 mm, ESP32-S3 module on top, sensors and regulators underneath
ESC 3D render
4-in-1 ESC - 4 layers, 40 mm, 24 MOSFETs on top, four AM32 MCUs and drivers underneath
Front ToF satellite 3D render
ToF satellites - 2 layers, fully routed, DRC 0

The boards are laid out by Python scripts in tools/pcb on KiCad 7, routed by Freerouting and a finishing router. The flight controller and the ESC still have open connections; each one is listed in review/G3/open-connections.md, and how to finish them is open question OQ-19. Layer plots, DRC reports, the stackup and the trace-width calculations are in review/G3.

The numbers (estimates, regenerated from the budget model)

Thrust-to-weight 3.9 to 5.7 at the nominal 86.2 g Simulated back flip: rotation, pitch rate and height against time
Weight budget per item, 86.2 g nominal against a ~85 g limit Estimated hover time against takeoff weight
More charts and animations: power, cost, duct layout, pin map, power-on sequence, ToF addressing
Average and peak current per electronic load Priced parts per drone from the G2 BOM
Top view to scale of the four ducts, props and notched boards ESP32-S3 module pin map coloured by function
Animated timing diagram from button press to ready-to-arm Animation of the distance sensors moved from address 0x29 to new addresses

Project status

Gate What the owner reviews State
G1 Architecture, parts, budgets, pin table - review/G1 ✅ Approved 2026-10-07
G2 Schematics, ERC, reference-design checks - review/G2 ✅ Approved 2026-10-08
G3 PCB layout, DRC, stackup, trace widths - review/G3 🟡 Awaiting review; routing not finished (OQ-19 to OQ-23)
G4 Fabrication outputs ⚪ Not started
G5 Mechanical design ⚪ Concept CAD only
G6-G7 Firmware, bench bring-up, first flight ⚪ SDK, simulator and Flight Lab built early
G8 Release ⚪ Not started

Progress log: PROGRESS.md. Every design choice and its alternatives: docs/decisions.md.

Known risks:

  • Takeoff weight ~86.2 g against the ~85 g limit.
  • The flight controller and ESC layouts still have open connections (OQ-19), and the flight controller now needs a 6-layer board (D-062).
  • The XT30 connector's peak rating is below the full-throttle current, so firmware limits current to 30 A.
  • Priced parts come to ~$205 per drone (higher cost accepted).
  • Gate-driver stock is uncertain (OQ-13).
  • There is no fuse and no reverse-polarity protection.
What the agent cannot produce or confirm (the human verifies these at the gates)
  • Physical testing of any kind: power-up, sensor readings, motor spin, flight, battery charging, thermal behaviour, camera streaming, radio range.
  • Real-time part availability and pricing; stock and prices were seen on given dates and change daily.
  • Footprint-to-part correctness: land patterns, pin 1 orientation and package variants must be checked against the purchased parts.
  • ESP32-S3 pin conflicts (strapping, PSRAM/flash, USB, boot-sensitive pins), which must be checked against the exact module datasheet.
  • PCB layout quality: RF and antenna keep-out, USB pairs, ground returns, EMI, IMU noise, motor-current heating.
  • Analog and power design correctness against each IC's reference design.
  • Fabrication file correctness, including Gerbers, drills and JLCPCB CPL rotations.
  • Manufacturer STEP model availability (simplified envelopes are labelled APPROXIMATE).
  • Mechanical fit and print quality; weights are estimates until weighed.
  • Firmware behaviour on real hardware; all gains are placeholders until tuned.
  • Whether the chosen firmware base supports this sensor set plus camera streaming without changes.
  • Regulatory compliance, battery safety certification and licence compatibility; the agent drafts guidance only.
Repository layout
Path Contents Licence
hardware/ Schematic sources (*/design/*.py), generated KiCad files, project symbol library CERN-OHL-S-2.0
mechanical/concept/ Parametric concept CAD (CadQuery) + STEP/STL/3MF/GLB exports CERN-OHL-S-2.0
firmware/ Drone and remote firmware - from M7 GPL-3.0
software/microscout_sdk/ Python SDK, simulator, reference flight controller, examples, tests MIT
bom/ Bills of materials (drone-bom-g2.csv is generated from the schematics) CERN-OHL-S-2.0
docs/ Guides, decisions, protocol, figures, renders, the GitHub Pages explorer, setup guide CC-BY-SA-4.0 (scripts MIT)
docs/lab/ The Flight Lab: browser simulator, controllers, RL trainers, bundled policies, tests MIT
tools/sch/, tools/viz/ Schematic generator and checks; every figure, render and the explorer MIT
review/G1…G8 Gate review packages CC-BY-SA-4.0
VERIFY.md, PROGRESS.md, LICENSES.md Gate checklists, progress, licence summary CC-BY-SA-4.0

Safety

Caution

Unplug the battery after every flight. The power button switches only the electronics, and there is no fuse or reverse-polarity protection on the battery path (D-035). Use packs with factory-fitted XT30 plugs.

  • Bench work: props off for all bench work.
  • First flights: fly with the ducts on, tethered or netted.
  • Flips: only above 1 m, with nobody nearby.
  • Charging: never charge unattended. Use the onboard charger only after it passes the G6 bench test.

In the US, recreational pilots must pass the free FAA TRUST test (FAA). Drones under 250 g flown recreationally don't need registration (FAA). This is draft guidance only; rules change and vary by country. Respect privacy when flying with the camera.

Licences

Hardware is CERN-OHL-S-2.0, firmware GPL-3.0, software MIT, and documentation CC-BY-SA-4.0. Details and third-party notices are in LICENSES.md.

About

Open-source palm-sized ESP32-S3 brushless camera drone - DRAFT, unbuilt and untested

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages