FoxHunter — охота на лис на LoRa
Спортивная радиопеленгация («охота на лис») на LoRa: три роли на одинаковых модулях E77-900MBL (STM32WLE5). Лиса — маяк-передатчик, 9-байтовый пакет каждые 300 мс. Охотник — приёмник с зуммером: в режиме зон пищит тем чаще, чем сильнее сигнал; в режиме пеленга на каждый пакет щёлкает тоном, высота которого растёт с уровнем сигнала. Фальшлиса — учебный «атакующий» для углублённого блока о защите радиосвязи.
На этом стенде построен курс из восьми уроков труда для 7 класса. Ученики ищут лису по уровню сигнала на этаже, измеряют, как сигнал слабеет с расстоянием, изготавливают из медной проволоки 2 мм направленную антенну Яги по чертежу и технологической карте, проверяют её замером «вперёд/назад» и берут ею пеленг во дворе школы. Три углублённых урока для кружка разбирают подпись пакета, счётчик кадров и перебор подписи.
Карта курса: FoxHunter — охота на лис
Курс для уроков труда в 7 классе. Ученики ищут спрятанный радиопередатчик по уровню сигнала, изготавливают направленную антенну Яги из медной проволоки 2 мм и деревянной рейки, проверяют её замером и берут ею пеленг во дворе школы. Полные поурочные разработки в формате технологической карты — в разделе «Курс: охота на лис».
Стенд: модули E77-900MBL (STM32WLE5) в трёх ролях. Лиса — маяк, 9-байтовый пакет каждые 300 мс. Охотник — приёмник с зуммером: в режиме зон частота пиков растёт с уровнем сигнала, в режиме пеленга на каждый пакет щелчок, высота тона растёт с уровнем. Фальшлиса — учебный «атакующий» для углублённого блока.
Как распределена сложность
В основной линии нет логарифмов. Ученик пользуется тремя правилами:
- +3 дБ — вдвое, +10 дБ — вдесятеро;
- удвоил расстояние — минус 6 дБ на открытом месте, минус 9 дБ в здании;
- длина волны в метрах = 300 / частоту в МГц.
Каждое правило ученик сначала видит в своих числах: на экране охотника, в таблице замеров, на линейке. Выводы формул — в разделе «Глубже» каждого урока.
Уроки
| № | Тема | Модуль ФРП | Что остаётся после урока |
|---|---|---|---|
| 1 | Найти лису на слух | Робототехника | лиса найдена, правило поиска записано |
| 2 | Децибелы и мощность лисы | Робототехника | таблица затухания на 1–16 м, вывод о мощности |
| 3 | Три лисы по очереди | Робототехника | три лисы найдены, объяснено расписание |
| 4 | Антенна и тень тела | Робототехника | расчёт длины волны, диаграмма направленности тела |
| 5 | Яги: чертёж и заготовки | Технологии обработки материалов | элементы и стрела в допуске |
| 6 | Яги: сборка и проверка | Технологии обработки материалов | антенна, протокол испытаний, «вперёд/назад» ≥ 10 дБ |
| 7 | Пеленг во дворе | Компьютерная графика. Черчение | засечка на плане 1:500, лиса найдена |
| 8 | Соревнование | Робототехника | протокол, разбор тактики |
| 9 | Подпись против подмены | углублённо, 14+ | модель угроз |
| 10 | Счётчик кадров | углублённо, 14+ | правило различения ребута и повтора, его слабое место |
| 11 | Перебор и длина ключа | углублённо, 14+ | расчёт времени перебора |
Изделие курса
Антенна Яги на 869 МГц: рефлектор 168 мм, вибратор 2 × 79 мм с зазором 4 мм,
директор 148 мм, расстояния 70 и 55 мм, стрела 250 × 20 × 10 мм. Размеры
рассчитаны программой NEC-2 для меди 2 мм: усиление 8,2 дБи, отношение
«вперёд/назад» 25 дБ, ширина луча в горизонтальной плоскости около 90°,
входное сопротивление 30 Ом. При ошибках изготовления ±2 мм по длине
отношение «вперёд/назад» в расчёте не опускается ниже 18 дБ. Чертёж —
img/yagi-869.svg.
Перенос в другие темы
| Что освоено | Где встретится снова |
|---|---|
| дБм, затухание с расстоянием | WarWalk (бюджет радиолинии), планирование Wi-Fi дома |
| Насыщение шкалы прибора | весы, фотоэкспозиция, АЦП |
| Разделение эфира по времени | сотовая связь, промышленные шины |
| Длина волны и полуволновой вибратор | любая антенна: Wi-Fi, ТВ, рации |
| Технологическая карта, допуск, контроль изделия | все практические работы труда |
| Пеленг и засечка | ориентирование, навигация по маякам |
| Подпись и счётчик кадров (углублённо) | LoRaWAN в PowerSentry, банковские карты, автомобильные брелоки |
Презентация курса: FoxHunter — охота на лис
Слайд 1. Найти то, чего не видно
- Спрятан радиопередатчик — «лиса». Он молчит и ничем себя не выдаёт.
- У команды приёмник — «охотник». Он не показывает, куда идти: только пищит чаще, когда сигнал сильнее.
- Задача урока 1: найти лису на этаже за 15 минут.
Слайд 2. Сигнал в числах
- Сила сигнала на экране — RSSI в дБм: −40 сильнее, чем −70.
- +3 дБ — вдвое, +10 дБ — вдесятеро.
- Удвоил расстояние — минус 6–9 дБ. Это мы измерим в коридоре.
- Слишком мощную лису найти труднее: охотник звучит одинаково по всему этажу.
Слайд 3. Три лисы на одной частоте
- Лисы говорят по очереди, по 20 секунд. Номер лисы — число пиков.
- Так устроены настоящие соревнования по радиопеленгации.
- Охотник сглаживает скачки сигнала: звук спокойнее, но опаздывает.
Слайд 4. Антенна, которая показывает направление
- Длина волны = 300 / 869 = 34,5 см. Вибратор — около полуволны.
- Тело закрывает сигнал: лиса за спиной слышна слабее на 10–15 дБ.
- Антенна Яги делает то же медью: рефлектор сзади, директор спереди.
Слайд 5. Изделие: антенна Яги
- Медная проволока 2 мм, сосновая рейка, кабель с разъёмом.
- Рефлектор 168, вибратор 2 × 79, директор 148, расстояния 70 и 55 мм, допуск ±2.
- Проверка: сигнал спереди сильнее, чем сзади, на 10 дБ и больше.
Слайд 6. Пеленг и засечка
- Направление ищут по двум спадам звука: середина между ними — на лису.
- Три линии пеленга на плане двора 1:500 сходятся в треугольник.
- Итог курса — соревнование: три лисы, 25 минут, своя антенна.
FOXHUNT — подготовка учителя к курсу
Курс — восемь уроков для 7 класса и три углублённых для кружка. Поурочные
разработки лежат в Uroki/, на сайте — в разделе «Курс: охота на лис». Этот
файл — что сделать до уроков и как не наступить на известные грабли.
Линия курса
| Уроки | Что делают ученики | Где |
|---|---|---|
| 1–3 | Ищут лису по частоте писка, меряют затухание, ищут три лисы по расписанию | этаж, коридор |
| 4 | Считают длину волны, снимают диаграмму тени тела | спортзал или двор |
| 5–6 | Изготавливают антенну Яги по чертежу и проверяют её замером | мастерская, двор |
| 7–8 | Берут пеленг, строят засечку на плане, соревнуются | двор |
| 9–11 | Подпись, счётчик кадров, перебор подписи — кружок, 14+ | кабинет |
Порядок важен. В здании отражения от стен не дают взять направление, поэтому поиск начинается с уровня сигнала. Антенну делают, когда ученики уже знают, зачем она нужна.
Подготовка до курса
- Прошить три лисы (
FOX_ID1, 2, 3) и охотники. Удобно держать два набора охотников:BEARING_MODE 0для уроков 1–3 иBEARING_MODE 1для 4–8. Если охотников мало — перепрошивать перед уроком 4. - Для урока 2 — вторая лиса, прошитая на 14 дБм: на уроке перепрошивать некогда.
- Для урока 3 — два охотника с
RSSI_AVG_N 1иRSSI_AVG_N 7для демонстрации. - Для уроков 5–6 — заготовить медную жилу 2 мм отрезками по 60 см (снять изоляцию с ВВГ 4 мм² заранее), рейки 250 × 20 × 10, кабели с разъёмом под антенный вход E77, ферритовые защёлки. Проверить, какой разъём на ваших платах: SMA или IPEX.
- Для урока 7 — план двора в масштабе 1:500, три азимутальных круга (транспортир 360° на картоне).
- Проверить каждого охотника у лисы: рядом сплошной тон, в 20 шагах — пики.
Подключение зуммера
Код рассчитан на пассивный пьезозуммер (молчит от постоянного напряжения,
звучит от tone()).
PA0 ──[ 100 Ом ]──┬── «+» зуммера
│
«−» зуммера ── GNDРезистор обязателен: на фронте пьезоэлемент ведёт себя как конденсатор и даёт бросок тока, а пин STM32WLE5 рассчитан примерно на 20 мА. Тише — 220–470 Ом, громче — 47 Ом, не меньше.
Активный зуммер (пищит сам от постоянного напряжения) напрямую от пина не
питают: нужен транзисторный ключ, а код придётся переписать с tone() на
digitalWrite. Проще купить пассивный.
Известные ловушки
- Лиса в том же кабинете. При 2 дБм сплошной тон звучит в радиусе около
10 м — весь кабинет одна зона. Лису прячут на этаже в 20–40 м. В спортзале —
лиса −9 дБм и охотники с
ZONE_SHIFT_DB 15. - Лисы включили вразнобой. Расписание отсчитывается от включения. Все лисы включают одновременно, по счёту.
- Лиса лежит на боку. Антенна лисы должна стоять вертикально, иначе направленная антенна охотника теряет до 20 дБ, а пеленг не берётся.
- Яги держат горизонтально. Элементы — вертикально, как у лисы.
- Охотник у стены. Отражения создают провалы сигнала. Смотреть, как меняется звук за несколько шагов.
- Только что включённый охотник и атака повтора (урок 10). Охотник ещё не
знает
fcntнастоящей лисы и примет первый повторённый пакет. Сначала дать ему послушать настоящую лису.
Уровень шума ([NOISE] в мониторе порта)
Когда лиса молчит, охотник раз в 2 с печатает [NOISE] floor=-XX dBm — уровень
шума в канале 125 кГц. В тихом кабинете обычно −115…−120 дБм. Это мини-опыт:
поднесите охотник к ноутбуку, к роутеру, к щитку и сравните.
Шум не включает зуммер: звук дают только принятые пакеты с верной подписью.
LoRa на SF7 принимает пакеты и на 7 дБ ниже уровня шума, поэтому порог тишины
RSSI_SILENCE (−115) не нужно поднимать над шумом.
Юридическая рамка
Поддиапазон 868,7–869,2 МГц исторически разрешает до 25 мВт (14 дБм) без ограничения скважности. Сверьте действующую редакцию решения ГКРЧ перед публичными запусками. На уроках лиса работает на 2 дБм (1,6 мВт) и меньше. Модуль E77 не включают на передачу без антенны.
Безопасность занятий — документ 4 УМК: пайка (раздел 3.2), выход за территорию (раздел 4), правовая рамка перед уроком 11 (раздел 6).
FOXHUNT — «Охота на лис» на LoRa (E77 / STM32WLE5)
Учебный проект спортивной радиопеленгации. Три роли на одинаковых модулях,
роль задаёт прошивка. Курс уроков — в каталоге Uroki/, порядок подготовки
к занятиям — в METODIKA.md. Здесь — железо, сборка и настройки.
Роли и файлы
| Файл | Роль | Уроки |
|---|---|---|
FoxHunt_Fox.ino | Лиса — маяк-передатчик | 1–8 |
FoxHunt_Hunter.ino | Охотник — приёмник с зуммером, OLED по желанию | 1–8 |
FoxHunt_FakeFox.ino | Фальшлиса — три атаки для углублённого блока | 9–11 |
foxhunt_common.h | Общие параметры радио, пакет, подпись | — |
foxhunt_sim.py | Симулятор «горячо-холодно» на карте этажа | 2 |
img/yagi-869.svg | Чертёж антенны Яги на 869 МГц | 5–6 |
foxhunt.zip | Те же скетчи, разложенные по папкам для Arduino IDE | — |
Железо
- Модуль CDEBYTE E77-900MBL-01 (STM32WLE5CCU6, радио SX126x на кристалле).
- Антенна лисы — штатный хлыст, всегда вертикально.
- Антенна охотника — штатный хлыст (уроки 1–4) или самодельная Яги (уроки 6–8,
чертёж
img/yagi-869.svg, изготовление — уроки 5–6). - Пассивный пьезозуммер через резистор 100 Ом — на охотнике и фальшлисе.
- OLED SSD1306 128×64 по I2C — на охотнике, по желанию. Для замеров антенны (уроки 2, 4, 6) нужны цифры: OLED или монитор порта.
- Программатор ST-Link v2 (SWD).
Подключение
| Роль | Сигнал | Пин E77 |
|---|---|---|
| Охотник | зуммер (через 100 Ом) | PA0 |
| Охотник | OLED SDA / SCL | PB7 / PB6 |
| Фальшлиса | кнопка смены атаки → GND | PA0 |
| Фальшлиса | зуммер (через 100 Ом) | PB5 |
| Все | ВЧ-ключ TXEN / RXEN | PA6 / PA7, разведены на плате |
Лисе нужны только питание и антенна.
Пины E77, которые нельзя занимать
- PB0 = VDDTCXO — питание опорного генератора радио. Если занять его как
GPIO,
radio.beginвернёт ошибку −707. - PA2 / PA3 — консоль (Serial).
Сборка в Arduino IDE
Arduino IDE собирает скетч из папки, названной так же, как .ino, и ищет
заголовок рядом. В этом каталоге все файлы лежат вместе, поэтому:
- либо распакуйте
foxhunt.zip— там три готовые папки, в каждой копияfoxhunt_common.h; - либо создайте папку
FoxHunt_Hunter/, положите тудаFoxHunt_Hunter.inoиfoxhunt_common.h(так же для двух других ролей).
Правите общий параметр — правьте его во всех копиях foxhunt_common.h.
- Ядро STM32duino (Boards Manager → «STM32 MCU based boards»), проверено на 2.12.0.
- Библиотеки: RadioLib (проверено на 7.7.1), Adafruit SSD1306 и Adafruit GFX (только для охотника).
- Board: Generic STM32WL series, Board part number: Generic WLE5CCUx.
- Upload method: STM32CubeProgrammer (SWD).
Все три скетча собираются на этих версиях без ошибок. Проверено
arduino-cli compile -b STMicroelectronics:stm32:GenWL:pnum=GENERIC_WLE5CCUX.
Заливка по ST-Link на Linux
Симптом: STM32CubeProgrammer not found (STM32_Programmer.sh) ... Aborting!
при успешной компиляции. Это ошибка заливки, код ни при чём.
- Установить STM32CubeProgrammer с сайта ST.
- Добавить его
binв PATH и запустить Arduino IDE из того же терминала:echo 'export PATH="$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin:$PATH"' >> ~/.bashrc source ~/.bashrc which STM32_Programmer.sh - Права на USB для ST-Link:Переподключить ST-Link.
sudo cp ~/STMicroelectronics/STM32Cube/STM32CubeProgrammer/Drivers/rules/*.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger
Настройки
Лиса (FoxHunt_Fox.ino):
FOX_ID— номер лисы, 1..5.FOX_COUNT— сколько лис всего.1— непрерывный маяк;3— три лисы по очереди. Лисы сFOX_COUNT > 1включают одновременно: расписание отсчитывается от включения.FOX_TX_PWR_DBM— мощность: 2 дБм для этажа и двора, −9 дБм для спортзала, 14 дБм для большого парка. Диапазон модуля −9…22 дБм, разрешено до 14.BEACON_MS— период маяка, 300 мс.SLOT_MS— длина слота: 20 000 в здании, 30 000 на соревновании во дворе.
Охотник (FoxHunt_Hunter.ino):
BEARING_MODE—0: «горячо-холодно», пять зон по частоте пиков;1: пеленг, на каждый пакет щелчок, высота тона растёт с уровнем сигнала, усреднение по 2 пакетам.RSSI_AVG_N— окно усреднения в режиме зон (5). Бегом — 3, медленный поиск — 7.ZONES[]иRSSI_SILENCE(−115) — пороги зон. Копия порогов есть вfoxhunt_sim.py, при правке меняйте обе.ZONE_SHIFT_DB— сдвиг всех порогов вверх. 0 — этаж; 15 — спортзал с лисой на −9 дБм.
Общее (foxhunt_common.h): 869,0 МГц, SF7, BW 125 кГц, sync word 0x12 —
одинаково у всех ролей.
Юридическая рамка
Поддиапазон 868,7–869,2 МГц, мощность до 25 мВт (14 дБм). Перед публичными запусками сверьте действующую редакцию решения ГКРЧ: это инженерная документация, юридического заключения она не заменяет. На уроках лиса работает на 2 дБм (1,6 мВт) и меньше.
История отладки
- Заливка на Linux — CubeProgrammer в PATH и udev-правила (см. выше).
- Охотник принимал 1 пакет из ~20 —
startReceive()перенесён до отрисовки OLED и вывода в порт; OLED рисуется по таймеру; I2C 400 кГц. - После перезагрузки лисы все пакеты «REPLAY» — добавлена ресинхронизация:
растущий низкий
fcntпринимается как ребут. У этого правила есть дыра: записанные подряд три пакета лисы, проигранные по порядку, тоже пройдут. Дыра оставлена для урока 10. - Охотник не собирался на RadioLib 7.x —
getRSSI(false, false)есть только у LR11x0; для SX126x/STM32WLx —getRSSI(false). - В зале весь охотник звучал сплошным тоном — добавлены
ZONE_SHIFT_DBи пятая зонаLEDYANO; тишина опущена с −100 до −115 дБм, чтобы вдали от лисы охотник не молчал, пока пакеты ещё принимаются.
| |
| |
| |
| |
| |