↩️ Назад

Категории

Звуковой радар своими руками: слушаем небо на Raspberry Pi

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

Дешвый звуковой радар против дронов и БПЛА на Raspberry Pi

Так мыслишки, вроде где то уже идейку писал но вот еще разок. Надо сделать звуковой радар против дронов. А то какую то куйню в новосятх пишут, вдруг откуда ни возьмись повяилася в ... взорвал НПЗ никто не заметил как дрон пролетел через всю страну )) Пока идея, но вроде вполне реализиуема. Кому интересно может продолжить.
Или: как из «говна и палок» сделать систему раннего обнаружения летающих штук с ДВС — без радаров, без RF, без разрешений.

Если вы слышали, как скутер без глушителя переключает передачи за 5 км — вы уже наполовину звуковой радар. Осталось автоматизировать.

Зачем это вообще?

  • Радары не видят низколетящие цели за горами и лесами.
  • RF-детекторы не работают против самодельных БПЛА без Wi-Fi.
  • А вот звук двигателя без глушителя — слышен за километры, особенно ночью.
  • И его невозможно заглушить, не заглушив сам двигатель.

Задача: пассивно слушать, понимать — «это не птица», и хотя бы знать, откуда пришёл звук.

Что понадобится (бюджет ~7 тыс. ₽)

  • Raspberry Pi Zero 2 W (или Orange Pi Zero) — 2000 ₽
  • 2 шт. цифровых микрофона INMP441 (I2S) — по 700 ₽
  • Плата-адаптер или пайка вручную — можно без неё
  • Аккумулятор + солнечная панель (опционально) — от 1000 ₽
  • Корпус, провода, термоусадка — что найдётся

Почему INMP441? Он цифровой, малошумный, хорошо ловит низкие частоты (50–500 Гц), и его легко подключить по шине I2S к Pi.

Как это работает: TDOA

Мы используем метод Time Difference of Arrival (TDOA):

  1. Звук доходит до одного микрофона чуть раньше, чем до второго.
  2. Разница во времени — микросекунды.
  3. Из неё можно вычислить угол прихода (азимут).

Формула упрощённо:

Δt = (d * sin(θ)) / v
→ θ = arcsin((Δt * v) / d)

Где:

  • Δt — разница во времени,
  • d — расстояние между микрофонами (например, 0.3 м),
  • v — скорость звука (~343 м/с),
  • θ — угол от перпендикуляра к базе.

Подключение микрофонов к Raspberry Pi

INMP441 — I2S-микрофон. Подключаем так:

INMP441 #1      → Raspberry Pi
--------------------------------
LRCLK (WS)      → GPIO18 (PIN12)
BCLK (SCK)      → GPIO19 (PIN35)
DOUT (SD)       → GPIO20 (PIN38)
GND             → GND
3.3V            → 3.3V
L/R             → GND (левый) / 3.3V (правый)

То же самое — для второго микрофона, но L/R наоборот.

Включаем I2S в /boot/config.txt:

dtparam=i2s=on
dtoverlay=i2s-mmap

Проверяем:

arecord -l
# Должен появиться «audioinjector-pi-soundcard» или подобное

Простой Python-скрипт для определения направления

Устанавливаем зависимости:

sudo apt install python3-pip libatlas-base-dev
pip3 install numpy pyaudio

Код (упрощённая версия):

import pyaudio
import numpy as np

# Настройки
RATE = 48000
CHUNK = 4096
FORMAT = pyaudio.paInt16
CHANNELS = 2

p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

def cross_correlation(sig1, sig2):
    corr = np.correlate(sig1 - np.mean(sig1), sig2 - np.mean(sig2), mode='full')
    return corr.argmax() - (len(sig2) - 1)

while True:
    data = np.frombuffer(stream.read(CHUNK), dtype=np.int16)
    left = data[0::2]
    right = data[1::2]
    
    delay = cross_correlation(left, right)
    # Переводим в микросекунды
    dt = delay / RATE * 1e6  # мкс
    print(f"Задержка: {dt:.1f} мкс")
    
    # Пример: если |dt| > 200 мкс → есть направление
    if abs(dt) > 200:
        print("⚠️ Обнаружен направленный звук!")

Это база. Дальше можно:

  • Фильтровать низкие частоты (50–800 Гц),
  • Считать уровень сигнала (SPL),
  • Отправлять в Telegram при обнаружении «двигателя».

Что дальше? (Твой ход!)

  • Вращающаяся «труба»: поставь микрофоны на сервопривод — сканируй горизонт.
  • Параболическое зеркало: вырежь из фанеры, обклей фольгой — +15 дБ усиления.
  • Сеть постов: несколько «слушалок» → триангуляция положения!
  • ИИ-классификатор: обучи модель распознавать «скутер», «самолёт», «ветер».

А теоретические 20 км? Ну… если поставить такой пост в тайге ночью при инверсии — и объект с мощным мотором летит низко… почему бы и нет? Главное — **слушать первым**.

IoT-версия: звуковой радар на ESP32 + LoRa, питание от батареек (с аналоговым триггером)

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

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

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

  • Аналоговый сторож (микрофон + компаратор) — работает всегда, потребляет ~0.3 мА.
  • ESP32 — спит в deep sleep (~10 мкА), просыпается по сигналу от сторожа.
  • Цифровые I2S-микрофоны — включаются только после пробуждения для анализа.
  • LoRa — передаёт данные, затем всё снова засыпает.

Что понадобится

  • ESP32-WROOM-32
  • 2 шт. I2S-микрофона (INMP441 или SPH0645)
  • Модуль LoRa (SX1278, 868 МГц)
  • Электретный микрофон (капсула или модуль KY-038)
  • Операционный усилитель/компаратор (LM358 или MCP6002)
  • Потенциометр 10 кОм, диод 1N4148, конденсаторы 100 нФ / 10 мкФ
  • Аккумулятор 18650 + TP4056

Схема подключения «сторожа»

Подключаем выход компаратора («DO» модуля KY-038 или самодельной схемы) к GPIO34 ESP32.

[Аналоговый звуковой модуль]
        DO → GPIO34 (EXT0 wake-up pin)
        GND → GND
        VCC → 3.3V

⚠️ Только GPIO32–39 поддерживают EXT0 wake-up из deep sleep. GPIO34–39 — входы только, но этого достаточно.

Оценка времени работы

Потребление:
- Сторож: 0.3 мА (постоянно)
- ESP32 в сне: 0.01 мА
- ESP32 активен: ~80 мА, но только 2–3 сек после события

Если событий мало (1–2 раза в день):
→ Средний ток ≈ 0.31 мА

Батарея 3000 мА·ч:
T = 3000 / 0.31 ≈ 9677 ч ≈ 13 месяцев!

Даже без солнца — такой узел проработает **почти год**. А с солнечной панелью — **вечно**.

Код для ESP32 (Arduino IDE)

Установи библиотеки: LoRa, I2S.

#include <I2S.h>  
#include <LoRa.h>  
#include <driver/rtc_io.h>  

#define WAKEUP_PIN 34  // EXT0 pin (только 32-39)

// Настройки аудио
#define SAMPLE_RATE 16000
#define BUFFER_SIZE 1024
#define MIC_LEFT  0

void setup() {
  Serial.begin(115200);
  
  // Проверяем причину пробуждения
  esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
  if (wakeup_reason == ESP_SLEEP_WAKEUP_EXT0) {
    Serial.println("Пробуждение: громкий звук!");
    
    // Инициализация I2S
    I2S.setAllPins(25, 26, 27); // BCK, DIN, LRCK
    I2S.begin(I2S_PHILIPS_MODE, SAMPLE_RATE, 16);
    
    // Инициализация LoRa
    SPI.begin(18, 19, 23, 5);
    LoRa.setPins(5, 14, 2);
    LoRa.begin(868E6);
    LoRa.setTxPower(17);
    
    // Анализ звука (можно улучшить)
    if (detectEngine()) {
      sendData(estimateAzimuth());
    }
    
    delay(1000); // дать всем завершиться
  } else {
    Serial.println("Холодный старт — засыпаю.");
  }

  // Готовимся к глубокому сну
  esp_sleep_enable_ext0_wakeup((gpio_num_t)WAKEUP_PIN, 1); // HIGH = пробуждение
  esp_deep_sleep_start();
}

bool detectEngine() {
  int16_t samples[BUFFER_SIZE];
  I2S.read(samples, BUFFER_SIZE * sizeof(int16_t));
  
  long sum = 0;
  for (int i = 0; i < BUFFER_SIZE; i += 2) {
    int16_t val = samples[i + MIC_LEFT];
    sum += (long)val * val;
  }
  float rms = sqrt((float)sum / (BUFFER_SIZE / 2));
  return (rms > 1500); // порог подбирается
}

float estimateAzimuth() {
  // Упрощённо: можно расширить позже
  return 180.0; // заглушка
}

void sendData(float azimuth) {
  LoRa.beginPacket();
  LoRa.write(0xAA);
  LoRa.write((uint8_t)azimuth);
  LoRa.write(0x55);
  LoRa.endPacket();
  Serial.println("LoRa: данные отправлены");
}

Как настроить аналоговый модуль

  1. Подключи модуль KY-038 к 3.3 В.
  2. Поверни потенциометр на модуле так, чтобы светодиод не горел в тишине.
  3. Хлопни в ладоши или включи скутер — светодиод должен мигнуть.
  4. Теперь выход DO будет подавать HIGH при громком звуке — этого хватит, чтобы разбудить ESP32.

Что получаем?

  • Полностью пассивный, батарейный узел обнаружения.
  • Работает до года от одной 18650.
  • Передаёт данные по LoRa на 5–10 км.
  • Можно расставить по лесу — и знать, где «что-то гудит».

Это не фантастика. Это — IoT-радар настоящего самоделкина.

Вывод

Звуковой радар — это не магия. Это:

  • Физика,
  • Два микрофона,
  • Кусок кода,
  • И немного здравого смысла.

И иногда — это единственное, что замечает, что «что-то не так в небе».

Автор: самоделкин с дачи.
Лицензия: делай, копируй, улучшай — но не продавай как своё.
Обновлено: ноябрь 2025.




Категории:

Категории

Комментарии

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

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

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

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

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