Управление светодиодами с Arduino

Обычные светодиоды


Светодиод – простейший индикатор, который можно использовать для отладки кода: его можно включить при срабатывании условия или просто подмигнуть. Но для начала его нужно подключить.

Подключение светодиода


Светодиод – это устройство, которое питается током, а не напряжением. Как это понимать? Яркость светодиода зависит от тока, который через него проходит. Казалось бы, достаточно знания закона Ома из первого урока в разделе, но это не так!

  • Светодиод в цепи нельзя заменить “резистором”, потому что он ведёт себя иначе, нелинейно.
  • Светодиод полярен, то есть при неправильном подключении он светиться не будет.
  • Светодиод имеет характеристику максимального тока, на котором может работать. Для обычных 3 и 5 мм светодиодов это обычно 20 мА.
  • Светодиод имеет характеристику падение напряжения (Forward Voltage), величина этого падения зависит от излучаемого цвета. Цвет излучается кристаллом, состав которого и определяет цвет. У красных светодиодов падение составляет ~2.5 вольта, у синих, зелёных и белых ~3.5 вольта. Более точную информацию можно узнать из документации на конкретный светодиод. Если документации нет – можно пользоваться вот этой табличкой, тут даны минимальные значения:

Если питать светодиод напряжением ниже его напряжения падения, то яркость будет не максимальная, и здесь никаких драйверов не нужно. То есть красный светодиод можно без проблем питать от пальчиковой батарейки. В то же время кристалл может деградировать и напряжение уменьшится, что приведёт к росту тока. Но это редкий случай. Как только мы превышаем напряжение падения – нужно стабилизировать питание, а именно – ток. В простейшем случае для обычного светодиода ставят резистор, номинал которого нужно рассчитать по формуле: R = (Vcc - Vdo) / I, где Vcc это напряжение питания, Vdo – напряжение падения (зависит от светодиода), I – ток светодиода, а R – искомое сопротивление резистора. Посчитаем резистор для обычного 5 мм светодиода красного цвета при питании от 5 Вольт на максимальной яркости (2.5 В, 20 мА): (5-2.5)/0.02=125 Ом. Для синего и зелёного цветов получится 75 Ом.

Яркость светодиода нелинейно зависит от тока, поэтому “на глаз” при 10 мА яркость будет такая же, как на 20 мА, и величину сопротивления можно увеличить. А вот уменьшать нельзя, как и подключать вообще без резистора. В большинстве уроков и проектов в целом для обычных светодиодов всех цветов ставят резистор номиналом 220 Ом. С резистором в 1 кОм светодиод тоже будет светиться, но уже заметно тусклее. Таким образом при помощи резистора можно аппаратно задать яркость светодиода.

Как определить плюс (анод) и минус (катод) светодиода? Плюсовая нога длиннее, со стороны минусовой ноги бортик чуть срезан, а сам электрод внутри светодиода – крупнее:

Мигаем


Мигать светодиодом с Ардуино очень просто: подключаем катод к GND, а анод – к пину GPIO. Очень многие уверены в том, что “аналоговые” пины являются именно аналоговыми, но это не так: это обычные цифровые пины с возможностью оцифровки налогового сигнала. На плате Nano пины A0-A5 являются цифровыми и аналоговыми одновременно, а вот A6 и A7 – именно аналоговыми, то есть могут только читать аналоговый сигнал. Так что подключимся к A1, настраиваем пин как выход и мигаем!

void setup() {
  pinMode(A1, OUTPUT);
}
void loop() {
  digitalWrite(A1, HIGH);
  delay(500);
  digitalWrite(A1, LOW);
  delay(500);
}

Как избавиться от delay() в любом коде я рассказывал вот в этом уроке.

Мигаем плавно


Как насчёт плавного управления яркостью? Вспомним урок про ШИМ сигнал и подключим светодиод к одному из ШИМ пинов (на Nano это D3, D5, D6, D9, D10, D11). Сделаем пин как выход и сможем управлять яркостью при помощи ШИМ сигнала! Читай урок про ШИМ сигнал. Простой пример с несколькими уровнями яркости:

void setup() {
  pinMode(3, OUTPUT);
}
void loop() {
  analogWrite(3, 10);
  delay(500);
  analogWrite(3, 100);
  delay(500);
  analogWrite(3, 150);
  delay(500);
  analogWrite(3, 200);
  delay(500);
  analogWrite(3, 255);
  delay(500);
}

Подключим потенциометр на A0 и попробуем регулировать яркость с его помощью:

void setup() {
  pinMode(3, OUTPUT);
}
void loop() {
  // analogRead(0) / 4 == 0... 255
  analogWrite(3, analogRead(0) / 4);  
  delay(100);
}

Как вы можете видеть, все очень просто. Сделаем ещё одну интересную вещь: попробуем плавно включать и выключать светодиод, для чего нам понадобится цикл из урока про циклы.

void setup() {
  pinMode(3, OUTPUT);
}
void loop() {
  for (int i = 0; i < 255; i++) {
    analogWrite(3, i);
    delay(20);
  }
  for (int i = 255; i > 0; i--) {
    analogWrite(3, i);
    delay(20);
  }
}

Плохой пример! Алгоритм плавного изменения яркости блокирует выполнение кода. Давайте сделаем его на таймере аптайма.

void setup() {
  pinMode(3, OUTPUT);
}

uint32_t tmr;
int val = 0;
bool dir = true;
void loop() {
  if (millis() - tmr >= 20) {
    tmr = millis();
    if (dir) val++; // увеличиваем яркость
    else val--;     // уменьшаем
    if (val >= 255 || val <= 0) dir = !dir; // разворачиваем
    analogWrite(3, val);
  }
}

Теперь изменение яркости не блокирует выполнение основного цикла, но и остальной код должен быть написан таким же образом, чтобы не блокировать вызовы функции изменения яркости! Ещё одним вариантом может быть работа по прерыванию таймера, см. урок.

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

Ещё один момент: если подключить светодиод наоборот, к VCC, то яркость его будет инвертирована: 255 выключит светодиод, а 0 – включит, потому что ток потечет в другую сторону:

Светодиодные ленты


Светодиодная лента представляет собой цепь соединённых светодиодов. Соединены они не просто так, например обычная 12V лента состоит из сегментов по 3 светодиода в каждом. Сегменты соединены между собой параллельно, то есть на каждый приходят общие 12 Вольт. Внутри сегмента светодиоды соединены последовательно, а ток на них ограничивается общим резистором (могут стоять два для более эффективного теплоотвода):

Таким образом достаточно просто подать 12V от источника напряжения на ленту и она будет светиться. За простоту и удобство приходится платить эффективностью. Простая математика: три белых светодиода, каждому нужно по ~3.2V, суммарно это 9.6V. Подключаем ленту к 12V и понимаем, что 2.5V у нас просто уходят в тепло на резисторах. И это в лучшем случае, если резистор подобран так, чтобы светодиод горел на полную яркость.

Подключаем к Arduino


Здесь всё очень просто: смотрите предыдущий урок по управлению нагрузкой постоянного тока. Управлять можно через реле, транзистор или твердотельное реле. Нас больше всего интересует плавное управление яркостью, поэтому продублирую схему с полевым транзистором:

Конечно же, можно воспользоваться китайским мосфет-модулем! Пин VCC кстати можно не подключать, он никуда не подведён на плате.

Управление


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

Про RGB и адресные светодиодные ленты мы поговорим в отдельных уроках.

Питание и мощность


Светодиодная лента потребляет немаленький ток, поэтому нужно убедиться в том, что выбранный блок питания, модуль или аккумулятор справится с задачей. Но сначала обязательно прочитайте урок по закону Ома! Потребляемая мощность светодиодной ленты зависит от нескольких факторов:

  • Яркость. Максимальная мощность будет потребляться на максимальной яркости.
  • Напряжение питания (чаще всего 12V). Также бывают 5, 24 и 220V ленты.
  • Качество, тип и цвет светодиодов: одинаковые на вид светодиоды могут потреблять разный ток и светить с разной яркостью.
  • Длина ленты. Чем длиннее лента, тем больший ток она будет потреблять.
  • Плотность ленты, измеряется в количестве светодиодов на метр. Бывает от 30 до 120 штук, чем плотнее – тем больший ток будет потреблять при той же длине и ярче светить.

Лента всегда имеет характеристику мощности на погонный метр (Ватт/м), указывается именно максимальная мощность ленты при питании от номинального напряжения. Китайские ленты в основном имеют чуть меньшую фактическую мощность (в районе 80%, бывает лучше, бывает хуже). Блок питания нужно подбирать так, чтобы его мощность была больше мощности ленты, т.е. с запасом как минимум на 20%.

  • Пример 1: нужно подключить 4 метра ленты с мощностью 14 Ватт на метр, лента может работать на максимальной яркости. 14*4 == 56W, с запасом 20% это будет 56*1.2 ~ 70W, ближайший блок питания в продаже будет скорее всего на 100W.
  • Пример 2: берём ту же ленту, но точно знаем, что яркость во время работы не будет больше половины. Тогда можно взять блок на 70 / 2 == 35W.

Важные моменты по току и подключению:

  • Подключение: допустим, у нас подключено ленты на 100W. При 12 Вольтах это будет 8 Ампер – весьма немаленький ток! Ленту нужно располагать как можно ближе к блоку питания и подключать толстыми (2.5 кв. мм и толще) проводами. Также при создании освещения есть смысл перейти на 24V ленты, потому что ток в цепи будет меньше и можно взять более тонкие провода: если бы лента из прошлого примера была 24-Вольтовой, ток был бы около 4 Ампер, что уже  не так “горячо”.
  • Дублирование питания: лента сама по себе является гибкой печатной платой, то есть ток идёт по тонкому слою меди. При подключении большой длины ленты ток будет теряться на сопротивлении самой ленты, и чем дальше от точки подключения – тем слабее она будет светить. Если требуется максимальная яркость на большой длине, нужно дублировать питание от блока питания дополнительными проводами, или ставить дополнительные блоки питания вдоль ленты. Дублировать питание рекомендуется каждые 2 метра, потому что на такой длине просадка яркости становится заметной уже почти на всех лентах.
  • Охлаждение: светодиоды имеют не 100% КПД, плюс ток в них ограничивается резистором, и как результат – лента неслабо греется. Рекомендуется приклеивать яркую и мощную ленту на теплоотвод (алюминиевый профиль). Так она не будет отклеиваться и вообще проживёт гораздо дольше.

Важные страницы