Python tools for parsing and visualizing live data from the smartmicro UMRR-0A Type 29 (24 GHz FMCW) Stop + Advance radar sensor over RS485.
python3 -m venv venv
source venv/bin/activate
pip install pyserial PyQt6python3 umrr0a_gui.py --port /dev/tty.usbserial-6 --baud 115200# Live decoded output
python3 umrr0a_parser.py --mode parse --port /dev/tty.usbserial-6
# Raw hex dump
python3 umrr0a_parser.py --mode raw --duration 10
# Baud rate scan
python3 umrr0a_parser.py --mode scanThe sensor uses Legacy RS485 framing at 115200 baud (not 230400 as documented):
Start: CA CB CC CD | CAN messages | XOR checksum | End: EA EB EC ED
Each frame contains multiple CAN messages packed as: [2-byte CAN ID (BE)] [1-byte length] [N-byte data]
| CAN ID | Name | Description |
|---|---|---|
| 0x02FF | High-Res Timer | 125 kHz hardware clock (8 µs resolution) |
| 0x0500 | Sensor Control | Uptime (ms), status, network ID, interface mode, diagnostics |
| 0x0501 | Object Control | Cycle count, duration (50 ms), object count, data format |
| 0x0502+ | Object Data | Per-object: x/y position, speed, heading, length, vehicle class |
| 0x0782 | Trigger Params | Measurement zone parameters |
| 0x0783 | Trigger Data | Trigger sub-messages (3 variants: 6-byte, 2-byte, 5-byte) |
| 0x0785 | Uptime Split | Uptime as seconds + milliseconds (cross-validates with 0x500) |
The UMRR-0A byte layout differs from the UMRR-11 data communication manual:
- Byte order: big-endian (UMRR-11 documents little-endian for some fields)
- 0x0500: Uptime u32 at bytes 0-3, status/diag at bytes 4-7 (reversed from UMRR-11)
- 0x0501: Cycle count u32 at bytes 0-3, metadata at bytes 4-7 (reversed from UMRR-11)
- Baud rate: 115200 (documented as 230400)
- CAN ID 0x02FF: UMRR-0A specific, not in UMRR-11 docs
Bit-packed Intel (little-endian) encoding in 8 bytes:
| Field | Bits | Resolution | Offset | Unit |
|---|---|---|---|---|
| mode_signal | 1 | — | — | — |
| x_point | 13 | 0.128 | -4096 | m |
| y_point | 13 | 0.128 | -4096 | m |
| speed | 11 | 0.1 | -1024 | m/s |
| heading | 11 | 0.177 | -1024 | deg |
| obj_length | 7 | 0.2 | 0 | m |
| obj_id | 8 | — | — | — |
Vehicle classification by length: pedestrian (≤1.0m), bicycle (≤1.6m), motorcycle (≤2.6m), passenger car (≤5.4m), delivery/pickup (≤8.8m), short truck (≤13.8m), long truck (>13.8m).
- PPI radar view with range rings, target blips (color-coded by speed), heading arrows, trails
- All decoded CAN message parameters displayed in real-time
- Sensor status with diagnostic flags (blind, error, interference, rain)
- Object table with full detail (ID, position, speed in m/s and km/h, heading, length, class)
- Three cross-validated uptime sources (0x500 ms counter, 0x785 split, 0x2FF 125 kHz timer)
- Protocol statistics (frame rate, byte count, message type counts)
- Dark theme, scrollable panel layout
umrr0a_parser.py— CLI parser and protocol library (no GUI dependencies)umrr0a_gui.py— PyQt6 radar display application (imports from parser)
- macOS
- Linux (PyQt6 + pyserial)