Skip to content
Go to file


Failed to load latest commit information.
Latest commit message
Commit time

Chorus RF Laptimer


Chorus [ˈkɔr əs] - 1. (Music) a group of persons singing in unison.

NOTE: This project is currently in a "public beta" stage. Changes to schematic and software are very likely. Feel free to contribute and/or share your usage results to improve the project.

This is a VTX Radio Frequency Lap Timing solution for drone racers - the evolution of a Solo DIY RF Laptimer project. Several updated Solo Laptimer devices connected together make up a Chorus Laptimer device which is capable of tracking several drones at once. This is a "lightweight" alternative to IR lap timing systems having the advantage that it does not require any additional equipment on drones except VTX.


  • 2019-01: Chorus32 project by Alessandro Carcione gets popular. It's a port of Chorus to ESP32 which is under active development now
  • 2018-10: Chorus is now basically supported in LiveTime Scoring Engine - racing organization PC software
  • 2018-07: Added support for USB devices in Android app (you can use wired connection or 433/915MHz telemetry modules for better range)
  • 2018-06: Integration with LiveTime is in progress
  • 2018-06: Arduinos got new API (v.4), incompatible with prev versions. All mobile apps are up to date with the new API.
  • 2018-06: New threshold setup algorithm is implemented. Instead of measuring immediate RSSI at some point in space it's now a staged process
  • 2018-05: Philipp Seidel published his great open source 4-node PCB:
  • 2017-11: iOS app is live on AppStore: All credits go to Lazar Djordjevic!
  • 2017-10: WiFi modules (DT-06) are now supported as an alternative to Bluetooth connection! (still not sure how stable the connection will be with these modules, so use at your own risk and report if you discover any odd behavior with them)
  • 2017-10: Android app is now available on Google Play only. The source code remains here.

Support the project:

If you'd like to support the project, please contribute. This is the main benefit of the open-source ideology.

If you feel like spending some money for the purspose - I'd also be very grateful for that.

PayPal logo - PayPal Me

Bitcoin logo - 1KHfQpKfSFZtc9c7b9ZPSsX3uqRcXgJuow

Thanks for your support!

Featured references:




Solo or Chorus node - device for tracking a single drone. Parts cost about $12. Consists of Arduino Pro mini, RX5808 module, connectors, optional buzzer, optional resistors:

Solo device

Chorus - several (2+) connected Solo devices (nodes):

Chorus device


  • No additional equipment besides 5.8GHz Video Transmitter required on a drone.
  • Measure lap times with 1ms resolution.
  • Android application for controlling the device via Bluetooth or WiFi.
  • 5V * 250 mA power consumption (per device)
  • Low cost (around $16 per device, excluding power supply), compared to similar solutions available on market.
  • Can be tuned to any RF band/channel (R, A, B, E, F, D and even a bit of Connex)
  • Monitors several frequencies simultaneously (corresponding to a number of devices)
  • Expandable: make one Solo device and track your solo flight times; make more devices, connect them into a Chorus and compete with teammates
  • Automatic detection of a number of Solo devices in a Chorus
  • Spoken notifications, including lap results
  • Adjustable LiPo battery monitoring and spoken notifications of low battery


  • Tracks up to 100 laps per heat.
  • Limited support for digital VTx equipment (Connex)
  • Although expandable, definitely has a physical limit on a number of stacked devices (depending on UART throughput of the last device in a chain)
  • Software for iOS is on the way! (thanks to contributors)

How it works

Each Solo device measures a VTx signal strength (RSSI value) and compares it with a threshold set up. If the RSSI value is above the threshold, the corresponding drone is considered passing a finish gate.


Used parts

  • RX5808 (with SPI patch) (N items)
  • Arduino Pro Mini 5V 16MHz or Nano v.3.0 (N items)
  • HC-06/HC-05 (HM-10 for iOS) Bluetooth module (1 item)
  • DT-06 Geekcreit WiFi module as an alternative to Bluetooth module (@Banggood) (1 item)
  • 5V power supply (for example 2-4S LiPo with 5V BEC) (1 item)
  • Piezo buzzer (5V, without built-in generator) - optional (N items)
  • 2 Resistors (1K and 10K) for LiPo Voltage monitoring - optional (N items)

Bluetooth module setup

Make sure your bluetooth module baud rate is set to 115200 (use any of numerous tutorials on internet).

Generalized steps:

  1. Connect HC-06 -> USB-UART Adapter -> PC
  2. Open Arduino IDE, set adapter's COM port, run Serial Monitor
  3. Send commands

More details for HC-06 are on this wiki page

WiFi module setup

Geekcreit DT-06 modules by default operate as WiFi access point with IP So open your browser, connect to and set up as follows:

Don't forget to save each page after making the changes!

Change Baud Rate to 115200, Serial Split Timeout(ms) to 10, leave other settings as shown:

Serial page setup

On the WiFi page you may specify the name for your WiFi network and set a password:

WiFi page setup

On the Networks page you should select UDP Server and make sure the UDP port is set to 9000:

Networks page setup

Make sure to restart the module to apply the changes. They'll remain until you "Restore" the module to defaults.

Restart module

RX5808 SPI patch (required)

(copied from sheaivey/rx5808-pro-diversity repo)

In order to get the RX5808 to use SPI you will need to open it and remove a single SMD resistor.

RX5808 spi patch

For older versions of RX5808 use these instructions.

Wiring of a Solo device

Parts may be connected directly without using any additional components:

UPDATE: powering RX5808 from Arduino's VCC was a bad idea - Pro Mini's linear regulator might not be able to provide enough power for RX, so use raw 5V power instead.

UPDATE #2: powering Arduino via RAW pin is also a bad idea if you use external stabilized 5V power supply - Arduino's internal voltage regulator might significantly drop voltage thus making LiPo monitor calculations wrong. Supply 5V power to VCC pin instead (as shown on the updated wiring diagram).

Note the resistor divider for LiPo Battery monitoring. Although just one of the Solo devices in a Chorus should be connected to LiPo battery for monitoring, but make sure to have A0 Arduino pins on all other Solo devices connected to Ground (via 1K resistor) or just solder the resistors on each Solo device according to schematic.

Wiring Solo schematic

It seems to work fine being connected this way, however adding 100 Ω resistors in line on SPI wires (Arduino pins 10, 11, 12) is a good idea to prevent possible glitches with channel selection:

Wiring with resistors

Schematic and PCBs

Schematic and PCB design in DipTrace format are available in the DipTrace folder.


Printed Circuit Board

PCB by Joao Reis (Gerber format, SeedStudio compatible):

PCB by Joao Reis

PCB by Philip Seidel (4 node, DipTrace, Gerber):

PCB by Philipp Seidel

Assembly of a Solo device

Correct positioning of RX5808 module against the finish gate area is vital for correct measurements.

I tried using different types of antennas and shields with RX5808 to achieve the best possible accuracy, and finally found that the module itself works as a short-range directional antenna. The non-shielded side of the module is a surface that should face the gate, so consider this fact upon assembling.

Assembly of a Chorus device

  1. Make several Solo devices.
  2. Connect them together.
  3. Connect a Bluetooth module to the last Solo device in a chain.
  4. Use a jumper on the first Solo device to shorten two upper pins.
  5. Attach 5V power supply to one of the Solo devices (make sure to supply enough power - each Solo device consumes about 250mA).
  6. Optionally attach LiPo battery to one of the solo devices that has a resistor divider for LiPo Monitoring feature

Assembly of a Chorus Device



Download the project from Arduino folder, open chorus-rf-laptimer.ino file with Arduino IDE and upload to each Solo device.

Android App

The app is now available on Google Play.

Get the Android app

iOS App

Lazar Djordjevic is the creator of the iOS app. Thanks, Lazar!

The app is available on App Store.

Get the iOS app

Note for iOS users: Apple devices don't work with HC-05/06 modules. You should use HM-10 Bluetooth module instead. (Or wait for WiFi modules support in iOS version :))

App User Guide

Android app is used as the illustration for the guide.

Application startup screen:

Application startup screen

Use "⋮" menu to connect/disconnect to your Chorus device.

Application connect

Connection is available via Bluetooth or WiFi, depending on the connectivity module you use for your Chorus.

Bluetooth connection assumes that Bluetooth is enabled and the Bluetooth module is paired with the phone.

WiFi connection assumes that the module operates in Access Point mode (AP), UDP server is up and running on port 9000, and you are connected directly to its WiFi network.

Once connected to Chorus device, the app automatically detects a number of stacked Solo devices and shows corresponding controls.

The app consists of 4 tabs:

  • SETUP - race preconditions and device settings:
  • FREQ - VTX channel/band for each Solo device
  • PILOTS - Pilot name and RSSI threshold for each channel
  • RACE - start/stop race and race results

Controls on the tabs are mostly self-explanatory. Still some clarifications might be useful:

  • Enable device sounds: tick to enable device buzzers.
  • Minimal Lap Time: use +/- to increase/decrease minimal lap time. Set enough time to let a drone leave the "above-threshold RSSI area" after lap time is captured.
  • Skip first lap: tick if start table is located before the start/finish gate (first lap time will be skipped because it's not a full lap); untick if start table is located right behind the laptimer (first lap time will be tracked only if minimal lap time is passed after the race start).
  • RSSI Threshold: use +/- to fine-tune RSSI threshold.
  • Clear/Set: clear current RSSI threshold / set threshold automatically (described below).
  • Calibrate Timers: different Arduino devices have different oscillators accuracy and it may slightly deviate from 16MHz. In order to make sure that same timespan is measured equally on different devices, you need to calibrate them before the race.
  • Start Race: tap to start tracking laps. This same button is used to Stop the race.

When you stop the race, Chorus device immediately clears saved lap times, but they remain visible in the application until new race is started. Also the Race data is saved in CSV reports on your device (if you grant the Write to SD Card permissions)

LiPo Monitoring feature has a "hidden" possibility for adjustment. If voltage measured by LiPo Monitor in Android App doesn't correspond to real voltage of your battery, perform a long tap on a voltage value to see the Adjustment controls:

LiPo Monitor

LiPo Monitor Adjustment

Adjust until measured voltage corresponds to the voltage of your LiPo battery while it's powering the Chorus device.

Setup and Usage Guide

  1. Power on the Chorus device and put it on the ground in a corner of the finish gate facing the opposite side at 45 degrees upwards.
  2. Start the mobile app and connect to the Chorus device.
  3. Setup VTX Band/Channel for each Solo device in Android app on the "Freq" tab.
  4. Fully prepare racing drones and power them up (VTX must be powered in racing mode).
  5. Setup threshold values for each channel on the "Pilots" tab (see detailed description below).
  6. Repeat step 5 for each drone taking part in a race.
  7. Calibrate timers using the corresponding button on a "Race" tab (in case you have more than 1 Solo device).
  8. Start Race in the app.
  9. Fly the track and see the lap times being captured.

Also consider shielding the Chorus device with a piece of metal on one side where drones are approaching from. It might increase the accuracy by partially blocking the VTx signal before a drone is inside a gate.

RSSI Threshold Setup

When you first start the device, it has predefined threshold values of 190 on each channel, which is more or less suitable value for 25mW VTx. But if you want to have accurate laps tracking, you should consider individual thresholds setup for each participating drone.

You can set RSSI threshold in 2 alternative ways:


  1. Hold a powered drone at the opposite side of the gate.
  2. Note the RSSI value.
  3. Use +/- buttons to change the threshold to match the noted value (short press changes by 1, long press changes by 30).

Manual Threshold Setup


  1. Hold a powered drone far enough from the device (10-20 meters), so that current RSSI is significantly lower compared to when the drone is near.
  2. Long press "Set" button - notice yellow circle progress bar which means that Chorus is wating for RSSI to start rising.
  3. Walk towards the opposite side of the gate. At some point notice the yellow progress bar changing color to blue, which means that Chorus recognized the rise of RSSI and is now tracking the maximum value). Continue approaching the gate (RSSI should rise).
  4. Pass the gate (don't stop) and move away from it (either return or go forward). Make sure that you pass Chorus a bit farther than the most distant point of the gate where you want Chorus to capture a flying drone during the race.
  5. At some point distant from the gate, the blue progress bar will change to the captured RSSI threshold value. You're done!

Note: you can set thresholds for all pilots in a heat at once. Just start threshold setup for each pilot and have all pilots walk by the gate.

Automatic Threshold Setup


If the app connects to Bluetooth module but doesn't seem to communicate with the device, check the following:

  1. Arduino must be 5V 16Mhz (proper work of 3.3V 8Mhz is not guaranteed)
  2. Bluetooth module baud rate must correspond to Arduino's: 115200 baud
  3. Loopback jumper must be in place.
  4. Wiring :)


Big thanks to all contributors to this project:

Android app:

  • Louis Plett (highway11) - voice speaking
  • Ray Erik Rabe (raveerk) - CSV reports generation
  • evgen48 - display frequencies in MHz
  • Gleb Godonoga (SidhNor) - internationalization support, Russian localization, permissions tuning
  • Jose Luis Ortiz (JLOFPV) - Spanish localization
  • thestealth131205, anunique - German localization
  • Nicola Gorghetto (nikybiasion) - Italian localization
  • Kevin (@Smeat) - power-down mode for inactive nodes, fix for wifi connectivity on Android 10 (#112)
  • @Nisse43 - Fix connectivity issue #81

Arduino app:

  • anunique - arbitrary frequency setting, predefined Connex frequencies, improvements to Arduino code
  • Kevin (@Smeat) - power-down mode for inactive nodes

iOS app:

  • Lazar Djordjevic (lazar89nis) - entire app implementation!

Alternative PCB design:

  • Joao Reis
  • Philipp Seidel

LiveTime integration:

  • David Lewis - building and contributing several Chorus nodes to LiveTime team for integration testing
  • Cory Kroll - implementation of Chorus support in LiveTime


Feel free to ask questions, suggest improvements, report your usage results.

Happy flying!

/Google Play and the Google Play logo are trademarks of Google LLC./

You can’t perform that action at this time.