Категории

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

2025-10-21 22:07:06 | Статья из категории: Безопасность

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

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

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

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

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

  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:

Пример 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-скрипт, который:

Пример структуры таблицы в 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 км

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

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

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

Потому что:

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

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

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

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

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

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

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

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

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

Плюсы:

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

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

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

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

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

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

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

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

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

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

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

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

Пример кода для 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-детектор и звуковой радар — система может автоматически повысить уровень угрозы.

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

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

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

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

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

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

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

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

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

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

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

Примерная стоимость одного узла (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 ₽. Вывод: лучше вкладываться в СВО (Систему Внимательного Обнаружения) 😉.

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

Но помни: это не радиус действия, а зона, где дрон ещё излучает достаточно сильно. Если он летит в «тихом режиме» (без телеметрии) — ты его не услышишь вообще. Но, у тебя будет сеть еще с 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». Через пару сотен таких записей — запускаешь обучение.

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

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