Гайд по адресной светодиодной ленте
В данной статье мы рассмотрим наиболее популярные виды светодиодных лент на чипе WS2812b, разберемся с их подключением и энергопотреблением. Также узнаем как подключить адресную ленту к Ардуино и как писать программы для нее в Arduino IDE с помощью библиотеки FastLED. разберем несколько примеров
Типы светодиодных лент
Чаще всего используются светодиодные ленты на чипе - WS2812b. Они делятся на 3 класса защиты от окружающей среды: IP64, IP65 и IP67. Ленты IP64 имеют наименьшую защиту, но их легче всего разрезать на более мелкие кусочки. Они также поставляются с липкой обратной стороной, с помощью которой их можно крепить к любым типам поверхностей. Ленты IP65 также поставляются с липкой обратной стороной и имеют силиконовое покрытие, что несколько затрудняет пайку. Тип IP67 полностью заключен в силиконовый корпус и не имеет липкой задней части.
Также ленты имеют разную плотность светодиодов. В основном это 30шт/м, 60 шт/м и 144 шт/м. По моему опыту, 30 шт/м - это достаточно много, так как каждый светодиод может быть очень ярким. Это дает вам максимальную выгоду по затратам, а также простоту в подборе электропитания
Практически все светодиодные ленты WS2812b можно разрезать на несколько полос меньшего размера. Каждую из медных прокладок можно разрезать пополам и использовать для соединения секций вместе. Провода можно припаять к каждому концу. Просто не забудьте подключить GND <-> GND, VCC <-> VCC и DIN <-> DOUT. Ниже матрица светодиодов из секций ленты IP64, 60 светодиодов / м.
Питание
Поскольку большинство адресных светодиодных лент работает от 5 вольт, мы можем использовать термины "мощность" и "ток" как взаимозаменяемые. Количество тока (ампер), потребляемого каждым светодиодом, зависит от его цвета и яркости. Если горит только один из трех красных, зеленых или синих светодиодов, он будет потреблять меньше энергии. Если для пикселя установлен белый цвет (все три светодиода включены), он будет использовать максимальное количество энергии.
Рекомендуется исходить из предположения, что каждый из светодиодов будет использовать максимум 20 мА (фактическое значение немного ниже). Это дает нам 20 мА + 20 мА + 20 мА = 60 мА на пиксель. Поэтому, например, для светодиодной ленты с разрешением 150 пикселей нам потребуется максимум 9А мощности. Для этих целей нам потребуется блок питания как минимум на 10А Однако, максимальные 9A лента будет потреблять только тогда, когда все светодиоды горят на максимальной яркости. Если мы немного уменьшим яркость и не будем допускать одновременного свечения всех светодиодов на длительный период времени, то и блок питания нам понадобится гораздо менее мощный. Ниже представлен график потребляемой мощности ленты в зависимости от установленной яркости
Также важно использовать качественный источник питания напряжением 5 вольт. Многие блоки питания, особенно китайские, используют более дешевые компоненты и фактически не могут поддерживать этот уровень тока. Даже при качественном источнике питания я бы рекомендовал оставить около 20-30% запаса для обеспечения безопасности. Попытка использовать большое количество тока может привести к падению напряжения, снижению яркости светодиодов или, что еще хуже, к их повреждению или источника питания. Для тех, кто менее знаком с электрической терминологией, напряжение можно представить как давление воды, а ток - как расход воды. Если мы попытаемся увеличить расход воды (ток) выше, чем может выдержать подача, давление (напряжение) воды снизится. В каждую ленту встроены маленькие провода для подключения одного светодиода к следующему. Они действуют как трубы, по которым движется вода (ток). Если мы попытаемся настроить все светодиоды на максимальную яркость белого, они потребляют слишком много воды (тока) для этих маленьких трубок. К тому времени, когда мы добираемся до конца длинной ленты, напряжение падает, а яркость и цветопередача светодиодов ухудшаются. Чтобы исправить это, нам просто нужно подать питание и заземление на обе стороны полосы. Многие ленты даже имеют дополнительную пару контактов для проводов 5 В и GND на каждом конце специально для “подачи” большей мощности.
Аналогично уменьшению яркости, мы также можем уменьшить мощность, отключить все красные, зеленые или синие светодиоды в ленте. Если мы используем комбинацию двух из трех светодиодов на каждом пикселе, мы можем снизить мощность до двух третей от обычного потребления. Если мы запрограммируем наши светодиоды только на красный, зеленый или синий, мы сможем сократить энергопотребление до одной трети, поскольку два из трех светодиодов выключены. Например, если мы знаем, что хотим использовать только желтый (красный + зеленый) и фиолетовый (красный + синий), при максимальной яркости 100 наибольшее потребление будет 12,5 мА на пиксель. Яркость 100 потребляет около 19 мА из графика, умноженного на 2/3, поскольку мы знаем, что будем использовать только два из трех цветов одновременно, что дает нам 12,5 мА на пиксель. В зависимости от того, насколько жесткие ограничения вы накладываете на себя, количество энергии, необходимое для каждого пикселя, может быть значительно уменьшено. Если вы точно знаете, какие максимальные яркость и цвета вам нужны, вы можете рассчитать конкретное наибольшее энергопотребление. Хотя, как правило, хорошей идеей является предоставление себе как можно большей гибкости для создания более широкого спектра анимаций и цветов.
Для более удобного подсчета необходимой мощности блока питания для светодиодной ленты на сайте есть специальный калькулятор
Библиотека FastLed. Описание и примеры использования
Итак, у вас есть адресная светодиодная лента, и вы хотите ее зажечь. На первый взгляд задача может показаться сложной, но это только кажется! Есть много способов начать работу со светодиодной лентой, и один из самых простых и гибких способов - использовать библиотеку FastLED, доступную для Arduino. Эта библиотека поддерживает все наиболее распространенные типы светодиодных лент, включая Neopixel, Dotstar и многие другие. Он предлагает расширенный контроль цвета и цветовую математику, что делает его хорошим выбором для многих проектов.
Загрузка библиотеки
Библиотеку можно загрузить здесь. Доступно много версий, но я бы рекомендовал загрузить последнюю, чтобы убедиться, что библиотека поддерживает ваш тип чипа. Чтобы загрузить, нажмите на ссылку с надписью "Source code (zip)" в последней версии. Извлеките содержимое архива в папку Libraries Arduino IDE. На моем компьютере она находится:
(C:)> Program Files (x86) > Arduino> Libraries
Теперь библиотека загружена, и вы готовы приступить к программированию.
Пример работы с библиотекой
Для начала работы необходимо определиться, сколько светодиодов будет использоваться, тип ленты и определить выводы для подключения.
#include <FastLED.h>
#define NUM_LEDS 60 //Количество светодиодов
#define DATA_PIN 13 //Выход данных
#define CLOCK_PIN 14 //Тактовый выход
CRGB leds[NUM_LEDS];// массив, где хранятся цвета каждого светодиода
void setup() {
delay(2000);
FastLED.addLeds(leds,NUM_LEDS);
//Чип, № вывода данных, № Тактового вывода, Порядок следования цветов,
//Частота работы (если нужно. По умолчанию 24МГц)
}
apa102,data_pin,clock_pin,rgb,data_rate_mhz(10)
Для того, чтобы зажечь нужный нам светодиод, пишем следующее
void loop() {
leds[0] = CRGB::DarkGreen; //записываем значение нужного нам цвета в первый светодиод
FastLED.show(); //Выводим данные в последовательный порт
delay(30);
}
В таблице ниже можно найти полный список предопределенных цветов:
Цвет | Hex Значение | Образец |
---|---|---|
CRGB::AliceBlue | 0xF0F8FF | |
CRGB::Amethyst | 0x9966CC | |
CRGB::AntiqueWhite | 0xFAEBD7 | |
CRGB::Aqua | 0x00FFFF | |
CRGB::Aquamarine | 0x7FFFD4 | |
CRGB::Azure | 0xF0FFFF | |
CRGB::Beige | 0xF5F5DC | |
CRGB::Bisque | 0xFFE4C4 | |
CRGB::Black | 0x000000 | |
CRGB::BlanchedAlmond | 0xFFEBCD | |
CRGB::Blue | 0x0000FF | |
CRGB::BlueViolet | 0x8A2BE2 | |
CRGB::Brown | 0xA52A2A | |
CRGB::BurlyWood | 0xDEB887 | |
CRGB::CadetBlue | 0x5F9EA0 | |
CRGB::Chartreuse | 0x7FFF00 | |
CRGB::Chocolate | 0xD2691E | |
CRGB::Coral | 0xFF7F50 | |
CRGB::CornflowerBlue | 0x6495ED | |
CRGB::Cornsilk | 0xFFF8DC | |
CRGB::Crimson | 0xDC143C | |
CRGB::Cyan | 0x00FFFF | |
CRGB::DarkBlue | 0x00008B | |
CRGB::DarkCyan | 0x008B8B | |
CRGB::DarkGoldenrod | 0xB8860B | |
CRGB::DarkGray | 0xA9A9A9 | |
CRGB::DarkGreen | 0x006400 | |
CRGB::DarkKhaki | 0xBDB76B | |
CRGB::DarkMagenta | 0x8B008B | |
CRGB::DarkOliveGreen | 0x556B2F | |
CRGB::DarkOrange | 0xFF8C00 | |
CRGB::DarkOrchid | 0x9932CC | |
CRGB::DarkRed | 0x8B0000 | |
CRGB::DarkSalmon | 0xE9967A | |
CRGB::DarkSeaGreen | 0x8FBC8F | |
CRGB::DarkSlateBlue | 0x483D8B | |
CRGB::DarkSlateGray | 0x2F4F4F | |
CRGB::DarkTurquoise | 0x00CED1 | |
CRGB::DarkViolet | 0x9400D3 | |
CRGB::DeepPink | 0xFF1493 | |
CRGB::DeepSkyBlue | 0x00BFFF | |
CRGB::DimGray | 0x696969 | |
CRGB::DodgerBlue | 0x1E90FF | |
CRGB::FireBrick | 0xB22222 | |
CRGB::FloralWhite | 0xFFFAF0 | |
CRGB::ForestGreen | 0x228B22 | |
CRGB::Fuchsia | 0xFF00FF | |
CRGB::Gainsboro | 0xDCDCDC | |
CRGB::GhostWhite | 0xF8F8FF | |
CRGB::Gold | 0xFFD700 | |
CRGB::Goldenrod | 0xDAA520 | |
CRGB::Gray | 0x808080 | |
CRGB::Green | 0x008000 | |
CRGB::GreenYellow | 0xADFF2F | |
CRGB::Honeydew | 0xF0FFF0 | |
CRGB::HotPink | 0xFF69B4 | |
CRGB::IndianRed | 0xCD5C5C | |
CRGB::Indigo | 0x4B0082 | |
CRGB::Ivory | 0xFFFFF0 | |
CRGB::Khaki | 0xF0E68C | |
CRGB::Lavender | 0xE6E6FA | |
CRGB::LavenderBlush | 0xFFF0F5 | |
CRGB::LawnGreen | 0x7CFC00 | |
CRGB::LemonChiffon | 0xFFFACD | |
CRGB::LightBlue | 0xADD8E6 | |
CRGB::LightCoral | 0xF08080 | |
CRGB::LightCyan | 0xE0FFFF | |
CRGB::LightGoldenrodYellow | 0xFAFAD2 | |
CRGB::LightGreen | 0x90EE90 | |
CRGB::LightGrey | 0xD3D3D3 | |
CRGB::LightPink | 0xFFB6C1 | |
CRGB::LightSalmon | 0xFFA07A | |
CRGB::LightSeaGreen | 0x20B2AA | |
CRGB::LightSkyBlue | 0x87CEFA | |
CRGB::LightSlateGray | 0x778899 | |
CRGB::LightSteelBlue | 0xB0C4DE | |
CRGB::LightYellow | 0xFFFFE0 | |
CRGB::Lime | 0x00FF00 | |
CRGB::LimeGreen | 0x32CD32 | |
CRGB::Linen | 0xFAF0E6 | |
CRGB::Magenta | 0xFF00FF | |
CRGB::Maroon | 0x800000 | |
CRGB::MediumAquamarine | 0x66CDAA | |
CRGB::MediumBlue | 0x0000CD | |
CRGB::MediumOrchid | 0xBA55D3 | |
CRGB::MediumPurple | 0x9370DB | |
CRGB::MediumSeaGreen | 0x3CB371 | |
CRGB::MediumSlateBlue | 0x7B68EE | |
CRGB::MediumSpringGreen | 0x00FA9A | |
CRGB::MediumTurquoise | 0x48D1CC | |
CRGB::MediumVioletRed | 0xC71585 | |
CRGB::MidnightBlue | 0x191970 | |
CRGB::MintCream | 0xF5FFFA | |
CRGB::MistyRose | 0xFFE4E1 | |
CRGB::Moccasin | 0xFFE4B5 | |
CRGB::NavajoWhite | 0xFFDEAD | |
CRGB::Navy | 0x000080 | |
CRGB::OldLace | 0xFDF5E6 | |
CRGB::Olive | 0x808000 | |
CRGB::OliveDrab | 0x6B8E23 | |
CRGB::Orange | 0xFFA500 | |
CRGB::OrangeRed | 0xFF4500 | |
CRGB::Orchid | 0xDA70D6 | |
CRGB::PaleGoldenrod | 0xEEE8AA | |
CRGB::PaleGreen | 0x98FB98 | |
CRGB::PaleTurquoise | 0xAFEEEE | |
CRGB::PaleVioletRed | 0xDB7093 | |
CRGB::PapayaWhip | 0xFFEFD5 | |
CRGB::PeachPuff | 0xFFDAB9 | |
CRGB::Peru | 0xCD853F | |
CRGB::Pink | 0xFFC0CB | |
CRGB::Plaid | 0xCC5533 | |
CRGB::Plum | 0xDDA0DD | |
CRGB::PowderBlue | 0xB0E0E6 | |
CRGB::Purple | 0x800080 | |
CRGB::Red | 0xFF0000 | |
CRGB::RosyBrown | 0xBC8F8F | |
CRGB::RoyalBlue | 0x4169E1 | |
CRGB::SaddleBrown | 0x8B4513 | |
CRGB::Salmon | 0xFA8072 | |
CRGB::SandyBrown | 0xF4A460 | |
CRGB::SeaGreen | 0x2E8B57 | |
CRGB::Seashell | 0xFFF5EE | |
CRGB::Sienna | 0xA0522D | |
CRGB::Silver | 0xC0C0C0 | |
CRGB::SkyBlue | 0x87CEEB | |
CRGB::SlateBlue | 0x6A5ACD | |
CRGB::SlateGray | 0x708090 | |
CRGB::Snow | 0xFFFAFA | |
CRGB::SpringGreen | 0x00FF7F | |
CRGB::SteelBlue | 0x4682B4 | |
CRGB::Tan | 0xD2B48C | |
CRGB::Teal | 0x008080 | |
CRGB::Thistle | 0xD8BFD8 | |
CRGB::Tomato | 0xFF6347 | |
CRGB::Turquoise | 0x40E0D0 | |
CRGB::Violet | 0xEE82EE | |
CRGB::Wheat | 0xF5DEB3 | |
CRGB::White | 0xFFFFFF | |
CRGB::WhiteSmoke | 0xF5F5F5 | |
CRGB::Yellow | 0xFFFF00 | |
CRGB::YellowGreen | 0x9ACD32 |
Но это не единственный способ установки цвета. Далее представлены еще несколько вариантов.
leds[i].r = 100; //установка значения каждой составляющей цвета RGB
leds[i].g = 12;
leds[i].b = 255;
leds[i].red = 100; //еще один вариант записи
leds[i].green = 12;
leds[i].blue = 255;
leds[i][0] = 50; // red //и еще один
leds[i][1] = 100; // green
leds[i][2] = 150; // blue
leds[i] = 0x640СFF; //тот же цвет в hex-формате
leds[i].setRGB(100, 12, 255);
leds[i] = leds[j]; //Простое копирование
leds[i] = CRGB( 50, 100, 150);
leds[i] = CRGB::Red; //Задание цвета из списка цветов
Представление цвета в HSV-модели
leds[i] = CHSV( 224, 187, 255); //оттенок/насыщенность/яркость
leds[i].setHSV( 224, 187, 255); //другой вариант записи
leds[i].setHue(224); //задание полностью насыщенного, яркого цвета
CHSV spectrumcolor; //задание спектра с диапазоном от 0 до 255
spectrumcolor.hue = 224;
spectrumcolor.saturation = 187;
spectrumcolor.value = 255;
hsv2rgb_spectrum( spectrumcolor, leds[i] );
Спектр и радуга.
Существует два типа преобразования HSV — spectrum и rainbow. Первый тип использует линейную зависимость изменения каждого цвета. Минус состоит в том, что при таком методе получаем едва заметный желтый цвет в палитре цветов. В «радуге» все основные цвета распределены равномерно, что гораздо удобнее для человеческого восприятия.
CHSV hsv( 160, 255, 255); // синий цвет в rainbow-пространстве hsv
CRGB rgb;
hsv2rgb_rainbow( hsv, rgb);
// в rgb получаем (0, 0, 255)
Цвета в rainbow hsv имеют следующие значения
- Red (0..) "HUE_RED"
- Orange (32..) "HUE_ORANGE"
- Yellow (64..) "HUE_YELLOW"
- Green (96..) "HUE_GREEN"
- Aqua (128..) "HUE_AQUA"
- Blue (160..) "HUE_BLUE"
- Purple (192..) "HUE_PURPLE"
- Pink(224..) «HUE_PINK»
CHSV hsv( 171, 255, 255); // чистый синий цвет в спектре hsv
CRGB rgb;
hsv2rgb_spectrum( hsv, rgb);
// в rgb получаем (0, 0, 255)
Цвета в spectrum hsv имеют следующие значения
- Red (0..)
- Yellow (42..)
- Green (85..)
- Aqua (128..)
- Blue (171..)
- Purple (213..)
Плюсом spectrum-преобразования является то, что преобразование в rgb происходит несколько быстрее.
Функцию hsv2rgb_spectrum, как и функцию hsv2rgb_rainbow можно вызвать для массового преобразования.
CHSV hsvs[10];
CRGB leds[10];
hsv2rgb_rainbow( hsvs, leds, 10); // конвертируем всё
Математические операции
Библиотека поддерживает так же математические операции
leds[i] += CRGB( 0, 5, 0); //добавили немного к зеленому цвету
leds[i].addToRGB(5); //добавляет яркость ко всем каналам RGB
leds[i]++; //инкремент трех составляющих RGB
leds[i] -= CRGB( 5, 0, 0); //вычитание 5 из красного
leds[i].subtractFromRGB(5); //вычитание яркости из RGB
leds[i]--; //декремент трех составляющих RGB
leds[i].r = 5; //присвоение значения только красной составляющей
Изменение яркости
leds[i].fadeLightBy(64);
leds[i] %= 192;
leds[i].nscale8_video(192);
leds[i].fadeToBlackBy(64);
leds[i].nscale8(192);
leds[i].maximizeBrightness();
leds[i] /= 2;
leds[i] *= 2;
Практические примеры использования
Теперь разберем на практике как можно реализовать полученные знания. Для этого приведу пример 3 простых скетчей для ленты длиной 150 светодиодов
RBG Гонка
Эта первая небольшая анимация просто циклически переключает светодиоды между тремя основными цветами. В коде есть красный, зеленый, а затем синий раздел. В каждом разделе мы перебираем каждый отдельный пиксель и меняем их по одному. Обратите внимание, что команда “FastLED.show” находится внутри цикла. Если мы уберем его, он обновит светодиоды только после того, как мы поменяем их все. Также не забудьте изменить количество светодиодов на 150.
#include <FastLED.h>
CRGB leds[150];
void setup()
{
FastLED.addLeds(leds, 150);
}
void loop()
{
for(int i = 0; i < 150; i++)
{
leds[i] = CRGB(100, 0, 0);
FastLED.show();
}
for(int i = 0; i < 150; i++)
{
leds[i] = CRGB(0, 100, 0);
FastLED.show();
}
for(int i = 0; i < 150; i++)
{
leds[i] = CRGB(0, 0, 100);
FastLED.show();
}
}
Мерцание желтого и фиолетового
Эта анимация быстро регулирует яркость фиолетовой и желтой секций. Цикл j регулирует яркость, в то время как цикл i определяет разделы. Измените значения в цикле i, чтобы настроить, где начинается и заканчивается каждая цветовая секция.
#include <FastLED.h>
CRGB leds[150];
void setup()
{
FastLED.addLeds(leds, 150);
}
void loop()
{
for(int j = 0; j < 100; j++)
{
for(int i = 0; i < 75; i++)
{
leds[i] = CRGB(j, j, 0);
}
FastLED.show();
}
for(int j = 0; j < 100; j++)
{
for(int i = 75; i < 150; i++)
{
leds[i] = CRGB(j, 0, j);
}
FastLED.show();
}
}
Радуга
Радужная анимация - это ваш классический цветовой цикл. Каждый раз, когда выполняется цикл, значения RGB обновляются в верхней части цикла. Он начинается с красного на максимуме и быстро меняет цвета один за другим, постепенно исчезая.
#include <FastLED.h>
CRGB leds[150];
int r = 255;
int b = 0;
int g = 0;
void setup()
{
FastLED.addLeds(leds, 150);
}
void loop()
{
if(r > 0 && b == 0){
r--;
g++;
}
if(g > 0 && r == 0){
g--;
b++;
}
if(b > 0 && g == 0){
r++;
b--;
}
for(int i = 0; i < 150; i++)
{
leds[i] = CRGB(r, g, b);
}
FastLED.show();
}