В последние несколько лет трехцветные светодиоды (RGB LEDs) становятся все более популярными вследствие их красивого свечения, яркости и потрясающих световых эффектов. Поэтому в современном мире их часто используют для украшения различных зданий и помещений.
В данной статье мы рассмотрим управление цветной светодиодной матрицей WS2812B (Neopixel Based RGB LED matrix shield) с помощью платы Arduino и Android приложения Blynk с целью создания "обворожительных" световых эффектов. Цветная светодиодная матрица WS2812B реализована в виде шилда (платы расширения) для Arduino.
Adafruit 5X8 NeoPixel шилд для Arduino
Совместимая с Arduino NeoPixel Shield (шилд, плата расширения) содержит 40 трехцветных светодиодов (RGB LEDs) с индивидуальной адресацией. Данная плата расширения имеет встроенный драйвер WS2812b, который организует (упорядочивает) матрицу 5×8 светодиодов в NeoPixel Shield. При необходимости несколько таких шилдов могут быть объединены в один чтобы сформировать светодиодную матрицу большого размера. Для управления трехцветными светодиодами в составе данного шилда необходим всего лишь один контакт платы Arduino, в нашем случае мы решили использовать для этой цели контакт 6.
В нашем проекте все светодиоды матрицы запитываются от контакта 5V платы Arduino, мощности которого достаточно для запитывания примерно трети светодиодов матрицы с полной яркостью. Для запитывания большего числа светодиодов необходимо подключать внешний источник питания 5V.
Принцип управления светодиодной матрицей с помощью Arduino и приложения Blynk
Используемая в нашем проекте светодиодная матрица 8*5 содержит 40 трехцветных светодиодов (RGB LEDs) с индивидуальной адресацией с помощью драйвера WS2812B. Она позволяет использовать 24-битное управление цветом, что позволяет реализовать 16.8 миллионов цветов на одном пикселе. Управляется данная матрица по одному проводу. Как следует из даташита на светодиоды матрицы рабочее напряжение для них составляет от 4 до 6 В, при этом при напряжении 5 В и полной яркости всех трех цветов один такой светодиод потребляет ток примерно 50 mA. Также матрица содержит защиту от неправильной полярности напряжения (Reverse-voltage protection) на внешних контактах подачи питания и кнопку сброса (Reset button), с помощью которой можно производить сброс платы Arduino. Также у нее есть контакт для внешней подачи питания для светодиодов, его можно использовать в случае когда мощности внутреннего источника питания не хватает.
Как показано на представленной структурной схеме, нам необходимо скачать и установить на свой смартфон приложение Blynk (Blynk application), с помощью которого можно будет управлять цветом и яркостью свечения светодиодов в используемой нами светодиодной матрице. После установки этих параметров в приложении Blynk даже если потом с этим приложением что-нибудь случится, мы все равно можем скачать/изменить эти данные из облака Blynk (Blynk cloud) с помощью нашего компьютера. Когда плата Arduino Uno подключена к компьютеру с помощью USB кабеля, то процесс получения этих данных выглядит следующим образом. Компьютер запрашивает данные из облака Blynk через определенные интервалы времени и если данные в этом облаке обновились, то он передает их плате Arduino, которая управляет изменением цвета и яркости свечения светодиодов. Шилд цветной светодиодной матрицы (RGB LED shield) размещен на плате Arduino и он соединен одиночным проводом с одним из контактов платы Arduino (по умолчанию это контакт D6). Последовательные данные от платы Arduino передаются на данный шилд Neopixel и управляют свечением светодиодов на нем.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Шилд цветной светодиодной матрицы 8*5 (8*5 RGB LED Matrix shield) (купить на AliExpress - смог найти там только один похожий шилд и он не от компании Adafruit, но драйвер у него точно такой же какой рассматривается в статье).
- USB A/B кабель для Arduino Uno.
- Персональный компьютер или ноутбук
Соединение шилда цветной светодиодной матрицы с платой Arduino
Используемый нами шилд светодиодной матрицы (Adafruit RGB LED Shield с драйвером WS2812B) имеет всего три контакта – один для передачи данных и два для питания. Его очень просто подключить к плате Arduino – для этого необходимо просто поместить наш шилд Neopixel LED matrix сверху платы Arduino UNO. В этом случае светодиодная матрица будет запитываться от контакта 5V платы Arduino. После установки ее сверху на плату Arduino вся конструкция будет выглядеть следующим образом:
Настройка приложения Blynk
Blynk – это приложение, которое может работать на мобильных операционных системах Android и IOS и позволяет с помощью смартфона управлять различными устройствами, поддерживающими концепцию интернета вещей (Internet of Things, IoT). При использовании данного приложения нам сначала необходимо создать в нем графический интерфейс пользователя (Graphical User Interface, GUI). Из этого графического интерфейса данные будет передаваться в облако Blynk. На приемной стороне мы имеет плату Arduino, подключенную к компьютеру по USB кабелю. Таким образом, компьютер запрашивает эти данные из облака Blynk и потом эти данные передаются в плату Arduino для дальнейшей обработки.
Прежде чем начать работу с приложением скачайте его (Blynk Application) из магазина Google Play (пользователи IOS аналогичным образом могут скачать его из App Store). После скачивания приложения зарегистрируйтесь в нем используя ваш email и придумав пароль.
Создание нового проекта
Послу успешной установки и регистрации в приложении Blynk вы увидите на его главной странице кнопку “New Project” (новый проект). Нажмите ее и у вас в приложении откроется новое окно, в котором необходимо будет ввести такие параметры проекта как имя, плату и тип соединения. Для нашего проекта выберите плату “Arduino UNO”, тип соединения “USB” и нажмите на кнопку “Create” (создать).
После успешного создания проекта вам на электронную почту (с которой вы регистрировались в приложении) придет ваш идентификатор подлинности (Authenticate ID). Сохраните его – он нам пригодится в дальнейшем.
Создание графического интерфейса пользователя (GUI)
Откройте проект в приложении Blynk, в нем нажмите на значок “+” – после этого вы получите доступ к виджетам (графическим элементам), которые вы можете использовать в своем проекте. В нашем случае нам будет нужен RGB Color Picker который назван как “zeRGBa”, как показано на следующем рисунке.
Установка виджета
После перетаскивания (dragging) виджета в наш проект нам необходимо установить его параметры, которые будет необходимы для передачи значений цветов плате Arduino UNO.
Нажмите на ZeRGBa, после чего откроется экран с его настройками (ZeRGBa setting). Установите в нем Output option (настройка выхода) в положение “Merge”, а контакт “V2” установите в положение, показанное на следующем рисунке:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе нам необходимо подключить все используемые библиотеки. Откройте Arduino IDE, в нем перейдите на вкладку Sketch и в ней нажмите на опцию Include Library-> Manage Libraries. В открывшемся окне выполните поиск "Blynk", после его нахождения скачайте и установите пакет Blynk (Blynk package) для платы Arduino UNO.
Также в нашем проекте мы будем использовать библиотеку “Adafruit_NeoPixel.h” для управления цветной светодиодной матрицей (RGB LED Matrix). Для этого сначала скачайте библиотеку Adafruit_NeoPixel, потом установите ее с помощью опции Include ZIP Library в Arduino IDE.
1 2 3 |
#define BLYNK_PRINT DebugSerial #include <Adafruit_NeoPixel.h> #include <SoftwareSerial.h> |
Затем в программе нам необходимо указать номер контакта платы Arduino, с которого мы будем управлять светодиодной матрицей, и общее количество светодиодов в нашей светодиодной матрице.
1 2 |
#define PIN 6 #define NUM_PIXELS 40 |
Затем нам необходимо будет ввести наш blink authentication ID (его нам прислали на электронную почту) в массив auth[].
1 |
char auth[] = "HoLYSq-SGJAafQUQXXXXXXXX"; |
Последовательную связь в нашем проекте мы будем использовать для целей отладке. Для этого с помощью библиотеки SoftwareSerial.h организуем последовательную связь на контактах 2 и 3 платы Arduino.
1 2 |
#include <SoftwareSerial.h> SoftwareSerial DebugSerial(2, 3); |
Внутри функции setup() мы инициализируем последовательную связь с помощью функции Serial.begin, подключимся к приложению blynk с помощью Blynk.begin и инициализируем светодиодную матрицу с помощью функции pixels.begin().
1 2 3 4 5 6 7 |
void setup() { DebugSerial.begin(9600); pixels.begin(); Serial.begin(9600); Blynk.begin(Serial, auth); } |
Внутри функции loop() мы будем вызывать функцию Blynk.run(), которая будет проверять поступающие команды от графического интерфейса пользователя (GUI) приложения Blynk и выполнять в соответствии с поступающими командами необходимые операции.
1 2 3 4 |
void loop() { Blynk.run(); } |
На финальной стадии нашего проекта мы будем принимать и обрабатывать данные, поступающие от приложения Blynk. В нашем случае эти параметры будут размещаться на виртуальном контакте “V2”, который мы рассматривали ранее. Функция BLYNK_WRITE будет вызываться всегда когда состояние/значение нашего виртуального контакта будет изменяться. Мы можем исполнять код внутри данной функции также, как и в любой другой функции Arduino.
В нашем случае внутри функции BLYNK_WRITE осуществляется проверка поступающих с виртуального контакта V2 данных. Как было рассмотрено в разделе про настройку приложения BLYNK, данные по цвету пикселов ассоциированы с виртуальным контактом V2. Для того, чтобы управлять цветом светодиода в матрице, нам необходимы 3 индивидуальных параметра цвета для каждого пиксела – Red (красный), green (зеленый) и Blue (синий). Как показано в фрагменте кода ниже, для извлечения значения красного цвета мы используем параметр param[0].asInt(). Аналогичным образом мы извлекаем значения и двух других цветов. Считанные значения цветов мы сохраняем в индивидуальных переменных. Затем эти значения цветов применяются к пикселям матрицы с помощью функции pixels.setPixelColor.
Также в представленном фрагменте кода функция pixels.setBrightness() используется для управления яркостью, а функция pixels.show() – для установки цвета светодиодов в матрице.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
BLYNK_WRITE(V2) { int r = param[0].asInt(); int g = param[1].asInt(); int b = param[2].asInt(); pixels.clear(); pixels.setBrightness(20); for (int i=0; i<=NUM_PIXELS;i++) { pixels.setPixelColor(i, pixels.Color(r, g, b)); } pixels.show(); } |
Загрузка кода программы в плату Arduino
Сначала в Arduino IDE мы должны выбрать PORT, к которому подключена плата Arduino, а затем уже загружать программу в плату. После успешной загрузки программы в плату запомните номер порта, который будет использоваться для нашей последовательной связи.
После этого найдите script folder (папку со скриптами) библиотеки Blynk на вашем компьютере – она должна была создаться когда вы устанавливали библиотеку. В нашем случае эта папка располагается по адресу:
“C:\Users\PC_Name\Documents\Arduino\libraries\Blynk\scripts”
В этой папке (script folder) должен содержаться файл с именем “blynk-ser.bat” – исполнимый файл для последовательной связи с приложением blynk, который мы должны отредактировать в блокноте (notepad). Откройте этот файл в блокноте и измените в нем номер порта (Port number) на номер порта для Arduino (Arduino Port number), который вы записали/запомнили на предыдущем шаге.
После редактирования запустите на исполнение этот исполнимый файл, после этого вы на экране компьютера должны увидеть примерно следующую картину:
Примечание: если вы не видите показанное на представленном рисунке окно и вам выдается предупреждение что необходимо заново подключиться, то это может быть вызвано ошибкой соединения вашего компьютера с шилдом Arduino. В этом случае необходимо проверить соединение вашей платы Arduino с компьютером. После этого проверьте отображается ли номер COM порта в Arduino IDE. Если в Arduino IDE показывается правильный номер COM порта, то можно продолжать процесс – запустите файл “blynk-ser.bat” на исполнение снова.
Тестирование работы проекта
Откройте приложение Blynk, в нем откройте GUI (графический интерфейс пользователя) и нажмите на кнопку Play. После этого вы можете выбрать любой цвет, который вы хотите отобразить на светодиодной матрице. Как показано в нашем случае, мы выбрали красный и синий цвет.
Аналогичным образом вы можете попробовать отображать и другие цвета.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#define BLYNK_PRINT DebugSerial #include <Adafruit_NeoPixel.h> #include <SoftwareSerial.h> SoftwareSerial DebugSerial(2, 3); #include <BlynkSimpleStream.h> char auth[] = "-54csCxRMCSyHxxxxxxxxx"; #define PIN 6 #define NUM_PIXELS 40 Adafruit_NeoPixel pixels(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { DebugSerial.begin(9600); pixels.begin(); Serial.begin(9600); Blynk.begin(Serial, auth); } void loop() { Blynk.run(); } BLYNK_WRITE(V2) { int r = param[0].asInt(); int g = param[1].asInt(); int b = param[2].asInt(); pixels.clear(); pixels.setBrightness(20); for (int i=0; i<=NUM_PIXELS;i++) { pixels.setPixelColor(i, pixels.Color(r, g, b)); } pixels.show(); } |