- Arduino. Порты ввода-вывода в режиме выхода.
- Расчет постоянного резистора для светодиода
- Обычные светодиоды
- Подключение светодиода
- Мигаем
- Мигаем плавно
- Светодиодные ленты
- Подключаем к Arduino
- Управление
- Питание и мощность
- Схема подключения светодиода к Arduino Uno.
- Функции pinMode() и digitalWrite().
- Базовый пример скетча.
- Расширенный пример. Мигание светодиодом на Arduino.
Arduino. Порты ввода-вывода в режиме выхода.
Какова идея и значение термина «цифровой (цифровой) пин»? Все просто — каждый пин в режиме вывода может находиться в одном из двух состояний:
- логический ноль (0)
- логическая единица (1)
Каждому из этих состояний соответствует определенное значение напряжения:
- выход 0 — напряжение равно 0 В (GND)
- на выходе 1 — напряжение 5 В (5В)
В данном случае 5 В — это напряжение питания микроконтроллера. При использовании платы с питанием от микроконтроллера 3,3 В (например, Arduino Leonardo) на выходе будет 3,3 В. Подведем итоги и систематизируем:
Высокий уровень | Логика 1 | 5 В |
Низкий уровень | Логический 0 | 0 В |
По сути, в этом и заключается суть управления портом ввода/вывода в режиме вывода. У нас есть два возможных варианта — выдать на выходе 0 или 1 — и все. Результат будет зависеть от того, что именно подключено к этому выводу на плате. Допустим, анод светодиода подключен, подаем 1 — горит, подаем 0 — не горит. Именно на примере взаимодействия Ардуино со светодиодом мы сегодня и будем тестировать скетчи.
Расчет постоянного резистора для светодиода
Выход Arduino имеет напряжение 5 вольт и способен отдавать ток намного выше допустимого для светодиода. Также необходимо учитывать, что сопротивление светодиода и без того низкое, и оно также уменьшается в процессе работы.
Используя закон Ома, мы можем видеть, что ток будет увеличиваться при уменьшении сопротивления и при том же напряжении. Это означает, что светодиод, которому для работы требуется 20 мА, пропустит через себя более сильный ток и просто сгорит. Здесь нам поможет обычное постоянное сопротивление.
Для расчета необходимого номинала резистора нам необходимо знать характеристики блока питания и характеристики светодиода. А свойства светодиода можно посмотреть в его техническом описании, или спросить у продавца. Обычно это ток 20 мА и падение напряжения 2 В.
- Vps — напряжение питания (5 вольт)
- Vdf — падение напряжения на светодиоде (2 вольта)
- If — номинальный ток светодиода (20 миллиампер или 0,02 ампера)
Теперь подставим наши данные в формулу закона Ома для расчета сопротивления. Если кто забыл, напомню: R = U/I (сопротивление равно напряжению, деленному на ток). Подставляем наши данные: R = (Vps — Vdf) / If = (5V — 2V) / 0,02A = 150 Ом
Теперь просто берем резистор на 150 Ом и ставим его до или после светодиода (не важно).
Мы подключим светодиод к цифровому выводу с поддержкой ШИМ, чтобы мы могли не только управлять включением/выключением, но и яркостью светодиода. Рекомендую прочитать про особенности, характеристики и распиновку Arduino nano. Код скетча будет одинаковым для Arduino Nano и Arduino Uno. Это я тоже объясню чуть позже. В качестве токоограничивающего резистора я буду использовать постоянный резистор на 150 Ом. Можно использовать резисторы и подобных номиналов, но при меньшем сопротивлении светодиод будет сильнее греться, а при большем — тусклее светиться. Я рекомендую использовать резисторы от 120 Ом до 250 Ом для самых простых 5мм светодиодов. Вот наглядная схема подключения светодиода к ардуино нано:
Схема подключения светодиода к Arduino Nano V3
Обычные светодиоды
Светодиод — простейший индикатор, который можно использовать для отладки кода: он может включаться при срабатывании условия или просто мигать. Но сначала его нужно подключить.
Подключение светодиода
Светодиод — это устройство, которое питается током, а не напряжением. Что это значит? Яркость светодиода зависит от тока, проходящего через него. Казалось бы, знаний закона Ома из первого урока в разделе достаточно, но это не так!
- Светодиод в цепи нельзя заменить «резистором», потому что он ведет себя по-другому, нелинейно.
- Светодиод поляризован, что означает, что он не загорится при неправильном подключении.
- Светодиод имеет характеристику максимального тока, при котором он может работать. Для обычных 3-мм и 5-мм светодиодов это обычно 20 мА.
- Светодиод имеет характеристику прямого напряжения, величина этого падения зависит от излучаемого цвета. Цвет излучается кристаллом, состав которого определяет цвет. Для красных светодиодов падение ~2,5 вольта, для синих, зеленых и белых ~3,5 вольта. Для получения дополнительной информации см документацию по конкретному светодиоду. Если нет документации, можно использовать вот эту табличку, здесь приведены минимальные значения:
Если питать светодиод напряжением ниже падения напряжения, то яркость будет не максимальной, и драйвера тут не нужны. Это значит, что красный светодиод можно без проблем запитать от пальчиковой батарейки. При этом может произойти пробой кристалла и снижение напряжения, что приведет к увеличению тока. Но это редкий случай. Как только мы превысим падение напряжения, нам нужно стабилизировать питание, а именно ток. В простейшем случае для обычного светодиода устанавливается резистор, номинал которого необходимо рассчитать по формуле: R = (Vcc — Vдо)/I, где Vcc — напряжение питания, Vдо — падение напряжения (зависит от светодиода), I — ток светодиода, а R — желаемое сопротивление резистора.
Рассчитаем сопротивление стандартного красного светодиода диаметром 5 мм при напряжении 5 вольт при максимальной яркости (2,5 В, 20 мА): (5-2,5)/0,02=125 Ом. Для синего и зеленого цветов получается 75 Ом. Яркость светодиода нелинейна с током, поэтому на глазок при 10 мА яркость будет такой же, как при 20 мА, а значение сопротивления можно увеличить.
Но уменьшить его нельзя, как и подключить вообще без сопротивления. В большинстве уроков и проектов вообще используется резистор на 220 Ом для обычных светодиодов любого цвета. При сопротивлении 1 кОм светодиод тоже загорится, но уже заметно потускнеет. Таким образом, с помощью резистора можно аппаратно настроить яркость светодиода. Как определить плюс (анод) и минус (катод) светодиода? Плюсовая ножка длиннее, сторона минусовой ножки немного срезана, а собственно электрод внутри светодиода больше:
Мигаем
прошить светодиод с Arduino очень просто: катод подключаем к GND, а анод к выводу GPIO. Многие уверены, что «аналоговые» стики — это просто аналоговые, но это не так: это обычные цифровые стики с возможностью оцифровки аналогового сигнала. На плате Nano выводы A0-A5 цифровые и аналоговые одновременно, а вот A6 и A7 аналоговые, то есть могут считывать только аналоговый сигнал. Итак, давайте подключим A1, установим пин как выход и моргаем!
void setup() { pinMode(A1, OUTPUT); } void loop() { digitalWrite(A1, HIGH); задержка(500); цифровая запись (A1, НИЗКИЙ); задержка(500); }
Как избавиться от delay() в любом коде, я рассказал вам в этом уроке.
Мигаем плавно
Как насчет плавной регулировки яркости? Вспомним урок про сигнал ШИМ и подключим светодиод к одному из контактов ШИМ (на Nano это D3, D5, D6, D9, D10, D11). Давайте сделаем пин в качестве выхода и сможем управлять яркостью с помощью ШИМ-сигнала! Прочтите урок о ШИМ-сигнале. Простой пример с несколькими уровнями яркости:
void setup() { pinMode(3, OUTPUT); } недействительный цикл () { AnalogWrite (3, 10); задержка(500); аналог записи (3, 100); задержка(500); аналоговая запись (3, 150); задержка(500); аналоговая запись (3, 200); задержка(500); аналог записи (3, 255); задержка(500); }
Подключим к A0 потенциометр и попробуем отрегулировать с его помощью яркость:
void setup() { pinMode(3, OUTPUT); } void loop() { // AnalogRead(0) / 4 == 0… 255 AnalogWrite(3, AnalogRead(0) / 4); задержка(100); }
Как видите, все очень просто. Займемся более интересным делом: попробуем плавно включать и выключать светодиод, для чего нам понадобится шлейф из урока о шлейфах.
void setup() { pinMode(3, OUTPUT); } void loop() { for (int i = 0; i < 255; i++) { AnalogWrite(3, i); задержка(20); } for (int i = 255; i > 0; i—) { AnalogWrite(3, i); задержка(20); } }
Плохой пример! Алгоритм плавного изменения яркости блокирует выполнение кода. Давайте сделаем это на таймере безотказной работы.
void setup() { pinMode(3, OUTPUT); } uint32_t тмр; интервал = 0; логический каталог = истина; void loop() { if (millis() — tmr >= 20) { tmr = millis(); если (реж)val++; // увеличить яркость else val—; // уменьшить if (val >= 255 || val <= 0) dir = !dir; // расширяем аналогWrite(3, val); } }
изменение яркости не блокирует выполнение основного цикла, но остальной код нужно написать точно так же, чтобы не блокировать вызовы функции изменения яркости! Другим вариантом может быть работа над прерыванием таймера, см урок.
Светодиод будет мигать не очень плавно: яркость будет увеличиваться слишком быстро и практически не меняться. Это связано с тем, что человеческий глаз воспринимает яркость нелинейно, а мы управляем ею линейно. Для более плавного ощущения яркости используется гамма-коррекция ЭЛТ, которая вынесена из этого урока в отдельный урок по миганию светодиода с помощью ЭЛТ-гаммы в блоке алгоритмов. Обязательно учитесь!
Еще момент: если подключить светодиод наоборот, к VCC, то яркость будет инвертирована: 255 выключит светодиод, а 0 включит, потому что ток пойдет в другую сторону:
Светодиодные ленты
Светодиодная лента представляет собой цепочку соединенных светодиодов. Подключаются они неспроста, например обычная полоса на 12В состоит из сегментов по 3 светодиода в каждом. Сегменты соединены параллельно, то есть на каждый поступает общее 12 вольт. Внутри сегмента светодиоды соединены последовательно, а ток на них ограничен общим сопротивлением (их может быть два для более эффективного отвода тепла):
Таким образом, все, что вам нужно сделать, это подать 12В от источника напряжения на ленту, и она загорится. Эффективность достигается за счет простоты и удобства. Простая математика: три белых светодиода, каждый из которых требует ~ 3,2 В, всего 9,6 В. Подключаем ленту к 12В и понимаем, что 2,5В просто уходит в тепло на резисторах. И это в лучшем случае, если резистор подобран так, чтобы светодиод горел на полную яркость.
Подключаем к Arduino
Здесь все очень просто: см предыдущий урок по управлению нагрузкой постоянного тока. Управлять им можно через реле, транзистор или твердотельное реле. Нас больше всего интересует плавная регулировка яркости, поэтому продублирую схему с полевым транзистором: Конечно, можно использовать китайский мосфет-модуль! Кстати, вывод VCC подключить нельзя, он нигде на плате не подключен.
Управление
Лента с транзисторным подключением управляется точно так же, как светодиод в предыдущей главе, то есть все примеры кода с миганием, миганием и управлением потенциометром подойдут к этой схеме. О RGB и адресных светодиодных лентах мы поговорим в отдельных уроках.
Питание и мощность
Светодиодная лента потребляет много энергии, поэтому нужно убедиться, что выбранный блок питания, модуль или аккумулятор справятся с поставленной задачей. Но сначала обязательно прочитайте урок по Закону Ома! Потребляемая мощность светодиодной ленты зависит от нескольких факторов:
- Яркость. Максимальный ток будет потребляться при максимальной яркости.
- Напряжение питания (чаще всего 12В). Есть также диапазоны 5, 24 и 220В.
- Качество, тип и цвет светодиодов: Светодиоды с одинаковым внешним видом могут потреблять разный ток и светить с разной яркостью.
- Длина ленты. Чем длиннее лента, тем больше энергии она потребляет.
- Плотность ленты, измеряемая количеством светодиодов на метр. Бывает от 30 до 120 штук, чем плотнее — тем больше электроэнергии он будет потреблять при той же длине и ярче светить.
Лента всегда имеет характеристику мощности на погонный метр (Ватт/м), то есть максимальную мощность ленты при работе от указанного номинального напряжения. Китайские ленты обычно имеют немного меньшую фактическую мощность (около 80%, иногда лучше, иногда хуже). Блок питания необходимо подобрать так, чтобы мощность была больше мощности диапазона, т.е с запасом не менее 20%.
- Пример 1: нужно подключить 4 метра ленты мощностью 14 ватт на метр, лента может работать на максимальной яркости. 14*4==56Вт, с запасом 20% будет 56*1,2~70Вт, ближайший блок питания в продаже скорее всего будет на 100Вт.
- Пример 2: берем ту же ленту, но точно знаем, что яркость при работе не будет больше половины. Тогда можно взять блок 70/2==35Вт.
Важные моменты о питании и подключении:
- Подключение: допустим у нас подключена лента на 100Вт. При 12 вольтах становится 8 ампер — довольно большой ток! Лента должна располагаться как можно ближе к источнику питания и подключаться толстыми (2,5 кв м и более) проводами. При создании освещения также есть смысл перейти на диапазоны 24В, т к ток в цепи будет меньше и можно взять более тонкие провода: если бы диапазон из предыдущего примера был 24 вольта, то ток был бы около 4 ампер, что уже не так «горячо”.
- Дублирование питания: сама лента представляет собой гибкую плату, то есть ток протекает через тонкий слой меди. При подключении длинной ленты ток будет теряться на сопротивлении самой ленты, и чем дальше от точки подключения, тем тусклее она будет светить. Если вам нужна максимальная яркость на большом расстоянии, то нужно продублировать питание от блока питания дополнительными проводами, либо установить дополнительные блоки питания вдоль полосы. Блок питания рекомендуется дублировать через каждые 2 метра, т.к на такой длине становится заметным падение яркости практически на всех диапазонах.
- Охлаждение: Светодиоды не на 100% эффективны, плюс ток в них ограничивается резистором, в результате лента довольно сильно нагревается. На радиатор (алюминиевый профиль) рекомендуется приклеить яркую и прочную ленту. Таким образом, он не будет отслаиваться и, как правило, живет намного дольше.
Схема подключения светодиода к Arduino Uno.
Раз уж мы подошли к теме подключения светодиода, обсудим подробнее. В целом здесь стоит упомянуть всего два момента:
Как видно из иллюстрации, светодиод имеет два вывода, при этом они не равны, а скорее диаметрально противоположны. Один вывод — анод диода, другой — катод, визуально или по схеме определить назначение вывода можно следующим образом:
Подробнее о том, как работает диод, можно прочитать здесь. Между тем важным фактом является то, что светодиод загорится, если напряжение на аноде превысит напряжение на катоде на определенную величину. Отсюда следует логичный вывод, что катод имеет смысл подключить к GND, а анод к цифровому выводу Arduino (один из вариантов):
Если на пин поставить высокий уровень, то напряжение на нем будет 5 В, на GND соответственно 0 В. Тогда эти 5 В будут отображаться на светодиоде. И тут возникает второй нюанс, который заключается в том, что подаваемое на светодиод напряжение должно соответствовать его характеристикам, а не выбираться случайно.
Режим работы светодиода определяется двумя параметрами — напряжением на нем и протекающим через него током. Для установки этих значений достаточно добавить в схему резистор:
Вот мы и узнаем, что означает этот резистор, а также как определить требуемый номинал резистора. И для лучшего понимания традиционно рассмотрим конкретный реальный пример, а не стандартные теоретические формулировки. Берем первый попавшийся диод, оставляем так, и открываем даташит (документацию) на него. Нас интересуют два параметра, определяющие работу диода — прямой ток (I_F) и соответствующее этому току прямое напряжение (V_F). Эти данные мы можем получить из вольт-амперной характеристики (ВАХ):
При этом работа порта Arduino в режиме вывода имеет свои ограничения, с которыми можно ознакомиться в даташите на конкретную плату. Для Uno максимальный ток 40мА и это как раз максимальный ток, для стабильной работы рекомендуется не превышать 20мА. На самом деле даже 20 мА это довольно много, токовую нагрузку лучше подключить, например, через транзисторы. Но сегодня мы не об этом, поэтому воспользуемся допустимым значением 20 мА, которое можно безболезненно выдать стиком. Все это задает определенную точку на ВАХ:
Если кратко подытожить, то результатом будет то, что напряжение на светодиоде должно быть 2 В, а ток через него 20 мА. Определим значения потенциалов в различных точках цепи:
Напряжение между точками 1 и 3 равно 5 В и при этом равно сумме напряжений:
U_{13} = U_R + U_D
Где: U_R — напряжение на резисторе, а U_D — напряжение на светодиоде. Напряжение на светодиоде мы знаем из документации, уже можем подставить его в эту формулу, что приведет к закономерному результату:
U_R = U_{13} — U_D = 5 medspace B — 2 medspace B = 3 medspace B
Сформулируем промежуточный результат: чтобы напряжение на светодиоде было 2 В, сопротивление должно быть 3 В. Ладно, продолжаем, обозначим протекающие токи:
А так как элементы соединены последовательно, то через каждый из них протекает одинаковый ток. И значение, кстати, нам тоже известно, так как мы выбрали:
I = 20 мкм мА
Таким образом, мы можем только рассчитать искомое сопротивление по закону Ома:
R = frac{U_R}{I} = frac{3 medspace V}{20 medspace мА} = 150 medspace Ом
Получаем требуемое значение. В данном случае мы ограничены током, который может выдать порт микроконтроллера, но максимально допустимый ток для светодиода также можно получить из даташита. Например, для нашего тестера в документации указан максимальный прямой ток, равный 50 мА:
Следовательно, превышение этого значения с внушительной вероятностью сделает светодиод хламом. А схема подключения светодиода к Ардуино в итоге выглядит так:
При использовании макетной платы (breadboard) переключение можно осуществить следующим образом:
И на этом все наконец готово для перехода к практической части программы.
Практическая часть.
Функции pinMode() и digitalWrite().
Для использования порта в качестве выхода Arduino предлагает нам функцию, которая выполнит необходимую настройку:
pinMode(вывод, режим);
Функция принимает два аргумента:
- pin — номер контакта Arduino
- mode — требуемый режим работы
Может быть три режима работы: OUTPUT, INPUT, INPUT_PULLUP. Сегодня нас интересует только первый, а остальные два мы будем использовать в следующей статье. В результате, если мы хотим, чтобы пятый пин Arudino работал в режиме вывода, мы вызываем:
pinMode(5, ВЫХОД);
С этим все просто, но управлять состоянием вывода не сложнее, для этого используется еще одна функция:
цифровая запись (пин, значение);
Аргументы:
- pin — номер вывода (как в pinMode())
- value — требуемый уровень выхода: HIGH или LOW
Значение HIGH — это высокий уровень — логическая единица — 5 В, а LOW — это низкий уровень — логический ноль — 0 В. Все понятно и логично Применение:
цифровая запись (5, ВЫСОКИЙ);
Читайте также: Рейтинг лучших ламп Н11 2023 года, по отзывам покупателей
Базовый пример скетча.
Как видно на схемах, я подключил светодиод к D2, то есть к цифровому выходу номер 2. В базовом скетче мы просто включим светодиод, и оставим его включенным:
void setup() { pinMode(2, OUTPUT); цифровая запись (2, ВЫСОКИЙ); } недействительный цикл() { }
Но сразу же замечаем тот факт, что в каждой из используемых функций у нас есть номер вывода («2»), при этом он пишется прямо как цифра. Это плохой стиль программирования, даже в самых простых примерах этого делать не следует. Поэтому мы объявим переменную, где будет храниться это число, и в дальнейшем будем оперировать исключительно значением этой переменной:
инт светодиодный контакт = 2; void setup () { pinMode (ledPin, OUTPUT); digitalWrite(ledPin, ВЫСОКИЙ); } недействительный цикл() { }
Что это дает? А то, что если нужно изменить номер пин, то это надо делать только в одном месте — при объявлении переменной, а не искать во всей программе места, где номер задается вручную цифрой. В итоге получаем логичный результат в виде горящего светодиода. Но для морального удовлетворения этого недостаточно, поэтому немного усложним пример.
Расширенный пример. Мигание светодиодом на Arduino.
Здесь мы используем функцию, которая обсуждалась в предыдущем уроке, а именно delay(). Идея проста до позора — в основном цикле программы (в функции loop()) мы включим светодиод, подождем 500мс, выключим светодиод и снова подождем 500мс. Ожидаем получить результат в виде мигания светодиода раз в секунду:
инт светодиодный контакт = 2; void setup () { pinMode (ledPin, OUTPUT); } void loop() { // Установить на выходе высокий уровень digitalWrite(ledPin, HIGH); задержка(500); // Низкий уровень digitalWrite(ledPin, LOW); задержка(500); }
Компилируем и прошиваем, конечно результат полностью соответствует ожиданиям