Авторы: Евгений Дубовик, Senior Android Developer, Николай Хабаров, Embedded Expert
Накануне нового года мы решили создать гирлянду с помощью Android Things, смартфона на базе Android и IoT-платформы DeviceHive. В качестве самих огоньков, мы использовали светодиодную ленту WS2812B. Для работы Android Things мы воспользуемся Raspberry Pi 3, хотя здесь подошла бы и любая другая плата, оснащенная SPI-интерфейсом и имеющая поддержку Android Things. Управление светодиодами осуществляется с мобильного устройства, записывающего звуки, на основе которых генерируются паттерны поведения огоньков.
Android Things
Android Things — это современная, хорошо спроектированная операционная система, разработанная компанией Google, которая позволяет использовать Android API и сторонние Java и Android-библиотеки. Raspberry Pi 3 будет посылать цвета на светодиодную ленту через шину SPI (Serial Peripheral Interface).
SPI — это последовательный синхронный интерфейс передачи данных, который обеспечивает взаимодействие между устройствами, используя структуру типа «ведущий — ведомый». В API платформы Android Things за работу с шиной SPI отвечает служба PeripheralManager.
Согласно официальной документации, протокол передачи данных ленты WS2812B использует униполярный код NZR. После сброса DIN-порт получает данные от контроллера, первый светодиод принимает первые 24 бита данных (GRB, не RGB — по одному байту на цвет), а затем отправляет их на следующие светодиоды в ленте. Так данные передаются по цепочке, используя DO-порт светодиодов. Получается, что после каждого из них длина данных уменьшается на 24 бита. Каждая передача должна содержать данные для всех светодиодов ленты.
Схема работы протокола передачи данных устройства достаточно проста: передача цифрового значения «1» и «0» одного бита приведена на иллюстрации ниже.
Схема из официальной документации, где T0H длится 220нс~380нс, T0L – 580нс~1600нс, T1H – 580нс~1600нс, T1L – 220нс~420нс
Мы будем эмулировать это протокол работая с шиной SPI. В нашем случае Raspberry Pi 3 выступает в роли ведущего устройства (master), а WS2812 — в роли ведомого (slave).
Для эмуляции SPI-протокола мы используем блоки по 4 бита при передаче по SPI, чтобы сгенерировать один бит протокола для WS2818B. Скорость для шины SPI следует выбирать в соответствии с временными интервалами для WS2818B. Мы используем значение 3809523 Гц, а передача каждого блока из 4-х битов (или одного бита WS2818B) занимает 1,05 мс, что наглядно иллюстрирует рисунок ниже:
Железо
Чтобы создать новогодние огни, нам понадобятся следующие компоненты:
- Raspberry Pi3;
- Карта памяти формата microSD на 8ГБ;
- Источник питания на 5В (мощность зависит от общей длины ленты);
- Светодиодная лента WS2812B;
- Кабели.
Ниже можно увидеть схему подключения RPi3 и светодиодной ленты:
WS2812B pin | Raspberry Pi 3 pin |
---|---|
+5V | 5V |
GND | GND |
Инструкцию по установке Android Things можно найти в официальной документации.
Можно сказать, что с «железной» частью мы закончили! Убедитесь только, что источник питания имеет достаточную мощность для того, чтобы обеспечить работу светодиодной ленты и самой платы. Для правильного функционирования длинных лент 5В должны быть подключены напрямую к источнику питания, минуя плату Raspberry Pi3.
IoT-платформа
Чтобы подключить устройство под управлением Android Things OS к плате и мобильному устройству, нам нужна соответствующая платформа. Для этого хорошо подойдет платформа DeviceHive.
Благодаря платформе DeviceHive любой девайс может быть подключен к облачному сервису, т. е. стать IoT-устройством. Платформа включает в себя масштабируемый сервер, мультиплатформенные библиотеки для коммуникаций и управления устройствами. DeviceHive может быть применен для решения задач в интеллектуальной энергетике, автоматизации дома, дистанционных измерениях, телеметрии, удаленного управления, мониторинга ПО и многого другого.
Настройка платформы DeviceHive
Платформа DeviceHive обеспечивает пользователей библиотеками. Для разработки клиентских приложений можно использовать DeviceHive Java Client library. Это открытый проект на основе Java, с помощью которого можно создавать приложения на базе Java или Android. Эта библиотека полностью поддерживает Android Things. Добавить эту библиотеку очень просто:
- Добавьте репозиторий JitPack к файлу проекта build.gradle и задайте зависимость файлу модуля build.gradle.
- Вызовите метод getInstance().init(String url, String refreshToken) объекта DeviceHive и передайте два параметра: ссылку на REST интерфейс сервера и JWT Refresh-токен.
- Вызовите метод getDevice(String id) для того, чтобы получить существующее устройство или создать новое.
Это все! Теперь у нас есть все необходимое, чтобы использовать DeviceHive в нашем проекте. После настройки библиотеки поддержки в DeviceHive мы создадим проект, который состоит из двух частей: Android Things и мобильного приложения.
Приложение Android Things
Это приложение просто слушает входящие команды с WebSocket соединения, установленного с сервером DeviceHive, и исполняет их. Список команд:
- BLINK: после получения команды контроллер включает на ленте два предустановленных цвета Санта-Клауса, красный и белый. Огоньки бегут от центра к концам ленты и обратно.
- RANDOM: после получения команды контроллер генерирует случайные цвета.
- AUDIO: контроллер получает команду с двумя объектами данных внутри: списком сгенерированных цветов и скоростью изменения цветов. Ниже представлен пример параметров команды для объектов данных в формате JSON:
{ "speed": "500", "colors": [ { "blue": 0.101960786, "green": 0.0, "red": 0.039215688 }, ... ] }
- OFF: просто отключает светодиодную ленту.
А вот как команды выглядят в консоли администратора DeviceHive:
Готовое приложение доступно в этом репозитории. Единственный нюанс, перед сборкой и установкой приложения на плату, необходимо указать учетные данные сервера в исходниках.
Мобильное приложение
Мобильное приложение посылает команды на Raspberry Pi 3. У него достаточно простой UI, который включает два экрана: экран входа (Login) и главный экран (Main). На экране входа нам нужно заполнить три поля такими значениями, как ссылка на REST интерфейс сервера, JWT Refresh токен и ID устройства. На главном экране присутствуют 4 кнопки для исполнения команд.
После нажатия на кнопку, которая запускает исполнение команды AUDIO, смартфон начинает запись звука через микрофон устройства. Затем звукозапись проходит через быстрое преобразование Фурье (FFT) и считается основная частота тактов. Мы используем этот алгоритм для создания уникального паттерна поведения для огней на основе спектра звукозаписи, которые таким образом отображают конкретную аудиозапись на светодиодной ленте. После предварительной обработки мобильное приложение генерирует HSV-цвета на основе этих данных. Мы используем цветовую модель HSV, которая позволяет использовать значения H (тон), S (насыщенность) и V (яркость) манипулирую только с первым для получения ярких цветов. В итоге приложение высылает информацию по цветам и скорости, рассчитанной на основе количества тактов в секунду.
После отправки команды она обрабатывается приложением на стороне Android Things.
Мобильное приложение так же доступно в репозитории проекта.
Заключение
Разумеется, это развлекательный проект, который позволяет с удовольствием провести время перед праздниками и немного украсить свой дом. Но поскольку проект полностью открыт, аналогичные решения можно задействовать и для создания более практичных решений.
Используя Android Things и DeviceHive можно реализовать более сложную логику, организовать подключение к другим сервисам или создать кластер из плат управляемых с помощью одного сервиса. Мы надеемся, что этот проект поможет вам красиво декорировать дом и создать более продвинутые системы. С наступающим!
Kidar
А просто позвонить на это устройство можно, чтобы управлять миганием или инициализировать его (без мобильного приложения)?
В этом году сделал простенькое устройство с сотовым модемом, контроллером и светодиодной лентой для новогодней елочки.
Любой человек может с любого места позвонить на номер «Зажги елку». Вызов отбивается, т.е. бесплатен и при этом происходит вспышка гирлянды.
Можно будет потом добавить включение случайного цвета при звонке.
Получилось так.