Опубликовано

Управление несколькими цветными светодиодами одним контактом платы Arduino

Раздел из главы 7 “Управление светодиодными устройствами вывода данных” из книги “Arduino. Большая книга рецептов, 3-е изд.” (авторы Джепсон Брайан, Марголис Майкл, Уэлдин Николас Роберт)

Arduino. Большая книга рецептов, 3-издание

ЗАДАЧА

Требуется управлять цветом нескольких RGB-светодиодов, используя один контакт платы Arduino.

РЕШЕНИЕ

Для решения этой задачи требуется использовать специальный модуль RGB-светодиодов со встроенным микроконтроллером — кольцо NeoPixel. Подключение модуля NeoPixel и потенциометра для управления его цветом к плате Arduino показано на рис. 7.7.

C:\Users\acer\Documents\#Electronics\Магазин электроники\фрагменты из книг\2788. Arduino Cookbook. Recipes to Begin, Expand, and Enhance\pic\07\7.7.png

Рис. 7.7. Подключение модуля NeoPixel и потенциометра к плате Arduino

При использовании платы Arduino с питанием 3,3 В как потенциометр, так и положительный вывод модуля NeoPixel следует подключить к контакту 3V3 платы Arduino, а не к контакту 5V.

Скетч для управления этой схемой приводится в листинге 7.4. Для изменения цвета светодиодов модуля в зависимости от положения потенциометра в скетче используется библиотека Adafruit_Neopixels, которую следует установить с помощью Менеджера библиотек среды Arduino IDE.

Листинг 7.4. Работа с модулем RGB-светодиодов NeoPixels

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
34
35
36
37
38
39
40
41
42
43
44
/*
* Скетч SimplePixel
* Меняет свет модуля RGB-светодиодов в зависимости от значения
сигнала датчика
*/
#include <Adafruit_NeoPixel.h>
const int sensorPin = A0; // Номер контакта для подключения датчика
const int ledPin = 6; // Номер контакта для подключения модуля RGB-светодиодов
const int count = 8; // Количество светодиодов в модуле
// Объявляем экземпляр объекта модуля RGB-светодиодов
Adafruit_NeoPixel leds = Adafruit_NeoPixel(count, ledPin, NEO_GRB + NEO_KHZ800);
 
void setup()
{
leds.begin(); // Инициализируем экземпляр модуля светодиодов
for (int i = 0; i < count; i++)
{
leds.setPixelColor(i, leds.Color(0,0,0)); // Выключаем все светодиоды модуля
}
leds.show(); // Обновляем состояние модуля новыми значениями
// отдельных RGB-светодиодов (все выключены)
}
 
void loop()
{
static unsigned int last_reading = -1;
int reading = analogRead(sensorPin);
if (reading != last_reading)
{
// Если значение входного сигнала изменилось,
// сопоставляем новое значение диапазону цветов модуля NeoPixel
unsigned int mappedSensorReading = map(reading, 0, 1023, 0, 65535);
// Обновляем состояние отдельных RGB-светодиодов модуля
// с небольшой задержкой между ними, чтобы создать эффект скольжения
for (int i = 0; i < count; i++)
{
leds.setPixelColor(i, leds.gamma32(
leds.ColorHSV(mappedSensorReading, 255, 128)));
leds.show();
delay(25);
}
last_reading = reading;
}
}

Обсуждение работы решения и возможных проблем

Скетч решения управляет модулем NeoPixel компании Adafruit, содержащим восемь RGB-светодиодов, расположенных в виде кольца. Скетч можно использовать с другими версиями модуля NeoPixel, содержащими большее количество RGB-светодиодов (пикселов), присвоив переменной numOfLeds соответствующее значение. Но в таком случае следует иметь в виду, что каждый светодиод может потреблять до 60 мА тока (если задать для него белый цвет на полную яркость). Порт USB может запитать до восьми светодиодов, но для большего количества питание на модуль NeoPixel необходимо подавать с отдельного мощного источника питания напряжением 5 В. При этом шину «земли» этого источника питания необходимо подключить к шине «земли» платы Arduino. Кроме того, для плат Arduino с напряжением питания 3,3 В, напряжение питания модуля NeoPixel не должно превышать 3,7 В, поскольку напряжение сигнала данных модуля NeoPixel должно быть примерно равно напряжению питания модуля. При использовании для модуля NeoPixel отдельного источника питания, необходимо установить конденсатор емкостью 1000 мкФ между положительной и отрицательной («землей») шинами источника питания для защиты светодиодов модуля. При этом следует обеспечить правильную полярность подключения этого конденсатора.

В скетче объявляется переменная leds объекта модуля NeoPixel с помощью следующей строки кода:

1
Adafruit_NeoPixel leds = Adafruit_NeoPixel(count, ledPin, NEO_GRB + NEO_KHZ800);

В результате исполнения этой строки в памяти платы создается структура для хранения цвета каждого светодиода и взаимодействия с модулем. В параметрах объявления указывается количество светодиодов в модуле (count), номер контакта платы Arduino (ledPin), к которому подключается линия управления модуля, а также тип используемого модуля (NEO_GRB + NEO_KHZ800). При использовании другого светодиодного модуля нужно проверить информацию в документации библиотеки и используемого модуля, чтобы узнать, не требуется ли применить иные параметры.

Но не будет никакого вреда перепробовать все опции, приведенные в библиотеке, чтобы найти ту, которая будет работать.

Цвет отдельных светодиодов устанавливается с помощью метода (функции) led.setPixelColor(). В параметрах функции передается номер требуемого светодиода (нумерация которых начинается со значения 0) и требуемый цвет. Данные на светодиод передаются посредством функции led.show(). Прежде чем вызывать функцию led.show(), можно изменить значения цвета нескольких светодиодов, которые потом будут применены одновременно с этой функцией. Значения, которые не были изменены, останутся прежними. При создании экземпляра объекта Adafruit_NeoPixel все значения цветов инициализируются значением 0.

Библиотека Adafruit NeoPixel содержит собственную функцию ColorHSV() для преобразования цвета спектра в значения RGB. Функции передаются три параметра: цвет спектра, насыщенность цвета и яркость, в указанном порядке. Результат, возвращенный функцией ColorHSV(), обрабатывается функцией gamma32(), которая преобразовывает его, чтобы компенсировать разницу между представлением цвета компьютерами и его восприятием людьми.

Каждый светодиод модуля (так называемый пиксел) оснащен контактами для ввода и вывода данных, а также плюса и минуса («земли») питания. Управляющий сигнал с Arduino подается на контакт ввода данных первого светодиода, контакт вывода данных которого подключен к контакту ввода следующего светодиода, и т. д. со всеми светодиодами цепочки. На рынке предлагаются как отдельные пикселы, так и модули из нескольких уже соединенных пикселов, организованных в кольцо или полосу.

Если используемый модуль не поддерживается библиотекой Adafruit

В ранних светодиодных модулях использовалась микросхема WS2811, на смену которой пришли разные другие версии — например, WS2812, WS2812B и APA102. Если ваш светодиодный модуль не поддерживается библиотекой Adafruit, попробуйте использовать библиотеку Fast LED (http://fastled.io).

Совместимая с Arduino плата Teensy 3.x и более поздние ее версии (https://www.pjrc.com/teensy) может управлять восемью модулями и благодаря своему эффективному аппаратному и программному обеспечению способна реализовывать высококачественную анимацию.

Как уже упоминалось ранее, пикселы доступны на рынке как в виде отдельных светодиодов, так и установленные на гибких лентах на разных расстояниях друг от друга (указывается в количестве светодиодов на метр или фут). Компания Adafruit выпускает под торговым именем NeoPixel широкий диапазон светодиодных модулей на печатных платах разных форм-факторов: круги, короткие полоски или панели.

Дополнительная информация

Более подробная информация по модулям NeoPixel приводится в руководстве Uberguide компании Adafruit (https://oreil.ly/zgAVa).

Веб-страница библиотеки OctoWS2811 (https://oreil.ly/yxGBM) поддерживает работу со светодиодными модулями платы Teensy и содержит удачные схемы подключения источников питания для большого количества светодиодов, а также программу movie2serial на языке Processing, которая извлекает данные из файла видео, указанного в программе, и отображает это видео на панели из светодиодных полос.