Radar Desk Buddy: Build an ESP32-S3 Desk Pet That Follows You with 60 GHz mmWave Radar

An open-source ESP32-S3 desk companion that uses a 60 GHz mmWave radar to turn toward you, follow you with its eyes, show the time when you sit down and hide when you leave. No camera, no cloud, no soldering.

Radar Desk Buddy cover: the desk pet with its sunflower figure and the real 60 GHz AiP mmWave radar board (42 x 8 mm)

Radar Desk Buddy is a small desk companion built on an ESP32-S3 and a 60 GHz mmWave radar. When you walk around the room, its little figure turns to face you and the eyes on its round screen follow you. When you sit down at the desk, it shows the local time and weather. When you leave, it hides and the screen goes to sleep. There is no camera and no cloud service. All of this comes from the radar’s angle and distance readings.

The whole project is open source on GitHub under the MIT license: github.com/Kymopsis/radar-desk-buddy. Everything plugs together with Dupont jumper wires and lever wire connectors, so you can build it in an evening without a soldering iron.

GitHub · Kymopsis /radar-desk-buddyESP32-S3 desk companion with a 60 GHz mmWave radar: eyes and figure follow you, local time and weather, Telegram messages. No soldering.CMIT licenseView repository →

What it does

The five Radar Desk Buddy screens rendered from the firmware: eyes, time and weather, new message, setup QR code and sleep
  • Follows you. A pan servo turns the figure toward you, and the on-screen pupils look in the same direction. Because both use the same angle, it reads as one character instead of a screen bolted to a motor.
  • Two distance bands. Within about 5 m it watches you with animated eyes. Within 0.5 m (you are at the desk) the screen switches to a clock and the current weather.
  • Rises and hides. A second servo lifts the figure when someone shows up and lowers it about 10 seconds after the room is empty.
  • Messages from your phone. Optionally, link a free Telegram bot. Messages you send appear on the screen, and you pat the touch pad on its head to read them.
  • Setup in the browser. On first boot it shows a QR code. Scan it, join the DeskBuddy-XXXX hotspot, pick your Wi-Fi and type your city. No app to install.

The screen images above are not mock-ups. They were rendered by running the project’s own drawing code (ui.c) on a PC, so they show exactly what the 240 × 240 display draws.

What it looks like on a desk

Our build is a light-blue 3D-printed box with the round screen on the front and a small figure standing on the servo turntable on top. Ours is a sunflower, the Kymopsis mascot, but any light figure that fits the turntable works.

Why a 60 GHz radar instead of a PIR sensor or a camera

A PIR sensor only tells you that something warm moved. Once you sit still to read or type, it reports nobody, and it has no idea where you are. A camera knows where you are, but it needs light and a lot of processing, and few people want a camera on their desk pointed at them.

A 60 GHz FMCW radar sits in between. The presence firmware on the radar reports each person as a target with coordinates in metres, so the ESP32 gets both the direction and the distance in a few bytes over UART. It works in the dark, it sees through a thin plastic enclosure, and it never produces an image. The antennas are built into the radar chip package (antenna-in-package, AiP), which is why the module is only about 42 × 8 mm.

How it decides what to do

Top view of the radar field of view: far band up to 5 m shows following eyes, near band within 0.5 m shows clock and weather

The firmware sorts the nearest person into one of three bands. The near band uses hysteresis: you enter it at 0.5 m but only leave it at 0.6 m, so the screen does not flicker between faces when you lean back in your chair. Every threshold here, along with the servo speed, the pan limit and the rise delay, can be changed live on the setup page.

BandDefault distanceWhat you see
Near≤ 0.5 m (leave at 0.6 m)Clock and weather, or “New message”
Farup to 5 mEyes that follow the same angle as the pan servo
NobodynoneFigure hides; backlight off after about 12 s

From radar frame to a turning head

Data flow from 60 GHz radar UART target frames to ESP32-S3 angle calculation, servos and on-screen pupils

The radar sends frames in the TinyFrame format at 115200 baud. Frame type 0x0A04 carries the target list, with x (left), y (forward) and z (up) for each person. The ESP32 picks the nearest target, keeps following the same track ID while it stays visible, and converts its position into an angle and a distance:

azimuth  = atan2(x, y)      // 0° = straight ahead, positive = left
distance = sqrt(x*x + y*y)

The angle then goes through a slew limiter (90°/s by default) and a soft limit (±80°) before it reaches the pan servo, so the figure moves smoothly instead of twitching with every radar frame. The same smoothed angle drives the pupils on the screen. The decoder lives in firmware/components/radar_link/ and comes with a host-side test, so you can reuse it in your own radar project.

Parts list

These are the parts the firmware is written and tested for. The radar is the one part that really matters. Choose the “Presence, wall mount” firmware option on the radar kit page. It is the side-mounted 3D presence firmware that reports target positions. Both the DIY board and the development kit come with a connection lead that ends in female Dupont plugs.

PartWhyLink
60 GHz AiP radar, “Presence, wall mount” firmwareAngle and distance of each person over UARTRadar kit
ESP32-S3 board, N16R816 MB flash and 8 MB PSRAM are requiredESP32-S3 N16R8
1.28″ round TFT, GC9A01, 240×240Eyes, clock and messagesRound display
2 × micro servoPan (turn) and lift (rise/hide)SG90 or MG90S
TTP223 touch sensor“Pat the head” to open a messageTTP223
AMS1117 3.3 V moduleClean, separate 3.3 V rail for the radarAMS1117
Dupont wires and lever connectorsNo-solder signals and a 5 V / GND busDupont wires · Lever connectors
USB-C PD trigger board (set to 5 V) and a PD charger ≥ 20 WPower for the servos and the boardAny
470–1000 µF capacitor (≥ 10 V)Smooths servo current spikesAny

A 3D-printable enclosure is being revised and will be added to the repository soon.

Wiring without a soldering iron

Radar Desk Buddy wiring diagram: radar UART, servos, touch pad, GC9A01 round screen and 5 V power bus around an ESP32-S3

The signals are plain jumper wires. Power runs through two lever connectors used as a small 5 V bus and a GND bus. The full pin table is in docs/wiring.md. Three rules prevent nearly every problem people run into:

  1. Set the PD trigger board to 5 V before you connect anything. At 9 V or 12 V you will lose the servos and the board.
  2. Feed the ESP32 through its USB-C port, not the 5V header pin. On many boards that pin bypasses the input path, and you get a flickering screen or Wi-Fi dropouts.
  3. Give the radar its own 3.3 V from the AMS1117 module and run a separate ground wire from every part back to the GND bus. Servo current spikes should never flow through the radar’s ground, because clean power gives cleaner angles.

Mount the radar on the base, not on the moving figure, so the angle it measures does not rotate with the servo. If the figure turns away from you, there is a Flip pan button on the setup page.

Flash it and set it up

The firmware is an ESP-IDF v6.0.2 project. Build and flash it with idf.py flash; the steps are in docs/flashing.md. After that, everything happens on your phone:

The Desk Buddy setup page in a phone browser: Wi-Fi, city and Telegram, and a live radar view
  1. Power on. The screen shows a QR code with the hotspot name and a password that is different on every device.
  2. Scan the QR code to join DeskBuddy-XXXX. The setup page opens by itself, or go to http://mod.config.
  3. Choose your home Wi-Fi and type your city. The time zone and weather come from the free Open-Meteo API, with no API key.
  4. Walk around the room and watch the live radar view on the setup page. Green is the person it follows.

Level 2: messages through Telegram

If you want to send it messages, create a bot with @BotFather and paste the token on the setup page. Then open the bot and press Start, and that chat becomes the only one the device listens to. The ESP32 talks to the Telegram Bot API directly over HTTPS, so there is no server to run. Messages show up as “New message”, and a pat on the head opens them. The guide is docs/level-2-telegram.md.

Make it yours

  • Tune the bands for your room. A bigger near band works well on a standing desk.
  • Swap the eye style or colors. The two built-in themes, pink and blue, live in ui.c.
  • Reuse the radar decoder for something else: a presence-aware desk lamp, a monitor that sleeps when you leave, or a doorway counter.
  • Wire the radar into Home Assistant. The angle and distance are already on the ESP32, so it is a short step to MQTT.

Get the code and the parts

The firmware, wiring guide and FAQ are on GitHub. If you build one, open an issue with a photo; we would love to see it. If you need a radar for a product, with your own firmware, housing or volume pricing, ask through the B2B form. On the radar kit page, choose the “Presence, wall mount” firmware.

GitHub · Kymopsis /radar-desk-buddyESP32-S3 desk companion with a 60 GHz mmWave radar: eyes and figure follow you, local time and weather, Telegram messages. No soldering.CMIT licenseView repository →

FAQ

Does Radar Desk Buddy record video or audio?

No. It has no camera and no microphone. The radar reports only the positions of nearby people as numbers, and nothing leaves the device unless you set up Telegram.

Which radar firmware should I order?

Order the 60 GHz AiP radar kit with the “Presence, wall mount” firmware. It is the side-mounted 3D presence firmware that reports target positions over UART, which is what the ESP32 code reads.

Do I need a server or a cloud account?

No. Levels 1 and 2 talk directly to NTP, Open-Meteo and, optionally, Telegram. An optional self-hosted server for pairing two buddies is planned for later.

What happens with two people in the room?

The radar reports several targets. The firmware follows the nearest one and keeps its track ID while it stays visible, so it does not jump back and forth.

Can I use a different ESP32?

The code targets the ESP32-S3 with 16 MB of flash and 8 MB of PSRAM (N16R8). Do not use GPIO 35–37 on those boards, because they belong to the octal PSRAM.

Radar outputs in this project are for hobby and development use. They are not a safety or medical device.