↩️ На главную

IoT-радар для БПЛА: сеть детекторов в лесу на 1 км² с LoRa и PIR

21.10.2025 | Статья из категории: Безопасность

IoT-радар для БПЛА - сеть детекторов на 20 км² с LoRa и PIR

Захотелось ПВО сделать для дачи, в виде глушилок БПЛА. Но увы, законом это запрещено. Тогда будет радар для дачи, ну не только, может кому и в реальных боевых действиях пригодится. По логике, коллапс неизбежен, но это уже другая история. Один радар в окопе — хорошо. А сеть из десятков радаров по периметру леса — уже система раннего предупреждения. Ну хотяб двустволку успеть зарядить) Представь: ты расставил 20–30 автономных узлов на деревьях и кустах. Каждый слушает эфир, смотрит вниз инфракрасным глазом и молча передаёт данные по LoRa на шлюз. А на твоей PHP-панели — динамическая карта: красные точки — дрон, жёлтые — человек, стрелки — направление движения.

Это не фантастика. Это IoT-радар на коленке.

Архитектура системы

  • Узлы (сенсоры) — ESP32 + RFM95 (LoRa) + RFM69 (433 МГц) + PIR-датчик
  • Связь — LoRa на 868/915 МГц, дальность до 10–20 км (в лесу — 3–5 км, но достаточно для 1 км²)
  • Шлюз — Raspberry Pi с LoRa-модулем и MQTT-брокером (Mosquitto)
  • Панель — PHP-сайт с картой, точками и анализом последовательностей
  • Питание — 2–4 А·ч LiFePO4 + солнечная панель 5 В/2 Вт (опционально)

Что делает каждый узел?

Каждый «радар» выполняет три задачи:

  1. Слушает радиоэфир — 433 МГц и 915 МГц на предмет пакетов от БПЛА.
  2. Следит за землёй — PIR-датчик (HC-SR501) фиксирует движение людей или животных.
  3. Передаёт события — по LoRa на центральный шлюз, только при срабатывании (экономия энергии).

Режим работы — спящий большую часть времени. Просыпается каждые 10–30 секунд, проверяет эфир и PIR, и если есть событие — отправляет пакет.

Схема узла

ESP32:
  GPIO5  → RFM69 NSS (433 МГц)
  GPIO15 → RFM95 NSS (LoRa, 915 МГц)
  GPIO2  → RFM69 DIO0
  GPIO4  → RFM95 DIO0
  GPIO13 → PIR OUT
  GPIO25 → Бипер (опционально)

Питание:
  LiFePO4 3.2 В → через LDO на 3.3 В для всех модулей

Код узла: ESP32 + LoRa + PIR + RF

#include <SPI.h>  
#include <RH_RF69.h>  
#include <RH_RF95.h>  

#define RF69_FREQ 433.0
#define RF69_CS 5
#define RF69_INT 2

#define LORA_FREQ 915.0
#define LORA_CS 15
#define LORA_INT 4

#define PIR_PIN 13
#define BUZZER_PIN 25

RH_RF69 rf69(RF69_CS, RF69_INT);
RH_RF95 lora(LORA_CS, LORA_INT);

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW);

  // Инициализация RF69
  rf69.init();
  rf69.setFrequency(RF69_FREQ);

  // Инициализация LoRa (для отправки)
  lora.init();
  lora.setFrequency(LORA_FREQ);
  lora.setTxPower(20, false); // максимум для дальности
}

void sendEvent(const char* type) {
  String payload = String("{\"node\":\"radar_01\",\"event\":\"") + type + "\",\"rssi\":-1}";
  uint8_t buf[64];
  payload.getBytes(buf, sizeof(buf));
  lora.send(buf, strlen((char*)buf));
  lora.waitPacketSent();
}

void loop() {
  // Проверка PIR
  if (digitalRead(PIR_PIN) == HIGH) {
    digitalWrite(BUZZER_PIN, HIGH);
    delay(100);
    digitalWrite(BUZZER_PIN, LOW);
    sendEvent("pir_motion");
    delay(5000); // анти-спам
  }

  // Проверка 433 МГц
  uint8_t buf[32];
  uint8_t len = sizeof(buf);
  if (rf69.available() && rf69.recv(buf, &len)) {
    sendEvent("rf_433");
    digitalWrite(BUZZER_PIN, HIGH);
    delay(200);
    digitalWrite(BUZZER_PIN, LOW);
  }

  // Глубокий сон на 20 сек (в реальности — через esp_sleep_enable_timer_wakeup)
  delay(20000);
}

Шлюз: Raspberry Pi + LoRa + MQTT

На Raspberry Pi:

  • Подключён LoRa-модуль (например, Dragino Lora/GPS HAT)
  • Запущен Python-скрипт, который слушает LoRa и публикует события в MQTT
  • MQTT-брокер (Mosquitto) принимает сообщения и передаёт их PHP-панели

Пример Python-обработчика (упрощённо):

import paho.mqtt.client as mqtt
from datetime import datetime
import json

def on_lora_message(payload):
    data = json.loads(payload)
    data['timestamp'] = datetime.utcnow().isoformat()
    mqtt_client.publish("sensors/alert", json.dumps(data))

PHP-панель: карта угроз

На твоём сервере — PHP-скрипт, который:

  • Подписывается на MQTT (или читает из БД, куда скрипт шлюза пишет события)
  • Отображает карту (можно SVG или Canvas)
  • Рисует точки:
    • 🟢 Зелёная — узел онлайн
    • 🔴 Красная — сработал RF-детектор (дрон)
    • 🟡 Жёлтая — сработал PIR (человек)
    • 🔴🔴 Большая полупрозрачная окружность — длительная активность
  • Анализирует последовательности: если сработали узлы A → B → C — рисует стрелку движения

Пример структуры таблицы в MySQL:

CREATE TABLE sensor_events (
  id INT AUTO_INCREMENT,
  node_id VARCHAR(20),
  event_type ENUM('rf_433', 'pir_motion'),
  rssi INT,
  lat FLOAT,
  lng FLOAT,
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

Масштабирование: от 1 км² до 20 км

Сеть легко масштабируется:

  • Используй LoRaWAN вместо «сырого» LoRa — тогда можно подключать сотни узлов.
  • Добавь ретрансляторы на высоких точках (деревья, вышки).
  • Для питания — солнечные панели + LiFePO4 (они живут дольше обычных Li-ion).
  • Все узлы — в IP67-корпусах, с силиконовой заливкой.

Такая система может покрыть не только дачный участок, но и целый лесной массив.

Зачем это нужно?

Потому что:

  • Дрон с гранатой не пришлёт SMS перед атакой.
  • Человек в кустах может быть разведчиком.
  • Раннее предупреждение = время на реакцию.

И всё это — без облаков, без Google, без зависимости от внешних сервисов. Только твой сервер, твои датчики, твой код.

А как смотреть данные в лесу — без интернета и без облаков?

Хорошо, датчики расставлены, сеть работает, данные летят на шлюз. Но что, если вы находитесь прямо там — в лесу, у озера, на полевом лагере — и вам нужно знать: «Кто-то идёт? С какой стороны?» А интернета нет. И не будет. И облака — это не про вас.

Решение — локальная IoT-панель на том же шлюзе. Никаких зависимостей от внешнего мира.

Вариант 1: Мини-дисплей на шлюзе

К шлюзу (например, на ESP32 или Raspberry Pi) подключается компактный дисплей:

  • E-Ink экран — потребляет ток только при обновлении, идеален для батарейного питания. Показывает: «Последнее срабатывание: датчик №42, 2 мин назад, направление — север».
  • OLED 128x64 — яркий, контрастный, работает в темноте. Можно отображать мини-карту из точек или просто список активных зон.

Управление — одной кнопкой: «показать статус», «сбросить тревогу», «выйти в спящий режим».

Вариант 2: Локальный веб-сервер без интернета

Шлюз поднимает Wi-Fi точку доступа (AP mode). Вы подключаетесь к ней со смартфона — и открываете страницу вроде 192.168.4.1. Там — та же самая сетка из 100 точек, что и в домашней версии, но без облака, без DNS, без Google. Всё работает в изолированной сети.

Плюсы:

  • Не нужно тащить с собой ноутбук
  • Интерфейс знаком — браузер
  • Можно добавить звуковое оповещение на телефон через веб-аудио

Вариант 3: LoRa-«радар» на руку

Самый автономный вариант — отдельное портативное устройство:

  • Маленький LoRa-приёмник (на том же SX1278)
  • Микроконтроллер (ESP32 или ATmega)
  • Мини-OLED или даже просто LED-индикаторы по сторонам света
  • Питание от power bank или 18650

Устройство слушает эфир и при получении пакета от датчика мигает соответствующим светодиодом: север — синий, юг — красный и т.д. Это уже не панель, а тактильный радар движения — как у охотника или разведчика.

Такой подход полностью соответствует духу задачи: никаких внешних зависимостей, всё работает в радиомолчании, данные никуда не уходят, только к вам.

И да — если «война», то именно такие решения и остаются рабочими, когда всё остальное молчит.

Дополнение: Акустический радар для обнаружения БПЛА

Помимо инфракрасных датчиков движения (PIR) и радиочастотного мониторинга (Wi-Fi, 433 МГц), полезно добавить в систему периметрального контроля звуковой радар — устройство, способное распознавать характерные звуки беспилотников по их акустическому «отпечатку». Даже недорогой микрофон в связке с микроконтроллером и сервером анализа позволяет обнаруживать БПЛА на расстоянии до 100–300 метров в тихой местности. А если таких микрофонов расставить сотни или тысячи то можно охватить большой периметр. Но это радар из говна и палок, дорогие акустические датчики могут фиксировать звуки на 1км, ну или направленные делать в виде уха, как во вторую мировую слухачи определяли тип и примерную высоту самолета за десятки км.

Как это работает?

  1. Микрофон постоянно прослушивает окружение.
  2. При превышении порога громкости записывается короткий аудиофрагмент (2–5 сек).
  3. На устройстве или на сервере строится спектр звука (FFT).
  4. Спектр сравнивается с базой эталонных звуков дронов.
  5. Если совпадение выше заданного порога — генерируется событие тревоги и привязывается к координатам датчика.

Необходимое оборудование

  • Микрофон: INMP441 (I²S, 20 Гц – 20 кГц), SPH0645LM4H-B или MEMS-микрофон с АЦП.
  • Микроконтроллер: ESP32 (с поддержкой I²S) или Raspberry Pi Pico с внешним АЦП.
  • Передача данных: LoRa-модуль (например, SX1278) для отправки спектральных данных в условиях отсутствия Wi-Fi.
  • Питание: LiFePO4 аккумулятор + солнечная панель для автономной работы.

Что отправлять по LoRa?

Полный аудиофайл по LoRa передавать нецелесообразно — слишком медленно и объёмно. Вместо этого можно:

  • Вычислить на ESP32 упрощённый FFT (например, 32 или 64 бина).
  • Отправить вектор амплитуд по частотным диапазонам как массив байтов.
  • Добавить ID датчика и временную метку.

Пример кода для ESP32 (Arduino)

#include <driver/i2s.h>
#include <LoRa.h>

#define SAMPLE_RATE 16000
#define BUFFER_SIZE 1024
#define FFT_SIZE 64

int16_t samples[BUFFER_SIZE];
uint8_t fft_bins[FFT_SIZE];

void setup() {
Serial.begin(115200);
LoRa.setPins(18, 14, 26);
if (!LoRa.begin(433E6)) {
Serial.println("LoRa init failed");
while (1);
}

i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 4,
.dma_buf_len = BUFFER_SIZE / 2,
.use_apll = false
};

i2s_pin_config_t pin_config = {
.bck_io_num = 26,
.ws_io_num = 25,
.data_out_num = I2S_PIN_NO_CHANGE,
.data_in_num = 33
};

i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM_0, &pin_config);
}

void loop() {
// Ждём превышения порога (упрощённо — можно добавить детектор громкости)
delay(5000);

// Захватываем аудио
size_t bytes_read;
i2s_read(I2S_NUM_0, samples, sizeof(samples), &bytes_read, portMAX_DELAY);

// Упрощённый FFT (можно использовать библиотеку arduinoFFT)
// Здесь — заглушка: заполняем случайными значениями для примера
for (int i = 0; i < FFT_SIZE; i++) {
fft_bins[i] = abs(samples[i * (BUFFER_SIZE / FFT_SIZE)]) / 256;
if (fft_bins[i] > 255) fft_bins[i] = 255;
}

// Отправка по LoRa
LoRa.beginPacket();
LoRa.write(0x01); // тип пакета: звуковой радар
LoRa.write(0x42); // ID датчика (например, 66)
LoRa.write((uint8_t*)&fft_bins, FFT_SIZE);
LoRa.endPacket();

Serial.println("FFT sent via LoRa");
delay(10000);
}

Обработка на сервере (PHP + Python)

LoRa-шлюз принимает пакеты и передаёт их веб-серверу. Для анализа спектров лучше использовать Python (библиотеки librosa, numpy, scipy), но приём можно организовать через PHP:

<?php
// Пример приёма данных от LoRa-шлюза (через HTTP POST)
$data = file_get_contents('php://input');
$payload = unpack('Ctype/Csensor_id/C*', $data);

if ($payload['type'] === 1) {
$sensor_id = $payload['sensor_id'];
$fft = array_slice($payload, 3); // массив из 64 значений

// Сохраняем в БД или отправляем в Python-скрипт анализа
file_put_contents("spectra/sensor_{$sensor_id}_" . time() . ".bin", pack('C*', ...$fft));

// Запуск анализа (например, через shell_exec или очередь)
// shell_exec("python3 analyze_drone.py spectra/sensor_{$sensor_id}_*.bin &");
}
?>

Python-скрипт analyze_drone.py загружает эталонные спектры дронов, вычисляет косинусное сходство или использует простую нейросеть для классификации. При совпадении > 85% — в БД записывается событие:

INSERT INTO events (sensor_id, event_type, confidence, timestamp)
VALUES (66, 'drone_audio', 0.91, NOW());

Интеграция с общей картой событий

Теперь на твоей PHP-панели можно отображать не только сработавшие PIR-датчики, но и «звуковые тревоги» — например, полупрозрачный жёлтый круг вокруг датчика с подписью «подозрительный звук». Если в одной зоне одновременно сработали PIR, Wi-Fi-детектор и звуковой радар — система может автоматически повысить уровень угрозы.

Где взять эталонные звуки?

  • freesound.org — открытые записи двигателей дронов.
  • GitHub: Drone Detection Dataset.
  • Собери свою базу: запиши звук популярных дронов (DJI Mavic, Phantom и т.п.) на разном расстоянии.

Такой подход превращает простую сеть датчиков в мульти-модальную систему наблюдения, способную не просто фиксировать движение, а идентифицировать источник угрозы — даже если он не излучает радиосигналы.

«Радар» от БПЛА на коленке: что реально, а что — фантастика для дачников

В эпоху, когда олигархи строят подводные яхты, а Минобороны обещает «умные» комплексы за миллиард, простой смертный может собрать систему обнаружения дронов за цену пары бутылок виски. Но работает ли она? И главное — что именно она видит?

Что у нас есть на самом деле?

Забудь про «радар» в военном смысле. У тебя — пассивный RF-детектор: направленная антенна + приёмник + мозги (ESP32). Он не излучает, не меряет время отражения, не считает доплеровский сдвиг. Он просто слушает, как дрон «болтает» в эфире.

Что можно определить — и как

  • Направление (азимут) — да, если антенна поворачивается или их несколько. Точность: ±10–30°.
  • Факт присутствия — да, если дрон что-то передаёт (а почти все передают: управление, телеметрия, видео).
  • Тип сигнала — да: Wi-Fi (2.4 ГГц), телеметрия (433/868/915 МГц), видеопередатчик (5.8 ГГц).
  • Движется или нет — да, по изменению азимута и RSSI во времени.
  • Траектория — да, если узлов ≥3 и они синхронизированы по времени.

Что НЕЛЬЗЯ определить (несмотря на мечты)

  • Точное расстояние — нет. RSSI (уровень сигнала) зависит от мощности передатчика дрона, рельефа, листвы, фазы луны и настроения китайского инженера. Погрешность — от 50% до 300%.
  • Скорость в км/ч — нет. Можно оценить «быстро летит» vs «медленно ползёт», но без расстояния — только угловая скорость.
  • Высоту полёта — нет. Даже с двумя антеннами по вертикали — без калибровки и модели дрона это гадание на кофейной гуще.
  • Модель дрона — почти нет. Только если ловишь сигнатуру (например, DJI использует определённые MAC-адреса или пакеты), но это уже уровень хакера, а не дачника.

А можно ли отличить дрон от мобилы в лесу?

Да — и это главная фишка! Вот как:

  • Мобила/роутер: сигнал стабилен по азимуту и уровню, работает часами, частота — только 2.4/5 ГГц.
  • Дрон: сигнал меняется каждые 1–5 сек, часто есть компонент на 433 МГц, пакетов в секунду — 30+, работает 5–30 минут и исчезает.
  • Если сигнал «прошёл» от узла A к узлу B за 15 сек — это не грибник с телефоном. Это что-то летит.

Сколько стоит такой «радар»?

Примерная стоимость одного узла (2025, AliExpress, без военных компонентов):

КомпонентЦена (RUB)
ESP32-WROOM-32300
LoRa-модуль (433 МГц)350
Шаговый двигатель + драйвер200
Направленная антенна (433 МГц, DIY или готовая)300
Солнечная панель 5 Вт + power bank600
Корпус, провода, крепёж250
Итого на узел~2 000 ₽

Сеть из 4 узлов на 1 км² — 8–10 тыс. рублей. Для сравнения: яхта олигарха — от 500 000 000 ₽. Вывод: лучше вкладываться в СВО (Систему Внимательного Обнаружения) 😉.

Реалистичная дальность

  • В городе: 300–800 м (Wi-Fi, много помех).
  • На поле: 1–2.5 км (с направленной антенной).
  • В лесу: 0.5–1.5 км (433 МГц проходит лучше, чем 2.4 ГГц).

Но помни: это не радиус действия, а зона, где дрон ещё излучает достаточно сильно. Если он летит в «тихом режиме» (без телеметрии) — ты его не услышишь вообще. Но, у тебя будет сеть еще с PIR датчиками, а может и PIR радары круговые. Будут звуковые радары, и обработка звуков через нейросеть )) до кучи можно еще брать данные с народного мониторинга, слышал что уже есть сервисы где публикую данные про бпла. И на основе всей этой кучи данных принимать решение, показать тебе на экране ВНИМАНИЕ или не показать )))

Вывод

Такой «радар» — это не волшебная палочка, а инструмент осведомлённости. Он не скажет: «DJI Mavic 3, высота 60 м, скорость 12 км/ч, курс на твой погреб с вином». Но он скажет: «Эй, чувак, с северо-востока кто-то жужжит — и движется прямо к тебе». А для дачи, леса или периметра — этого более чем достаточно.

Главное — не ждать от китайского датчика за 200 рублей возможностей ПВО С-500. Иначе вместо защиты от дронов получишь защиту от собственных иллюзий.

Важно!

Система предназначена для пассивного наблюдения. Не используй её для подавления связи, вмешательства в работу чужих устройств или нарушения закона. Слушай — да. Глуши — нет.

Бонус для отмороженных: «ИИ-мозг» поверх RF-сетки

Если ты дочитал до этого места — поздравляю, ты официально отмороженный (в хорошем смысле). А раз уж пошли на это, давай добавим нейросеть, которая будет учиться отличать «деда с рацией» от «дрона с гранатой» — по тем же данным, что уже летят в твою базу.

Как это работает (без хайпа)

У тебя есть база:

timestamp | node_id | azimuth | rssi | freq_mhz | packet_rate | duration_sec
1729600123| 3       | 125     | -68  | 433      | 45          | 12
1729600128| 3       | 127     | -65  | 433      | 44          | 17
1729600133| 4       | 95      | -72  | 433      | 46          | 5

Это — временной ряд. Идеальный корм для простой нейросети. Ты помечаешь вручную: «это был дрон», «это — соседский Wi-Fi», «это — лиса с приклеенным ESP32». Через пару сотен таких записей — запускаешь обучение.

Архитектура (минималистичная, но рабочая)

  • Вход: [azimuth, rssi, freq_mhz, packet_rate, delta_time, node_sequence_flag]
  • Модель: простой MLP (многослойный перцептрон) или даже Random Forest
  • Выход: вероятность: [фон, дрон, человек, помеха]

RF-Радар обнаружения БПЛА

⚠️ Сигнал: 120° | RSSI: -62 dBm

Пассивный RF-радар: обнаружение по излучению (Wi-Fi/телеметрия). Не требует передатчика.

Пример API на Python (Flask + scikit-learn)

Да, это можно запустить даже на Raspberry Pi 4.

from flask import Flask, request, jsonify
import joblib
import numpy as np

app = Flask(__name__)
model = joblib.load('drone_classifier.pkl')  # обученная модель

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    # вход: [azimuth, rssi, freq, packet_rate, duration]
    X = np.array([[
        data['azimuth'],
        data['rssi'],
        data['freq_mhz'],
        data['packet_rate'],
        data['duration_sec']
    ]])
    proba = model.predict_proba(X)[0]
    classes = ['фон', 'дрон', 'человек', 'помеха']
    result = {cls: round(float(p), 3) for cls, p in zip(classes, proba)}
    return jsonify(result)

Как использовать в PHP-панели

// После получения данных от узла
$data = [
    'azimuth' => 125,
    'rssi' => -68,
    'freq_mhz' => 433,
    'packet_rate' => 45,
    'duration_sec' => 12
];

$ch = curl_init('http://localhost:5000/predict');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$ai = json_decode($response, true);
if ($ai['дрон'] > 0.85) {
    // 🔴 Тревога! Вероятность дрона — 85%+
    send_alert("Внимание! Дрон обнаружен с вероятностью " . ($ai['дрон']*100) . "%");
}

Насколько это реально?

— Для 90% случаев хватит даже правил в PHP (см. предыдущий блок). — Но если у тебя много ложных срабатываний (ветер в листве, рации, туристы) — ИИ поможет. — Обучать модель можно на Colab бесплатно, а потом экспортировать в .pkl. — А если совсем отморозиться — замени MLP на LSTM и анализируй последовательности как видео.

Главное — не верить, что «нейросеть всё решит», она может только «подсказать». Хотя кто знает, все дело в доработках и настройках, но нейросети — это лишь умный фильтр поверх твоих данных. А данные делает ты: сеть датчиков, логика, железо на дереве и солнечная панель, которая работает даже тогда, когда у олигарха отключили свет за неуплату.

Удачи в развёртывании. И пусть твоя сеть всегда будет тише леса — пока не наступит время заговорить.




Категории:

Категории

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

← Назад к списку статей

Посетителей сегодня: 0
о блоге | карта блога

© Digital Specialist | Не являемся сотрудниками Google, Яндекса и NASA