Захотелось ПВО сделать для дачи, в виде глушилок БПЛА. Но увы, законом это запрещено. Тогда будет радар для дачи, ну не только, может кому и в реальных боевых действиях пригодится. По логике, коллапс неизбежен, но это уже другая история. Один радар в окопе — хорошо. А сеть из десятков радаров по периметру леса — уже система раннего предупреждения. Ну хотяб двустволку успеть зарядить) Представь: ты расставил 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 Вт (опционально)
Что делает каждый узел?
Каждый «радар» выполняет три задачи:
- Слушает радиоэфир — 433 МГц и 915 МГц на предмет пакетов от БПЛА.
- Следит за землёй — PIR-датчик (HC-SR501) фиксирует движение людей или животных.
- Передаёт события — по 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км, ну или направленные делать в виде уха, как во вторую мировую слухачи определяли тип и примерную высоту самолета за десятки км.
Как это работает?
- Микрофон постоянно прослушивает окружение.
- При превышении порога громкости записывается короткий аудиофрагмент (2–5 сек).
- На устройстве или на сервере строится спектр звука (FFT).
- Спектр сравнивается с базой эталонных звуков дронов.
- Если совпадение выше заданного порога — генерируется событие тревоги и привязывается к координатам датчика.
Необходимое оборудование
- Микрофон: 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-32 | 300 |
| LoRa-модуль (433 МГц) | 350 |
| Шаговый двигатель + драйвер | 200 |
| Направленная антенна (433 МГц, DIY или готовая) | 300 |
| Солнечная панель 5 Вт + power bank | 600 |
| Корпус, провода, крепёж | 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-Радар обнаружения БПЛА
Пассивный 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 и анализируй последовательности как видео.
Главное — не верить, что «нейросеть всё решит», она может только «подсказать». Хотя кто знает, все дело в доработках и настройках, но нейросети — это лишь умный фильтр поверх твоих данных. А данные делает ты: сеть датчиков, логика, железо на дереве и солнечная панель, которая работает даже тогда, когда у олигарха отключили свет за неуплату.
Удачи в развёртывании. И пусть твоя сеть всегда будет тише леса — пока не наступит время заговорить.
Комментарии
Пока нет комментариев. Будьте первым!