Drone-mounted BLE triangulation system that estimates the bearing of RF-emitting devices using RSSI from three distributed sensors.
Hostile Drone Detection System for Reconnaissance and Bomber UAVs
Develop a detection system that enables reconnaissance and bomber UAVs to identify approaching hostile FPV drones in real time, including direction, speed, and altitude.
Due to limited onboard camera field of view, UAV operators often cannot detect FPV threats approaching from lateral or rear angles. Losses of UAVs caused by hostile FPV drones are increasing.
A distributed RF sensor array mounted on a drone that detects a target's signal from multiple positions, calculates the bearing to the source, and indicates direction to the operator — enabling evasive action before visual contact.
The detector must find and indicate the target direction so the drone operator can respond.
In the field, hostile FPV drones emit RF signals (video downlink, control link) that can be detected and triangulated. For this hackathon MVP, we simulate that with Bluetooth Low Energy (BLE) because:
- Every phone and pair of headphones is a ready-made test transmitter
- The Raspberry Pi Pico 2 W and Pi 5 have built-in BLE radios — no external RF hardware needed
- The detection principle (RSSI-based triangulation) is identical regardless of frequency band
- It lets us build and demo the full pipeline in 12 hours
The architecture is designed so the BLE scanners could be swapped for SDR-based RF receivers targeting drone control frequencies (2.4 GHz, 5.8 GHz) with no changes to the controller or bearing logic.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Pico 2 W │ │ Pico 2 W │ │ Pi 5 │
│ (pi1) │ │ (pi2) │ │ (pi3) │
│ BLE scan │ │ BLE scan │ │ BLE scan │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ UDP │ UDP │ UDP
└────────┬────────┴────────┬────────┘
│ │
┌─────▼─────────────────▼─────┐
│ Laptop Controller │
│ RSSI → Bearing Calculation │
│ Live TUI Dashboard │
└─────────────────────────────┘
Sensor layout on drone (triangle):
pi3 (Pi 5) ← Front
/ \
/ \
pi1 (Pico) pi2 (Pico) ← Rear
Each sensor scans for the target BLE device, measures RSSI, and sends it to the laptop via UDP over WiFi. The laptop calculates a weighted bearing vector and displays direction in real time.
==================================================
🚁 DRONE SIGNAL TRACKER
==================================================
● PI1 | ████████ | -62 dBm
● PI2 | ████ | -75 dBm
● PI3 | ████████████████ | -48 dBm <-- SELECTED
--------------------------------------------------
Bearing: 312.7°
Direction: ↖
--------------------------------------------------
Status: 3/3 Pis online
Selected: PI3git p
Press Ctrl+C to stop
- Each sensor measures signal strength (RSSI) to target
- Laptop receives RSSI from all 3 sensors via UDP
- Convert RSSI to weights:
weight = max(0, 100 + rssi) - Calculate weighted position vector:
vector_x = Σ(weight × sensor_x) vector_y = Σ(weight × sensor_y) - Calculate bearing angle:
angle = atan2(vector_x, vector_y)→ 0°–360°
- RSSI smoothing: Exponential moving average (α=0.7) filters noisy readings
- Angle smoothing: Prevents bearing jitter between updates
- Hysteresis: 5 dB threshold prevents rapid switching between selected sensors
- Timeout handling: Detects offline sensors after 3 seconds of silence
| Component | Qty | Role |
|---|---|---|
| Raspberry Pi Pico 2 W | 2 | BLE scanners (rear-left, rear-right) |
| Raspberry Pi 5 | 1 | BLE scanner (front) + USB power for Picos |
| Laptop | 1 | Controller / dashboard |
| Any BLE device | 1 | Target (e.g. wireless earbuds) |
| File | Deploy To | Purpose |
|---|---|---|
pico_scanner.py |
Pico 2 W (as main.py) |
BLE scanner, sends RSSI via UDP |
pi5_scanner.py |
Raspberry Pi 5 | BLE scanner using bleak |
laptop_controller.py |
Laptop | Receives RSSI, calculates bearing, displays dashboard |
1. Configure all scanner files — set your WiFi SSID/password, laptop IP, and target BLE device name.
2. Flash Picos — install MicroPython firmware, upload pico_scanner.py as main.py (change PI_ID to "pi1" / "pi2").
3. Run Pi 5 scanner:
pip3 install bleak --break-system-packages
python3 pi5_scanner.py4. Run laptop controller:
python3 laptop_controller.py5. Activate target BLE device near the sensors and watch the dashboard.
See pico-setup.md for detailed instructions.
| Device | Sends To | Listens On |
|---|---|---|
| pi1 (Pico) | Laptop:5000 | Port 5002 |
| pi2 (Pico) | Laptop:5000 | Port 5003 |
| pi3 (Pi 5) | Laptop:5000 | Port 5004 |
| Laptop | All Pis | Port 5000 |
Messages are plain UDP text: "pi1,-62" (RSSI data) / "SELECTED" (selection command).
Europe Defence Tech Estonia Hackathon 2026 — Tallinn
All rights reserved. This code is not licensed for reuse, modification, or distribution.




