Перейти к содержанию

Лабораторная работа 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);

}

Список контрольных вопросов:

  1. Как работает функция millis?
  2. Где и как его используют?
  3. Какие преимущества имеет и недостатки имеет метод задержки с помощью mills?

Список дополнительных задач:

  1. Изменить время горения одного диода.
  2. Изменить направление бегущего огонька.
  3. Изменить программу так, чтобы диоды загорались в другой последовательности
  4. Изменить программу так, чтобы можно было управлять яркостью свечения диодов.

Center-nav

← Назад | Оглавление | Вперёд →