Всех рад снова приветствовать 🤝 Без чего не обходится почти ни один проект на Arduino? Конечно, без работы с портами ввода-вывода, которые в контексте Arduino помечены как “Digital” (цифровой пин). Каждый из цифровых выводов может работать как в режиме выхода, так и в режиме входа. Сегодня мы сосредоточимся на первом из вариантов, а в следующем уроке – на втором, итак, приступаем. Конечно же, в качестве примера осуществим подключение светодиода к Arduino Uno, это бессменная классика в мире микроконтроллеров.
Сразу скажу, что уроки будут не из серии – "скопируй три строки кода, светодиод загорелся, ну и отлично", будут поясняться основополагающие физико-электрические понятия, связанные с тем или иным процессом. Без этого не будет понимания, что и как работает, а это означает практически нулевой результат обучения.
Теоретическая часть.
Arduino. Порты ввода-вывода в режиме выхода.
В чем идея и смысл понятия "цифровой (digital) пин"? Все просто – каждый вывод в режиме выхода может находиться в одном из двух состояний:
- логический ноль (0)
- логическая единица (1)
Каждому из этих состояний соответствует определенное значение напряжения:
- на выходе 0 – напряжение равно 0 В (GND)
- на выходе 1 – напряжение равно 5 В (5V)
В данном случае 5 В – это напряжение питания микроконтроллера. При использовании платы с питанием МК от 3.3В (например, Arduino Leonardo), единица на выходе будет соответствовать уже 3.3 В. Также существует терминология, при использовании которой единица на выходе – это высокий уровень сигнала, а 0 – низкий. Резюмируем и систематизируем:
Высокий уровень | Логическая 1 | 5 В |
Низкий уровень | Логический 0 | 0 В |
Собственно, в этом и состоит суть управления портом ввода-вывода в режиме выхода. У нас есть два возможных варианта - подать на выход 0 или 1 - вот и все. Результат будет зависеть от того, что именно подключено к этому пину платы. Допустим, подключен анод светодиода, подаем 1 - горит, подаем 0 - гаснет. Именно на примере взаимодействия Ардуино со светодиодом сегодня и будем проводить тестирование скетчей.
Схема подключения светодиода к Arduino Uno.
Раз уж вышли на тему подключения светодиода, то обсудим подробнее. В общем-то, здесь есть всего два момента, о которых стоит упомянуть:
Как видно из иллюстрации светодиод имеет два вывода, при этом они не равнозначны, а скорее диаметрально противоположны. Один вывод – это анод диода, второй - катод, визуально, либо по схеме, определить назначение вывода можно следующим образом:
Подробнее о принципе работы диода можно прочитать вот тут. Пока же важен тот факт, что светодиод будет гореть, если напряжение на аноде превышает напряжение на катоде на некоторую величину. Из этого следует логичный вывод, что катод есть смысл подключить на GND, а анод – на цифровой пин Ардуино (один из вариантов):
Если мы подадим на пин высокий уровень, то напряжение на нем составит 5 В, на GND соответственно – 0 В. На светодиоде тогда эти 5В и окажутся. И тут вступает в действие второй нюанс, который заключается в том, что напряжение, подаваемое на светодиод, должно соответствовать его характеристикам, а не выбираться случайным образом.
Режим работы светодиода определяется двумя параметрами – напряжением на нем и протекающим через него током. Для задания этих величин достаточно добавить в схему один резистор:
Итак, разбираемся, в чем смысл этого резистора, а также, как определить необходимую величину сопротивления. И для лучшего понимания традиционно будем рассматривать конкретный реальный пример, а не стандартные теоретические формулировки. Берем первый попавшийся диод, пусть будет такой, и открываем даташит (документацию) на него. Интересуют нас два параметра, определяющие работу диода – прямой ток (I_F) и прямое напряжение, соответствующее этому току (V_F). Эти данные мы можем почерпнуть из вольт-амперной характеристики (ВАХ):
При этом для работы порта Ардуино в режиме вывода есть свои собственные ограничения, которые можно узнать из даташита на конкретную плату. Для 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 В - 2 \medspace В = 3 \medspace В
Сформулируем промежуточный итог: для того, чтобы напряжение на светодиоде составило 2 В, на резисторе должно быть 3 В. Прекрасно, продолжаем, обозначим протекающие токи:
И, поскольку, элементы соединены последовательно, то через каждый из них течет один и тот же ток. А величина его, между прочим, нам также известна, поскольку нами же и выбрана:
I = 20 \medspace мА
Таким образом, нам остается только рассчитать искомое сопротивление по закону Ома:
R = \frac{U_R}{I} = \frac{3 \medspace В}{20 \medspace мА} = 150 \medspace Ом
Получаем необходимое значение 👍 В данном случае мы ограничены током, который может выдавать порт микроконтроллера, максимально же допустимый ток для светодиода можно также почерпнуть из даташита. К примеру для нашего подопытного в документации указан предельный прямой ток, равный 50 мА:
Соответственно, превышение данного значения с внушительной вероятностью превратит светодиод в хлам. И схема подключения светодиода к Ардуино в итоге имеет такой вид:
При использовании макетной платы (breadboard) коммутация может быть произведена так:
И на этом, наконец, все готово к переходу к программно-практической части.
Практическая часть.
Функции pinMode() и digitalWrite().
Для использования порта в качестве выхода Arduino предлагает нам одну функцию, которая осуществит необходимую конфигурацию:
pinMode(pin, mode);
Функция принимает два аргумента:
pin
- номер пина Ардуиноmode
- необходимый режим работы
Режимов работы может быть три: OUTPUT, INPUT, INPUT_PULLUP. Нас сегодня интересует исключительно первый, а два оставшихся используем в следующей статье. В результате, если мы хотим настроить 5-й пин Арудино на работу в режиме выхода, то вызываем:
pinMode(5, OUTPUT);
С этим все просто, управлять же состоянием вывода ничуть не сложнее, для этого используется другая функция:
digitalWrite(pin, value);
Аргументы таковы:
pin
- номер пина (как и в pinMode())value
- требуемый уровень на выходе: HIGH, либо LOW
Значение HIGH - это высокий уровень – логическая единица - 5 В, а LOW - низкий уровень - логический ноль - 0 В. Все четко и логично 🙂 Вариант применения:
digitalWrite(5, HIGH);
Базовый пример скетча.
Как вы уже видели на схемах, я подключил светодиод к D2, то есть цифровому выходу под номером 2. В базовом скетче мы просто зажжем светодиод, и пусть горит постоянно:
void setup() { pinMode(2, OUTPUT); digitalWrite(2, HIGH); } void loop() { }
Но сразу же отметим тот факт, что у нас в каждой из используемых функций фигурирует номер пина ("2"), при этом он прописан непосредственно цифрой. Это скверный стиль программирования, даже в простейших примерах так делать не стоит. Поэтому объявим переменную, в которой будет сохранен этот номер, и в дальнейшем будем оперировать исключительно значением этой переменной:
int ledPin = 2; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); } void loop() { }
Что это дает? А то, что при необходимости изменить номер пина, это нужно будет сделать всего лишь в одном месте - при объявлении переменной, а не выискивать по всей программе места, где номер задан вручную цифрой. В результате получаем закономерный итог в виде горящего светодиода. Но этого недостаточно для морального удовлетворения, поэтому немного усложним пример.
Расширенный пример. Мигание светодиодом на Arduino.
Здесь мы используем функцию, разобранную в предыдущем уроке, а именно delay()
. Идея проста до безобразия - в основном цикле программы (в функции loop()
) будем зажигать светодиод, ждать 500 мс, гасить светодиод и снова ждать 500 мс. Ожидаем получить результат в виде раз в секунду мигающего светодиода:
int ledPin = 2; void setup() { pinMode(ledPin, OUTPUT); } void loop() { // Подаем высокий уровень на выход digitalWrite(ledPin, HIGH); delay(500); // Подаем низкий уровень digitalWrite(ledPin, LOW); delay(500); }
Компилируем и прошиваем, само собой результат полностью соответствует ожиданиям 👍
И на этом на сегодня заканчиваем, всех благодарю за внимание, следите за обновлениями и присоединяйтесь к нашему сообществу!