A Belgian maritime pilot, whose job is guiding ships in and out of port, has built a desk piece that brings the sea indoors. His 30 cm 3D-printed west cardinal buoy hangs on eight lines, each wound by its own small stepper motor, and it rolls and heaves with live wave data from a real buoy out at sea. Pick a station off Bermuda and it moves to 1.9 m waves every 8 seconds; for some buoys it even plays back the real buoy's recorded motion. An ESP32-S3 runs the whole thing.
Live data from real buoys
The firmware pulls wave data over HTTPS from public networks: NOAA's NDBC, CDIP, the Irish Marine Institute and the Belgian and Dutch North Sea networks. A 1.9-inch 170 x 320 ST7789 display shows the station, wave height, period and direction. For CDIP buoys, which publish actual displacement records, the desk buoy replays the measured motion rather than a simulated wave. CDIP's file runs past the newest sample, so the firmware searches for the newest 30 minutes of data that are at least 90 percent valid.
Eight motors, one timer
The buoy hangs from 8 lines for 6 degrees of freedom, which is over-constrained, so the lines can fight each other. The maker's answer is current-limited TMC2209 drivers, configured over two UART buses with the TMCStepper library: if lines pull against each other, a motor slips a step instead of building up force. One hardware timer on the ESP32-S3 generates all 8 STEP signals so the motors stay in sync at line speeds up to 150 mm/s, and the motion loop runs 100 times a second while the HTTPS downloads and display run alongside.
There are no endstops. To home, all 8 motors wind in at low current until each one stalls on a taut line, with the buoy standing in a small cup so equal pull does not tip it over.
Key details
- Controller: ESP32-S3 DevKitC-1 N8R8 (8 STEP lines, 2 UART buses, SPI display, I2C for USB-C PD, a knob and a fan)
- Drivers: 8 small steppers on TMC2209 drivers set over UART, StealthChop enabled
- Power: an Adafruit HUSB238 asks the USB-C charger for 20, 15, 12 or 9 V, and the firmware sets motor current to match what the charger can supply; motors stay off below 9 V
- Setup: WiFiManager captive portal, joined by scanning a QR code on the display
- Updates: two app slots in 8 MB flash for over-the-air updates that can roll back
Our take
This is a nice example of a cable-driven parallel robot shrunk to desk size, and the write-up is full of hard-won ESP32 details: the knob on boot-strap pin GPIO0, an LCD that needs a real reset pulse, and USB-C PD brown-outs when motor load makes the charger renegotiate. Anyone building a multi-motor ESP32 project will find something useful in it.
Image credit: u/ThisRelation5974 on Reddit, frame from the project video, cropped and resized.
About the author: Aswinth Raj is an electronics engineer and the editor of CircuitDigest, where he has published more than 150 hands-on projects and tutorials across Arduino, PIC, ESP32, Raspberry Pi and EV battery systems. He selects the stories on this page for what engineers and makers can actually learn or build from. Connect on LinkedIn
Add a comment
No account needed. Your comment appears once a moderator has reviewed it.