Гайд по адресной светодиодной ленте. Библиотека FastLED
Рассмотрим популярные виды светодиодных лент на чипе WS2812b. Подключение и энергопотребление. Подключение к Ардуино и программирование с помощью FastLED.
Гайд по адресной светодиодной ленте. Библиотека FastLED
29.02.2024 в 10:47   5569 0
Версия для печати

Гайд по адресной светодиодной ленте

logo

В данной статье мы рассмотрим наиболее популярные виды светодиодных лент на чипе WS2812b, разберемся с их подключением и энергопотреблением. Также узнаем как подключить адресную ленту к Ардуино и как писать программы для нее в Arduino IDE с помощью библиотеки FastLED. разберем несколько примеров

Типы светодиодных лент

Чаще всего используются светодиодные ленты на чипе - WS2812b. Они делятся на 3 класса защиты от окружающей среды: IP64, IP65 и IP67. Ленты IP64 имеют наименьшую защиту, но их легче всего разрезать на более мелкие кусочки. Они также поставляются с липкой обратной стороной, с помощью которой их можно крепить к любым типам поверхностей. Ленты IP65 также поставляются с липкой обратной стороной и имеют силиконовое покрытие, что несколько затрудняет пайку. Тип IP67 полностью заключен в силиконовый корпус и не имеет липкой задней части.

Также ленты имеют разную плотность светодиодов. В основном это 30шт/м, 60 шт/м и 144 шт/м. По моему опыту, 30 шт/м - это достаточно много, так как каждый светодиод может быть очень ярким. Это дает вам максимальную выгоду по затратам, а также простоту в подборе электропитания

density

Практически все светодиодные ленты WS2812b можно разрезать на несколько полос меньшего размера. Каждую из медных прокладок можно разрезать пополам и использовать для соединения секций вместе. Провода можно припаять к каждому концу. Просто не забудьте подключить GND <-> GND, VCC <-> VCC и DIN <-> DOUT. Ниже матрица светодиодов из секций ленты IP64, 60 светодиодов / м.

strip

Питание

 

Поскольку большинство адресных светодиодных лент работает от 5 вольт, мы можем использовать термины "мощность" и "ток" как взаимозаменяемые. Количество тока (ампер), потребляемого каждым светодиодом, зависит от его цвета и яркости. Если горит только один из трех красных, зеленых или синих светодиодов, он будет потреблять меньше энергии. Если для пикселя установлен белый цвет (все три светодиода включены), он будет использовать максимальное количество энергии.

led zoom

Рекомендуется исходить из предположения, что каждый из светодиодов будет использовать максимум 20 мА (фактическое значение немного ниже). Это дает нам 20 мА + 20 мА + 20 мА = 60 мА на пиксель. Поэтому, например, для светодиодной ленты с разрешением 150 пикселей нам потребуется максимум 9А мощности. Для этих целей нам потребуется блок питания как минимум на 10А Однако, максимальные 9A лента будет потреблять только тогда, когда все светодиоды горят на максимальной яркости. Если мы немного уменьшим яркость и не будем допускать одновременного свечения всех светодиодов на длительный период времени, то и блок питания нам понадобится гораздо менее мощный. Ниже представлен график потребляемой мощности ленты в зависимости от установленной яркости

graph

Также важно использовать качественный источник питания напряжением 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 Гонка

 

rgbchase

Эта первая небольшая анимация просто циклически переключает светодиоды между тремя основными цветами. В коде есть красный, зеленый, а затем синий раздел. В каждом разделе мы перебираем каждый отдельный пиксель и меняем их по одному. Обратите внимание, что команда “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();
 }
}

 

Мерцание желтого и фиолетового

 

purple

Эта анимация быстро регулирует яркость фиолетовой и желтой секций. Цикл 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();
 }
}

 

Радуга

 

rainbow

Радужная анимация - это ваш классический цветовой цикл. Каждый раз, когда выполняется цикл, значения 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();
}
Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Обзоры библиотек | Добавил: :, (02.01.2023)
Просмотров: 5569 | Теги: адресная лента, Arduino IDE, Arduino, FastLED, WS2812B | Рейтинг: 0.0/0
Поделиться:
Всего комментариев: 0
avatar