Лабораторная работа 6. Светодиодная сборка
Цель работы:
Знакомство с принципами работы светодиодной сборки и биполярного транзистора, а также применение полученных навыков для создания программы по управлению свечением светодиодной сборки.
Теоретическая часть
Светодиодная сборка – это определенное количество независимых светодиодов, каждый со своим анодом и катодом, подключенных к микроконтроллеру. Существуют множества различных вариантов свето- диодных сборок. Но одним из наиболее распространенных исполнений светодиодной шкалы сборки является сборка с десятью светодиодами (Рисунок 6.1).
Рисунок 6.1. Внешний вид светодиодной сборки
При работе с множеством элементов необходимо осознавать важ- ность, чтобы к каждому из элементов подключался собственный рези- стор, а не один резистор подключался на все (Рисунок 6.2). В случае под- ключения одного резистора на все элементы, при подключении новых светодиодов в сеть, яркость свечения будет изменяться.
Также стоит помнить, что диоды открываются при определенном на- пряжении, и у разных диодов эти значения могут колебаться. Это значит, что при подаче напряжения может открыться лишь один диод и пустить через себя большой ток, что выведет его из строя. Затем ток пойдет по другому открывшемуся диоду и выведет из строя уже его.
Практическая часть
В данной лабораторной работе необходимо разработать программу, которая будет управлять свечением светодиодной сборки. Но прежде необходимо научиться использовать одну из директив языка, операторы цикла типа for и функцию таймера millis.
Рисунок 6.2. Принципиальная схема подключения светодиодной сборки
Директива #define
В языке СИ при работе с Arduino есть удобная директива, называемая #define. Определенные этой директивой константы не занимают программной памяти, поскольку компилятор заменяет все обращения к ним их значениями на этапе компиляции, соответственно они служат исключительно для удобства программиста и улучшения читаемости текста программы. Важно, что если имя константы, заданное с помощью директивы #define включить в имя другой константы или переменной, то оно будет заменено на свое значение.
Синтаксис:
#define constantName value
Параметры:
constantName – имя константы, которое мы будем использовать, value – значение, на которое константа будет заменена,
Точка с запятой после объявления не ставится.
Оператор цикла for.
Описание:
Часто при программировании задач нужно, чтобы одна и та же после- довательность команд выполнялась несколько раз. Такой процесс назы- вается циклическим. Алгоритм, в котором определенная последователь- ность команд повторяется несколько раз с новыми входными данными, называется циклическим алгоритмом. Примером циклического алгорит- ма является цикл for.
Цикл for выполняется до тех пор, пока значение value равно true. Как только значение выражения станет false, выполнение цикла прекращает- ся, и выполняется оператор, который следует за циклом for.
Синтаксис:
for ( initialization, value, increase )
Параметры:
initialization - операция присваивания, в которой устанавливается на- чальное значение переменной цикла. Эта переменная является счетчи- ком, который управляет работой цикла. Количество переменных, управ- ляющих циклом for, может быть две и больше;
value - условное выражение, в котором проверяется значение пе- ременной цикла. На этом этапе определяется дальнейшее выполнение цикла;
increase – определяет, как будет изменяться значение переменной цикла после каждой итерации.
Функция таймера millis.
Описание:
Функция millis является функцией таймера. Она возвращает от встро- енного таймера микроконтроллера значение количества миллисекунд, прошедших с момента запуска. Пространство применения этой функции очень большое. Например, очень часто эту функцию используют как аль- тернативу функции delay.
Функция delay является самой простой командой и её очень часто используют. По сути, она является задержкой, которая приостанавлива- ет работу программы на указанное в скобках число миллисекунд. Нуж- но отчетливо понимать, что на время паузы с помощью функции delay работа программы приостанавливается, приложение не будет получать никаких данных с датчиков. Это является самым большим недостатком использования функции delay при программировании микроконтролле- ров Arduino.
Функция millis, в свою очередь, позволит выполнить задержку без ис- пользования функции delay, и, тем самым, обойти недостатки предыду- щего способа. Максимальное значение параметра millis такое же, как и у функции delay.
С помощью функции millis выполнение всего скетча не останавли- вается. Функция указывает, сколько времени управляющая программа микроконтроллера должна «обходить» именно тот блок кода, который необходимо приостановить. Чтобы с помощью millis ставить выполнение программы на паузу, необходимо использовать дополнительный код для описания задержки, например, операторы цикла, либо ветвления.
Таким образом, программная задержка, выполненная с помощью функции millis, требует большего кода (по сравнению с использованием функции delay), но с ее помощью можно моргать светодиодом и ставить на паузу скетч, не останавливая при этом систему.
Синтаксис:
millis (); Параметров нет.
Возвращает количество миллисекунд с начала выполнения программы.
Схема подключения:
К данной рабочей программе используется следующая схема подключения (Рисунок 6.3). Для реализации проекта потребуются следую- щие компоненты: макетная плата, резистор на 220 Ом (10 шт), светоди-одная шкала на 10 светодиодов (1 шт) и провода
Рисунок 6.3. Схема сборки
После сборки схема имеет следующий вид (Рисунок 6.4):
Рисунок 6.4. Внешний вид схемы после сборки
Рабочая программа:
// Светодиодная шкала подключена к группе пинов, расположенных
// подряд.
// Присваиваются понятные имена первому и последнему пинам
#define first_pin 2
#define last_pin 11
void setup()
{
// В сборке 10 светодиодов. Возможно написать pinMode 10 раз
// для каждого из пинов, но это увеличивает код и
// делает его изменение более проблематичным.
// Поэтому для открытия каждого нужного пина на выход
// используется цикл for. Тогда функция pinMode
// циклично откроет каждый пин от первого (first_pin)
// до последнего last_pin, увеличивая значения
// pin на единицу (++pin)
for (int pin = first_pin; pin <= last_pin; ++pin) pinMode (pin, OUTPUT);
}
void loop()
{
// Определение времени в миллисекундах с момента
// включения микроконтроллера unsigned int ms = millis();
// Вычисление, какой светодиод должен гореть
// именно сейчас. Смена будет происходить
// каждые 500 миллисекунд.
int pin = first_pin + (ms / 500) % 10;
// Включение нужного светодиода на 50 миллисекунд
// с последующим выключением. На следующем проходе цикла
// светодиод снова включится
digitalWrite(pin, HIGH); delay(50);
digitalWrite(pin, LOW);
}
Также микроконтроллер позволяет воспользоваться уже встроенным в плату светодиодом. Всего на плате имеется семь встроенных светодио- дов, в том числе шесть программируемых пользовательских и один сер- висный светодиод. В коде программы указывается первый встроенный светодиод, подключенный к 22 пину, и последний, подключенный к 27 пину.
Схема подключения:
К данной рабочей программе нет схемы, все комплектующие встроены в плату. (Рисунок 6.5)
Рисунок 6.5. Работа со встроенными в контроллер светодиодами
Рабочая программа:
// Светодиодная шкала подключена к группе пинов, расположенных
// подряд.
// Присваиваются понятные имена первому и последнему пинам
#define first_pin 22
#define last_pin 28
void setup(){
// в сборке 10 светодиодов. Возможно написать pinMode 10 раз
// для каждого из пинов, но это увеличивает код и
// делает его изменение более проблематичным.
// Поэтому для открытия каждого нужного пина на выход
// используется цикл for. Тогда функция pinMode
// циклично откроет каждый пин от первого (first_pin)
// до последнего last_pin, увеличивая значения
// pin на единицу (++pin)
for (int pin = first_pin; pin <= last_pin; ++pin) pinMode (pin, OUTPUT);
}
void loop(){
// определение времени в миллисекундах с момента
// включения микроконтроллера unsigned
int ms = millis();
// Вычисление, какой светодиод должен гореть
// именно сейчас. Смена будет происходить
// каждые 500 миллисекунд.
int pin = first_pin + (ms / 500) % 10;
// Включение нужного светодиода на 50 миллисекунд
// с последующим выключением. На следующем проходе
// цикла светодиод снова включится
digitalWrite(pin, HIGH);
delay(50); digitalWrite(pin, LOW);
}
Список контрольных вопросов:
- Как работает функция millis?
- Где и как его используют?
- Какие преимущества имеет и недостатки имеет метод задержки с помощью mills?
Список дополнительных задач:
- Изменить время горения одного диода.
- Изменить направление бегущего огонька.
- Изменить программу так, чтобы диоды загорались в другой последовательности
- Изменить программу так, чтобы можно было управлять яркостью свечения диодов.
Center-nav