SportIduino + BLE

Захотелось поделиться своими мыслями насчет того, как можно дешево и сердито организовать беспроводную передачу данных из станций SportIduino. Чтобы можно было вести онлайн-трансляции при прохождении участниками «смотровых» КП, например.

Поскольку система электронной отметки SportIduino основана на чипе ATMega328P-AU, то вполне логично, что программное обеспечение станций основано на популярной (среди самодельщиков) среде программирования Arduino, с которой мне тоже довелось немного поработать.

Как-то мне попались на youtube парочка видео (Видео1 и Видео2), которые меня поразили простотой реализации беспроводного обмена между платой Arduino с беспроводным модулем nRF24L01 и мобильником по Bluetooth. И запали прямо в душу)) Дмитрий Осипов (автор этих видео) особо не погружал своих зрителей в теорию, но выложил скетчи и продемонстрировал, что такой обмен возможен.

Дело в том, что модули nRF24L01 на Aliexpress стоят очень дешево (значительно менее 1$ за штуку, если без доставки) и, хотя они предназначены для беспроводного обмена между собой, они с Bluetooth  имеют следующие сходства:

  • Одинаковые рабочие частоты 2.4 ГГц с поддержкой скорости 1Mbps и пересекающаяся сетка каналов;
  • Одинаковые стартовые байты 10101010 или 01010101 (преамбула);
  • Одинаковая модуляция сигнала: GFSK;
  • Возможность задать в nRF24L01 адресацию 4 байтами.

А на днях мне попалась статья «BLE под микроскопом» (BLE – это аббревиатура от «Bluetooth Low Energy»),  благодаря которой я вспомнил про видео Дмитрия Осипова, пересмотрел их еще раз и мне стало гораздо понятнее, как это работает. Я сейчас очень кратко поделюсь с этим.

BLE при работе на частоте 2.4 ГГц использует 40 каналов, которым присвоены логические номера от 0 до 39. Из этих 40 каналов 37 используются для передачи данных (это когда два Bluetooth-устройства установили между собой соединение и тогда они занимают один из 37-ми  каналов передачи данных), а вот 3 канала (с логическими номерами 37, 38 и 39) используются в качестве рекламных (режим «advertising»).

При этом стандарт BLE предусматривает передачу рекламных пакетов нескольких типов, но далее я буду рассматривать только рекламные пакеты  типа «ADV_NONCONN_IND». Эти пакеты могут рассылать не присоединяемые устройства, «радиомаячки», для которых не требуется установка соединения с дальнейшим переходом на канал передачи данных. Вся информация от «радиомаячка» содержится в этом пакете. Также все рекламные пакеты имеют одинаковый код доступа (адрес) и это 4 байта: 0x8E89BED6. Максимальный размер рекламного пакета BLE составляет 39 байт, однако беспроводной модуль nRF24L01 может передавать/принимать пакеты максимум из 32-х байт, поэтому будем считать, что максимальный размер рекламного пакета равен именно 32 байта.

 Станция SportIduino с беспроводным модулем nRF24L01 как нельзя лучше подходит на роль «радиомаячка» для передачи одного пакета данных по рекламным каналам Bluetooth.

Приведу формат рекламного пакета BLE:

Номера байтов Мнемоника Описание
1

PDU Type (4 бита), флаг TxAdd (1 бит), флаг RaAdd (1 бит)

PDU Type – тип пакета. 0010 – это ADV_NONCONN_IND (рекламное устройство без присоединения)
2 Length Длина пакета (количество байт, начиная с 3-го байта и до последнего байта в пакете, включая CRC)
3-8 MAC адрес MAC-адрес «радиомаячка» (6 байт)
9 0x02 Флаги (LE-only, limited discovery mode)
10 0x01 Флаги (продолжение)
11 0x05 Флаги (окончание)
12-29* Data Собственно сами данные пакета (максимум 18 байт). Данные должны состоять хотя бы из одного тега (см.ниже)
30-32** CRC Контрольная сумма (3 байта)

(*) – количество байт данных в поле Data может быть переменным;
(**) – порядковые номера байтов для CRC в пакете зависят от количества байт в Data.

Как видно из вышеприведенного формата рекламного пакета BLE, из 32-х байт в пакете для полезной информации остается только 18 (и даже меньше, но об этом далее). Потому что поле Data должно состоять хотя бы из одного тега (или из нескольких тегов).

Привожу формат тега:

Номера байтов Мнемоника Описание
1 Tag Length Длина тега, в байтах (начиная со 2-го байта тега и до последнего)
2 Tag Type тип тега. Например:
0x08 – сокращенное имя устройства (в поле Tag Data)
0x09 – полное имя устройства  (в поле Tag Data)
0xFF – тег производителя устройства, содержит произвольные данные  (в поле Tag Data)
3 – (3 + Tag Length – 2) Tag Data Данные тега. Количество байт равно (Tag Length – 1), так как 1 байт занимает еще тип тега

Итак, поле Data рекламного 32-байтного пакета BLE может содержать максимум 18 байт для тегов, но каждый тег «отъедает» еще 2 байта под свою служебную информацию (длина и тип тега).

А теперь давайте вернемся к самому началу – как эти 18 байт можно использовать с пользой для дела? Если станцию отметки SportIduino доработать (добавить к ней беспроводной модуль nRF24L01 и модифицировать прошивку), то для онлайн-трансляции отметок с такой станции этих 18 байт вполне хватит.

Я думаю, что надо в поле Data разместить 2 тега:

  • тег с типом 0x08 с сокращенным именем «радиомаячка», состоящим из 4-х символов. Такой длины достаточно, чтобы имя содержало в первом символе тип станции («B» — станция отметки, «S» — стартовая, «F» — финишная и т.п.), а в последующих 3-х — номер станции. Например, для станции отметки с номером 39 это может быть «B039» и под этим именем его будут видеть другие Bluetooth-устройства. Итого этот тег займет 6 байтов;
  • тег с типом 0xFF и содержащий до 10-ти байт полезной информации. Например, это могут быть следующие данные:
    • ID – 1 байт. Идентификатор (маркер) данных производителя, некий внутренний тип «пакета данных», если под «пакетом данных» понимать байты данных в этом теге. Какое-то фиксированное значение для передачи данных отметки участника в этом формате;
    • Номер станции – 1 байт;
    • Дата/время отметки – 4 байта. Дата/время в формате UNIXTIME (с точностью до 1 секунды);
    • Номер чипа – 2 байта;
    • Резерв – 1 байт. Сюда можно записывать напряжение батареек станции (или флаг низкого напряжения батареек) или любую другую информацию;
    • CRC – 1 байт. Контрольная сумма всех байт поля Tag Data этого тега.

Тогда в первом теге будет содержаться сокращенное имя «радиомаячка», а во втором теге – собственно, данные об отметке участника на этой станции.

Как реализовать только передачу такого рекламного пакета – об этом можно посмотреть Видео1 – там под видео приведен скетч и даны также ссылки на скачивание.

Рекламный пакет там передается по всем 3-м рекламным каналам. Они максимально разнесены по частотам – используют физические частоты по краям и в середине диапазона 2.4 ГГц. Так было сделано (разработчиками BLE) сознательно, потому что в помещениях возможны помехи и интерференция волн, а так есть высокая вероятность, что хотя бы какой-то из этих пакетов достигнет цели.

Надо еще понимать, что мобильники в обычном режиме поиска Bluetooth-устройств не увидят такие «радиомаячки», поэтому необходимо еще делать софт для мобильника. Чтобы данные принимались из рекламных пакетов и затем передавались на сайт онлайн-результатов (например, на orgeo.ru).

Эта статья – мои мысли вслух. Надеюсь, они заинтересуют кого-нибудь и подтолкнут к реализации в «железе».

Надо сказать, что на ГитХабе уже есть отдельная ветка «SportIduino/NRFstation», в которой уже реализован вариант с беспроводным модулем nRF24L01 и выложены схемы и файлы для создания печатных плат уже с этими модулями. Правда, по задумке автора этой ветки, на эти модули подается питание только при замыкании геркона путем поднесения магнита к определенному месту корпуса станции (где расположен геркон), и используются эти модули для программирования режима работы станций. Но вместо геркона можно впаять просто перемычку… А прошивку модифицировать…