From 68f96417f3d41d201cfec79e441d95f92d6ba40e Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 21 May 2026 05:46:01 +0300 Subject: [PATCH] Add docs for espnow --- README.md | 2 +- docs/img/espnow-connection.jpg | Bin 0 -> 50166 bytes docs/usage.md | 38 ++++++++++++++++++++++++---- tools/espnow-proxy/espnow-proxy.ino | 6 ++--- 4 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 docs/img/espnow-connection.jpg diff --git a/README.md b/README.md index 649c559..a740455 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ * Dedicated for education and research. * Made from general-purpose components. * Simple and clean source code in Arduino (<2k lines firmware). -* Connectivity using Wi-Fi and MAVLink protocol. +* Communication with MAVLink protocol using Wi-Fi or ESP-NOW. * Control using USB gamepad, remote control or smartphone. * Wireless command line interface and analyzing. * Precise simulation with Gazebo. diff --git a/docs/img/espnow-connection.jpg b/docs/img/espnow-connection.jpg new file mode 100644 index 0000000000000000000000000000000000000000..607fa9e23db37cb275abc9232854283a092ba158 GIT binary patch literal 50166 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 literal 0 HcmV?d00001 diff --git a/docs/usage.md b/docs/usage.md index 39f9da4..5984a32 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -290,11 +290,8 @@ The Wi-Fi mode is chosen using `WIFI_MODE` parameter in QGroundControl or in the * `0` — Wi-Fi is disabled. * `1` — Access Point mode *(AP)* — the drone creates a Wi-Fi network. -* `2` — Client mode *(STA)* — the drone connects to an existing Wi-Fi network. -* `3` — *ESP-NOW (not implemented yet)*. - -> [!WARNING] -> Tests showed that Client mode may cause **additional delays** in remote control (due to retranslations), so it's generally not recommended. +* `2` — Client mode *(STA)* — the drone connects to an existing Wi-Fi network (may cause additional delays, so generally not recommended). +* `3` — ESP-NOW mode — the drone uses ESP-NOW protocol for communication. The SSID and password are configured using the `ap` and `sta` console commands: @@ -316,6 +313,37 @@ Disabling Wi-Fi: p WIFI_MODE 0 ``` +### Using ESP-NOW + +[ESP-NOW](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/network/esp_now.html) is a low level wireless communication protocol. It can provide lower latency, better reliability, and longer range than Wi-Fi. However, it requires a second ESP32 board to be used as a proxy for the computer. + + + +To setup ESP-NOW communication: + +1. Flash the second ESP32 board with ESP-NOW proxy sketch: [`tools/espnow-proxy/espnow-proxy.ino`](../tools/espnow-proxy/espnow-proxy.ino). Use Arduino IDE or command line: `make upload_proxy`. + +2. Open Serial Monitor or use `make monitor` command. The ESP32 will print its MAC address and generated encryption key, for example: + + ``` + espnow 7a:c8:e3:eb:bf:e9 &PiuSysxP9+$L&5E + ``` + + Run this line as a console command on each drone you want to bind to this proxy board. + +3. Set the `WIFI_MODE` parameter to `3` on the drone: + + ``` + p WIFI_MODE 3 + ``` + +4. Go to the QGroundControl menu ⇒ *Application Settings* ⇒ *Comm Links*, add new link with the following settings: + * Name: ESP32. + * Type: Serial. + * Serial Port: choose the port of the proxy ESP32 board, e. g. `/dev/cu.usbserial-0001`. + * Baud Rate: 115200. +5. Click *Save*. QGroundControl should connect to the drone using ESP-NOW and begin showing the telemetry. + ## Flight log After the flight, you can download the flight log for analysis wirelessly. Use the following command on your computer for that: diff --git a/tools/espnow-proxy/espnow-proxy.ino b/tools/espnow-proxy/espnow-proxy.ino index b7d7658..c42c914 100644 --- a/tools/espnow-proxy/espnow-proxy.ino +++ b/tools/espnow-proxy/espnow-proxy.ino @@ -3,13 +3,13 @@ // Proxy for ESP-NOW connection +#include #include #include #include #include #include #include "../../flix/util.h" -#include const int CHANNEL = 6; char key[ESP_NOW_KEY_LEN + 1] = {0}; // with trailing null @@ -61,7 +61,7 @@ void generateRandomKey() { void loop() { uint8_t buf[5000]; - // Send from serial to ESP-NOW + // Send from Serial to ESP-NOW while (Serial.available() > 0) { int b = Serial.read(); if (b < 0) { @@ -78,7 +78,7 @@ void loop() { } } - // Send from ESP-NOW to serial + // Send from ESP-NOW to Serial for (ESPNOWSerial *link : peers) { int len = link->read(buf, sizeof(buf)); if (len > 0) {