Pick your firmware.
Three flight controller firmware ecosystems exist for the kind of FC the Lumipad cohort uses, and they are not interchangeable. Picking the wrong one means you'll fight the configurator for the next month or have to re-flash everything. The decision is mostly determined by what you want the drone to do.
The three ecosystems:
- BetaFlight — the FPV racing/freestyle default. Best documentation and largest community. Tuned for manual flight: acro mode is its native habitat. Has limited autonomous flight support (waypoint missions are bolted on, not native).
- INAV — a fork of BetaFlight that added GPS-based autonomous flight as a first-class feature. Position hold, return-to-home, waypoint missions all work natively. Slightly behind BetaFlight on tuning sophistication and release cadence, but for survey work this rarely matters.
- ArduPilot — the heavyweight open-source autopilot. Full mission planner integration, ground station support, redundancy options. Steeper learning curve, more configuration overhead. Used in research-grade systems and commercial drones.
For Lumipad cohort builds, the defaults are:
One firmware per drone. Don't try to dual-flash or alternate firmware on the same FC. Pick one, configure it well, and stay with it. The configurator settings, the OSD layout, the mode mapping — all of it is firmware-specific.
Match firmware to FC capability. Some FC boards target only certain firmware. The SpeedyBee F405 V4 (Lumipad cohort default) supports all three; the Matek H743 (an alternative for 10" builds) is best with ArduPilot. Check the FC manufacturer's published target list before assuming.
First connection.
Plug the FC into the laptop with USB-C. Open the configurator. See the FC respond. Sounds simple — and most of the time it is. The 30% of the time it isn't, the cause is invariably USB drivers. This section walks through both the happy path and the recovery path.
What you need:
- The flight controller (already mounted in the frame, or on the bench — both work for first connection).
- A working USB-C cable. Specifically a data cable, not a charging-only cable. The latter is a common source of an entire wasted afternoon. Test the cable on another USB device first if uncertain.
- A laptop with the configurator software for your chosen firmware: BetaFlight Configurator, INAV Configurator, or Mission Planner (for ArduPilot). All are free downloads.
The happy path: Install the configurator. Connect the FC via USB. Open the configurator. The FC appears in the connection dropdown as a COM port (Windows) or /dev/tty.usbmodem... (macOS, Linux). Click Connect. The configurator shows a graphical model of your FC with live attitude data — pitch, roll, yaw responding when you tilt the FC by hand. This is the moment to verify the FC is alive and the gyro is working.
USB driver troubleshooting
If the FC doesn't appear in the configurator's connection list, the cause is one of three things, in order of frequency:
- USB cable is charge-only. Try another cable. Many cables that came with phones are charging-only. A cable that handled file transfer between your laptop and another device will work.
- FC is in DFU mode (bootloader). When the FC is in DFU mode, it appears as a "USB DFU device" in your OS, not as a COM port. The configurator has a separate "Flash Firmware" tab that handles DFU; the connection dropdown won't see it. To exit DFU mode, unplug, wait 5 seconds, plug back in (without holding the bootloader button if your FC has one).
- USB driver missing. Windows sometimes needs the SiLabs CP210x driver or STM USB driver installed manually. The configurator's documentation links to these. macOS and Linux generally don't need extra drivers.
Once connected, before doing anything else, take a screenshot or note of the firmware version reported. This becomes the baseline you'll reference if anything goes wrong later. The configurator typically shows firmware target name (e.g. SPEEDYBEEF405V4), firmware version (e.g. INAV 7.1.2), and FC hardware ID. All three are useful when asking for help in graduates Slack or vendor forums.
Flash firmware.
New FCs ship with whatever firmware the manufacturer happened to load — often outdated, often the wrong firmware for your needs. The first real configuration step is flashing the version of INAV (or BetaFlight, or ArduPilot) you actually want. This is also the most reversible mistake to make: if anything goes wrong, you re-flash.
Before flashing, do three things:
- Identify the correct target. Each FC has a specific build target string. For the SpeedyBee F405 V4 with INAV, the target is
SPEEDYBEEF405V4. For BetaFlight on the same hardware, the target is alsoSPEEDYBEEF405V4but the firmware is different. Mismatching firmware to target results in a bricked FC that can usually be recovered but disrupts the build session. - Save current configuration. If the FC was already partly configured, dump the current config to a text file. In INAV/BetaFlight: connect, open CLI tab, type
diff all, copy the entire output to a file. In ArduPilot: Mission Planner has a parameter export. If anything fails, this dump is what restores you. - Pick a stable version. Don't flash bleeding-edge release candidates for production builds. As of mid-2026, INAV 7.x is the stable line; INAV 8.x is in active development. Stick with stable for cohort builds.
The flash procedure:
- In the configurator, navigate to the Firmware Flasher tab.
- Select the target board (or load a custom .hex file you downloaded from the firmware project's release page).
- Click "Load Firmware (Online)" or browse to your local .hex file.
- Click "Flash Firmware". The FC enters DFU mode; the flasher writes; the FC reboots; the configurator should reconnect automatically.
- Verify by checking the firmware version in the connection summary matches what you intended to flash.
Recovering a "bricked" FC
If a flash goes wrong and the FC won't connect anymore — black screen, no LEDs, no COM port — it's almost certainly recoverable. The FC has a separate bootloader region that the regular firmware can't overwrite, so it can always re-flash via DFU mode. Procedure:
- Unplug the FC from USB.
- Hold the bootloader button (a small surface-mount button, usually labeled BOOT) on the FC PCB. If your FC doesn't have a button, short the BOOT pads with tweezers.
- While holding, plug in USB.
- Release the button. The FC should now appear as a "STM Device in DFU Mode" in your OS.
- In the configurator, the Firmware Flasher tab can now flash directly via DFU. Pick your target and proceed.
This procedure has recovered every single "bricked" FC we've seen in the cohort program. If it doesn't work for you, the cause is a faulty USB cable (try another) or a different DFU-mode quirk specific to your FC (consult the FC's manual).
Port mapping.
The FC has multiple UART (serial) ports. Each port can serve a specific function: receiver, GPS, OSD, telemetry, etc. The Ports tab in the configurator is where you tell the firmware which port serves what. This is the single most common configuration mistake — the cause of half the "everything is wired but nothing works" tickets in graduates chat.
The SpeedyBee F405 V4 (Lumipad cohort default FC) has these UART ports physically broken out to the FC's pads or solder pads:
The pattern: each accessory uses one UART port. If you forget to enable that UART for the right function in the Ports tab, the firmware will not see the accessory even though it's correctly wired. Symptoms include "no GPS lock" (UART2 not set to GPS), "RX bind succeeds but no stick input in configurator" (UART1 not set to Serial RX), and so on.
After changing port settings, click Save and Reboot. The ports tab does not apply settings live — they only take effect after reboot. Many "I configured ports but it still doesn't work" issues are actually "I forgot to reboot."
Motor configuration.
Mapping motors to outputs 1–2–3–4 in the configurator. Verifying that each motor spins in the correct direction. Setting the ESC protocol. Configuring BLHeli for ESC-level tuning. All of this is done with propellers physically removed — this section does not apply once the props are on.
Propeller orientation in a quadcopter is not arbitrary. Two motors spin clockwise (CW), two spin counter-clockwise (CCW). The diagonal pairs match: front-right and rear-left both CW (or both CCW); front-left and rear-right opposite. This balances yaw torque so the drone can hover without spinning around its own axis.
The configurator's Motors tab shows the four motor outputs and lets you spin each one individually at low throttle. Verify two things in this tab:
- Motor mapping — when you click "Test motor 1", the front-right motor should spin (or whatever motor is mapped as motor 1 in your FC's documentation; this varies). If a different motor spins, the wires are swapped at the FC. Either re-solder the wires or use the configurator's motor remap setting.
- Rotation direction — when motor 1 spins, the prop nut should be tightening, not loosening. If the rotation is backwards, you can either swap any two of the three motor wires (electrical solution) or use BLHeli's "Motor Direction Reversal" feature (firmware solution; preferred since it doesn't require re-soldering).
Propellers-off rule
Every step in this section is done with propellers physically removed from the motors. Not "throttle low so they don't spin" — physically off the motor shafts and on the workbench. A cohort instructor recently shared a video of what a 5×4.3×3 prop does to a hand at 30% throttle. We are not going to share that video. Take the props off. The drone has no means to launch itself by accident if there are no props on. With props on, the test-motor feature in the configurator can launch the drone.
ESC protocol selection. The Configuration tab has an ESC protocol setting. For cohort builds:
- DSHOT600 — the cohort default. Digital protocol, fast, robust. Works on all modern ESCs (BLHeli_S, BLHeli_32).
- DSHOT300 — fallback if DSHOT600 has issues. Slower but more tolerant of marginal wiring.
- Multishot / Oneshot125 — older analog protocols. Don't use unless your ESCs are too old for DSHOT (rare in current builds).
BLHeli configuration. The configurator has a separate BLHeliSuite passthrough (or BLHeli_32 Suite passthrough) that lets you communicate with the ESC firmware directly. Settings worth tuning:
- Motor direction — flip if rotation is backwards.
- Damped light mode — ON. Makes the motor brake on throttle drop, improves response.
- Beep volume — set to a level you can hear in the field but isn't unbearably loud at the bench.
- Startup tones — useful for diagnosing power-on issues; leave default.
Most other BLHeli parameters can stay at defaults for cohort builds. PID-level tuning of the ESC is rarely useful for survey work.
Receiver setup.
Pairing the radio receiver with the radio transmitter (the "bind" procedure). Selecting the correct serial protocol. Verifying that stick movements on the radio show up in the configurator's Receiver tab. End-point and trim calibration so the drone responds symmetrically.
Two receiver ecosystems matter for current builds:
- ELRS (ExpressLRS) — open-source, low-latency, long-range. The current cohort recommendation. Receiver protocol is CRSF (Crossfire-style serial). Bind procedure varies slightly by ELRS receiver model but generally involves powering the RX in bind mode, then the TX in bind mode, and waiting for them to find each other.
- FrSky/CRSF — commercial, mature, well-documented. Receivers like the R-XSR or X4R-SB. Bind procedure is well-documented in the radio's manual.
For both ecosystems, the configurator setup is the same:
- Configuration tab — set Receiver Mode to "Serial-based receiver" and Receiver Protocol to CRSF (for both ELRS and Crossfire) or SBUS (for FrSky non-CRSF). Save and Reboot.
- Ports tab — verify UART1 is set to Serial RX, baud rate AUTO. (Already done in Section 04 if you followed the cohort defaults.)
- Receiver tab — should show channel bars responding when you move sticks on the radio. If not: check radio is powered, bound, and on the correct model.
Channel mapping. The Receiver tab also shows a channel mapping setting (typically "AETR1234" or "TAER1234"). This describes which radio channel maps to which FC input. The default for ELRS-with-EdgeTX radios is AETR (Aileron, Elevator, Throttle, Rudder), then auxiliary channels 1, 2, 3, 4 in order. If the channel mapping is wrong, your stick inputs will be scrambled — pitch becomes roll, throttle becomes yaw, etc. Verify by:
- Move the right stick up. The Receiver tab's Pitch (Elevator) bar should move.
- Move the right stick right. The Roll (Aileron) bar should move.
- Move the left stick up. The Throttle bar should move.
- Move the left stick right. The Yaw (Rudder) bar should move.
If any of these are wrong, change the channel mapping (try TAER1234 if AETR doesn't work — Mode 2 vs Mode 1 radios differ).
End-points and trim. The radio sends values from roughly 1000 (low) to 2000 (high) microseconds; centre is 1500. If your sticks at full deflection only reach 1100/1900, the FC won't get full input range — the drone will feel sluggish at high throttle and unresponsive at extremes. Calibrate the radio's end-points so full stick deflection reads 1000/2000 (with a small margin: 1010/1990 is fine).
Failsafe.
What the drone does when something goes wrong: link loss, low battery, GPS failure. This section is the difference between a recoverable in-flight problem and a destroyed drone. Failsafe is configured once per drone and tested on every flight day.
Three failsafe scenarios matter, in order of frequency:
- Receiver signal loss — the radio transmitter is too far, has interference, or has a low battery. The drone stops getting stick commands.
- Low battery — the battery voltage drops below a threshold mid-flight. Without intervention, the drone will keep flying until it hits land-or-die voltage.
- GPS lock loss — relevant only if you're in a position-hold or autonomous mode. GPS becomes unreliable; position hold fails.
The INAV failsafe configuration (Failsafe tab in the configurator) handles all three. The cohort default settings:
The voltage thresholds are per cell, not pack total. A 4S pack at 3.5V/cell is 14.0V total; a 6S pack at 3.5V/cell is 21.0V total. INAV handles the per-cell math automatically once you tell it the cell count. The configuration field is usually labelled "vbat warning cell voltage."
The RTH home point is set on arm, not on power-on. This is important: if you power up the drone in your truck and drive to the survey site, the home point is the truck location at power-up. Walking around the drone before arming doesn't update home. You must disarm and re-arm at the actual takeoff point for RTH to work correctly. Cohort instructors require trainees to demonstrate this verbally before the first flight.
OSD configuration.
On-Screen Display — the data overlaid on the FPV video feed during flight. Battery voltage, throttle, RSSI, GPS coordinates, mode, flight time. Configure once, see it on every flight. The cohort default OSD layout is functional for survey work; personalise after a few flights.
The OSD shows on the FPV goggles or screen, overlaid on the live video. The configurator's OSD tab lets you select which data fields appear and where on the screen they're positioned.
The cohort default OSD layout (left to right, top to bottom):
The cohort default also includes a warning area at center-top for any active alarms (low battery, link weak, GPS lost). When an alarm fires, a text warning appears here in addition to whichever specific field flashes.
Personalisation is fine, but two fields should always remain in the cohort default position: battery voltage (TL) and flight mode (BL). These are the two fields you check most often during flight, and consistent placement means muscle-memory transfers between drones in the graduate community.
Flight modes.
Modes determine how the drone interprets stick inputs. Acro mode is fully manual; Angle mode is self-leveling; Position Hold is GPS-locked. Mapping modes to switches on the radio is how the pilot changes the drone's behavior in flight. The mode mapping must be intuitive and unambiguous — flipping a switch in panic should not put the drone into a mode that makes things worse.
The four main modes for survey work:
- Acro (Acrobatic) — fully manual. Stick input directly controls rotation rate. Drone keeps doing whatever it was doing when you released the sticks. Hard for survey work; only experienced pilots use this.
- Angle — self-leveling. Stick input controls tilt angle; release sticks and the drone returns to level. The cohort flight-school default for first hovers.
- Position Hold — GPS-locked horizontal hover. Release sticks and the drone holds its current position even in light wind. The survey-work default once trainees can hover comfortably.
- RTH (Return-To-Home) — autonomous return to the arm-point. The emergency-recovery and end-of-mission mode.
Two helper modes worth assigning:
- Beeper — triggers the FC's beeper (and ESCs' tones). Useful for finding a crashed drone in long grass.
- Air Mode — keeps motors spinning at minimum throttle when stick is at zero (rather than disarming). For acro flying. Cohort default leaves this off.
Switch assignment for a 4-position mode switch (typical EdgeTX radio):
Don't put Acro mode on the same switch as everything else. If a trainee's switch is in the wrong position when they arm, they should land in Angle or Position Hold, not Acro. Acro mode for the few cohort graduates who use it is on a separate dedicated switch (typically SF) with a deliberate two-step activation.
The Modes tab in the configurator is where you map switch positions to modes. Each mode has a "channel + range" setting — when channel N is between values X and Y, the mode is active. Verify by going to the Modes tab, then flipping switches on your radio, and watching the mode boxes light up green/active.
First arm.
The verification ritual. Twenty-two checklist items, in order, before the first arm. Most of them confirm what previous sections set up; a few are last-line checks that catch the rare configuration error that survived everything else. Do this list every time you build a new drone.
The 22-item pre-arm checklist, in two phases.
Phase A — Propellers off, drone on bench (10 minutes):
- Check all FC config saved to flash (CLI:
save; should reboot cleanly). - Verify firmware version matches what you intended.
- Receiver is bound and shows stick input in the Receiver tab.
- All four motors spin in the configurator's Motors tab. Direction correct.
- GPS module shows satellite count climbing within 2 minutes of power-on (outdoors).
- Failsafe configured: voltage threshold set, RTH enabled, RX timeout set.
- OSD layout looks correct in the configurator's OSD preview.
- Mode switches: each switch position activates the correct mode in the Modes tab.
- Battery voltage reads correctly in the configurator (matches what your battery checker shows).
- Arming switch position: arm-disarm cycles work as expected (no propellers spinning, of course).
- Shake test: physically shake the FC. Configurator shows attitude responding; nothing rattles or detaches.
Phase B — Propellers on, drone on flat ground or sandbag, 5m clear area (15 minutes):
- Propellers installed correctly: CW props on CW motors, CCW on CCW motors. Nuts tightened with light torque.
- Battery installed and strapped. Power leads connected.
- Power-on: FC LED comes on, ESC tones play, drone settles into idle.
- Radio TX powered on, model selected, mode switch set to Angle.
- GPS lock acquired (wait for 8+ satellites; can take up to 5 minutes for first lock).
- Final visual: nothing loose, props clear of obstructions, no stray wires.
- Bystanders cleared to 5m radius minimum.
- Arm: stick combination (typically throttle low + yaw right) or arming switch.
- Idle test: throttle just above zero. All four motors spin smoothly. No vibration or asymmetric wobble.
- Brief throttle-up (~30%) to lift the drone 30cm off the ground for 2-3 seconds, then back down.
- Disarm. Power off. Inspect for any signs of stress (warm motors, deformed props).
If anything fails the checklist
Stop. Identify the failed item. Resolve before continuing. Do not try to "fly through" a failed check. The cost of a failed first arm caught at the bench is 5 minutes; the cost caught in the air is the drone, possibly the props, sometimes the airframe. The cost caught at someone's hand or face is much higher.
Cohort instructors have a strong rule: any item on this checklist that fails halts the drone for that day. Re-test the entire checklist (not just the failed item) on the next session, since other configuration may have changed in the interim.
The first 30cm hover is also the moment to verify a few things you can't easily verify on the bench:
- Drone is balanced — it should hover roughly in place without drifting fast in any direction. Slight drift (1-2 m/min) is normal in light wind; fast drift indicates centre-of-gravity issues or motor mounting problems.
- Yaw is true — releasing yaw stick should let the drone hold heading, not slowly rotate. Slow rotation indicates motor imbalance or PID issues.
- Throttle response is responsive — small throttle changes should produce small altitude changes. Mushy or delayed response indicates ESC protocol mismatch or motor wiring issues.
- Stick centre is true — sticks at centre, drone should stay level. If centred sticks make the drone tilt, recalibrate the radio.
If the first hover feels rough, the next configuration step is PID tuning — covered in tuning.html (proposed; not yet built). For most cohort builds, the INAV defaults plus the cohort cohort-default config dump produce a flyable drone without further tuning.