Создание анимированной умной LED-ленты с управлением через Alexa на базе Arduino
Компоненты и материалы
| Arduino UNO | 1 |
| Raspberry Pi 3 Model B | 1 |
| NeoPixel лента (WS2812) | 1 |
Приложения и онлайн-сервисы
- Arduino IDE
- Amazon Web Services AWS Lambda
- Amazon Alexa Skills Kit
- Amazon Web Services AWS IoT
О проекте
Зачем нужна LED-лента
Я всегда восхищался адресуемыми RGB LED-лентами. Их бесконечные цветовые эффекты и возможности анимации пробудили мое творческое воображение, поэтому несколько лет назад я разработал библиотеку для плат Arduino под названием ALA (Arduino Light Animations). Теперь Alexa дает возможность управлять освещением и эффектами голосом — это просто здорово!
Обзор проекта
Проект состоит из следующих компонентов:
- Amazon Alexa: Пользовательский навык Alexa (Light Strip) определяет модель голосового взаимодействия и преобразует команды (интенты) в вызовы Lambda-функции.
- Amazon Lambda: Python-скрипт, принимающий сообщения от Alexa и отправляющий обновления в сервис IoT.
- Amazon IoT: Сервис IoT хранит «тень устройства» (thing shadow) — представление состояния RGB-ленты. При каждом обновлении тени подписанные MQTT-клиенты (Raspberry Pi) получают уведомления.
- Raspberry Pi: Этот одноплатный компьютер запускает MQTT-клиент для приема сообщений от Amazon IoT. С другой стороны, он питрует Arduino и отправляет команды через USB-порт.
- Arduino: Микроконтроллер запускает библиотеку ALA для управления LED-лентой, принимая команды от Raspberry Pi по последовательному порту USB. Подходят Arduino Uno, Nano или Mega.
- WS2812 RGB LED-лента: Адресуемые ленты позволяют управлять каждым светодиодом индивидуально, создавая красивые цветные анимации.
Никакая часть проекта не является слишком сложной, но компонентов много, и они тесно взаимосвязаны. Рекомендую следовать предложенной структуре, чтобы создать надежную базу перед переходом к следующему этапу. Для упрощения проект разбит на две части.
Первая часть описана в проекте Web-Controlled LED Animations with Raspberry Pi and Arduino на Hackster.io. Она проведет вас через подключение Raspberry Pi, Arduino и WS2812 LED-ленты. По завершении этого этапа вы сможете управлять анимациями со смартфона или ПК через веб-браузер.
Вторая часть (описанная здесь) добавляет голосовое управление через Amazon Alexa к предыдущей реализации. Настройка всей цепочки требует выполнения множества шагов, поэтому проявите терпение и внимательно следуйте инструкциям.
Amazon IoT
Аппаратная часть готова? Переходим в облако! Мы будем использовать платформу AWS IoT для управления нашим «устройством» из интернета.
Мы используем «Device Shadow» (тень устройства) — копию состояния вещи вместе с желаемыми изменениями. Raspberry Pi подпишется на канал уведомлений, публикующий изменения («дельта») этой тени. Подробнее об AWS IoT платформе и API можно узнать здесь.
Создание IoT-вещи (Thing)
- Войдите в AWS Console. Если у вас еще нет аккаунта, создайте бесплатный.
- Убедитесь, что вы находитесь в регионе US East (N. Virginia) или EU (Ireland) (в правом верхнем углу).
- Найдите «IoT» и выберите сервис AWS IoT. Нажмите Get Started, чтобы закрыть вводное руководство (если оно есть).
- Сначала создайте политику безопасности для нашей «вещи». Перейдите в меню Secure > Policies и нажмите Create a Policy. Заполните:
- Name:
LightStripPolicy - Action:
* - Resource:
* - Effect — Allow: отмечено
- Нажмите «Create»
- Name:
- Теперь создайте IoT Thing:
- Выберите Manage > Things и создайте новую вещь через Register a Thing > Create a single thing.
- В поле Name введите
LS01. Остальное по умолчанию, нажмите Next. - Нажмите Create certificate в разделе One-click certificate creation.
- Скачайте 3 сертификата для устройства и Root CA (для Root CA может потребоваться правый клик → «Сохранить как...»).
- После скачивания нажмите Activate.
- Нажмите Attach a Policy, выберите созданную ранее LightStripPolicy и нажмите Register Thing.
- Запишите AWS IoT Endpoint. Нажмите Settings в левом нижнем углу страницы AWS IoT и скопируйте Endpoint.
Настройка Raspberry Pi для прослушивания «Thing»
Установите AWS IoT Device SDK для Python на Raspberry Pi:
sudo pip3 install AWSIoTPythonSDK
Скачайте репозиторий LightStrip с GitHub и распакуйте:
mkdir -p /home/pi/LightStrip
cd /home/pi/LightStrip
wget https://github.com/bportaluri/LightStrip/archive/master.zip
unzip master.zip
Скопируйте четыре скачанных сертификата в папку /home/pi/LightStrip/LightStrip-master/pi.
Отредактируйте скрипт lightstripcfg.py (например, через nano):
cd /home/pi/LightStrip/LightStrip-master/pi
nano lightstripcfg.py
Настройте параметры под вашу конфигурацию:
- AWSIOT: введите записанный ранее AWS IoT Endpoint.
- ROOT_CA: имя файла корневого сертификата CA.
- CERTIFICATE: имя файла сертификата.
- PRIVATE_KEY: имя файла приватного ключа.
- DEVICE_NAME: оставьте
LS01.
Сохраните файл (Ctrl+X, затем Y).
Запустите скрипт lightstrip.py:
sudo python3 lightstrip.py
Скрипт покажет доступные USB-порты. Arduino обычно подключается к /dev/ttyACM0, поэтому запустите с указанием порта:
sudo python3 lightstrip.py /dev/ttyACM0
Клиент подключится к сервису тени устройства Amazon и подпишется на изменения тени LS01. При успешном подключении скрипт обновит свой статус в тени устройства и получит подтверждение.
Для проверки вернитесь в консоль AWS IoT, выберите Manage > Things, откройте устройство LS01 и перейдите в меню Shadow. Нажмите Edit в разделе Shadow Document и вставьте следующий JSON:
{ "desired": { "animation": "101" } }
При нажатии Save будет отправлено «дельта»-сообщение MQTT-клиенту на Raspberry Pi, которое включит LED-ленту.
Следующий JSON установит синий цвет:
{ "desired": { "color": "0066CC" } }
На этом этапе вы можете управлять LED-лентой через AWS IoT — поздравляю!
AWS Lambda-функция
AWS Lambda позволяет запускать код в облаке без управления серверами. Это идеальный мост между Alexa Skills Kit (который добавит голосовое управление на последнем шаге).
- Войдите в AWS Console, выберите сервис Lambda.
- Убедитесь, что вы в том же регионе (US East (N. Virginia) или EU (Ireland)).
- Нажмите Create Function → Author from scratch:
- Name =
LightStrip - Runtime =
Python 3.6 - Role = Create a Custom Role. Откроется новая вкладка — нажмите «Allow» для создания роли
lambda_basic_execution. - Existing role:
lambda_basic_execution - Нажмите Create Function
- Name =
- Запишите Lambda ARN ID в правом верхнем углу.
- Нажмите на блок LightStrip для открытия редактора кода.
- Code entry type: Edit code inline
- Runtime:
Python 3.6 - Handler:
lambda_function.lambda_handler
- Вставьте код из файла
LightStrip\lambda\lambda_function.pyв редактор. - Создайте еще один файл
ala_controller.pyи вставьте код изLightStrip\lambda\ala_controller.py. - Нажмите оранжевую кнопку Save в правом верхнем углу.
Навык Alexa (Alexa Skill)
Теперь создадим пользовательский навык Light Strip для Alexa.
- Перейдите в Amazon Developer Console и войдите (при необходимости зарегистрируйтесь).
- Перейдите в Alexa > Alexa Skills Kit (Get Started).
- Нажмите Add a New Skill (правый верхний угол) и заполните вкладку Skill Information:
- Skill Type: Custom Interaction Model
- Language: English (U.S.)
- Name:
LightStrip - Invocation Name:
light strip - Нажмите Save
- Запишите Skill ID.
- Выберите меню Interaction Model → Launch Skill Builder.
- Нажмите Code Editor и вставьте содержимое файла
LightStrip/alexaskill/lightstrip_skill.json. - Нажмите Save Model и Build Model. Сборка займет несколько минут. Затем вернитесь через кнопку Skill Information.
- Перейдите в меню Configuration.
- В Service Endpoint Type выберите AWS Lambda ARN и вставьте ARN Lambda-функции, записанный ранее.
- Остальное по умолчанию, нажмите Save.
Связывание навыка Alexa с Lambda-функцией
- Вернитесь к вашей Lambda-функции. Справа в списке предопределенных триггеров выберите Alexa Skills Kit — он добавится к функции.
- Настройте:
- Application Id = Skill ID, записанный выше.
- Нажмите Add, затем Save.
Готово!
Проект завершен. Попробуйте следующие голосовые команды:
- «Alexa, open Light Strip» — открыть Light Strip
- «Turn on» — включить
- «Set brightness to 20 percent» — установить яркость 20%
- «Set brightness to 50 percent» — установить яркость 50%
- «Set color to red» — установить красный цвет
- «Set color to turquoise» — установить бирюзовый цвет
- «Turn off» — выключить
- «Run an exciting animation» — запустить энергичную анимацию
- «Run a relaxing animation» — запустить расслабляющую анимацию
Навык LightStrip поддерживает более сложные диалоги:
Я: Alexa, open Light Strip Alexa: Welcome to LightStrip — LED-лента засветится синим Я: Launch an animation Alexa: Do you want a relaxing or exciting animation? Я: Relaxing Alexa: OK — LED-лента покажет случайную анимацию Я: Next animation Alexa: OK — будет показана другая случайная анимация
Для лучшего понимания модели взаимодействия ниже приведена полная VUI-диаграмма навыка.
Улучшения и доработки
Автозапуск AlaWeb при загрузке
Небольшое улучшение — настроить автозапуск скрипта lightstrip.py при загрузке Raspberry Pi, чтобы не запускать его вручную после каждого включения или сбоя. Инструкции по настройке автозапуска можно найти в репозитории проекта.
Добавление и настройка анимаций
Навык Light Strip уже содержит 20 вариантов анимаций. Однако библиотека ALA позволяет легко создавать свои анимации, выбирая пресет, цветовую палитру и скорость. Вы можете добавить свои анимации или изменить существующие в скрипте ala_controller.py. Примерно на строке 80 находится список настроек анимаций, который можно модифицировать под свои предпочтения.
Код
Весь необходимый код проекта доступен на GitHub: https://github.com/bportaluri/LightStrip
Схемы
Схема подключения прилагается в разделе Schematics оригинального проекта.
Производственный процесс
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Умные самозавязывающиеся туфли с встроенной сборкой энергии
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
- Умная робо-рука на Arduino: простое DIY-руководство
- Освоение распознавания и синтеза речи на Arduino Due