Emerging Interfaces

mmWave Radar Sensing: Getting Started With the RD-03D

This site's sensor tutorials have covered capacitive touch, force sensing, and time-of-flight. Here's a sensing mode that works through cardboard, plastic, and wooden doors: millimeter-wave radar.

Most of this site’s sensor tutorials — capacitive touch, force sensing, time-of-flight — need a clear line of sight or direct contact to work. Millimeter-wave (mmWave) radar doesn’t. A cheap module like the RD-03D can track a person’s position and speed through a cardboard panel, a plastic enclosure, or a wooden door, which opens up interaction designs that simply can’t be built with light- or contact-based sensing.

What the RD-03D actually reports

Unlike a simple PIR motion sensor, which only tells you “something moved,” the RD-03D tracks a target and streams back structured data per update: X position, Y position, straight-line distance, angle, and speed — all from a single small module, with multi-target tracking built in. That’s a meaningfully richer signal than a motion sensor’s binary trigger, closer to what a short-range tracking radar reports than to a typical hobbyist proximity sensor.

The one thing that trips people up: baud rate

The RD-03D’s default communication speed is 256000 baud, and that single number explains most of the “my sensor just prints ‘Radar Sensor Started’ and then nothing” reports from people who’ve tried it. An Arduino Nano communicates with the module over SoftwareSerial, which can’t reliably keep up with 256000 baud — the connection comes up, the startup message prints, and then real data simply never arrives. The fix is switching to a board with proper hardware serial headroom at that speed, such as an Arduino Uno R4 or an ESP32, rather than debugging the Nano setup further.

Wiring and a first read

Wire the module’s TX and RX to two digital pins on your board (pins 2 and 3 in this example), then install the RD-03D’s library via Sketch → Include Library → Add .ZIP Library. A minimal read loop looks like this:

#include <RadarSensor.h>

// RX, TX pins connected to sensor TX, RX
RadarSensor radar(2, 3);

void setup() {
  Serial.begin(115200);
  radar.begin(256000);
  Serial.println("\n=== Radar Sensor Started ===\n");
}

void loop() {
  if (radar.update()) {
    RadarTarget tgt = radar.getTarget();
    Serial.print("Distance (mm): ");
    Serial.println(tgt.distance);
    Serial.print("Speed (cm/s): ");
    Serial.println(tgt.speed);
  }
}

Open the Serial Monitor after uploading and move in front of the sensor — distance, angle, and position values update live as you move closer, farther, left, and right.

A first project: a distance-gated output

Once basic reads are working, a natural first exercise is gating an output by distance rather than just printing raw numbers — for instance, converting the reported distance to feet and turning an LED on only within a specific range:

float distanceFeet = tgt.distance * 0.00328084; // mm to feet

if (distanceFeet > 2.0 && distanceFeet < 14.0) {
  digitalWrite(LED_PIN, HIGH);
} else {
  digitalWrite(LED_PIN, LOW);
}

That same pattern — read a continuous value, gate behavior by a threshold — is the basis for nearly every interactive installation built on this sensor: a proximity-triggered soundscape, a lighting cue that fades in as a visitor approaches, or a kinetic piece that only activates within a specific zone. The through-material sensing is what makes mmWave worth reaching for over a cheaper ultrasonic or IR sensor specifically when the sensor itself needs to be hidden inside an enclosure or behind a panel, rather than mounted in the open.