В этом примере показано как с помощью контроллера Arduino заставить мигать светодиод.
Необходимые компоненты
- контроллер Arduino
- светодиод
- резистор 220 Ом
Подключение
RGB светодиод. Урок 8. Ардуино
Привет! Мы много раз работали с обычными светодиодами, подключали их к Ардуино и программировали разные скетчи для управления. Но сегодня поговорим про особенный RGB светодиод.
В общем случае, RGB светодиод — это три простых цветных светодиода размещенных в общем корпусе.
В предыдущих уроках мы рассматривали подключение нескольких светодиодов и управление ими с помощью кнопок. На этот раз мы подключим к Ардуино RGB светодиод и будем им управлять. Так что, посмотрите предыдущие уроки, если вы пропустили их или уже забыли.
Уроки Arduino #7 — подключение светодиода
Разумеется, не забудем также и о подавлении дребезга кнопок.
Для того, чтобы выполнить этот урок нам понадобиться
- Ардуино UNO
- Макетная плата
- Перемычки
- 4 Резистора номиналом 220 Ом
- RGB Светодиод
- Кнопка
- Кабель USB
Как и в предыдущем уроке, мы будем переключать режим светодиода кнопкой. Но, на этот раз, будем использовать один светодиод вместо 4 и добавим несколько новых режимов. Использую RGB светодиод мы можем смешивать цвета в разных пропорциях, а в результате получать другие цвета и оттенки.
RGB Светодиоды
Существует несколько разновидностей RGB светодиодов:
- элементы с общим катодом, которые управляются положительными сигналами, подаваемыми на аноды чипов. Такие элементы маркируются буквами CA;
- с общим анодом. Команды на изменение режима работы идут на катоды элементов. Маркировка CC;
- собственной парой контактов для каждого кристалла (6 выводов).
В нашем распоряжении оказались три светодиода с общими катодами, так что подключим их по схеме с общим катодом. А каждый вывод анода соединим со своим контактом Ардуино последовательно с сопротивлением.
Как видно из схемы, кнопку мы подключили по уже знакомой схеме со стягивающим резистором. Мы рассматривали эту тему ранее, когда подключали кнопку к Ардуино в первый раз.
Программа и режимы
При нажатии на кнопку, в программе будут переключаться режимы светодиодов. Для этого напишем функцию, которая будет принимать на вход состояние счетчика и зажигать светодиод определенным образом.
ПЕРВАЯ СХЕМА НА АРДУИНО [Уроки Arduino #4]
void setMode(int mode)< if (mode == 1)< // только красный digitalWrite(RLED, HIGH); digitalWrite(GLED, LOW); digitalWrite(BLED, LOW); >else if (mode == 2)< // только зеленый digitalWrite(RLED, LOW); digitalWrite(GLED, HIGH); digitalWrite(BLED, LOW); >else if (mode == 3) < // только синий digitalWrite(RLED, LOW); digitalWrite(GLED, LOW); digitalWrite(BLED, HIGH); >>
Добавим еще несколько режимов смешивания цветов для того, чтобы получить разные оттенки. В результате мы увидим на что способен RGB светодиод и почему их так часто используют в современных источниках освещения.
Вы можете и сами дописать любые режимы для светодиода и даже использовать возможности ШИМ пинов Ардуино, чтобы плавно изменять цвета.
Полный текст программы
const int buttonPin=2; boolean lastButtonState = LOW; boolean buttonState = LOW; int RLED = 9; int GLED = 10; int BLED = 11; int ledMode = 0; void setup() < Serial.begin(9600); pinMode (buttonPin , INPUT); pinMode(RLED, OUTPUT); pinMode(GLED, OUTPUT); pinMode(BLED, OUTPUT); >void setMode(int mode)< if (mode == 1)< digitalWrite(RLED, HIGH); digitalWrite(GLED, LOW); digitalWrite(BLED, LOW); >else if (mode == 2)< digitalWrite(RLED, LOW); digitalWrite(GLED, HIGH); digitalWrite(BLED, LOW); >else if (mode == 3)< digitalWrite(RLED, LOW); digitalWrite(GLED, LOW); digitalWrite(BLED, HIGH); >else if (mode == 4)< analogWrite(RLED, 127); analogWrite(GLED, 0); analogWrite(BLED, 127); >else if (mode == 5)< analogWrite(RLED, 0); analogWrite(GLED, 127); analogWrite(BLED, 127); >else if (mode == 6)< analogWrite(RLED, 127); analogWrite(GLED, 127); analogWrite(BLED, 0); >else if (mode == 7)< analogWrite(RLED, 85); analogWrite(GLED, 85); analogWrite(BLED, 85); >else < digitalWrite(RLED, LOW); digitalWrite(GLED, LOW); digitalWrite(BLED, LOW); >> boolean debounce(boolean last) < boolean current = digitalRead(buttonPin ); if (last != current)< delay(3); current = digitalRead(buttonPin ); return current; >> void loop() < buttonState = debounce(lastButtonState); if (lastButtonState == LOW buttonState == HIGH)< ledMode++; if (ledMode == 8)< ledMode = 0; >setMode( ledMode ); > lastButtonState = buttonState; >
Заключение
Подключение светодиода к Arduino. Схема и примеры скетчей.
Всех рад снова приветствовать Без чего не обходится почти ни один проект на Arduino? Конечно, без работы с портами ввода-вывода, которые в контексте Arduino помечены как “Digital” (цифровой пин). Каждый из цифровых выводов может работать как в режиме выхода, так и в режиме входа. Сегодня мы сосредоточимся на первом из вариантов, а в следующем уроке – на втором, итак, приступаем. Конечно же, в качестве примера осуществим подключение светодиода к Arduino Uno, это бессменная классика в мире микроконтроллеров.
Сразу скажу, что уроки будут не из серии – «скопируй три строки кода, светодиод загорелся, ну и отлично», будут поясняться основополагающие физико-электрические понятия, связанные с тем или иным процессом. Без этого не будет понимания, что и как работает, а это означает практически нулевой результат обучения.
- Теоретическая часть
- Порты ввода-вывода в режиме выхода
- Подключение светодиода
- Функции pinMode() и digitalWrite()
- Базовый пример
- Расширенный пример
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_ = U_R + U_D
Где: U_R — это напряжение на резисторе, а U_D — напряжение на светодиоде. Напряжение на светодиоде нам известно из документации, его мы уже можем подставить в эту формулу, что приведет к закономерному результату:
U_R = U_ — U_D = 5 medspace В — 2 medspace В = 3 medspace В
Сформулируем промежуточный итог: для того, чтобы напряжение на светодиоде составило 2 В, на резисторе должно быть 3 В. Прекрасно, продолжаем, обозначим протекающие токи:
И, поскольку, элементы соединены последовательно, то через каждый из них течет один и тот же ток. А величина его, между прочим, нам также известна, поскольку нами же и выбрана:
I = 20 medspace мА
Таким образом, нам остается только рассчитать искомое сопротивление по закону Ома:
R = frac = frac = 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); >
Компилируем и прошиваем, само собой результат полностью соответствует ожиданиям
И на этом на сегодня заканчиваем, всех благодарю за внимание, следите за обновлениями и присоединяйтесь к нашему сообществу!
Источник: microtechnics.ru