РадиоКот :: Радиоуправление моделью через Bluetooth LE
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Игрушки >

Теги статьи: BluetoothДобавить тег

Радиоуправление моделью через Bluetooth LE

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

Система дистанционного управления, представленная в статье, предназначена для работы на небольших расстояниях – где-то до 30м в открытом пространстве. Основное её достоинство – малое токопотребление, что во многих случаях может быть решающим фактором. В данном случае управление производится моделью машинки, в которой имеется один мотор для движения вперёд-назад и один мотор для поворота передних колёс. Модель для опытов была приобретена в местном молле уже собранной и изначально оснащённой аналоговой системой радиоуправления на частоте 27 мгц. Оба мотора модели нормированы на рабочее напряжение 3В и в оригинальном исполнении питались от одного литиевого аккумулятора напряжением 3.6В. Само управление производилось джойстиками в передатчике без регулировки скорости движения. Нашей целью было переделать модель под управление её траекторией и скоростью путём наклона платы передатчика, положение которой в пространстве отслеживалось-бы с помощью акселерометра. В сети известны примеры проектов использования смартфона для подобного управления, такой проект имеется и у нас. Однако на этот раз нам хотелось сделать что-то ощутимо менее энерго-потребяющее на передающей стороне. Это был первый обучающий BLE проект моего студента Нэйсена.

Ограничение на радиус действия управления связано прежде всего с использованием протокола BLE (Bluetooth Low Energy), который разработан преимущественно для небольших расстояний. Нами были использованы радиомодули семейства EZ-BLE фирмы Cypress с максимальной выходной мощностью +3dBm (2mW). Эти модули очень просты и удобны в программировании при использовании системы PSoC Creator. Про подобные модули у меня есть пара статей, см. [1] и ссылки в ней. Применённые в нашем проекте модули весьма просто паяются любым паяльником на плату благодаря большому шагу выводов (1.5мм) и наличию контактных площадок на рёбрах их плат. Данная модель модулей выпускается в двух модификациях – с установленным на плате экраном и без него. Отличие этих модификаций главным образом в наличиии сертификации и в цене. Мы использовали более дешёвые и несертифицированные модули без экранов, которые вполне пригодны для домашних поделок. Микроконтроллер модулей оснащён всей стандартной периферией, типичной для микроконтроллеров сегодня, так что вся система может быть собрана на основе одного лишь модуля. Микроконтроллер выполнен по архитектуре ARM Cortex-M0 с максимальной частотой тактирования 48 мгц от внутреннего генератора. На плате модуля установлен кварц на частоту 24 мгц для тактирования радио-тракта, а также часовой кварц для прецезионного формирования временных интервалов при работе стека протокола. В целях снижения токопотребления мы тактируем нижние уровни стека BLE на частоте 3 мгц от кварцевого генератора, а всё остальное приложение на частоте 6 мгц.

Приёмник

Схема приёмника чрезвычайно проста. Помимо радио-модуля IC1 она включает разъём для его программирования, драйвер моторов на микросхеме IC2, светодиод для индикации состояния программы приложения (см. ниже) и стабилизатор напряжения IC3. Для питания схемы решено было использовать 4 пальчиковые батареи типоразмера АА, так что напряжение на них не опускается ниже 4В при разрядке в процессе работы системы.

Применённый драйвер IC2 идеально подходит для управления небольшими моторами с потреблением до 1А. Он выполнен по КМОП технологии с малым падением напряжения на транзисторах выходного каскада, что предотвращает нагрев корпуса микросхемы даже при работе с максимальмым током. Нами использован вариант драйвера в корпусе с металлизированной подложкой, которая после припаивания к плате позволяет использовать фольгу на последней в качестве теплоотвода. Однако, эта мера предосторожности для трёх-вольтовых моторов модели оказалась совершенно излишней и подложку можно было-бы вообще не припаивать к плате, или даже использовать вариант корпуса без подложки. Четыре управляющих сигнала драйвера разбиты на 2 пары. В каждой паре один из сигналов используется для подачи из модуля ШИМ на соответствующий мотор, а второй для управления направлением его вращения. ШИМ для мотора поворота колёс предполагалось использовать для снижения эффективного напряжения на нём.

Внутри PSoC задействованы 3 модуля. Модуль PWM формирует ШИМ для управления моторами. В результате экспериментов была выбрана частота ШИМ в 2 мгц / 127 = 15.7 кгц при 7-битном разрешении. Разрешение выбрано из соображений посылки лишь одного байта для управления скоростью, положительное значение которого соответствует движению модели вперёд, а отрицательное – назад. При этом используются лишь 3 фиксированные скорости: малая, средняя, и большая. Как оказалось, в модели использована дешёвая коробка передач с пластиковыми шестерёнками без нормальных подшипников и с огромными потерями, а также весьма неэффективные моторы. Из-за увеличенного четырьмя батареями веса модели при очень малой скорости вращения колёс в воздухе она не могла тронуться с места после установки на пол. Поэтому и было принято решение насчёт трёх дискретных скоростей, так что даже на минимальной скорости моторы развивают достаточный момент для начального старта модели. Вот как выглядит соединение модулей PSoC в графическом конфигураторе ресурсов. Выводы A1 и B2 для изменения направления вращения моторов управляются непосредственно из программы.

Нижний на схеме модуль ШИМ предназначен для управления частотой мигания светодиода. Светодиод использовался преимущественно в режиме отладки для индикации различных фаз установки соединения с передатчиком путём изменения частоты его мигания. При этом постоянное его свечение соответствует успешному завершению процесса соединения. Однако, в конечном варианте соединение устанавливается в доли секунды после включения передатчика, так что светодиод практически сразу переходит к постоянному свечению.

Сердцем приёмника является модуль BLE в PSoC. Он сконфигурирован на GAP роль периферийного устройства с реализацией проприетарного GATT профиля (custom profile), и выступает в роли сервера. В профиле помимо стандартных сервисов Generic Access и Generic Attribute, регламентируемых BLE SIG, имеется и проприетарный сервис Car Control, включающий 3 характеристики Turn, Speed, и Control для управления поворотами и скоростью модели. Следует отметить, что наш проект отличается от опубликованного в [2], где GAP роли приёмника и передатчика противоположны нашим. Это сделано намеренно, чтобы Nathan глубже проникся миром BLE. Соответственно, заново разработана логика работы программ приёмника и передатчика и логика их взаимодействия со стеком BLE.

Приём команд передатчика, именно записи новых значений в характеристики профиля, реализован на основе обслуживания прерываний стека BLE в обрабочике GeneralEventHandler. При этом обрабатываются 4 события. Событие CYBLE_EVT_STACK_ON генерируется по завершении инициализации стека и используется для начала посылки advetisement с идентификатором приёмника, используемым для соединения его с передатчиком. В качестве идентификатора используется уникальный 48-битный код, зашитый в модуль на фабрике. Его можно изменить при необходимости, но мы это не делали. Следующие 2 события CYBLE_EVT_GAP_DEVICE_CONNECTED и CYBLE_EVT_GAP_DEVICE_DISCONNECTED генерируются стеком после установки соединения с передатчиком и при разъединении с ним. В первом случае мы просто конфигурируем светодиод на постоянное свечение, а во втором останавливаем модель и возобновляем посылку advetisement, предоставляя тем самым передатчику возможность возобновления соединения. Светодиод при отсутствии соединения с передатчиком начинает мигать с периодом 1 сек.

Наконец, главное для логики работы приложения событие CYBLE_EVT_GATTS_WRITE_REQ генерируется стеком при приёме команды записи значения характеристики в базу данных сервера. При этом мы проверяем какую именно характеристику следует изменить, посылаем подтверждение приёма команды в передатчик, и вызываем соответствующую функцию Set_Turn() и/или Set_Speed() для выполнения команды путём манипуляции сигналов на входах IC2.

В данной реализации протокола связи соединение с передатчиком происходит каждые 100 миллисекунд. В промежутках между соединениями система погружается в сон с потреблением 4.7 мА при неработающих моторах. Из этого потребления около 1.3 мА приходится на светодиод. Из-за необходимости постоянной генерации ШИМ для моторов не представляется возможным погрузить PSoC в глубокий сон во время движения модели, т.к. при этом останавливаются все генераторы и прекращается работа ШИМ. Потребление можно снизить примерно в 3 раза если отключать генерацию ШИМ при остановке модели и погружать систему в глубой сон.

Приёмник собран на односторонней печатной плате размером 37×26 мм, приклеенной на отрезок пластиковой упаковки, который в свою очередь приклеен к шасси модели. Батарейный отсек размещён в центральной части модели. Несмотря на фиксацию батарей крышкой корпуса отсека, при столкновении модели с препятствием или даже движении по шероховатой поверхности иногда возникает потеря контакта в пружинном держателе батарей, что приводит к кратковременной потере соединения с передатчиком и миганию светодиода на плате. Недаром в оригинальном исполнении в модели использовался аккумулятор с проволочными выводами, припаянными к плате.

Передатчик

Помимо радио-модуля, такого-же как в приёмнике, передатчик содержит 3-осный аналоговый акселерометр IC2 и светодиод для индикации наличия соединения с моделью. Конденсаторы C2-C4 наряду с резисторами внутри IC2 образуют ФНЧ для фильтрации шумов на выходе аналоговой части акселерометра. Измерение его сигналов на выходах X, Y, Z производится 12-битным АЦП в составе PSoC. Измерение производится каждые 100 миллисекунд в соответствии с периодом соединения с моделью. Временной интервал измерения параметров обеспечивается Watchdog-ом в PSoC, тактируемым от часового кристалла на плате модуля.

АЦП сконфигурирован на недефференциальное включение. Начало процесса измерения сигналов акселерометра производится программно. АЦП тактируется от своего генератора на частоте 6 мгц, так что измерение данных со всех трёх осей акселерометра производится за 36 микросекунд, включая усреднение четырёх измерений по каждой оси. Поворот модели осуществляется наклоном платы передатчика вправо и влево на угол превосходящий примерно 30°. Этим предотвращается подача ложных команд при небольших флюктуациях положения платы в руках оператора. Скорость и направление движения модели регулируются наклоном платы передатчика в направлении от себя или к себе. При этом скорость модели пропорциональна степени наклона. Поскольку используются 3 дискретных значения скорости, соответствующих пороговым значениям наклона платы, изменение скорости не происходит при наклоне платы между этими пороговыми значениями.

Светодиод индицирует фазы соединения с приёмником. Частота его вспышек увеличивается от начала сканирования BLE устройств, до обнаружения BLE устройства с идентификатором приёмника, соединения с приёмником, и процессом окончания чтения предоставляемым приёмником сервисов и их характеристик. По завершении всего процесса светодиод светит постоянно без мигания. При этом его генератор ШИМ отключается и светодиод управляется непосредсвенно с выхода соответствующего пина порта PSoC.

В отличии от приёмника удалось помещать систему в глубокий сон в промежутках между измерением ускорения и обработки событий стека. При этом токопотребление передатчика оказалось около 1.6 мА, из которых около 1.3 мА приходится на светодиод. Для дальнейшего снижения токопотребления следовало-бы также погружать акселерометр в сон подачей соответствующего сигнала на его вход ENA.

Передатчик смонтирован на односторонней печатной плате размером 74×42 мм. Фольга вблизи антенны модуля удалена в соответствии с рекомендациями производителя. Батарейный отсек размещён на тыльной стороне платы и привинчен к ней двумя винтами M2.

Соединение передатчика (ведущее устройство - master) с приёмником (ведомое устройство – slave) производится на основе обработки событий стека BLE в файле BLEclient.c. Как и в приёмнике, событие CYBLE_EVT_STACK_ON генерируется по окончании инициализации стека. Как только это произойдёт, вызывается API функция CyBle_GapcStartScan для начала сканирования доступных передатчику BLE устройств. При обнаружении такового генерируется событие CYBLE_EVT_GAPC_SCAN_PROGRESS_RESULT и стек передаёт обработчику идентификатор (MAC address) устройства. Одновременно генерируется событие CYBLE_EVT_GAPC_SCAN_START_STOP. В обработчике первого события полученный идентификатор сравнивается с таковым для модели приёмника. При его несовпадении сканирование устройств продолжается путём подачи соответствующей команды в обработчике второго события. В противном случае там-же подаётся команда CyBle_GapcConnectDevice произвести соединение с приёмником. При успешном соединении сначала генерируется событие CYBLE_EVT_GATT_CONNECT_IND, при котором обработчик получает дескриптор устройства (device handle) приёмника, который сохраняется в переменной connHandle и впоследствии используется для подачи команд приёмнику. Далее стеком генерируется событие CYBLE_EVT_GAP_DEVICE_CONNECTED, символизирующее об окончании процесса соединения. В этот момент обычно начинают процесс сбора информации о сервисах, предoставляемых соединённым устройством, их характеристиках и дескрипторах. Однако, в целях упрощения кода мы этого не делаем, т.к. наверняка знаем какие сервисы следует ожидать от нашего приёмника. Значения дескрипторов характеристик (characteristic handle) Turn, Speed и Control профиля приёмника (в нашем случае 0х0012, 0х0016, 0x001A) можно найти в файле BLE_custom.h проекта приёмника. Этот файл автоматически генерируется конфигуратором при создании проекта.

На фоне обработки событий стека BLE логика работы передатчика чрезвычайно проста. По получении прерывания от сторожевого таймера производится пробуждение АЦП и измерение сигналов на выходе акселерометра. Значения вектора ускорения сравнивается с пороговыми для поворотов и скоростей в функции Check_Control(), и производится заполнение полей структур управления характеристиками. Далее подаётся команда CyBle_GattcWriteCharacteristicValue передачи соответствующей характеристики приёмнику. Параметрами этой функции являются дескриптор соединения с приёмником (полученный при соединении) и структура дескриптора соответствующей характеристики. Последние инициализируются лишь один раз при подаче питания в фунции Init_RAM(), т.к. в этих структурах требуется указать лишь адрес значения надлежащей характеристики. При изменении значения кода скорости и поворота адрес этих значений при статическом расположении их в RAM не меняется.

При повторении конструкции следует в программе передатчика (файл BLEclient.c) изменить в массиве serverAddress MAC адрес моего модуля приёмника на Ваш. Для этого следует включить приёмник модели, который в режиме advertisement будет передавать свой MAC адрес и который можно будет прочитать любым сканером BLE устройств. Например, с помощью проложения CySmart для смартфонов, свободно доступного в сети. Файлы плат для Eagle и исходники проекта прилагаются.

Радиус действия управления, даже при использовании протокола BLE, можно существенно повысить до нескольких сотен метров путём использования модулей с большей выходной мощностью. Таковые имеются у Cypress, я прежде всего имею в виду новые модули CYBLE-224110-00 с огромной для BLE мощностью +9.5 dBm (около 9 mW). Конечно, при такой мощности это будет уже не совсем Low Energy. Фирма любезно предоставила нам эти модули для экспериментов, однако про них подробнее как-нибудь в другой раз. В заключении видео управления моделью.

Литература

1. Реалиазция стандартного GATT-BLE профиля на RSoC фирмы Cypress
2. Project #047: PSoC 4 BLE - Accelerometer Controlled Car


Файлы:
Архив ZIP


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




Как вам эта статья?

Заработало ли это устройство у вас?

23 3 2
1 0 0

Эти статьи вам тоже могут пригодиться: