Опубликовано: 11.12.2016 19:52
Автор: genaonyx
Почти два месяца лежал набросок данной стать в черновиках, все как то было некогда, то дела, то другие заботы. И вот в канун Нового года, она стала еще больше актуальна на мой взгляд, и я все таки решился дописать и опубликовать один из моих залежавшихся черновиков.
Приветствую всех, в данной статье мы поговорим с вами об RGB лентах, о том как подключать их, и раз уж скоро Новый год, то и сделаем мы с вами для наглядности, обычную ёлочную гирлянду. Для этого нам понадобиться сама RGB лента, у меня это 6-ти вольтовая лента на LED светодиодах 3528. Кнопка, Arduino UNO, блок питания на 5 Вольт (обычная зарядка для сотового) ну и конечно несколько перемычек.
В данной статье мы затронем только ленты на светодиодах 3528, так что можно считать эту статью первой, из серии знакомства со светодиодными лентами. В следующий раз мы поговорим об подключении лент на RGB светодиодах 5050, но будет это уже после нового года.
И того мы имеем следующую схему, разве что в качестве кнопки у меня выступает готовый модуль с подтягивающим резистором, но я думаю это не составит для вас проблем.
И так, что мы видим из схемы выше.
Теперь, когда мы все собрали и подключили, пора заняться собственно программированием. Но перед этим надо определиться, скажем так с "эффектами". Найдем в кладовке китайскую гирлянду, подключим, по переключаем различные режимы.
В моей гирлянде этих режимов оказалось довольно много. По этому я выберу из них несколько понравившихся и боле менее отличающихся друг от друга.
Собственно далее сам скетч.
// Порты, на которых висят светодиоды и кнопка.
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);
}
Я постарался как можно больше прокомментировать скетч. Но тем не менее хочу немного рассказать о его работе.
Во первых, мы создали несколько переменных необходимых для работы скетча.
Во вторых в функции setup() мы инициализируем порты, так как с лентой мы работаем использую ШИМ, то порты эти нет необходимости отдельно инициализировать, по этому тут указывается только порт кнопки.
В третьих в функции loop() мы производим проверку нажатия кнопки, смену эффекта, и собственно управление светодиодами нашей ленты в зависимости от текущего эффекта.
Ну и напоследок хочу заострить ваше внимание на работе ленты. Дело в том, что как вы заметили (а может и нет) по схеме подключения видно, что ленте мы подаем питание через отдельный контакт +6, а вот на контакты R, G, B мы должны подавать землю. В следствии чего происходит некий обратный эффект. Когда мы подаем на ленту при помощи ШИМ 5В, светодиоды затыкаются и перестают гореть, а вот когда мы перестаем мешать ленте и увеличиваем скважность импульсов, наша лента начинает гореть ярче и ярче.
Итого мы имеем:
Вот такая вот необычная вещь эта RGB светодиодная лента.
Ну а далее демонстрационное видео.
И так, после того как в соц. сетях появились комментарии что такого не может быть, что плата ардуино должна сгореть и вообще это чуть ли не нарушает законы физики, я решил выложить больше информации об RGB ленте.
Из описания следует:
Комплектация:
Далее собственно несколько фото.
Далее я замерил ток с помощью мультиметра (на максимальной яркости) и у меня получилась следующая таблица.
Контроллер | 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. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.