Tutorial 01

Flashing PteronautOS

Build and install the hermetic firmware using a CYCLONE ELRS 2.4GHz 7CH PWM RX Receiver as the example.

PteronautOS supports other receiver boards too. Sharing an ESP8285 does not make their wiring identical: the exposed GPIOs, channel assignments, programming connections, and PCB revisions can differ. The power and CH2/CH3 wiring below apply to this CYCLONE example; check your board’s pinout and supported hardware configuration before connecting another receiver.

Before connecting power, remove propulsive loads from the wing mechanism and make sure no servo can drive into a hard stop. Flashing is electrical work; the airframe should remain mechanically safe throughout the procedure.

01 · Build the firmware

First build the WebUI — the interface that gets baked into the receiver firmware. This step needs Node.js 20 or newer and npm. The I18N_LOCALES flag selects which languages are compiled in; the example below bakes in this tutorial's language plus English. Omit the flag to include all 11 languages.

cd src/html && nvm use 20 && I18N_LOCALES=en npm run build:pteronautos

Clone the repository, install PlatformIO, and run the following command from the repository root. The PlatformIO project is in src; this command builds the dedicated ESP8285 receiver environment used in this example.

cd ../.. && pio run -d src -e PteronautOS_ESP8285_2400_RX

02 · Connect the receiver

For this CYCLONE receiver, use the FTDI adapter’s 5 V power output for the receiver supply, not its 3.3 V power output. Its UART connections are on the signal pins of channels 2 and 3 — there is no need to locate separate UART pads.

FTDI adapter Receiver connection
GND GND (−)
5 V / VCC Supply (+)
TX CH3 signal — receiver RX (GPIO3)
RX CH2 signal — receiver TX (GPIO1)

The 5 V setting refers to receiver power. Check your adapter’s documentation: TX/RX must use ESP8285-compatible 3.3 V logic, even when the supply output is 5 V. Do not connect a second power supply at the same time.

03 · Enter the bootloader

Hold BOOT (GPIO0), unplug and reconnect the FTDI USB cable, keep BOOT held for about one second, then release it. The flashing script does not perform an automatic reset, so enter the bootloader manually before running it.

04 · Write the image

From the repository root, run the provided flashing script. It builds the WebUI and firmware with your chosen language, locates a working PlatformIO-bundled flashing tool and the built firmware, selects a serial port, and writes the image with the required flash settings.

The --lang flag below bakes in this tutorial's language directly. Omit it to choose interactively — all languages, a selection, or skip the rebuild.

./scripts/flash.sh --lang en

Automatic port selection looks for macOS /dev/cu.* devices. If several serial devices are connected, or you are using a different operating system, explicitly select the receiver adapter’s port. Replace the example below with your actual device path.

./scripts/flash.sh --lang en --port /dev/cu.usbserial-XXXX

To check bootloader communication without writing firmware, use the optional check mode. If it fails, repeat the BOOT power cycle before trying again.

./scripts/flash.sh --port /dev/cu.usbserial-XXXX --check

05 · Verify the installation

Power-cycle the receiver without holding BOOT. Confirm that its WiFi access point and WebUI become available (SSID: Pteronaut OS , password: flynatural ), then load the configuration and verify the target name before reconnecting servos.

Continue with the Hardware page for pin maps and revision-specific wiring notes.