image

BLE под микроскопом (24-52 link)


Компания NORDIC уже несколько лет выпускает новые кристаллы серии nRF52. Однако до сих пор многие используют более старое семейство nRF24. Сегодня я покажу как организовать между ними двухстороннюю связь на advertising каналах. Кроме того, используя способность кристалла nRF52 измерять уровень RSSI, мы будем выводить его на график.

Варианты соединений


Читая форум Nordic-а о возможностях беспроводной связи между старым и новым семействами, я увидел, что есть две возможности. Это протокол ESB (Enhanced Shock Burst) и надстройка над ним — протокол Gazell. Это конечно хорошо, но есть ряд трудностей. Со стороны nRF24 это то, что исходники есть в nRFgo_SDK_2.3.0 только под модули nrf24le1 и nrf24lu1 (связка nRF24L01 + микроконтроллер). Однако у радиолюбителей больше получил распространение вот такой модуль без контроллера.

Рис.1
image Со стороны nRF52 так же не всё гладко. В SDK протоколы ESB и Gazell даются в виде уже готовых, откомпилированных модулей, что то же не айс. Мы же будем связать их на самом низком уровне, работая с регистрами напрямую. В своей третьей статье я уже рассказывал как, используя nRF51822, сделать маяк. Так же интересно будет почитать вот эту публикацию.

Для начала несколько слов о системе, которую будем строить. Прием-передачу мы будем вести на каналах advertising-а в формате BLE пакетов. Это позволит при помощи сотового телефона и программы NRF Connect (андроид и iOS) увидеть в эфире наши пакеты. Это сильно поможет нам и позволит разбить первоначальную задачу на этапы. У нас будет Host с радиоканалом на nRF24L01 и Device на м/к nRF52832. Причем, т.к. nRF24L01 это просто радиоканал, ему будет нужен контроллер. Мы создадим сразу два проекта на разных м/к от компании ST. Host будет несколько раз в секунду посылать в эфир радиопакет. Его будет принимать Device, измерять уровень RSSI и отправлять ответный пакет обратно, в котором будет содержатся его значение. После приема ответной посылки, Host будет выводить в СОМ порт по одному байту с уровнем RSSI. Для того, что бы наглядно отслеживать изменение уровня приема, я написал небольшую графическую программу.

Host Nrf24L01+Stm8L152


Итак, начнем с Host-а на связке Nrf24L01+Stm8L152. Для этой задачи я взял модуль Nrf24L01, фото которого приводил выше и STM8L-DISCOVERY, отладочную плата на базе STM8L152C6T6. Ниже приводится распиновка модуля nRF24L01.

Рис.2
image

Распиновка со стороны STM8L-DISCOVERY
#define LED_PORT GPIOC
#define LED_PIN GPIO_Pin_7
#define IRQ_PORT GPIOE
#define IRQ_PIN GPIO_Pin_0
#define CE_PORT GPIOD
#define CE_PIN GPIO_Pin_1
#define SPI_CLK_PORT GPIOE
#define SPI_CLK_PIN GPIO_Pin_4
#define SPI_MISO_PORT GPIOE
#define SPI_MISO_PIN GPIO_Pin_2
#define SPI_MOSI_PORT GPIOE
#define SPI_MOSI_PIN GPIO_Pin_5
#define SPI_CSN_PORT GPIOD
#define SPI_CSN_PIN GPIO_Pin_0

Рис.3
image
Для вывода данных в СОМ порт был использован USB-переходник на м/с cp2102 подключенный к ножкам PC2 и PC3. Здесь можно взять его драйвер. В итоге получилось вот что.

Рис.4
image

На модуле nRF24L01 вы можете видеть запаянный электролитический конденсатор между ножек питания. Его рекомендуют ставить для устойчивой работы модуля. Полный проект и прошивку можно взять здесь и здесь. Открыть его можно при помощи среды разработки IAR for Stm8. Прошиваем м/к и запускаем. Синий светодиод на плате STM8L-DISCOVERY будет моргать 2 раза в секунду, показывая отправляемые посылки. Теперь самое время запустить программу NRF Connect и увидеть примерно такую картинку, которая изображена на Рис.5а. Если у вас всё получилось — поздравляю вас, первая половина задач выполнена.

Рис.5a________________________________Рис.5b_______________________________Рис.5c______________________________
image

Host Nrf24L01+stm32F103


Что бы не уходить далеко от работы Host-а, повторим всё то же самое для м/к stm32F103. Для этого я взял «синюю таблетку» с установленным на ней USB разъемом. Это позволило не использовать переходник, а выводить данные напрямую в USB порт, используя эти драйвера. Проект для stm32F103 я собрал в STM32CubeMx.

Распиновка со стороны синей таблетки
#define SPI_CE_PORT GPIOB
#define SPI_CE_PIN GPIO_PIN_4
#define SPI_IRQ_PORT GPIOB
#define SPI_IRQ_PIN GPIO_PIN_5
#define SPI_MISO_PORT GPIOB
#define SPI_MISO_PIN GPIO_PIN_6
#define SPI_CLK_PORT GPIOB
#define SPI_CLK_PIN GPIO_PIN_7
#define SPI_MOSI_PORT GPIOB
#define SPI_MOSI_PIN GPIO_PIN_8
#define SPI_CSN_PORT GPIOB
#define SPI_CSN_PIN GPIO_PIN_9

Рис.6
image

Сам проект и прошивку можно взять здесь и здесь. Открыть его можно при помощи среды разработки IAR for Stm32. Для программирования STM32F103 можно использовать любой программатор. Я использовал такой.

Рис.7
image

Подключаем питание и пробуем увидеть посылки на advertising каналах. Картинка будет та же что на Рис5а. На этой плате ничего не моргает, оба светодиода светятся непрерывно. У меня не получилось оживить зеленый светодиод на ножке PС13. Частота посылок выше, чем на плате c stm8L152, и составляет 10 Гц. Все эти параметры легко меняются внутри проектов.

Device Nrf52832


Итак, будем считать, что первая часть системы с Host-ом у нас заработала. Теперь будем запускать Device. Это можно делать на подходящем KIT-е от NORDIC PCA10040

Рис.8
image

Можно так же использовать любую плату с м/к nRF52832. Я буду использовать плату от старой разработки. Но и на ките PCA10040, я проверял, он так же запускается. Проект и прошивка лежат здесь и здесь. Он собран в среде Keil uVision4 с использованием уже старого SDK12.3.0, который можно взять здесь. Для того что бы проект без проблем собрался, его папку необходимо поместить в директорию nrf52832_workspace_SDK12\examples\peripheral\. Дело в том, что любой проект от NORDIC-а содержит огромное количество связанных ссылок, поэтому в произвольном месте не соберется. Что бы прошить nRF52832 можно использовать программу nRFgoStudio или nRF Connect for Desktop.

При запуске пректа Device, я бы рекомендовал сначала сделать вот что. Т.к. Device работает в режиме прослушивания эфира, он не посылает в эфир радиопакетов. Это произойдет только как ответ, после приема пакета от Host-а. Поэтому надо сначала проверить, что устройство живо. Для этого в проекте надо закомментировать функцию BleListen() и наоборот раскомментировать BleRadioTransaction(). Так, как изображено ниже.

image

В этом случает Device сам начнет выдавать в эфир радиопакеты. Их можно будет увидеть на телефоне. Примерная картинка изображена на Рис.5b. Если всё нормально, возвращаем всё назад и включаем оба устройства Host и Device. На телефоне мы должны увидеть их оба, как на Рис.5с. Это значит, что Device увидел посылку Host-а и в ответ передал свою. Если Host в свою очередь принял ответную посылку с уровнем RSSI, то он выставляет в COM-порт это значение. Теперь если мы запустим на Windows программу LevelRssi и выберем правильно порт, мы увидим как меняется уровень RSSI при разном взаимном расположении устройств.

Заключение


Я уже практически закончил оформлять статью, как мне пришла ещё одна мысль. Я решил использовать в качестве Device более распространенное устройство, а именно донгл pca10059, созданный на основе м/к nRF52840. Вот его фотка.

Рис.9
image
Благо у меня было две такие платы. Пересобрав проект я столкнулся с проблемой залить в него прошивку. Я знал, что делать это нужно при помощи программы nRF Connect for Desktop, но не сразу сообразил как ввести донгл в режим DFU (обновления прошивки). Рассказываю как это сделать. В режим DFU мы попадаем сразу после reset-a. Надо сначала воткнуть донгл в USB разъем, а затем нажать кнопку reset (дальнюю от процессора), с горизонтальным толкателем. На донгле начинает моргать красный светодиод. Открываем программу nRF Connect и нажимаем кнопку «Install» в разделе Programmer. Когда скачается необходимый софт, нажмите кнопку «Open».

Рис.10
image

Перед вами раскроется окно программатора.

Рис.11
image

Слева вверху выберите нужный COM порт. Вы увидите примерно следующую картинку.

Рис.12
image

С левой стороны мы увидим что находится в памяти контроллера. Нажав на кнопку «Add HEX file» можно добавить на правую сторону файл для заливки. Здесь так же не обошлось без проблем. Кнопки «Erase all» и «Erase & write» для нас недоступны. Дело в том, что у донгла нет программатора, поэтому заливка программы происходит при помощи bootloader-a. А попадаем мы в него через MBR раздел. Если мы сотрем эти разделы, то прошивка через режим DFU будет невозможна. По идее надо просто добавить на правую половину экрана прошивку и нажать кнопку «Write». Вроде всё верно, но работать не будет. Наша программа начинается с нулевого адреса во FLASH памяти, а этот адрес уже занят разделом MBR. Как с этим справится можно прочитать в этом уроке. Если читать долго или нет желания, объясню в картинках на примере Keil-a. Вот картинка проекта с распределением памяти микроконтроллера для проектов без стека.

Рис.13
image

Надо сдвинуть указатель FLASH-a на 0x1000, а RAM на 0x20000008 и перекомпилировать проект.

Рис.14
image

После этого уже можно воспользоваться программой nRF Connect for Desktop. Вот пожалуй и всё. То что у меня получилось можно посмотреть на видео внизу.

yadi.sk/i/BGQQnga1HeN50A
yadi.sk/i/d8A9pU82kBcTMw
yadi.sk/i/XGac8xwpksVX7g

Сотрудник Группы Компаний «Цезарь Сателлит»
Печерских Владимир