Remote prevádzka rádiostaníc je čoraz bežnejšia, no pre CW operators came with one inconvenient limitation: network keying generally meant either a software key on the screen or a compromise with latency that degraded the quality of broadcast CW at higher speeds. Dan Pech OK1HRA, český rádioamatér a vývojár v Prusa3D, tento problém riešil od základov – výsledkom je Paddle2IP, open-source hardvérové zariadenie, ktoré pripojí classic iambic trap to a remote station via an IP network with controlled latency and maintaining the exact timing of marks.
You will read in the article
Hardware base: M5Stack M5Dial
Paddle2IP is based on M5Stack Dial v1.1 module with ESP32-S3 microcontroller. The module in a compact circular body integrates Wi-Fi, a 1.28" touch screen, a rotary encoder with a button and two Grove connectors. Port B (GPIO2/GPIO1) is used to connect a trap - dit and dah contacts with internal pull-up resistors, 100 Ω series resistance and 10 NF filter capacitor on each input. Port A is optional: GPIO13 for flat key, GPIO15 for headphone side tone via RC filter and DC-coupling capacitor. The internal buzzer on GPIO3 generates a side tone directly in the device, with a volume adjustable in the range 0-100 (step 5 corresponds to 2 dB). The device is powered by the battery, the firmware maintains power via GPIO46. Important notice: the red 5 V wire of the Grove connector must not be connected to the trap.
Why M5Dial?
The choice of M5Dial is not accidental. The rotary encoder serves to directly adjust the keying speed, the touch screen displays the current connection status and parameters, and Wi-Fi connectivity is integrated without external modules. The entire device has the dimensions of a disk with a diameter of less than 5 cm - it is one of the most compact platforms for this purpose. The compromise is limited battery life and the absence of an Ethernet port - for stationary use there is an alternative in the form of USB network mode.
A demo of Paddle2IP in action
Network protocol and latency
Paddle2IP does not forward raw contact presses. Iambic key (port of K3NG, CMOS Super Keyer timing) beží lokálne na jadre 1 ESP32-S3 ako neblokujúci stavový automat s tikom 1 ms. Generuje ideálne časové značky hrán - the beginning and end of each mark and space - and sends these marks with a time stamp via UDP (port 5690) to the server at the radio station. Tón sa ozve lokálne do 1 ms od stlačenia kontaktu, takže operátor počuje sám seba bez oneskorenia, zatiaľ čo sieťový prenos prebieha na pozadí.
The server receives packets and plays edges after a fixed playout delay D to compensate for network jitter. The recommended values of D depend on the type of connection: in LAN around 30 ms, with a good Internet connection or VPN 80-150 ms, via LTE 200 ms and more. RTT (round-trip time) is displayed on the device display - both the current value and the 5-second minimum. Each packet repeats the edges from the last 500 ms, which ensures resistance to the loss of individual packets. Authentication uses SipHash-2-4 with a 128-bit shared key, nonce rotates every 5 seconds, and sequence numbers prevent replay attacks.
Why a local keyholder is key
Many remote solutions send raw keystrokes to the remote server where the keyer is running. As latency fluctuates, this leads to irregular marks and gaps. Paddle2IP reverses this principle: the keyer runs locally and the server receives ready, correctly timed edges. Even if one packet drops, the CW remains clean because the next packet contains all the edges from the last half second. The limit occurs when the playout delay exceeds 500 ms - the operator hears the local side tone immediately, but the control confirmation from the radio is delayed, which requires adaptation of habits in fast operation.
User interface and settings
The M5Dial rotary encoder is used to set parameters directly on the device without a computer. Keying speed (WPM) is adjustable from 5 to 60, pitch from 300 to 1200 Hz (10 Hz step). There is a choice of iambic mode A or B, switching dit/dah contacts, rotating the display 180° and a test function that broadcasts "TEST" at a set speed. Playout delay D is adjustable from 10 to 1000ms (10ms steps) or left at server default.
The web interface on port 80 (accessible via http://paddle2ip.local) allows configuration of Wi-Fi networks (up to four saved), generation of authentication key, status check and firmware update. A 115,200 baud serial console provides diagnostic and management commands.
Connection and network options
The primary connection method is Wi-Fi. At startup, the device performs one channel scan (approximately 1.5 s) and connects to the strongest saved network. If no saved network is available within 20 seconds, the backup access point "Paddle2IP-XXXX" with the configuration portal will be activated. Modem sleep is turned off - latency takes precedence over energy saving.
An alternative is USB network mode: the M5Dial enumerates itself as a CDC-NCM Ethernet device via TinyUSB 0.15.0. The computer shares its Internet connection via DHCP with NAT. This mode is verified on Linux (Debian 13, GNOME), not yet tested on Windows and macOS. If the USB network does not obtain a DHCP address within 20 seconds or the server does not respond within 10 seconds, the device will automatically switch to Wi-Fi.
UDP port forward on the server side is required for Internet access. On the Paddle2IP side, no inbound port is needed because the device initiates the communication. Carrier-grade NAT is not supported - in that case a VPN tunnel is the solution. Communication takes place exclusively via IPv4.
Supported servers
Paddle2IP is not a closed ecosystem. The documentation defines a complete communication protocol, which enables the implementation of own servers. The reference implementation is Open Interface III (OI3) with ATmega2560 and W5500, which keys the CW line via a PTT sequencer. The second option is WIFILT - a web interface for Icom transceivers with LAN connection, running on ESP32 or as a native PC program, capable of keying via the CI-V protocol of the radio without an additional cable. The choice of server depends on the transceiver and the connection method - OI3 is suitable for Yaesu, Kenwood or Elecraft with classic CW input, WIFILT for Icom with LAN interface.
3D printed box
For the mechanical completion of the device is on the portal Printables available threaded housing model (Threaded housing for M5Dial, model 1886030). Krabička je navrhnutá priamo pre modul M5Dial and provides protection for the display and connectors during portable operation. The screw cap allows quick access to the module without tools – handy when changing the battery or connecting the USB cable.
Build, firmware and further development
The firmware is compiled in Arduino IDE 2.x or arduino-cli with the M5Stack package (tested with version 2.1.3) and the M5Dial 1.0.2, M5Unified 0.2.2 and M5GFX 0.2.3 libraries. An alternative to custom compilation is the web flasher on GitHub Pages, which works in Chrome or Edge and doesn't require a development environment to be installed. For testing without hardware, the Python script rkey_test.py (fake server, load tests, SipHash self-test) and a host simulation of the keyer compilable via g++ with the C++17 standard are used.
The source code is publicly available at GitHub (github.com/ok1hra/paddle2ip). Verzie firmvéru používajú dátumovú schému YYYYMMDD, nastavenia sú uložené v NVS a zápis do Flash memory is delayed until the keyer is idle for at least 2 seconds - so that the write does not disturb the CW timing. The project is actively developed and the documentation includes a complete description of the wire protocol, which paves the way for integration into existing remote systems even outside the OI3 and WIFILT ecosystem.
