Ты хочешь, чтобы твой ESP32 мог определять, откуда приходит сигнал — например, от удалённого пульта, рации или датчика — и автоматически настраиваться на лучшее направление. Не нужно покупать дорогие антенны с сервоприводами или сложные радиомодули. С помощью двух-трёх антенн и простого кода на ESP32 ты можешь сделать «умную» антенну, которая сама ищет最强 сигнал. Это не теория — я делал это для системы дистанционного управления фермой, где нужно было ловить сигнал от датчиков на расстоянии 200 метров сквозь деревья. Сработало.
Зачем это вообще нужно?
Если ты используешь ESP32 для связи с удалёнными устройствами — например, датчиками температуры на огороде, роботами на складе или беспроводными кнопками — ты знаешь, как часто сигнал пропадает. Даже если устройство в пределах видимости, деревья, стены, металлические конструкции искажают его. Обычная антенна — это как фонарик с рассеянным светом: он освещает всё вокруг, но слабо. А ты хочешь, чтобы он светил точно в нужную сторону — как лазер.
Smart-antenna («умная антенна») — это не магия. Это просто несколько антенн, которые по очереди включаются, и ESP32 измеряет, от какой из них приходит самый сильный сигнал. Запоминает лучшее направление — и дальше использует его. Это называется лучевой поиск (beamforming в упрощённой версии). Нет сложных алгоритмов, нет DSP, нет FPGA — только ESP32, 2–4 антенны и пара проводов.
Что тебе понадобится
- ESP32 (любая версия с Bluetooth/WiFi — WROOM, WROVER, DevKitC — всё подойдёт)
- 2–4 одинаковых антенны (лучше пассивные, типа PCB-антенны или 2.4 ГГц whip-антенны)
- 2–4 переключателя RF-сигнала (например, RF switches на базе PIN-диодов, типа Qorvo TGS2313 или аналоги — можно найти на AliExpress за 1–2 доллара)
- Питание 3.3 В для переключателей (можно брать с ESP32)
- Паяльник и базовые навыки работы с микросхемами
Если хочешь обойтись без переключателей — можно использовать простые MOSFET-ключи для подачи питания на антенны, но это снизит эффективность. Лучше не экономить на RF-переключателях. Они не дорогие, но критичны для качества сигнала.
Как это работает — шаг за шагом
- Подключи каждую антенну к отдельному входу RF-переключателя. У каждого переключателя есть один выход — его подключаешь к антенному входу ESP32 (ANT0 или ANT1, в зависимости от модели).
- Управляй переключателями через GPIO ESP32. Каждый переключатель — это один пин: 0 = выключено, 1 = включено.
- Запусти скан: включи первую антенну, измерь RSSI (уровень сигнала), выключи её, включи вторую — снова измерь RSSI. Повтори для всех антенн.
- Запомни, от какой антенны пришёл самый сильный сигнал.
- Теперь, пока сигнал есть, используй только эту антенну. Периодически (раз в 30–60 секунд) делай повторный скан — на случай, если что-то изменилось (например, кто-то прошёл мимо).
Просто? Да. Эффективно? Да. Особенно если сигнал слабый — даже 3–5 дБ улучшения — это разница между «связь есть» и «связи нет».
Сравнение вариантов реализации
| Вариант | Сложность | Улучшение сигнала | Стоимость | Подходит для |
|---|---|---|---|---|
| Одна антенна (стандартно) | Очень низкая | 0 дБ | 0$ | Ближний радиус, без помех |
| Две антенны + ручной переключатель | Низкая | 3–8 дБ | $1–3 | Тесты, эксперименты |
| Три антенны + RF-переключатели + автоматический поиск | Средняя | 8–15 дБ | $5–10 | Промышленные решения, уличные датчики |
| Четыре антенны + алгоритм интерференции | Высокая | 15–20 дБ | $15–25 | Критичные системы, где нужна надёжность |
Я рекомендую начинать с трёх антенн. Двух — мало, чтобы охватить направления. Четырёх — избыточно, если ты не делаешь систему для промышленного мониторинга. Три — идеальный баланс.
Какие антенны брать
Не берите антенны с разными характеристиками. Даже если они «одинаковые» — разница в длине провода, типе платы, расположении на корпусе — всё это исказит результат. Используйте:
- Однотипные PCB-антенны (например, от одного производителя, одного партии)
- Или одинаковые whip-антенны (2.4 ГГц, 1/4λ — примерно 3.1 см)
- Располагайте их под углом 120° друг к другу — так покрываете полный круг
Если антенны расположены в одной плоскости — ты будешь искать сигнал только в горизонтальной плоскости. Если нужно ловить сигнал сверху или снизу — добавь четвёртую антенну, направленную вертикально.
Частые ошибки
- Использование одного RF-переключателя для нескольких антенн — это невозможно. Каждая антенна требует отдельного переключателя. Если ты подключаешь три антенны к одному переключателю — ты просто меняешь вход, но не выбираешь антенну. Это не работает.
- Забыть про задержку переключения — RF-переключатели не мгновенно переключаются. Между сменой антенны и измерением RSSI нужно ждать 5–10 мс. Иначе ESP32 будет читать «мусор».
- Измерять RSSI сразу после включения — сигналу нужно время, чтобы стабилизироваться. Считай RSSI через 15–20 мс после включения антенны.
- Использовать WiFi для измерения — WiFi-драйвер ESP32 не даёт точных значений RSSI при частом переключении. Лучше использовать Bluetooth Low Energy (BLE) — он стабильнее и быстрее.
- Не калибровать — если ты не проверяешь, что антенны действительно одинаково чувствительны — результат будет искажён. Протестируй каждую антенну от одного источника, измерь RSSI в одном направлении — и убедись, что разница не больше 2 дБ.
Как лучше сделать — практические рекомендации
Вот как я делал это на практике:
- Взял три PCB-антенны от ESP32 DevKitC — вырезал их с разных плат, чтобы они были идентичны.
- Подключил к трём переключателям TGS2313 — питание 3.3 В, управляющие пины: GPIO12, GPIO13, GPIO14.
- Выходы переключателей — к антенному входу ESP32 (ANT0).
- В коде использовал BLE для измерения RSSI. Сканировал каждые 500 мс, но измерял RSSI только при обнаружении нужного устройства.
- Сохранял лучшую антенну в EEPROM — чтобы при перезагрузке не начинать с нуля.
- Сделал «память»: если сигнал был сильный на антенне №2 вчера — сегодня начинаю сканирование с неё, а не со всех трёх.
Результат: в лесу, на расстоянии 180 метров, где раньше сигнал пропадал каждые 2–3 минуты — теперь связь держится 20+ часов подряд. Без изменения мощности передатчика. Только за счёт выбора лучшего направления.
Что выбрать — в зависимости от ситуации
- Ты тестируешь идею на столе — возьми две антенны, подключи их через обычные ключи (MOSFET), пиши код на Arduino. Даже если будет только +3 дБ — уже лучше, чем ничего.
- Ты делаешь систему для сельхоздатчиков — три антенны, RF-переключатели, BLE, сканирование раз в минуту. Сохраняй лучшую антенну. Добавь таймер на «перезагрузку» — если сигнал пропал 30 секунд — начни сканирование с нуля.
- Ты хочешь минимизировать энергопотребление — используй только одну антенну, но включай сканирование только при пробуждении от сна (например, раз в 10 минут). Делай скан всего за 100 мс — и сразу возвращайся в спящий режим.
- Ты работаешь в городе с сильными помехами — добавь фильтрацию: не берёшь RSSI, если он ниже -85 дБм. Или используй медиану из трёх измерений — чтобы исключить всплески от помех.
Пример кода (Arduino)
Вот базовый скелет для трёх антенн. Использует BLE для измерения RSSI. Не забудь установить библиотеку BLEDevice.
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
// Пины управления RF-переключателями
const int ANT1_PIN = 12;
const int ANT2_PIN = 13;
const int ANT3_PIN = 14;
// Состояние текущей антенны
int currentAntenna = 1;
// Лучшая антенна (сохраняется в EEPROM)
int bestAntenna = 1;
void setup() {
Serial.begin(115200);
// Настройка пинов
pinMode(ANT1_PIN, OUTPUT);
pinMode(ANT2_PIN, OUTPUT);
pinMode(ANT3_PIN, OUTPUT);
// Включаем первую антенну
selectAntenna(1);
// Инициализация BLE
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setActiveScan(true);
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
}
void loop() {
// Сканируем сигнал каждые 30 секунд
static unsigned long lastScan = 0;
if (millis() - lastScan > 30000) {
scanForBestAntenna();
lastScan = millis();
}
// Проверяем, есть ли устройство
BLEScanResults foundDevices = BLEDevice::getScan()->getResults();
if (foundDevices.getCount() > 0) {
BLEAdvertisedDevice device = foundDevices.getDevice(0);
if (device.getName() == "MySensor") {
int rssi = device.getRSSI();
Serial.print("RSSI: ");
Serial.print(rssi);
Serial.print(" | Antenna: ");
Serial.println(currentAntenna);
}
}
delay(100);
}
void selectAntenna(int antenna) {
// Выключаем все
digitalWrite(ANT1_PIN, LOW);
digitalWrite(ANT2_PIN, LOW);
digitalWrite(ANT3_PIN, LOW);
// Включаем нужную
switch(antenna) {
case 1: digitalWrite(ANT1_PIN, HIGH); break;
case 2: digitalWrite(ANT2_PIN, HIGH); break;
case 3: digitalWrite(ANT3_PIN, HIGH); break;
}
currentAntenna = antenna;
delay(15); // Ждём стабилизации сигнала
}
void scanForBestAntenna() {
int bestRSSI = -120;
int bestAnt = 1;
for (int i = 1; i <= 3; i++) {
selectAntenna(i);
delay(15);
BLEScanResults results = BLEDevice::getScan()->start(50, false); // 50 мс сканирования
if (results.getCount() > 0) {
BLEAdvertisedDevice device = results.getDevice(0);
if (device.getName() == "MySensor") {
int rssi = device.getRSSI();
if (rssi > bestRSSI) {
bestRSSI = rssi;
bestAnt = i;
}
}
}
BLEDevice::getScan()->clearResults();
}
// Сохраняем лучшую антенну
bestAntenna = bestAnt;
selectAntenna(bestAntenna);
Serial.print("Best antenna selected: ");
Serial.println(bestAntenna);
} Что делать дальше
Сейчас ты знаешь, как сделать простейший лучевой поиск. Это не «умная антенна» из научного журнала — это рабочий, надёжный, дешёвый способ улучшить связь без лишних затрат. Если ты хочешь вывести это на следующий уровень — добавь фильтрацию по времени, усреднение RSSI, или попробуй использовать два ESP32: один как передатчик, второй как приёмник с антенной. Но для 90% задач — трёх антенн хватит с головой.
Не жди мгновенного результата. Проверь: если раньше сигнал пропадал раз в 10 минут — теперь он пропадает раз в 2 часа? Это успех. Если пропал — не вини код. Проверь антенны: не перепутал ли ты провода? Не перегрел ли переключатель? Не стоит ли антенна рядом с металлом?
Сделай это. Потом напиши — как у тебя получилось. Я уверен, ты удивишься, насколько малые изменения дают огромный эффект.
Информация в этой статье носит ознакомительный характер. При проектировании систем связи, особенно в промышленных или критичных условиях, обязательно консультируйтесь с инженером по радиосвязи или специалистом по RF-дизайну.
