Воодушевившись первыми успехами с миганием светодиодами на Mynewt решил двинуть дальше и попробовать запустить BLE примеры с сайта. Простейший из них это конечно BLE iBeacon — его я и решил попробовать словив при этом несколько проблем.
Итак что меня есть: плата с nrf51822, программатор SEGGER Jlink, переходник UART -> USB.
Создаём проект — ну в общем тут никакой магии:
1 | $ mkdir ibeacon-test |
Для поддержки BLE добавляем в pkg.yml нашего приложения пакеты, необходимые для работы BLE стэка
1 | pkg.deps: |
Ну и пробуем собрать нашу цель:
1 | $ newt build ibeacon |
Грабля первая
И вот тут-то нас ждёт засада
1 | $ newt build ibeacon |
В общем собранный код не помещается в куцый объём 16Кбайт моего чипа. Есть вариант конечно выкинуть отладку и собрать optimized вариант, но вообще хотелось бы конечно и отладку сохранить. Очевидно нужно как-то уменьшить генерируемый объём кода.
В общем я нашёл 2 варианта решения этой проблемы.
Решение первое — отключить логгирование.
Для этого можно настроить уровень логгирования, что выполняется указанием в файле syscfg.yml
приложения значения переменной LOG_LEVEL
равным 255. Думаю 255 уровней позволят подобрать оптимальный вариант, но мне уже просто хотелось поскорей запуститься, поэтому поставил 255, что означает выключение логов.
1 | ... |
Решение второе — выключение некоторых пакетов
По умолчанию при создании приложения у нас в pkg.yml добавляются следующие пакеты:
1 | pkg.deps: |
Чтобы уменьшить объем кода нужно заменить их на
1 | pkg.deps: |
После этих изменений сборка выполняется успешно.
1 | $ newt build ibeacon |
Грабля номер 2 — не работает UART на nrf51822
Теперь, после того как сборка в общем-то заработала стоит добавить в проект какой-нибудь осмысленный код. Для этого внимательно читаем статью BLE iBeacon — там всё подробно разжёвано. Берём готовый код в конце статьи и записываем его в наш главный файл src/main.c
1 |
|
Изначально я воспользовался первым методом для уменьшения размера кода. В результате после запуска кода на устройстве обнаружил периодическое мигание светодиода на выходе TX UART-а. Попытка просканировать эфир на наличие каких-либо iBeacon-ов ни к чему не привела. В общем ничего не заработало — только TX издевательски подмигивал мне, намекая, что стоит к нему подключиться и посмотреть что-же там такого.
В итоге подключил к UART-у переходник UART-> USB и подцепившись терминалом к порту увидел, что за таинственные знаки подавал мне мигающий светодиод.
Видно, что периодически возникает assert и ошибка в обработке прерывания 2. Прерывание 2 это UART. Т.е. видимо что-то не так с UART-ом.
Собственно именно это сподвигло меня заняться отладкой и обнаружить проблему в коде UART-а. То, что при этом уменьшился размер кода это лишь побочный эффект. Т.е. решением проблемы будет замена пакетов log
и stat
с full на stub.
Теперь после запуска приложения на устройстве можно увидеть beacon с мобильника
Так-же устройство видно из родной нордиковской программы nrfConnect.
К сожалению нордиковское приложение nRF Beacon
не смогло ничего обнаружить.
Итоги
В итоге получилось запустить рабочий код маяка на Mynewt, отловив при этом потенциальные проблемы. Далее в планах проверить работу датчиков совместно с модулем и отловить результаты на мобильнике.
Комментарии