ESP32 controller stack

Comprehensive firmware docs for every folder in this repo.

Browse all transmitter and receiver variants, compare capabilities, search documentation pages, and follow a setup workflow from flash to pairing.

Main transmitterESP_NOW_V1.2_OLED
Main receiverESP32_Receiver-Direct-v2.0
TransportESP-NOW
FrameworkPlatformIO + Arduino

Overview

What is included

Search Documentation

    Transmitter line

    From V1.0 baseline to V1.2 optimized release, with OLED menus, persistent settings, portal pairing, and filtered analog input handling.

    Receiver line

    Includes legacy serial-first nodes and direct control receiver variants that map joystick packets into dual-motor PWM commands.

    Utilities

    Dedicated pages for changelog timeline, setup wizard, and pinout references support deployment and maintenance workflows.

    Firmware

    Repository variants

    FolderRoleNotes
    firmware/transmitter/esp-now-oled/v1.2Main transmitterOLED update optimization, EMA filtering, hysteresis deadzone, portal pairing
    firmware/transmitter/esp-now-oled/v1.1Older transmitterStable UI and settings architecture with portal and telemetry callback support
    firmware/transmitter/esp-now-oled/v1.0Initial transmitterMinimal packet + display baseline implementation
    firmware/receiver/direct-bts/v2.0Main receiverDirect motor logic for dual channels with PWM and response packets
    firmware/receiver/direct-bts-mpu6050/v3.0Direct receiver + IMUESP-NOW direct drive with MPU6050 estimator and mode-aware control
    firmware/receiver/direct-bts/v1.0Basic receiverSerial monitoring focused variant without integrated motor stage
    bridges/arduino-btsAddon moduleArduino-side bridge logic for BTS7960 controlled motor systems
    firmware/receiver/fsi6-bts/mpu6050-v1FS-i6 bridge + IMURC receiver stack with BTS bridge and MPU6050 sensor-assisted control
    firmware/receiver/fsi6-bts/v1FS-i6 bridge baselineRC receiver to BTS bridge motor drive without IMU layer
    firmware/receiver/esp-now-legacy/v1.1.2Legacy receiverTelemetry validation generation and structured reply path
    firmware/receiver/esp-now-legacy/v1.1Legacy receiverFirst simple one-way receiver callback implementation

    Comparison

    Feature matrix by folder

    Feature V1.2 OLED V1.1 OLED V1.0 OLED Direct RX v2.0 Direct RX MPU v3.0 Direct RX v1.0 FS-i6 BTS + MPU FS-i6 BTS v1 RX 1.1.2 RX 1.1
    OLED menu UIYesYesBasicNoNoNoNoNoNo
    Portal target registrationYesYesNoNoNoNoNoNoNo
    EMA analog filteringYesNoNoNoNoNoNoNoNo
    Hysteresis deadzoneYesNoNoNoNoNoNoNoNo
    Telemetry reply supportOptionalOptionalNoYesNoNoNoNoYesNo
    Direct motor PWM outputNoNoNoYesYesNoYesYesNoNo
    IMU integrationNoNoNoNoYes (MPU6050)NoYes (MPU6050)NoNoNo
    FS-i6 receiver inputNoNoNoNoNoNoYesYesNoNo

    Setup

    Build and pair devices

    1. Flash receiver

    Upload the receiver first and keep serial monitor open to capture MAC address.

    cd firmware/receiver/direct-bts/v2.0
    pio run
    pio run --target upload
    pio device monitor

    2. Flash transmitter

    Upload the transmitter, open settings, and register receiver from captive portal.

    cd firmware/transmitter/esp-now-oled/v1.2
    pio run
    pio run --target upload
    SSID: ESP-NOW-REMOTE
    Password: 12345678
    Portal URL: http://192.168.4.1
    Saved targets: 5

    Utilities

    Additional documentation pages

    Changelog timeline

    Review version milestones and major changes.

    Open Changelog

    Setup wizard

    Follow a guided, step-by-step bring-up checklist.

    Open Wizard

    Pinout reference

    Open a consolidated wiring sheet for transmitter and receiver families.

    Open Pinout

    Packets

    Link data structures

    Control payload

    typedef struct struct_message {
      uint16_t joyX;
      uint16_t joyY;
      uint16_t potValue;
      bool toggle1;
      bool toggle2;
      bool push1;
      bool push2;
    } struct_message;

    Reply payload

    typedef struct struct_reply {
      uint8_t sensorValue;
      uint8_t counter;
      uint8_t flags;
    } struct_reply;