Логотип sheen.bot

← Идеи и опыт

Почему радиосообщения Micro:bit перестают доходить, когда весь класс тестирует проекты одновременно

19 окт. 2026 г.·Sheen Robotics
Почему радиосообщения Micro:bit перестают доходить, когда весь класс тестирует проекты одновременно

Когда двадцать плат micro:bit одновременно вещают в стандартной радиогруппе, коллизии пакетов и переполнение буфера приема парализуют проект. Рассказываем, как настроить группы, интервалы передачи и полезную нагрузку для стабильной работы в классе.

Когда одна пара учеников тестирует скрипт радиосвязи для micro:bit за партой, всё почти всегда работает безупречно. Но когда двадцать пар запускают тот же сценарий одновременно, сеть рушится: сообщения приходят с задержкой в несколько секунд, доходят через раз или пропадают вовсе. Платы исправны, и школьный Wi-Fi здесь ни при чем. Класс столкнулся с двумя классическими сетевыми проблемами: бесконтрольными коллизиями пакетов в эфире и переполнением буфера приема.

Два невидимых узких места

Чтобы решить проблему, нужно понимать, что именно делает BBC micro:bit при выполнении радио-блоков в MakeCode. В micro:bit установлен трансивер Nordic Semiconductor (nRF51 на плате v1 или nRF52 на v2), работающий в диапазоне 2,4 ГГц. По умолчанию он передает данные без контроля занятости канала и без протокола автоматического повтора при сбоях.

Когда учебная программа дает плате команду отправить сигнал, при масштабировании на весь класс возникают две проблемы:

  • Коллизии в радиоэфире: если две платы micro:bit передают данные на одной частоте в одно и то же мгновение, их сигналы накладываются друг на друга. Приемная антенна улавливает искаженную смесь двух передач. Микроконтроллер проверяет контрольную сумму пакета (CRC), фиксирует ошибку и молча отбрасывает пакет. Никаких сообщений об ошибке не выдается — данные просто исчезают.
  • Переполнение буфера приема (RX): среда выполнения micro:bit (CODAL / DAL) сохраняет входящие радиопакеты в небольшом аппаратном буфере приема, который обычно вмещает всего четыре пакета, прежде чем передать их в пользовательский код. Если четыре платы отправят сообщения, пока приемник обновляет свой светодиодный дисплей 5×5 или находится в блоке паузы, буфер заполнится мгновенно. Все последующие сообщения, поступившие в этот интервал, будут сброшены.

Корень проблемы: бесконечный поток из цикла «forever»

Почти в каждом классе, где радиосвязь дает сбой, причиной оказывается типичный для начинающих паттерн кода:

basic.forever(function () {
    radio.sendNumber(input.acceleration(Dimension.X))
})

Внутри стандартного цикла forever («постоянно») без явной паузы micro:bit отправляет от 30 до 50 пакетов каждую секунду. Одна пара учеников, генерирующая 40 пакетов в секунду, занимает лишь небольшую часть эфирного времени. Но если умножить это на пятнадцать пар, одновременно работающих в одном кабинете, эфир мгновенно захлестывает поток в 600 пакетов в секунду.

Поскольку базовый код радиопередачи работает «вслепую» — то есть micro:bit не проверяет, свободен ли канал перед отправкой, и не запрашивает подтверждения доставки, — вещание с такой высокой частотой практически гарантирует, что каждая передача столкнется в эфире с пакетом соседнего устройства.

Как организовать надежную радиосвязь в классе

Чтобы радиосвязь работала стабильно, не нужны сложные сетевые протоколы. Достаточно соблюдать четыре базовых правила написания кода на уроках.

1. Никогда не используйте радиогруппу по умолчанию

В обучающих руководствах ученикам часто предлагают прописать radio.setGroup(1). Но если вся группа работает на канале 1, каждый приемник обрабатывает пакеты абсолютно всех передатчиков, даже если вы потом отфильтруете их программно. MakeCode поддерживает группы с номерами от 0 до 255. В начале учебной четверти закрепите за каждой партой или парой постоянный номер группы:

  • Пара 1 использует radio.setGroup(10)
  • Пара 2 использует radio.setGroup(20)
  • Пара 3 использует radio.setGroup(30)

Идентификаторы групп изменяют конфигурацию сетевого адреса на уровне чипа. Хотя близкие группы по-прежнему делят общий частотный диапазон 2,4 ГГц, аппаратная фильтрация по адресу не позволяет чужим пакетам переполнять очередь приема соседней пары.

2. Запретите циклы без ограничения скорости

За редким исключением в виде высокочастотной физической телеметрии, практически ни один школьный проект не требует 50 обновлений в секунду. Радиоуправляемая машинка или контроллер наклона отлично реагируют на команды и при частоте от 5 до 10 обновлений в секунду. Обязательно добавляйте паузу в каждый непрерывный цикл передачи:

basic.forever(function () {
    radio.sendValue("speed", currentSpeed)
    basic.pause(100) // максимум 10 пакетов в секунду
})

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

3. Добавьте случайное смещение по времени (джиттер)

Если каждый micro:bit в классе передает данные строго каждые 100 миллисекунд, их внутренние таймеры рано или поздно синхронизируются шаг в шаг, из-за чего две платы будут сталкиваться в эфире на каждом цикле снова и снова. Избавиться от ритмических коллизий можно с помощью псевдослучайного смещения (джиттера) в задержке цикла:

basic.pause(100 + Math.randomRange(0, 30))

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

4. Сокращайте размер полезной нагрузки

Передача радиосигнала занимает реальное физическое время: чем длиннее пакет, тем шире временное окно для коллизии. MakeCode позволяет отправлять длинные строки с помощью radio.sendString("FORWARD_LEFT"), однако строки занимают десятки байтов. Вместо этого используйте одиночные целые числа или пары ключ-значение с короткими односимвольными именами:

Нужное действиеНеудачный вариант (много эфирного времени)Оптимальный вариант (мало эфирного времени)
Команда поворотаradio.sendString("DRIVE_LEFT")radio.sendNumber(1)
Показания датчикаradio.sendValue("temperature_c", 24)radio.sendValue("T", 24)
Сигнал остановкиradio.sendString("EMERGENCY_STOP")radio.sendNumber(0)

Что делать, если весь класс должен отправлять данные на один приемник

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

Чтобы схема работала без потерь, измените логику взаимодействия: вместо хаотичного вещания всеми устройствами сразу реализуйте архитектуру опроса (polling). Центральный концентратор передает запрос конкретному идентификатору (например, отправляя число 1). Только ученическая плата с ID 1 передает свои данные в ответ. Приняв их, концентратор запрашивает устройство 2. Такой циклический опрос по очереди полностью устраняет риск коллизий и гарантирует, что в буфере принимающего micro:bit никогда не будет ожидать более одного пакета одновременно.

Для структурированных программ с десятками учеников, создающих аппаратные сетевые проекты, Sheen Robotics предлагает модульные учебные планы и конфигурации для классов в рамках программы Infinity for Schools, позволяя проводить практические занятия предсказуемо и без утомительного поиска причин невидимых коллизий в радиоэфире.

#microbit#радиосвязь#организация учебного процесса#обучение программированию#устранение неполадок

Больше в категории «Идеи и опыт»

Почему ультразвуковые датчики сбоят, когда в одном помещении работает несколько роботов
Идеи и опыт· 17 окт. 2026 г.

Почему ультразвуковые датчики сбоят, когда в одном помещении работает несколько роботов

Когда несколько роботов в одном помещении излучают сигналы на частоте 40 кГц, акустические перекрестные помехи приводят к ложным препятствиям и пропускам стен. Рассказываем, как устранить эту проблему программно и аппаратно.

Читать далее →
Почему опадают цветы в школьной гидропонике, так и не завязав плодов
Идеи и опыт· 16 окт. 2026 г.

Почему опадают цветы в школьной гидропонике, так и не завязав плодов

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

Читать далее →
Почему аналоговый датчик на ESP32 сходит с ума при включении Wi-Fi
Идеи и опыт· 15 окт. 2026 г.

Почему аналоговый датчик на ESP32 сходит с ума при включении Wi-Fi

Если аналоговый датчик начинает выдавать бессмысленные значения сразу после запуска Wi-Fi, скорее всего, он подключен к выводу ADC2. Радиомодуль Wi-Fi в ESP32 монополизирует ADC2; переключение датчика на ADC1 моментально решает проблему.

Читать далее →