Освоение модулей Bluetooth RN487x от Microchip для низкопотребляющих периферий
Узнайте, как конфигурировать семейство модулей Bluetooth RN487x от Microchip для ваших низкопотребляющих периферийных проектов.
Если вы строите компактное, энергоэффективное устройство, Bluetooth почти всегда является выбором связи номер один. За годы стандарт зрел, и сегодня широкий спектр готовых модулей предоставляет полную system-on-chip (SoC), удовлетворяющую потребности многих периферий. Популярный пример — Nordic nRF52840, объединяющий 32-битный процессор, мультипротокольную Bluetooth-радио и полный комплект I/O интерфейсов вроде GPIO, PWM, USB, SPI и I²S.
Пока мощные, эти SoC могут быть устрашающими: кривая обучения и время разработки, необходимые для интеграции встроенного ПО, значительны. Для многих распространенных сценариев — удаленного 감сирования или управления с лишь горстью аналоговых или цифровых каналов — более простое, сфокусированное решение часто предпочтительнее.
Встречайте семейство RN487x от Microchip. Два модуля в этом семействе — RN4870 и RN4871 — предлагают множественные одновременные двунаправленные цифровые и аналоговые каналы, сохраняя дизайн-футпринт и усилие по прошивке минимальными. Каждый модуль хранит компактную конфигурацию в своей невиолатильной RAM, позволяя вам адаптировать функциональность периферии к вашим точным требованиям. Важно, модули остаются полностью совместимыми со стандартом Bluetooth Low Energy (BLE), обеспечивая бесшовное парирование со современными смартфонами и другими BLE-клиентами.
В этой трехчастной серии мы пройдемся через создание полностью функционального Bluetooth-включенного периферийного устройства для четырех типичных задач: цифровой сенсор, цифровое управление, аналоговый сенсор и аналоговое управление. Каждый пример включает референс-схему, точные шаги конфигурации RN487x и простой Python-скрипт, демонстрирующий, как взаимодействовать с периферией с Linux-хоста. Скрипты тщательно документированы, так что вы можете легко встраивать периферию как подсистемы в более крупные дизайны.
Обзор дизайна
Ниже графическая иллюстрация примера «аналоговый сенсор», выделяющая ключевые интерфейсы красным.

Представление Linux-системы, коммуницирующей с периферией
Мы построим три ключевых компонента для этого примера:
- Периферийное оборудование, предоставляющее сенсорный сигнал — аналоговый преобразователь в этом случае, генерирующий переменное напряжение.
- Хост-приложение, представляющее данные пользователю — наш Python-скрипт.
- Конфигурация RN487x, отображающая физический сигнал в GATT базу данных, используемую хостом.
Выбор компонентов
Семейство RN487x предлагает две вариации: RN4870 и RN4871. Они отличаются в основном количеством пинов и доступными типами I/O. Ниже реорганизованная таблица pin-бюджета, чтобы помочь решить, какой чип лучше подходит для вашего проекта.
Существует три категории I/O пинов на модулях:
| Тип | Описание |
| ADC | Аналоговый вход: конвертирует напряжение в числовое значение. |
| PWM | Аналоговый выход: генерирует прямоугольную волну, частота и коэффициент заполнения которой заданы двумя числами. |
| DIO | Цифровой вход или выход: высокий или низкий уровень представляет логику 1 или 0. |
RN4870

Изображение из даташита RN487x
| Pin Name/Capability | P1_0 | P1_1 | P1_2 | P1_3 | P2_2 | P2_3 | P2_4 | P2_5 |
| ADC | x | x | x | x | ||||
| PWM | x | x | ||||||
| DIO | x | x | x | x | x |
RN4871

Изображение из даташита RN487x
| Pin Name/Capability | P1_2 | P1_3 |
| ADC | x | |
| PWM | ||
| DIO | x | x |
Эти таблицы проясняют: если вашему дизайну нужен только один аналоговый вход и нет PWM выходов, RN4871 — самый легкий выбор. Для проектов, требующих множественные сигналы или PWM, RN4870 — подходящий выбор. В примере аналогового сенсора мы используем RN4871 и подключаем сенсор к пину P1_2.
GATT (Generic Attribute) профиль BLE протокольного стека
Перед написанием хост-приложения важно понять GATT API, которое будет медиацией коммуникации между хостом и периферией.
Все BLE-устройства экспонируют GATT базу данных, которую периферия (сервер) заполняет. Хост (клиент) использует GATT вызовы для чтения или записи значений, идентифицируемых дескрипторами или именами. Типичные Python GATT операции выглядят так:
gatt_rq.connect() # Запись значения в дескриптор характеристики gatt_rq.write_by_handle(vh_light, str(bytearray([8])))
Первый вызов устанавливает соединение; второй записывает данные, которые немедленно отражаются на выходах периферии. GATT API поддерживается iOS, Android, Windows и Linux. Наши примеры используют Python на Linux для широкой совместимости.
Конфигурация модуля
Для моста физического сигнала к GATT базе данных вы должны запрограммировать NVRAM RN487x двумя ключевыми конфигурационными блоками:
- Определение характеристики (Characteristic Definition): Выделяет пространство базы данных и присваивает уникальные идентификаторы для каждого значения.
- Привязка пинов (Pin Binding): Отображает физические I/O пины к характеристикам базы данных, позволяя автоматическую конвертацию данных.
RN487x использует легкий командный язык для конфигурации. Обратитесь к приложению для деталей установки консольного соединения и выдачи конфигурационных команд. После программирования NVRAM модуля может выглядеть так:

Все конфигурационные значения находятся в двух-уровневой иерархии сервисов и характеристик — полезно при масштабировании к многосенсорным или многоконтрольным дизайнам.
Это завершает часть первую нашей трехчастной серии туториалов RN487x. Части 2 и 3 покроют реализации цифрового входа, цифрового управления, аналогового сенсора и аналогового управления. Часть 4 обсудит продвинутые темы, применимые ко всем примерам.
Ниже приложение, описывающее, как конфигурировать модули перед погружением в детальные проекты.
Использование консольного соединения для конфигурации RN487x
Подайте питание на модуль и установите последовательную связь с рабочей станцией. Каждый демо-циркуит включает 3-пиновый «prog» джампер, экспонирующий RX, TX и GND. Если нужна помощь, отличное руководство доступно здесь.
Запустите терминальный эмулятор. Утилита miniterm (в комплекте со многими Python-дистрибутивами) — хороший выбор. В оболочке запустите так:
python -m serial.tools.miniterm --eol LF /dev/ttyUSB0 115200
Дефолтный бодрейт 115200 подходит для RN487x.
Переключитесь из DATA в COMMAND режим, введя три знака доллара ("$$$") — вы не увидите символов, но промпт изменится на:
CMD>
Попробуйте нажать d затем Enter; модуль отобразит свой статус:
CMD> BTA=D88039F80080 Name=RN_BLE Connected=no Authen=2 Features=0000 Services=00 CMD>
Включите эхо, если хотите видеть нажатую клавишу: нажмите + и Enter:
CMD> ECHO ON CMD>
Создание нового GATT сервиса так же просто, как выдача одной команды PS, например:
CMD> PS,59c88760536411e7b114b2f933d5fe66 AOK
Проектные конфигурации также требуют многострочных скриптов. Начните скрипт с WW, введите каждую строку и завершите Esc для коммита:
CMD> ww @CONN |O,08,72 AOK CMD>
Общая инициализация модуля
При повторном использовании модуля RN487x между проектами предыдущая конфигурация может мешать новым использованиям. Выполните следующие шаги очистки перед каждым примером:
- Стерть любой существующий скрипт.
- Включить обработку скриптов.
- Стерть существующие определения сервисов/характеристик.
- Удалить любые специальные функции с пина, который вы будете использовать (например, P1_2).
- Перезагрузить модуль.
Выполните последовательность команд ниже:
CMD> WC AOK CMD> SR,0040 AOK CMD> PZ AOK CMD> SW,0A,00 AOK CMD> R,1 Rebooting
Настройка Linux для запуска примеров Python-скриптов
Аппаратное обеспечение
Убедитесь, что ваша хост-система имеет BLE-железо (Bluetooth 4.0 или новее). Если нужен USB-адаптер, рекомендуем основанный на Qualcomm CSR8510, доступный здесь.
Программное обеспечение
Примерные скрипты тестировались на Debian 10 и должны работать на других Debian-базированных дистрибутивах вроде Ubuntu. Два Python-пакета требуются, которые не установлены по дефолту:
python-bluez— предоставляет доступ к Bluetooth стеку.gattlib— предлагает Python-биндинги для GATT операций (установка черезpip).
Установка gattlib строит ELF-библиотеку, так что вам понадобятся инструменты сборки и библиотеки. Хелпер-скрипт, устанавливающий все зависимости, доступен здесь. После скачивания сделайте скрипт исполняемым и запустите его.
Ссылки
- RN487x Datasheet
- RN487x User Guide
- GATT API в Windows
- GATT API в iOS
- GATT API в Python
Оставайтесь в курсе следующих частей этой серии, где мы построим полные примеры цифрового входа и цифрового управления.
Перейдите к проектам 1 и 2: построение цифрового входа и цифрового управления.
Интернет вещей
- Синергия Cellular IoT и Bluetooth LE: подход к связности нового поколения
- Bluetooth Mesh: выбор между модулем и дискретным чипом
- Contrinex 2020: облачные сенсоры и Bluetooth light curtains для безопасности
- ADLINK развертывает AI от края до облака с платформой NVIDIA EGX: Ускоренные решения краевых вычислений
- Чтение аналоговых датчиков на Raspberry Pi без встроенного АЦП
- Чтение аналоговых датчиков с Raspberry Pi и Zabbix: пошаговое руководство
- Использование данных в Интернете надежности: стратегии эффективного управления
- От Edge к Cloud: мастерство IoT data pipelines
- Цифровизация в пищевой промышленности: повышение безопасности, прослеживаемости и эффективности
- Инсайты по Edge Computing и стратегии ИоТ с IoT World 2019