РадиоКот >Статьи >

Теги статьи:

Разработка BLE приложений в системе Anaren Atmosphere

Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 01.12.2015
Создано при помощи КотоРед.

В статье речь пойдёт о разработке software и firmware для проектов, включающих BLE (Bluetooth Low Energy), или как их сегодня принято называть Bluetooth Smart устройства. Под устройствами я понимаю пару, состоящую из master device и slave device в терминологии Bluetooth. Кстати, для первого (и даже второго) знакомства с технологией BLE рекомендую прочитать книгу [1]. В качестве master device в статье может выступать планшет или смартфон, работающие под управлением операционных систем Android или iOS, а slave device – это устройство пользователя, обычно содержащее микроконтроллер и другие компоненты. Я расскажу на примере о создании slave устройства и как связать его с master для двусторонней передачи данных.

Как Вы себе представляете идеальную систему разработки? Здорово было-бы, если не нужно разбираться как программировать незнакомый микроконтроллер или как писать приложения, скажем, под Android, и не нужно устанавливать никакого программного обеспечения на компьютер? Конечно, ничего не зная нереально ожидать успех в проектировании сколь-нибудь сложных систем. Однако для быстрой разработки простых приложений, или прототипов, или для предварительного знакомства с миром BLE, система, о которой я расскажу здесь, подходит идеально. С её помощью Вы сможете создать программное обеспечение для смартфона и микроконтроллера даже не видя ни одной строчки кода (не скажу, что это достоинство, но что-то в этом есть). Звучит заманчиво – тогда всё по порядку.

BLE системы можно разделить на 3 класса. К первому классу относятся те, что реализуют только PHY и Link уровни BLE стека. Такие системы называются контроллерами. В них также имеется управляющий МК, но он предназначен только для выполнения процедур, требующих обработки в реальном времени (из всего стека это только уровни LL и PHY), и интерфейса с другим МК системы, где реализованы остальные уровни стека и логика работы самого устройства. Ко второму классу отнесём устройства, во внутренний управляющий МК которых уже загружен BLE стек, общение с которым происходит через функции API или AT команды. Устройства этих классов не предназначены для загрузки в них программы пользователя и требуют внешнего МК. Наконец, к третьему классу относятся усройства с МК на борту, в который помимо стека BLE может быть загружена и программа пользователя. При этом стек может быть либо загруженным в МК фабрично, либо требующим загрузки извне вместе с программой пользователя. Устройства третьего класса принято называть SoC (System on Chip). Подробнее о стеке BLE можно прочитать в [1].

Всякая система разработки ориентирована на определённый круг микроконтроллеров. В нашем случае это будет микроконтроллер семейства ARM Cortex-M3, входяший в состав SoC BCM20737A производства компании Broadcom. Помимо 24-мгц микроконтроллера с его стандартными периферийными модулями 16-бит ADC, PWM (4 канала), I2C, SPI, UART и пр., в SoC имеется BLE радио-модуль с максимальной выходной мощностью +3dBm. Отличительными особенностями SoC является фабричная загрузка в ROM всего стека протоколов BТ4.0, нескольких GATT профилей, драйверов периферии, библиотек для security (с 4К-бит RCA!) и многого другого. Объём области ROM около 320К и наличие её сильно упрощает разработку программ, особенно если захотите «испачкать руки» и работать с кодом. Программа пользователя сначала записывается в EEPROM микроконтроллера и потом при каждой подаче питания на схему автоматически копируется в RAM, где для неё после нужд стека остаётся около 27К из имеющихся 60К. Более того, для SoC не требуется специального программатора – подойдёт любой USB-UART конвертер. Ну и что совсем замечательно, фирма Anaren выпускает сертифицированные BLE модули A20737A на основе SoC с печатной антенной, кристаллом, и прочей обвязкой на борту.

Первое знакомство с системой

Моё знакомство с этой SoC началось с демо-платы A20737A-MSDK1 фирмы Anaren, показанной ниже. Начнём и мы с неё.

На плате помимо BLE модуля имеется джойстик, спикер (большой квадрат в центре), несколько светодидов и сенсоров, а также двуканальный USB-UART конвертер на FT2232 и преобразователи логических уровней (правая часть платы после штрих-пунктирной вертикальной черты). Один канал конвертера используется для загрузки в SoC программы пользователя, а другой - для вывода из неё по желанию информации на терминал компьютера. На обратной стороне платы размещён держатель батареи CR2032 – плата может работать и от неё при правильной организации режимов экономного питания. Все выводы от SoC выведены на разъёмы по обеим сторонам платы, так что плату можно вставить в беспаечную макетку для прототипирования.

Для разработки программ под эту SoC имеется две возможности. Первая (WICED Smart SDK) предоставляется фирмой-изготовителем SoC [2] – мы её сегодня использовать не будем. И вторая – также бесплатная система интерактивного графического проектирования Atmosphere от фирмы-изготовителя BLE модуля [3]. Её-то мы и рассмотрим подробнее. Работа с этой системой начинается с регистрации на сайте atmosphere.anaren.com. Созданный при регистрации аккаунт будет использован для входа в систему, хранения всех ваших проектов (их можно также сохранить и на собственном компьютере), входа на форум, и загрузки кода в SoC. Форум, кстати, мониторится инженерами фирмы, которые, в основном, и отвечают на вопросы пользователей. Не игнорируйте его для получения квалифицированной консультации. Первым делом рекомендуется повторить проект “Push Me” с сайта, состоящий из кнопки на экране планшета/смартфона, включающей по радиоканалу светодиод на отладочной плате. После загрузки проекта увидите в окне браузера следующую картину.

Переводить всю инструкцию к первому проекту не имеет смысла - на сайте всё с деталями описано в картинках. Отмечу кратко лишь основные моменты. В левом окне “Toolbox” расположены иконки интерфейса с пользователем, которые появятся на экране смартфона (в графе Application), а также иконки периферийных модулей SoC (в графе Embedded). Среднее окно “Designer View” предназначено для создания алгоритма. Кликнув на иконки Button и GPIO_Toggle в левом окне, они появятся в среднем. При этом кнопка Button также появится в правом окне в том-же месте, как она будет видна на экране приложения на смартфоне (правое окно это как-бы экран смартфона). Все иконки можно перемещать мышкой. Поскольку нажатие кнопки должно привести к переключению состояния светодиода на выводе GPIO, между соответствующими иконками в среднем окне рисуем стрелку (элемент Connector). Наконец, кликая поочерёдно на иконки Button, GPIO, и Connector, в нижней части правого окна Properties можно произвести настройки соответствующих элементов. Собрав настройки всех наших трёх элементов воедино, получим следующее.

Как следует из настроек, текст “Push Me” появится на кнопке приложения, GPIO настроен на работу с портом P27 SoC (к нему следует подключить светодиод), и коннектор передаст факт нажатия на кнопку из приложения смартфона через радиоканал на плату, что приведёт к изменению состояния светодиода.

Компиляция проекта производится через опцию Project -> Build, об успешном окончании которой Вы узнаете в нижнем окне Console системы. При этом загрузочные модули для смартфона и SoC будут доступны из облака через Ваш аккаунт. Для загрузки программы в SoC следует установить Atmosphere Programmer – единственную программу, устанавливаемую на Вашем компьютере. Затем соединяем демо-плату с компьютером через USB кабель, дожидаемся окончания автоматической установки драйвера, и запускаем программатор. В окне программатора также следует войти в Ваш аккаунт, настроить его на работу с виртуальным портом демо-платы и кликнуть на кнопку Program. После загрузки кода он автоматически начинает выполняться на SoC.

Последнее, что следует сделать - это установить на смартфоне приложение Atmosphere из App Store или Google play, в зависимости от операционной системы смартфона. При компилляции создаются приложения для обоих систем, но Atmosphere App, соответственно, выберет и загрузит в смартфон только одно из них. Имя проекта при этом нигде не указывается, т.к. в аккаунте может быть только один активный проект - последний, с которым работали - и оба загрузчика узнают про него при входе в аккаунт. Таким образом, приложение для смартфона можно дефолтно запустить только из под Atmosphere App. Однако, через меню Project -> Download App Source система предоставляет возможность извлечь из облака исходники всех проектов на компьютер пользователя, где они могут быть скомпилированы в полноценные приложения для смартфонов внешними системами разработки такими как Android SDK. Atmosphere Wiki предоставляет для этого ясно написанные пошаговые инструкции. Хотя в среднем окне системы и имеется закладка Code View, в ней отображается лишь часть всего исходника, соответствующая элементам выбранным из меню. В большинстве случаев этого достаточно для небольших коррекций кода. Однако, и весь исходник можно сохранить через Project -> Download Embedded Source и потом, только если это необходимо, подправить его в системе WICED Smart SDK [2].

Работа с BLE модулем

Поиграв немного с демо-платой, мне захотелось пообщаться с BLE модулем напрямую, заставив его принимать и передавать данные. Что мне с самого начала не понравилось в управлении светодиодом выше – это то, что актуальное состояние светодиода на момент запуска приложения не индицируется на экране смартфона. Это может привести к тому, что состояние лампы, показываемое смартфоном, не будет соответствовать реальности. Если, к примеру, станем дома проверять выключен-ли свет в гараже, где его из дома не видно, то это большой недостаток. Кроме того, слишком-уж много работы нужно сделать прежде чем выключить свет – именно, вручную начать сканирование Bluetooth устройств, выбрать на смартфоне нужное устройство для подключения и установить с ним связь. Было-бы здорово, если приложение автоматически свяжется с надлежащим устройством и сразу покажет статус лампочки в гараже. Помимо этого, я решил, что не помешает заодно узнать температуру в гараже на момент соединения. Для реализации задуманного модуль был распаян на колодку для отладочной платы и соединен с I2C сенсором температуры TMP112 и USB-UART конвертером CP2104 по следующей схеме.

USB-UART конвертер IC1 нужен лишь для программирования модуля через выводы HCI (Host Communication Interface). Oн-же обеспечивает питание для всей экспериментальной схемы. Atmosphere Programmer работает со стандартными установками порта (9600, 8N1). Вместо CP2104 можно использовать любой другой конвертер, обеспечивающий логические уровни 3.3В и питать схему от внешнего источника того-же напряжения. Учтите, что с подключённым конвертером по подаче питания модуль автоматически переходит в режим программирования, поэтому для автономной работы модуля конвертер следует отключить.

При первой попытке загрузки кода в SoC появилась небольшая проблема. Именно, модуль никак не хотел программироваться. Перечитав кучу документации и даже обратившись за помощью на форум Anaren, я выяснил, что для программирования модуля необходимо, чтобы в его EEPROMе находилась утилита программирования (не бутлоадер), которая на фабрике туда не загружается (в модуль на демо-плате она, однако, загружена фабрично). Для загрузки утилиты при первом программировании следует нажать кнопку S1 и не отпуская её нажать S2. Затем отпустить обе кнопки и использовать опцию Recover в Atmosphere Programmer. Так-же следует поступать если в момент программирования произойдёт что-то непредвиденное, например отключится доступ к Интернету и процесс программирования не завершится. В остальных случаях перед программированием можно нажать и отпустить только кнопку S2 (при сбросе МК и подключённым USB-UART конверторе SoC автоматом входит в режим программирования) и пользоваться опцией Program в программаторе. Кстати, при наличии резистора R2 в схеме кнопку S1 можно исключить (в первоначальном варианте схемы без сенсора температуры этого резистора в схеме не было).

Воодушевившись первым успехом программирования моего модуля для “Push Me” приложения, я стал думать как добавить в схему сенсор температуры. В системе Atmosphere имеются библиотечные элементы для некоторых сенсоров (Tools -> Element Library), но поскольку она достаточно молодая, нужного мне элемента для TMP112, конечно, не было. Однако, в документации имеется достаточно подробная процедура написания своей библиотеки EEL (Extended Element Library) [5], что я и сделал. Библиотека находится в папке TMP112_library в прилагаемом архиве. Но не обошлось и тут без проблем. Именно, оказалось, что предлагаемый фирмой Python скрипт eel_builder.py для сборки библиотеки в формате JSON (JavaScript Object Notation) открывает PNG файл иконки элемента в символьном режиме. Пришлось его немного подкорректировать для бинарного режима при установленной у меня версии Python 2.7.10 на 64-бит Windows-7. Если будете импортировать мою библиотеку, используйте опцию Proect -> Import Element Library и загрузите файл tmp112.eel. Тогда иконка элемента TMP112 (зелёная на диаграмме ниже) появится в Embedded Toolbox.

Библиотека для TMP112 состоит всего из двух функций: TMP112_SoftwareReset() и TMP112_GetAmbientTemperature(). Как только кликните на элемент TMP112 в Embedded Toolbox, первый файл вставится в конец функции setup() в Code View. Он предназначен для погружения TMP112 в глубокий сон с потреблением менее 1 мкА. Вторая функция сначала засылает в сенсор TMP112 команду для нового единичного измерения температуры и потом мониторит бит 7 в байте его статуса. Как только этот бит установится по окончании измерения, производится чтение температуры и округление её до ближайшего целого. После этого сенсор опять погружается в сон. Как видно из осциллограммы ниже, процесс измерения занимает ровно 26 мс, в точности согласно документации.

Как следует из исходника библиотеки (файл tmp112_common.c) при разработке драйвера использовались API функции SoC для работы с интерфейсом I2C. Кстати,SoC чётко выдерживает установленную частоту тактирования линии 100 кгц.

Разобравшись с сенсором, рассмотрим полный алгоритм. Лампа включается и выключается нажатием на её иконку на экране. При этом иконка показывает текущее состояние лампы. Температура показывается под иконкой наряду со статусом обнаружения девайса и соединения с ним. Нижe показан вид приложения на экранах планшета и смартфона. Для фокусировки фотоаппарата пришлось положить что-то на экран.

 

Для реализации приложения был использован следующий алгоритм, показанный в окне Atmosphere. Некоторые части его я заимствовал из примеров [6], но что-то пришлось додумать и самому.

Алгоритм начинается с таймера Task9, который, в соответствии с его установками, запускается при старте приложения. Этот таймер активизирует сканнер Bluetooth устройств смартфона каждые 7 секунд. Как только какое-либо устройство будет обнаружено, таймер останавливается и характеристики устройства передаются в блок Expression12. Этот блок сравнивает имя найденного устройства с “ble_test” (может быть изменено по желанию) и в случае совпадения передаёт команду блоку Connection11 на соединение с этим устройством. В противном случае сканирование Bluetooth устройств продолжится. Статусы обнаружения нужного устройства и соединения с ним отображаются как Label14 и Label16 на экране приложения планшета/смартфона (две нижние строчки). Таймер Task13 нужен для соединения с устройством в следующий раз, если в предыдущей сессии явно не произведено разъединение с ним.

В случае успешного соединения подаётся команда сенсору TMP112 (зелёная иконка) для производства нового измерения температуры, которая по окончании измерения индицируется блоком Label15. Одновременно с командой сенсору подаётся команда на GPIO_Read5 (порт P26) для чтения статуса порта P27, коммутирующего лампу. Выводы этих портов соединены вместе на схеме, при этом P26 настраивается на ввод, а P27 на вывод. Можно, конечно, было-бы обойтись и одним портом, но для этого пришлось-бы лезть в код. У меня-же цель была попробовать обойтись лишь «рисованием» алгоритма без его явного программирования. Как только состояние лампы прочитано, на экране появляется соответствующая иконка горящей Lamp_ON или негорящей Lamp_OFF лампы (первоначально обе иконки невидимы на экране). Наконец, нажатие на видимую в данный момент иконку лампы приведёт к превращению её в невидимую и визуализации другой иконки лампы. Одновременно подаётся команда в блок GPIO_Toggle4 для изменения состояния порта P27 и, как следствие, лампы.

Таким образом, весь алгоритм получается “interrupt driven”. Стрелки на схеме показывают действия обработчиков прерываний. События, приводящие к прерываниям указаны в настройках исходящих концов стрелок, а вызываемые функции элементов и параметры, передаваемые им, специфицированы в установках правых концов стрелок. Левая сторона каждого элемента обозначает вызов какой-то его функции, а правая его сторона индицирует возвращаемое функцией значение или окончание её работы (если она void). В общем, на письме может это выглядит и сложно, но пощёлкав несколько вечеров мышкой и изучив разработанные фирмой примеры и описания API и элементов [6], всё постепенно установится на свои места.

Для управления нагрузками от модуля следует использовать внешние транзисторы, как это, например, сделано в подобном проекте [4], поскольку порты МК рассчитаны на выдачу не более 2мА. Однако, четыре PWM пина могут коммутировать до 16мА тока на землю.

В этой вводной статье я описал далеко не все возможности системы Atmosphere. Без внимания остались режимы экономного питания (собственно, для чего и нужно BLE), настройки GAP, настройки Security Manager и спаривания, структура кода SoC, работа с другими её периферийными модулями, и пр.Но начало положено, остальное откроется в рабочем порядке. В прилагаемом архиве имеется полный проект (его файл Project.atmo в формате JSON можно загрузить в Atmosphere через File -> Import), библиотека для TMP112 с исходниками, и файл печатной платы под модуль для Eagle.

Литература

1. K. Townsend and C. Cufi “Getting Started with Bluetooth Low Energy: Tools and Techniques for Low-Power Networking”, O'Reilly Media 2014.

2. Broadcom WICED Smart SDK.

3. Anaren Atmosphere.

4. J. Aubinais “230-V-Schalter mit Bluetooth ansteuern”, Elektor 12, 2015, 42 – 46.

5. Embedded Element Library Development.

6. Anaren Wiki. All Pages.


Файлы:
Файлы проекта и библиотеки


Все вопросы в Форум.