(Обновлена) Подключение RGB светодиодной ленты к Arduino (LED 3528)

11.12.2016 19:52

genaonyx



Предисловие 

Почти два месяца лежал набросок данной стать в черновиках, все как то было некогда, то дела, то другие заботы. И вот в канун Нового года, она стала еще больше актуальна на мой взгляд, и я все таки решился дописать и опубликовать один из моих залежавшихся черновиков.


Вступление

Приветствую всех, в данной статье мы поговорим с вами об RGB лентах, о том как подключать их, и раз уж скоро Новый год, то и сделаем мы с вами для наглядности, обычную ёлочную гирлянду. Для этого нам понадобиться сама RGB лента, у меня это 6-ти вольтовая лента на LED светодиодах 3528. Кнопка, Arduino UNO, блок питания на 5 Вольт (обычная зарядка для сотового) ну и конечно несколько перемычек.

В данной статье мы затронем только ленты на светодиодах 3528, так что можно считать эту статью первой, из серии знакомства со светодиодными лентами. В следующий раз мы поговорим об подключении лент на RGB светодиодах 5050, но будет это уже после нового года.


Подключение

И того мы имеем следующую схему, разве что в качестве кнопки у меня выступает готовый модуль с подтягивающим резистором, но я думаю это не составит для вас проблем.



И так, что мы видим из схемы выше.

  1. RGB лента подключена у нас напрямую к Arduino UNO. Сделал я так потому, что лента у меня как я писал выше 6-ти вольтовая, а это значит что ее можно напрямую подключить к ардуино без посредников, ну разве что гореть будет чуть тусклее, но глазу в целом - незаметно.
  2. Важно! RGB лента берет питание с контакта Vin(Arduino Uno) т.е. с блока питания (контакт ленты +6V мы подключили на порт Vin).
  3. Контакты RGB светодиодной ленты выведены на порты (~3, ~5, ~6), с помощью них мы и будем управлять нашими светодиодами используя ШИМ.
  4. Arduino Uno запитывается от блока питания (5В) через разъем питания.
  5. Модульная кнопка подключена как обычно (VCC на +5В, GND на GND, SIG на один из портов, в нашем случае это 12-й).


Скетч

Теперь, когда мы все собрали и подключили, пора заняться собственно программированием. Но перед этим надо определиться, скажем так с "эффектами". Найдем в кладовке китайскую гирлянду, подключим, по переключаем различные режимы.

В моей гирлянде этих режимов оказалось довольно много. По этому я выберу из них несколько понравившихся и боле менее отличающихся друг от друга.

  • Рандом (Цвета загораются в случайном порядке, но мы усложним, и сделаем случайной еще и яркость).
  • Бегущий огонек (Светодиоды включаются по очереди в определенном направлении).
  • Бегущий огонек в обратную сторону.
  • Затухание (Один из цветов плавно гаснет, в то время как другой набирает яркость, и так по кругу).
  • Ну и два стандартных, это "Включено" когда горят все светодиоды на максимальной яркости, и "Выключено" когда мы отключаем нашу ленту.


Собственно далее сам скетч.

// Порты, на которых висят светодиоды и кнопка.
byte pinBtn   = 12; // Кнопка на 12 пине.
byte pinRed   = 5;  // Красные светодиоды на 5 пине.
byte pinGreen = 6;  // Зеленые светодиоды на 6 пине.
byte pinBlue  = 3;  // Синие светодиоды на 3 пине.

// Номер текущего эффекта.
static byte mode = 1;

// Для работы кнопки (анти дребезг).
static byte tempButton = LOW;
static byte button = LOW;

// Дополнительные переменные.
static int state = 0;
static int index = 0;

void setup()
{
  // Настраиваем порт кнопки.
  pinMode(pinBtn, INPUT);
  // Т.к. мы используем ШИМ, то настраивать порты для ленты не надо.
}

void loop()
{

  // Отлавливаем нажатие кнопки.
  button = digitalRead(pinBtn);
  if (tempButton && !button)
  {
    // Небольшой анти дребезг.
    tempButton = button;
    delay(10);
    button = digitalRead(pinBtn);
    // Все хорошо, меняем эффект.
    if (button == tempButton)
    {
      // Переключаем на следующий эффект.
      mode++;
      if (mode > 6) mode = 1; // Зацикливаем эффекты по кругу.
      // Сбрасываем дополнительные переменные.
      state = 0;
      index = 0;
      // Выключаем все светодиоды.
      analogWrite(pinRed,   255);
      analogWrite(pinGreen, 255);
      analogWrite(pinBlue,  255);
    }
  }
  tempButton = button;
  
  // Обработка наших эффектов.
  switch (mode)
  {
    case 1: // Эффект №1: Все решает случай.
            analogWrite(pinRed,   random(0, 255));
            analogWrite(pinGreen, random(0, 255));
            analogWrite(pinBlue,  random(0, 255));
            break;
    
    case 2: // Эффект №2: Бегущий огонек. 
            if (state == 3)
            {
              analogWrite(pinRed,   255);
              analogWrite(pinGreen, 0);
            }
            if (state == 6)
            {
              analogWrite(pinBlue, 255);
              analogWrite(pinRed,  0);
            }
            if (state == 9)
            {
              analogWrite(pinGreen, 255);
              analogWrite(pinBlue,  0);
            }
            state--;
            if (state < 1) state = 9;
            break;
    
    case 3: // Эффект №3: Бегущий огонек (В обратную сторону).
            if (state == 1)
            {
              analogWrite(pinBlue,  255);
              analogWrite(pinGreen, 0);
            }
            if (state == 4)
            {
              analogWrite(pinGreen, 255);
              analogWrite(pinRed,   0);
            }
            if (state == 7)
            {
              analogWrite(pinRed,  255);
              analogWrite(pinBlue, 0);
            }
            state++;
            if (state > 9) state = 1;
            break;
    
    case 4: // Эффект №4: Затухание.
            if (state == 0)
            {  
               analogWrite(pinBlue, index);
               analogWrite(pinGreen, 255 - index);
            }
            if (state == 1)
            {
               analogWrite(pinGreen, index);
               analogWrite(pinRed, 255 - index);
            }
            if (state == 2)
            {
               analogWrite(pinRed, index);
               analogWrite(pinBlue, 255 - index);
            }
            index += 5;
            if (index > 255)
            {
              state++;
              index = 0;
              if (state > 2) state = 0;
            }
            break;
    
    case 5: // Включить ленту.
            analogWrite(pinRed,   0);
            analogWrite(pinGreen, 0);
            analogWrite(pinBlue,  0);
            break;
            
    case 6: // Выключить ленту.
            analogWrite(pinRed,   255);
            analogWrite(pinGreen, 255);
            analogWrite(pinBlue,  255);
            break;                
  }

  // Задержка в 50мс.
  delay(50);
}


Я постарался как можно больше прокомментировать скетч. Но тем не менее хочу немного рассказать о его работе.

Во первых, мы создали несколько переменных необходимых для работы скетча.

  • В переменных pinBtn, pinRed, pinGreen, pinBlue мы указываем порты на которые подключена светодиодная лента и кнопка.
  • Переменная mode содержит в себе номер "эффекта", который в данный момент воспроизводится.
  • tempButton и button необходимы нам для нормальной работы с кнопкой. При помощи них мы избавляемся от дребезга и переключаем эффекты.
  • state и index - вспомогательные переменные для нормальной работы некоторых эффектов.

Во вторых в функции setup() мы инициализируем порты, так как с лентой мы работаем использую ШИМ, то порты эти нет необходимости отдельно инициализировать, по этому тут указывается только порт кнопки.

В третьих в функции loop() мы производим проверку нажатия кнопки, смену эффекта, и собственно управление светодиодами нашей ленты в зависимости от текущего эффекта.


Ну и напоследок хочу заострить ваше внимание на работе ленты. Дело в том, что как вы заметили (а может и нет) по схеме подключения видно, что ленте мы подаем питание через отдельный контакт +6, а вот на контакты R, G, B мы должны подавать землю. В следствии чего происходит некий обратный эффект. Когда мы подаем на ленту при помощи ШИМ 5В, светодиоды затыкаются и перестают гореть, а вот когда мы перестаем мешать ленте и увеличиваем скважность импульсов, наша лента начинает гореть ярче и ярче.

Итого мы имеем:

  • Чтобы светодиоды выключились надо выполнить analogWrite(pin, 255); (Подаем на порт 5В).
  • Чтобы светодиоды горели в половину яркости надо выполнить analogWrite(pin, 127); (Подаем на порт 2.5В).
  • Ну а чтобы светодиоды горели на максимальную яркость надо выполнить analogWrite(pin, 0); (Подаем на порт 0В).

Вот такая вот необычная вещь эта RGB светодиодная лента.

Ну а далее демонстрационное видео.


Видео


Дополнение

И так, после того как в соц. сетях появились комментарии что такого не может быть, что плата ардуино должна сгореть и вообще это чуть ли не нарушает законы физики, я решил выложить больше информации об RGB ленте.

  • Заказывал ленту я в Китае, на торговой площадке Aliexpress, ссылка на ленту.
  • Arduino UNO так же от китайского производителя Robotdyn (Хорошие ардуино, с великолепным качеством. У меня самая дешёвая из 3х типов UNO которые он делает).

Из описания следует:

  • Напряжение ленты 5В.
  • 60 светодиодов на метр (У меня 2 метра).
  • Источник питания ленты - USB, да, обычный USB компьютера, ноутбука, телевизора, китаец даже указал прикуриватель автомобиля (возможно он имел ввиду зарядку для сотового). Из этого следует что по стандарту USB, ток ленты не должен превышать 500мА.
  • Ну и применение ленты - это подсветка корпуса ПК, мебели, телевизора и прочего где рядом есть USB разъем.

Комплектация:

  • Сама лента в бухте.
  • Контроллер с возможностью изменять яркость, выбирать цвета, и демо режим в виде гирлянды (откуда все и пошло).
  • Переходник, штекер питания на USB.


Далее собственно несколько фото.


Далее я замерил ток с помощью мультиметра (на максимальной яркости) и у меня получилась следующая таблица.


Контроллер
Arduino UNO
Red (40 шт.)
310 мА
30-40 мА
Green (40 шт.)
230 мА
40 мА
Blue (40 шт.)
340 мА
30-40 мА
Все (120 шт.)
870 мА
110 мА

Тут стоит еще учитывать точность дешёвого мультиметра.


Напряжение между + и -
Между Vin и GND
USB 2.0
5.28 В
4.64 В (USB->USB)
Блок питания
5.33 В
4.59 В (БП->Разъем питания)


Начнем мы с контроллера.

Из таблицы видно что потребляемый ток далеко не 500мА. Подключал я ленту к своему ПК и Телевизору, при этом самовосстанавливающиеся предохранители не выбивало, работало все часами. Из этого следует, что ток тут явно выше нормы но в пределах допустимого для USB. Хотя наш друг китаец мог и тут немного приукрасить. Ведь версию USB он не указал. А по току они отличаются. USB 1.0-2.0 - максимум 500мА. USB 3.0 - максимум 900мА.


Теперь по Ардуинке.

Всем известно что максимальный ток одного порта Arduino UNO не более 40мА. Это написано на каждом втором сайте. Собственно в таблице выше это мы и видим.

И чуда тут то же нет, Arduino не горит. Она ограничивает ток до 40мА и все. Лента горит тусклее но все работает. При этом за 4 часа непрерывной работы, Ардуино как была холодной так и осталась.


По поводу силовых ключей. Вы правы. Выжать из ленты все, на что она способна, можно только с ними. Но за не имением таковых, я попробовал подключить все напрямую, и оно заработало. Но, судя по всему, я их прикуплю, и мы продолжим экспериментировать с лентой уже в другой статье.


Большая просьба оставлять свои комментарии здесь, в статье. Наш виджет поддерживает все популярные соц. сети и вам даже не надо регистрироваться.



Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.