1.1 Включение светодиода
Некоторые задачи можно выполнять как с помощью электроники (аппаратно), так и с помощью программирования (программным способом).
Когда мы программируем электронику, нам необходимо понимать физический принцип происходящего и уметь подключать радиоэлектронные компоненты или модули к Arduino.
В качестве первого практического задания всегда собирают электрическую цепь со светодиодом.
Светодиод должен светиться от постоянного источника питания.
Цель задания — подключить светодиод к постоянному источнику питания, используя токоограничивающий резистор (подробнее о резисторах в подразделе 7.1 этой книги), который нужно подключить между источником питания и анодом светодиода, катод следует подключить к минусу источника питания.
Таким образом у нас получается:
— плюс от источника питания -> вывод резистора -> (резистор) -> вывод резистора -> анод светодиода.
— минус источника питания -> катод светодиода.
Чтобы определить, где у светодиода катод, а где анод, можно обратить внимание на длину выводов (катод короче), на корпус светодиода (со стороны катода нижняя часть корпуса прямая, а не закругленная), посмотреть на металлические пластины внутри корпуса (электрод катода (-) имеет большую площадь) или воспользоваться мультиметром (измерительным прибором).
В качестве источника питания можно использовать специальный отсек с тремя батарейками АА (выдаст 4,5В), использовать крону (выдает 9В, поэтому резистор нужно подбирать сопротивлением больше) или Arduino (использовать вывод Arduino 5В, а Arduino подключить к компьютеру).
От теории к практике: включение светодиода
Подключаем светодиод к Arduino
Задача:
Необходимо написать скетч для постоянного включения светодиода.
Подготовка:
Если это ваше первое знакомство с Arduino, то рекомендую сначала ознакомиться с подразделом 8.1 и подразделом 8.3 этой книги.
Чтобы начать достаточно установить компьютерную программу Arduino IDE любой версии на компьютер (подробнее в подразделе 8.3).
Если хочется не только программировать, но и видеть результат — то нужно приобрести отладочную плату Arduino (это можно сделать и позже).
Далее по книге предполагается, что мы будем программировать отладочную плату Arduino Uno или Arduino Nano (можно купить любую из них, для учебы рекомендуется Arduino Uno). Купить можно на любом маркетплейсе (если это первая покупка — нужно выбирать плату с кабелем (домашний кабель от зарядки может не подойти).
Для программирования нужно установить на компьютер драйвер CH341.
Решение:
Когда мы программируем микроконтроллер для того, чтобы работало какое-либо электронное устройство, вначале необходимо разобраться, как оно должно работать. В данной задаче важно разобраться, что необходимо для свечения светодиода.
Светодиод излучает свет или светится, если на него подать напряжение. Значит, чтобы светодиод постоянно излучал свет, необходимо чтобы все время, пока работает Arduino, на него поступало напряжение, для этого мы можем подключить светодиод к одному из цифровых выводов (начиная со второго выхода, 2—13) или к одному из аналоговых выводов (отмечены на плате буквой A). Аналоговые выводы (А0-А5) могут использоваться, как цифровые (2—13).
Все выводы (или пины/pin) на Arduino по умолчанию находятся в режиме входа (INPUT), поэтому если мы используем вывод в режиме входа и не указали в разделе void setup команду pinMode (pin, INPUT) в некоторых случаях скетч все равно будет работать, но для стабильной работы рекомендуется не забывать указывать состояние вывода. Если вывод используется с подтягивающим резистором (INPUT_PULLUP) или в режиме выхода (OUTPUT), то функцию указывать необходимо обязательно.
Таким образом, если не указать режим вывода, он будет находиться в режиме входа (INPUT), и если в скетче на него подавать напряжение, то есть использовать его в режиме выхода (OUTPUT), то это может в некоторых случаях привести к повреждению Arduino (при превышении допустимых токов).
Поэтому если мы используем пин Arduino, то обязательно используем функцию pinMode (_,_), где в скобках до запятой указывается номер пина Arduino, а после запятой его режим работы.
Вместо «INPUT» можно писать «0», потому что внутри микроконтроллера число «0» означает, что пин будет работать как вход, но обычно используют «INPUT», чтобы код был понятнее и проще для чтения.
То есть «pinMode (2,0);» и «pinMode (2,INPUT);» — это одно и то же.
«OUTPUT» соответствует «1», то есть «pinMode (2,1);» и «pinMode (2,OUTPUT);» — это одно и то же.
Допустим, что мы решили подсоединить светодиод к третьему пину Arduino, тогда функция установки режима пина будет иметь следующий вид: pinMode (3, OUTPUT);.
Каждая строчка заканчивается точкой с запятой. Точка с запятой позволяют компилятору определять, где оканчивается строка, поэтому это важно и без этого символа компилятор выдаст ошибку. Так же важно соблюдать регистр букв, если написать функцию только заглавными буквами, или только маленькими, или любым иным образом, кроме того, который указан выше — компилятор эту функцию не распознает и не сможет перевести код в понятный микроконтроллеру язык из нулей и единиц, в результате чего компилятор сообщит об ошибке.
Для того, чтобы подать напряжение на пин, существует функция digitalWrite (_, _), в круглых скобках которой до запятой указывается номер пина, а после его логическое состояние.
Здесь так же вместо HIGH (высокого логического сигнала, наличия напряжения) можно написать 1, а вместо LOW (низкого логического сигнала, отсутствия напряжения) можно написать 0.
void setup () {
pinMode (3, OUTPUT);
digitalWrite (3, HIGH);
}
void loop () {
}
В Wiring (языке программирования на котором программируют в программе Arduino IDE) есть два основных блока программы, это void setup () {} и void loop () {}.
void setup () {} — всегда выполняется только один раз после того, как на отладочную плату поступит питание. Внутри фигурных скобок « {}» пишется та часть кода, которая должна выполняться один раз. « {» — называют открывающей фигурной скобкой, а} — называют закрывающей фигурной скобкой.
С помощью этих скобок компилятор понимает, где границы функции void setup (). Чтобы микроконтроллер снова выполнил написанный в void setup () код, необходимо отключить от отладочной платы Arduino питание и подключить заново, либо нажать кнопку на отладочной плате Arduino, которая используется для перезагрузки. Так как код в void setup исполняется один раз, здесь размещают, например, настройки портов. Команда pinMode (_, _) всегда прописывается в фигурных скобках void setup (), но может быть записана и в void loop ().
В void setup () ее традиционно пишут потому, что даже после того, как микроконтроллер начнет выполнять код в void loop (), вывод будет выходом или входом (в зависимости от того, как мы его назначили). А назначать вывод выходом/входом несколько раз повторно (в случае с размещением в void loop () — бессмысленно.
Так же нам никто не запрещает размещать тут и другие команды, например, написать здесь «digitalWrite (3, HIGH);». Получается, что микроконтроллер включается, устанавливает третий вывод в режиме выхода и подает на неё высокий уровень логического напряжения, после этого он переходит в блок void loop (), но так, как там в фигурных скобках пусто — он больше ничего не делает, при этом продолжает подавать на третий вывод (ножку) высокое логическое напряжение.
void loop () в отличие от void setup () выполняется многократно. Всю программу микроконтроллер выполняет сверху вниз, дойдя до void loop () он выполняет первую строку внутри фигурных скобок этого блока, потом, если она есть, вторую, если есть третья, то третью, и так далее, когда строки с командами закончатся и микроконтроллер встретит закрывающую фигурную скобку, он перейдет к открывающей фигурной скобке и снова начнет выполнять первую после неё строку, потом вторую, третью, и так до конца. Получается, что то, что написано в void loop () внутри фигурных скобок выполняется по кругу сверху вниз бесконечно, пока на отладочную плату Arduino поступает напряжение питания.
Даже если внутри фигурных скобок void setup () или void loop () ничего не написано, эту функцию обязательно нужно оставлять, иначе вы не сможете откомпилировать и загрузить в Arduino ваш код.
В примере выше это хорошо представлено. Блок программы void loop () не используется, внутри фигурных скобок нет команд, но эта часть программы всё равно присутствует.
*** Если вы впервые знакомитесь с Arduino и впервые читаете книгу — рекомендую пропустить объяснение ниже и перейти сразу к окончанию этого подраздела — к «задачи для закрепления материала», а к тексту ниже вернуться после изучения 1 — 3 разделов.
В микроконтроллере есть специальные ячейки памяти, которые содержат его настройки и называются регистрами. Каждый регистр выполняет свою задачу, так вместо pinMode () в коде используется регистр DDR (подробнее в подразделе 3.4 этой книги), вместо digitalWrite () используется регистр PORT (подробнее в подразделе 3.5 этой книги).
3 вывод Arduino относится к порту D, поэтому команды будут DDRD и PORTD. Чтобы сделать вывод выходом и подать на него напряжение (HIGH или логическая единица) нужно установить единицу в соответствующие биты этих регистров. Для этого пишем логическую единицу, побитовый сдвиг "<<" и номер бита порта D. Оператор "|=" изменяет только нужный бит, не затрагивая остальные.
void setup () {
DDRD |= (1 <<3);
PORTD |= (1 <<3);
}
void loop () {
}
Запись (1 <<3) говорит о том, что единица сдвигается в позицию третьего бита (или, если упростить, мы записываем в третий бит порта D логическую единицу).
Чтобы включить два светодиода, каждый из которых не будет зависеть от другого, необходимо подключить светодиоды к разным выводам и подать напряжение на каждый из них.
void setup () {
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
digitalWrite (3, HIGH);
digitalWrite (4, HIGH);
}
void loop () {
}
Скетч с использованием регистров:
void setup () {
DDRD |= (1 <<3);
DDRD |= (1 <<4);
PORTD |= (1 <<3);
PORTD |= (1 <<4);
}
void loop () {
}
Задачи для закрепления материала:
Задачи следует решать с использованием функций Wiring.
(Дополнительно) Решение задач с использованием регистров.
1. Подключить три светодиода на 2, 3 и 4 выводах Arduino и подать на них напряжение.
2. Подключить восемь светодиодов. Подать на них напряжение. Выводы Arduino выбрать самостоятельно.
Что мы изучили в подразделе 1.1:
1. Принцип подключения светодиода;
2. Назначение токоограничивающего резистора (подробнее о резисторах в подразделе 7.1);
3. Понятия анод и катод;
4. Функцию pinMode () — настройка режима вывода;
5. Функцию digitalWrite () — подача логического уровня;
6. Значения HIGH и LOW;
7. Назначение void setup ();
8. Основы управления выводами через регистры DDRD, PORTD (подробнее в подразделах 3.4 и 3.5).