Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллера Arduino в информационно-управляющих системах. Учебное пособие
.pdf
}
Для того, чтобы избежать явления «дребезга» (см. главу «Тактовые
кнопки»), необходимо подключить в цепь с кнопкой подтягивающий резистор,
например, на 10 кОм). Тогда микротоки дребезга «заземлятся» и не будут создавать
ложные сигналы многократного нажатия и отпускания кнопки.
5.3.2 Пример
Кнопка подключена через подтягивающий резистор 10 кОм к пину 2.
Светодиод подключен через токоограничивающий резистор 220 Ом к пину 12,
представлено на рисуноке 34.
Рисунок 34 – Схема примера
Код скетча:
void setup() {
pinMode(12, OUTPUT);
pinMode(2, INPUT);
}
void loop() {
if (digitalRead(2) == HIGH) {
61

digitalWrite(12, HIGH);
}
else {
digitalWrite(12, LOW);
}
}
Результат работы скетча: Исходное состояние: светодиод выключен, кнопка
не нажата. Нажатие кнопки приводит к включению светодиода: пока кнопка нажата,
светодиод горит; отжимание кнопки возвращает систему в исходное состояние.
5.3.3 Практическое задание
Соберите электрическую схему и напишите скетч для Arduino. Используйте
токоограничивающий резистор для светодиода и подтягивающий – для кнопки,
чтобы избежать дребезга. Резисторы на 220 Ом и 10 кОм входят в комплект
«Матрешка Z».
Вариант 1: Схема с кнопкой и тремя светодиодами. Исходное состояние:
светодиоды выключены, кнопка отжата. При нажатии кнопки включается первый
светодиод. Повторное нажатие включает еще один (работают первый и второй).
Следующее нажатие включает третий светодиод (работают все три светодиода).
Четвертое нажатие выключает все светодиоды – возвращает систему к исходному
состоянию.
Вариант 2: Схема с кнопкой и тремя светодиодами. При нажатии кнопки
случайный светодиод включается на 4 секунды (используйте генератор случайных
чисел, описанный в соответствующей главе).
Вариант 3: Схема с кнопкой и двумя светодиодами. Исходное состояние: оба
светодиода одновременно включены, кнопка отпущена. Нажатие и удерживание
кнопки приводит к выключению светодиодов (скетч работает «наоборот).
Отпускание кнопки возвращает систему в исходное состояние. При этом инверсию
62

следует сделать не программно, а аппаратно – изменить схему подключения кнопки
(так, чтобы в спокойном состоянии с пина 2 считывалось HIGH, а при нажатии
кнопки - LOW).
5.4 Лабораторная работа №4 «Широтно-импульсная модуляция»
Цель работы: понять принцип работы широтно-импульсной модуляции
(ШИМ). Научиться использовать ШИМ в проектах на базе Arduino.
5.4.1 Краткие теоретические сведения
Широтно-импульсная модуляция (ШИМ) - это метод получения
изменяющегося аналогового значения посредством цифровых устройств. Пины
Arduino (0-13), настроенные как выходы, могут выдавать либо 5 вольт, либо 0. Если
в проекте необходимо использовать переменное значение напряжения (например,
3,3 вольта, 4,1 вольта, 1 вольт), необходимо использовать ШИМ.
Пин, настроенный как ШИМ-выход, выдает прямоугольные импульсы -
сигналы, которые постоянно переключается между максимальным (5 вольт) и
минимальным (0 вольт) значениями. Данный сигнал моделирует «промежуточное
напряжение» между 5В и 0В, изменяя при этом длительность времени включения
5В относительно включения 0В. Длительность включения тока в 5 вольт называется
шириной импульса. Для получения различных аналоговых величин изменяется
ширина импульса. При быстрой смене периодов включения-выключения можно
подавать постоянный сигнал между 0 и 5В. Например, можно управлять яркостью
свечения светодиода или частотой звука, проигрываемого пьезо-динамиком.
Широтно-импульсную модуляцию поддерживают только цифровые пины,
отмеченные знаком ~ на плате. На большинстве плат Arduino это пины 3, 5, 6, 9, 10
и 11.
63

Для ШИМ используется функция «analogWrite», при этом переводить пины в
режим выхода в блоке «setup» не требуется.
analogWrite(пин, значение);
где пин – номер контакта Arduino, отмеченный знаком ~, а значение – число от
0 до 255.
При этом analogWrite(пин, 255) выдает максимальный ток в 5 вольт, а
analogWrite(пин, 0) подает 0 вольт (прекращает подачу тока). Числа между 0 и 255 в
параметре функции «analogWrite» пропорционально генерируют, в итоге, ток,
величиной от 0 до 5 вольт. Например, значение 153 будет соответствовать величине
тока в 3 вольта, а 76 – 1,5 вольт. Работа ШИМ наглядно представлена на рисунке 35.
Рисунок 35 – Принцип работы ШИМ в виде графика
64

5.4.2 Пример
Светодиод подключен к пину «11~», поддерживающему возможность
использования ШИМ, через токоограничивающий резистор, как представлено на
рисуноке 5.
Рисунок 36 – Схема примера
Код скетча:
int i;
void setup() {
pinMode(11, OUTPUT);
}
void loop() {
for (int i=0; i <= 255; i++) {
analogWrite(11, i);
delay(10);
}
delay(100);
for (int i=255; i >= 0; i--) {
analogWrite(11, i);
65

delay(10);
}
delay(100);
}
Результат работы скетча: светодиод включается, яркость его свечения плавно
повышается до максимума, а затем плавно уменьшается до полного затухания
светодиода.
5.4.3 Практическое задание
Соберите электрическую схему и напишите скетч для Arduino. Используйте
токоограничивающий резистор для светодиода и подтягивающий – для кнопки,
чтобы избежать дребезга. Резисторы на 220 Ом и 10 кОм входят в комплект
«Матрешка Z». Используйте цикл для удобства работы с ШИМ-модуляцией
(например, для последовательного изменения значений от 0 до 255).
Вариант 1: Схема с двумя светодиодами. Исходное состояние: светодиод №1
включен на максимум (5В), светодиод №2 выключен. Светодиод №1 плавно
уменьшает яркость свечения до 0, светодиод №2 при этом плавно увеличивает
яркость до максимума (5В), затем наоборот (цикличное плавное изменение яркости
светодиодов).
Вариант 2: Схема с двумя светодиодами и кнопкой. При удерживании кнопки
яркость светодиода возрастает от 0 до 5В, при отпускании – светодиод выключается,
даже если максимум в 5В еще не был достигнут.
Вариант 3: Схема с двумя кнопками и светодиодом. Нажатие на одну кнопку
увеличивает яркость светодиода, на другую – уменьшает.
66

5.5 Лабораторная работа №5 «Работа с аналоговыми входами»
Цель работы: научиться использовать пины А0-А5 и соответствующие
функции языка Wiring. Научиться обрабатывать аналоговые данные и применять эти
знания в реальных проектах.
5.5.1 Краткие теоретические сведения
Микроконтроллер, используемый в Arduino, содержит аналого-цифровой
преобразователь (АЦП). Разрешение преобразователя составляет 10 бит, что
позволяет на выходе получать значения от 0 до 1023. Основным применением
аналоговых входов является получение данных с аналоговых датчиков (например,
датчики света и шума), однако пины А0-А5 могут выполнять функции цифровых
портов ввода-вывода (в таком случае, для работы с пинами следует использовать
номера 14 (А0) -19 (А5)).
Для аналоговых входов нет необходимости использовать функцию «pinMode»,
чтобы обозначить порты А0-А5 как порты ввода. В коде скетча сразу используются
функции работы с аналоговыми портами, при этом в качестве адреса пина
указывается цифра от 0 до 5, букву «А» писать не следует – среда определит, что вы
работаете с аналоговыми функциями, и, соответственно, аналоговыми портами, а не
будет пытаться считать данные с цифровых портов 0-5.
Для того, чтобы считать напряжение, подаваемое на аналоговый вход,
используется функция «analogRead». Эта функция возвращает число от 0 до 1023,
что соответствует напряжению от 0 до 5 вольт, подаваемому на аналоговый вход.
Это 1024 шага разрешением 0.0049 Вольт. Разброс напряжения и шаг могут быть
изменены функцией «analogReference», однако в данном пособии рассматривается
работа со стандартным разбросом и шагом.
Считывание значения с аналогового входа занимает примерно 100
микросекунд (0.0001 сек), т.е. максимальная частота считывания составляет
приблизительно 10,000 раз в секунду.
67

Пример использования «analogRead» в коде скетча:
int b = analogRead(0);
/* В переменную b будет записано число от 0 до 1023, соответствующее
напряжению, подаваемому на аналоговый пин А0.*/
5.5.2 Пример
Потенциометр и пьезо-динамик подключены к плате Arduino UNO, как
представлено на рисунке 37.
Рисунок 37 – Схема примера
«Плюс» пьезо-динамика соединен с цифровым пином 9, поддерживающим
ШИМ. Потенциометр работает как делитель напряжения, его крайние ножки
подключены к питанию 5В. Средняя ножка соединяется с пином А0 для считывания
с него сигнала.
Код скетча:
int F;
void setup()
{
68

//В данном скетче этот блок не используется
}
void loop()
{
F = analogRead(0);
F=F*5;
analogWrite(9, F);
}
Результат работы скетча: пьезо-динамик издает звук, частоту которого можно
регулировать поворотом ручки потенциометра.
5.5.3 Практическое задание
Соберите электрическую схему с датчиком, выдающим аналоговый сигнал и
светодиодом, напишите скетч для Arduino.
Вариант 1: Схема с потенциометром и светодиодом. Поворот ручки
потенциометра регулирует яркость свечения светодиода.
Вариант 2: Схема с фоторезистором (датчиком света) и светодиодом. При
изменении освещенности фоторезистора меняется яркость свечения светодиода. Чем
меньше света падает на фоторезистор, тем ярче горит светодиод. Будьте
внимательны при составлении схемы на макетной плате: постарайтесь сделать так,
чтобы светодиод не засвечивал фоторезистор.
Вариант 3: Схема с термистором (датчиком тепла) и светодиодом.
Повышение температуры на термисторе увеличивает яркость свечения светодиода.
5.6 Лабораторная работа №6 «Последовательный интерфейс UART»
Цель работы: научиться использовать интерфейс UART для передачи данных
между платой Arduino и компьютером. Научиться выводить на экран сигнал,
69

получаемый с датчиков. Изучить набор функций «Serial», используемый при работе
с последовательным интерфейсом.
5.6.1 Краткие теоретические сведения
Набор функций Serial служит для связи платы Arduino с компьютером или
другими устройствами, имеющими последовательный интерфейс. Все платы
Arduino имеют хотя бы один последовательный порт (UART). Для обмена данными
Serial использует цифровые порты ввода/вывода 0 (RX) и 1 (TX), а также USB порт.
Заметьте, если вы используете Serial, то нельзя одновременно с этим использовать
порты 0 и 1 для других целей.
Среда разработки Arduino IDE имеет «монитор последовательного
интерфейса» (Инструменты - Монитор порта). Для начала обмена данными
необходимо запустить монитор и выбрать ту же скорость связи (baud rate), с которой
вызвана функция «Serial.begin». Данную функцию следует вызывать один раз – в
блоке Setup.
Для вывода сообщения на экран используются функции «Serial.print()» и
«Serial.println()». Их отличие в том, что вторая функция вдобавок выведенному на
экран тексту переведет курсор на новую строку. В качестве аргумента функции
используется текст в кавычках или переменная. Serial не поддерживает кириллицу.
Например:
Serial.print(“Ответ: “);
Serial.println(result);
5.6.2 Пример
Плата Arduino UNO подключена к ПК через USB порт.
Код скетча:
double a,b,c;
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
