close

Вход

Забыли?

вход по аккаунту

?

Solenyi

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное
образовательное учреждение высшего образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
МЕХАТРОННЫХ И
РОБОТОТЕХНИЧЕСКИХ СИСТЕМ
Методические указания
по выполнению лабораторных работ
Санкт-Петербург
2016
Составители: кандидат технических наук, доцент С. В. Соленый,
кандидат технических наук, доцент О. Я. Соленая
Рецензент – кандидат технических наук, доцент М. А. Волохов
Методические указания содержат рекомендации к выполнению
лабораторных работ по программному обеспечению мехатронных и
робототехнических систем на базе контроллерa ATmega 328 и правила техники безопасности при проведении работ. Предназначена для
студентов очной формы обучения направления подготовки 15.03.06
«Мехатроника и робототехника», изучающих курс «Программное
обеспечение мехатронных и робототехнических систем», а также может быть полезна студентам вечернего отделения соответствующего
направления подготовки.
Подготовлено к публикации кафедрой «Технической физики,
электромеханики и робототехники» по рекомендации методической
комиссии института инновационных технологий в электромеханике
и энергетике. В написании отдельных частей методических указаний
к лабораторным работам принимали участие студенты кафедры технической физики, электромеханики и робототехники: Казаков А. И,
Цыбульская Ю.В, Ковалев А.Д, Иванов Д.Р.
Публикуется в авторской редакции.
Компьютерная верстка М. И. Дударева
Подписано к печати 12.04.16. Формат 60 × 84 1/16.
Бумага офсетная. Усл. печ. л. 4,1. Тираж 50 экз. Заказ № 166.
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
© Санкт-Петербургский государственный
университет аэрокосмического
приборостроения, 2016
Правила безопасности для студентов, выполняющих
лабораторные работы по дисциплине «Программное обеспечение
мехатронных и робототехнических систем»
1. Приступать к работе можно только после ознакомления с рабочим местом (платой Arduino, набором вспомогательных элементов (резисторы, конденсаторы, соединительные провода и др.),
цифровым осциллографом, мультиметром).
2. Перед сборкой схемы убедиться в том, что плата Arduino отключена от источника питания (блок питания, персональный компьютер (USB), угольная батарейка).
3. Перед включением схемы убедиться в том, что вся включенная в схему коммутационная аппаратура (кнопки и др.) находится
в исходном положении.
4. При включении и в процессе регулирования следить за показаниями основных измерительных приборов (цифровой осциллограф, мультиметр и др.) исследуемой схемы.
5. В процессе работы не оставлять без присмотра рабочее место,
которое находится под напряжением.
6. Не касаться неизолированных частей приборов и аппаратов,
которые находятся под напряжением.
3
Правила внутреннего распорядка при выполнении лабораторных
работ по дисциплине «Программное обеспечение мехатронных
и робототехнических систем»
1. К лабораторным работам допускаются только те студенты, которые усвоили правила безопасности.
2. Лабораторные работы выполняются бригадой студентов в составе не менее двух человек.
3. Каждый студент должен подготовиться к лабораторной работе. При недостаточной подготовке студент не допускается к ее выполнению.
5. Собранная схема и написанная программа должна быть проверена преподавателем, который после проверки дает разрешение
на проведение опытов.
6. Перед включением схемы студент, производящий данную
операцию, должен предупредить об этом членов своей бригады фразой «Начинаем эксперимент».
7. После включения схемы без записи показаний приборов проверяется возможность выполнения лабораторной работы во всем
заданном диапазоне изменения характеристик и показаний. Только после этого приступают к работе.
8. Результаты измерений по каждой характеристике должны
быть проверены преподавателем.
9. Все переключения в схеме и ее окончательная разборка делается только с разрешения преподавателя. В случае неверности полученных данных работа переделывается заново.
10. После переключения схема должна быть проверена преподавателем.
11. В случае возникновения аварийной ситуации (появление
дыма, запаха гари, несвойственных звуков, искры и др.) на рабочем месте необходимо немедленно отключить схему от напряжения
и сообщить об этом событии преподавателю без любых изменений
в схеме. Вместе с преподавателем надо найти причину аварии и
устранить ее.
12. Студент должен бережно обращаться с предоставляемым ему
оборудованием и компьютерной техникой. Запрещается делать надписи мелом, карандашом или чернилами. Нельзя загромождать рабочее место приборами и аппаратами, которые не используются в лабораторной работе, класть на них книги, тетради и др. предметы.
13. К следующему занятию каждый студент должен составить
отчет по предыдущей лабораторной работе в соответствии с установленной формой.
4
Правила оформления отчета по лабораторной работе
Результаты выполненных лабораторных работ оформляются
в виде отчета по одному образцу. Отчет составляют с одной стороны
листа формата А4 (размером 210×297 мм). Основные надписи выполняют в соответствии с Госстандартом.
На первой странице делают основную надпись с указанием названия работы, как для первого листа текстовых документов, на других
– как для последующих страниц. В отчете обязательно должны быть
отражены следующие разделы: «Цель работы», «Содержание работы», «Схемы испытаний», «Результаты измерений и вычислений»,
«Анализ полученных характеристик и краткие выводы». В состав
отчета могут быть включены другие разделы, которые учитывают
специфику выполняемой лабораторной работы (фото экспериментов, программный код и др.). Необходимые схемы, рисунки и графики можно чертить карандашом либо с использованием специальных
программных продуктов на персональном компьютере.
Разрешается следующее оформление первой страницы отчета
по лабораторной работе: в верхней части бланка указывается но3321
Отчет по лабораторной работе № 1
Сидоров С. С.
Исследование электромагнита при кратковременном и
повторно-кратковременном режимах работы
1. Цель работы
Изучить конструкцию электромагнита, его паспорт, научиться снимать характеристику нагрева и охлаждения катушки электромагнита при кратковременном
и повторно-кратковременном режимах работы.
2. Оборудование и приборы (блоки)
Трехфазный источник питания (201.4), однофазный источник питания (218.9),
регулируемый автотрансформатор (318.2), однофазный трансформатор (372),
выпрямитель (322), блок испытания электрических аппаратов (382), блок мультиметров (508.3.1).
3. Содержание работы
3.1. Изучить конструкцию и паспорт электромагнита.
3.2. Снять кривую нагрева и охлаждения катушки электромагнита при кратковременном и повторно-кратковременном режимах работы.
3.3. Построить график зависимости изменения температуры во времени при нагревании и охлаждении в двух режимах работы электромагнита Т = f(t).
Разработал
Сидиров С. С.
Лист
Проверил
Соленая О. Я.
1
Подпись
Дата
Листов
Рис. 0.1. Образец оформления первого листа отчета
по лабораторной работе
5
Федеральное государственное автономное образовательное
учреждение высшего образования
Санкт-Петербургский государственный университет
аэрокосмического приборостроения
Кафедра «Технической физики,
электромеханики и робототехники»
ЖУРНАЛ
ЛАБОРАТОРНЫХ РАБОТ
(ОТЧЕТЫ)
Выполнил:
ст. гр. 3321 Сидоров С.С.
Проверил:
доц., к.т.н. Соленая О.Я.
2016
Санкт-Петербург
Рис. 0.2. Образец оформления титульного листа
мер или название работы, группа, фамилия и инициалы студента,
а в нижней части – фамилия, инициалы преподавателя и студента,
их подписи и дата выполнения работы, как показано на рис. 0.1.
Все выполненные и подписанные руководителем отчеты по лабораторным работам складывают в логической последовательности
и брошюруют. При большом количестве страниц (более десяти) составляют содержание отчета, который размещают в альбоме после
титульного листа. Титульный лист должен иметь надпись: «Журнал лабораторных работ (отчеты)» с фамилией руководителя (преподаватель) и исполнителя (студент) (рис. 0.2).
6
Подготовка к работе с программным обеспечением для
контроллера Arduino в операционной системе Windows
Сперва необходимо установить на персональный компьютер интегрированную среду разработки no – Arduino IDE, которая скачивается с официального сайта: https://www.arduino.cc/en/Main/
Donate. В процессе инсталляции будет проведена установка всех
необходимых драйверов и программного окружения.
После установки необходимо запустить программное обеспечение, после чего появится окно Arduino IDE (рис. 0.3). Даже
без подключенной платы Arduino к персональному компьютеру
в правом нижнем углу появится надпись «Arduino on COM1». Таким образом, Arduino IDE сообщает о том, что в данный момент
она настроена на работу с целевой платой Arduino на порту COM1.
В процессе выполнения экспериментов данная настройка может
изменяться.
Подключение Arduino к персональному компьютеру производится при помощи USB-кабеля. После подключения на плате загорится светодиод «ON», и начнёт мигать светодиод «L» (рис. 0.4).
Это означает, что на плату подано питание и микроконтроллер
Arduino начал выполнять прошитую на заводе программу «Blink»
(мигание светодиодом).
Для того, чтобы настроить Arduino IDE на работу с Arduino, необходимо узнать, какой номер COM-порта присвоил персональный
Рис. 0.3. Первый запуск Arduino IDE
7
Рис. 0.4. Включение светодиода «ON» и мигание светодиода «L»
компьютер плате Arduino. Для этого нужно зайти в «Диспетчер
устройств» Windows и раскрыть вкладку «Порты (COM и LPT)», где
будет обозначено, на каком COM-порту распознана плата (рис. 0.5).
Данный параметр весьма важен, т.к. непосредственно влияет на работоспособность платы.
При подключении второй платы Arduino операционная система Windows назначит ей другой COM-порт. Т.о., если в работе
несколько плат, необходимо зафиксировать номера всех COMпортов.
Рис. 0.5. Распознавание платы Arduino в диспетчере устройств
персонального компьютера
8
Далее необходимо настроить Arduino IDE на работу с Arduino,
для чего необходимо сообщить Arduino IDE, что плата, с которой
ей предстоит общаться, находится на требуемом COM-порту. Для
этого нужно перейти в меню «Сервис» → «Последовательный порт»
и выбрать требуемый порт (рис. 0.6).
Также необходимо указать, какой тип платы будет использоваться. Для этого переходим в меню «Сервис» → «Плата» и выбираем «Arduino» (рис. 0.7).
Рис. 0.6. Выбор требуемого COM-порта
Рис. 0.7. Выбор требуемой платы
9
Рис. 0.8. Выбор из памяти Arduino примера «Blink»
Рис. 0.9. Загрузка примера «Blink» в плату Arduino
Для первой загрузки программы на плату можно использовать
готовые примеры, которые содержатся в памяти Arduino. В частности, можно использовать пример «Blink» (рис. 0.8).
Далее появившийся программный код необходимо загрузить на
плату Arduino (рис. 0.9). При этом светодиод «L» (рис. 0.4) начнет
загораться и гаснуть.
10
Лабораторная работа № 1
ИССЛЕДОВАНИЕ ЛОГИЧЕСКИХ И ШИРОТНО-ИМПУЛЬСНЫХ
ВЫХОДОВ МИКРОКОНТРОЛЛЕРА
Цель работы – изучить способы конфигурации пинов микроконтроллера в режим выхода как логического, так и широтно-импульсного (ШИМ), а также проработать конструкцию светодиодов
и особенности их эксплуатации.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Светодиод
АЛ307
Активный резистор
220 Ом; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200
точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 1.1 и рис. 1.2).
2. Написать программы: для принципиальной схемы (рис. 1.1) –
программа 1.1; для принципиальной схемы (рис. 1.2) – программа
1.2. Проверить их путем проведения компиляции программ.
11
пин 9
пин 13
220 Ом
220 Ом
АЛ307
АЛ307
Рис. 1.1. Исследование логических
выходов микроконтроллера
Рис. 1.2. Исследование ШИМ
выходов микроконтроллера
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 1.1 и 1.2
на плату.
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 1.1 и рис. 1.2).
Программа 1.1
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(900);
}
Программа 1.2
#define LED_PIN 9
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
analogWrite(LED_PIN, 85);
delay(250);
analogWrite(LED_PIN, 170);
delay(250);
analogWrite(LED_PIN, 255);
delay(250);
}
Пояснения к лабораторной работе
Очень важно помнить, как соединяются рельсы в breadboard (рис.
1.2, б). Если на breadboard красная и синяя линии вдоль длинных
12
рельс прерываются в середине, значит проводник внутри тоже прерывается. «Минус» светодиода – почти всегда короткая ножка, именно
её нужно соединять с землёй (GND). Также не стоит пренебрегать резистором, т.к. контроллер и светодиод могут выйти из строя. Выбрать
резистор нужного номинала можно с помощью таблиц маркировки
(можно найти в интернете) или с помощью мультиметра в режиме измерения сопротивления. Плата Arduino имеет три равносильных пина GND, т.о. можно использовать любой из них.
Процедура setup выполняется один раз при запуске микроконтроллера, зачастую она используется для конфигурации портов
микроконтроллера и других настроек. После ее выполнения запускается процедура loop, которая выполняется в бесконечном цикле.
Эти две процедуры должны присутствовать в любом программном
коде, даже без внутренних команд.
Для каждой открывающей фигурной скобки { всегда должна существовать закрывающая скобка }, они обозначают границы логически завершенного элемента кода. В конце каждой команды необходимо ставить ;.
Функция digitalWrite (pin, value) не возвращает никакого значения и может принимать два параметра: pin – номер цифрового
порта, на который отправляем сигнал; value – значение, которое
посылается на порт. Для цифровых портов значением может быть
HIGE (высокое, т.е. логическая единица 5 В) или LOW (низкое, т.е.
логический ноль 0 В). Если в качестве второго параметра передать
в функцию digitalWrite значение, отличное от HIGE или LOW, то
компилятор может не выдать ошибку, но считать, что передано
значение HIGE.
Все используемые константы необходимо писать заглавными
буквами INPUT, OUTPUT, LOW, HIGH. В противном случае компилятор выдаст ошибку. Когда ключевое слово распознано, оно
подсвечивается синим цветом в программном обеспечении Arduino
IDE.
При работе с ШИМ сигналами необходимо обратить внимание,
что не любой порт Arduino ее поддерживает, поэтому для изменения величины выходного напряжения можно использовать пины,
помеченные символом тильда «~» – это пины 3, 5, 6, 9, 10, 11.
При написании программ можно использовать идентификаторы переменных, констант и функций. Например, LED_PIN должен
быть одним словом, т.е. нельзя написать идентификатор LED PIN.
Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания, при этом идентификатор не может начинаться
13
с цифры. Регистр букв в идентификаторе также имеет значение.
Создаваемые идентификаторы не должны совпадать с предопределенными идентификаторами и стандартными конструкциями
языка С++. Т.о., если среда разработки подсвечивает введенный
идентификатор каким-либо цветом, необходимо заменить его на
другой. Названия идентификаторов всегда нужно делать осмысленными, чтобы при возвращении к ранее написанному коду было
ясно, зачем нужен каждый из них.
Директива #define сообщает компилятору заменить все вхождения заданного идентификатора на значение, заданное после пробела. Эти директивы нужно помещать в начало кода, в конце данной
директивы точка с запятой не ставится.
Полезно снабжать код программы комментариями, которые могут быть как однострочными // так и двухстрочными /**/. Комментарии игнорируются компилятором, но при этом весьма полезны
при чтении давно написанного и особенно чужого кода программы.
Функция analogWrite (pin, value) не возвращает никакого значения и принимает два параметра: pin – номер порта, на который
мы отправляем сигнал; value – значение скважности ШИМ сигнала, которое отправляется на порт, – может принимать целочисленное значение от 0 до 255, где 0 – это 0 %, а 255 – это 100 %.
Контрольные вопросы
1. Что произойдет, если подключить к земле анод светодиода
вместо катода?
2. Что произойдет, если подключить светодиод с резистором
большого номинала?
3. Что произойдет, если подключить светодиод без резистора?
4. Зачем нужна встроенная функция pinMode и какие параметры она принимает?
5. Зачем нужна встроенная функция digitalWrite и какие параметры она принимает?
6. С помощью какой встроенной функции можно заставить микроконтроллер не выполнять команды?
7. В каких единицах задается длительность паузы?
8. Какие из следующих идентификаторов корректны и не приведут к ошибкам: 13pin, MOTOR_1, контакт_светодиода, sensor
value, leftServo, my-var, distance_eval2?
9. Что произойдет, если создать директиву #define HIGH LOW?
10. Почему невозможно регулировать яркость светодиода, подключенного к порту без значка «~»?
14
11. Какое усреднённое напряжение получается на «пине» 6, если вызвать функцию analogWrite (6, 153)?
12. Какое значение параметра value нужно передать функции
analogWrite, чтобы получить усреднённое напряжение 2 В?
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
15
Лабораторная работа № 2
РАБОТА С АНАЛОГОВЫМИ ВХОДАМИ.
АНАЛОГОВЫЕ ДАТЧИКИ
Цель работы – научиться формировать аналоговый сигнал на
выходе микроконтроллера с последующей обработкой по заданному
алгоритму.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Светодиод
АЛ307
Фоторезистор
VT90N2
Пьезоизлучатель звука
HPA17A
Переменный активный
резистор
1 кОм; 0,125 Вт
Активный резистор
220 Ом; 0,125 Вт
Активный резистор
10 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения
работы.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 2.1, рис. 2.2 и рис. 2.3).
16
2. Написать программы: для принципиальной схемы (рис. 2.1) –
программа 2.1; для принципиальной схемы (рис. 2.2) – программа
2.2; для принципиальной схемы (рис. 2.3) – программа 2.3. Проверить их путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 2.1,
2.2, 2.3 на плату.
+5V
1 кОм
АЛ307
пин A0
пин-9
220 Ом
Рис. 2.1. Исследование аналогового датчика
+5V
10 кОм
пин A0
пин 3
VT90N2
HPA17A
Рис. 2.2. Исследование фоторезисторного датчика
+5V
пин A1
VT90N2
1 кОм
пин A0
+5V
АЛ307
10 кОм
пин 13
220 Ом
Рис. 2.3. Исследование принципов сравнения аналоговых сигналов
17
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 2.1, рис. 2.2 и
рис. 2.3).
Программа 2.1
#define LED_PIN 9
#define POT_PIN A0
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
}
void loop() {
int rotation, brightness;
rotation = analogRead(POT_PIN);
brightness = rotation / 4;
analogWrite(LED_PIN, brightness);
}
Программа 2.2
#define BUZZER_PIN 3
#define LDR_PIN A0
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
int val, frequency;
val = analogRead(LDR_PIN);
frequency = map(val, 0, 1023, 500, 2000);
tone(BUZZER_PIN, frequency, 20);
}
Программа 2.3
#define LED_PIN 13
#define LDR_PIN A0
#define POT_PIN A1
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int lightness = analogRead(LDR_PIN);
int threshold = analogRead(POT_PIN);
boolean tooDark = (lightness < threshold);
18
if (tooDark) {
digitalWrite(LED_PIN, HIGH);
}else {
digitalWrite(LED_PIN, LOW);
}
}
Пояснения к лабораторной работе
Подключим «землю» светодиода и переменного резистора (потенциометра) к длинному рельсу «-» макетной платы, соединим ее
с входом GND микроконтроллера. Т.о. используется меньше входов и от макетной платы к контроллеру тянется меньше проводов.
Подписи «+» и «-» на макетной плате не обязывают использовать их строго для питания – чаще всего они используются именно
так и наличие такой маркировка будет удобно для сборки схем.
Не важно, какая из крайних ножек переменного резистора будет подключена к 5 В, а какая к GND, – поменяется только направление, в котором нужно будет крутить ручку для изменения напряжения. Сигнал считывается со средней ножки.
Для считывания аналогового сигнала, принимающего широкий
спектр значений, а не просто 0 или 1, как цифровой, подходят только порты, помеченные на плате как «ANALOG IN» и пронумерованные с префиксом А. Для Arduino это A0-A5.
С помощью директивы #define поступает команда компилятору заменять идентификатор POT_PIN нa A0 (номер аналогового
входа). Можно встретить код, где обращение к аналоговому порту
будет по номеру без индекса А. Такой код будет работать, но во избежание путаницы с цифровыми портами нужно использовать индекс.
Переменным принято давать названия, начинающиеся со строчной буквы. Для объявления переменной необходимо указать ее тип –
int (от англ. integer) – целочисленное значение в диапазоне от –32768
до 32767.
Чтобы использовать переменную, необходимо ее объявить при
помощи инструкции: int rotation, brightness. Переменные одного
типа можно объявить в одной инструкции, перечислив их через запятую.
Функция analogRead(pinA) возвращает целочисленное значение
в диапазоне от 0 до 1023, которое пропорционально напряжению,
поданному на аналоговый вход, номер которого передается функции в качестве параметра pinA.
19
Значение, возвращенное функцией analogRead(), помещается
в переменную rotation с помощью оператора присваивания =, который записывает то, что находится справа от него в ту переменную,
которая стоит слева.
Полярность фоторезистора, как и обычного резистора, не играет
роли. Его можно устанавливать любой стороной.
В данной лабораторной работе используется простой вариант
схемы включения пьезоизлучателя. Полярность пьезоизлучателя
роли не играет, можно подключать любую из его ножек к земле и
любую к порту микроконтроллера.
В Arduino использование функции tone мешает использованию
ШИМ на соответствующих портах, однако можно подключить ее
к одному из них.
Функция map(value, fromLow, fromHigh, toLow, toHigh) возвращает целочисленное значение из интервала [toLow, toHigh], которое является пропорциональным отображением содержимого value
из интервала [fromLow, fromHigh].
Верхние границы map не обязательно должны быть больше нижних и могут быть отрицательными. К примеру, значение из интервала [1, 10] можно отобразить в интервал [10,-5].
Если при вычислении значения map образуется дробное значение, оно будет отброшено, а не округлено.
Функция map не будет отбрасывать значения за пределами указанных диапазонов, а также масштабирует их по заданному правилу.
Если необходимо ограничить множество допустимых значений,
используйте функцию constrain(value, from, to), которая вернет
value, если это значение попадает в диапазон [from, to]: from – если
value меньше диапазона, to – если value больше диапазона.
Функция tone(pin, frequency, duration) заставляет пьезоизлучатель, подключенный к порту pin, издавать звук частотой frequency
на протяжении duration миллисекунд.
Параметр duration не является обязательным. Если его не передать, звук включится навсегда. Чтобы его выключить, понадобится функция noTone(pin). Ей нужно передать номер порта с пьезоизлучателем, который нужно выключить.
Одновременно можно управлять только одним пьезоизлучателем. Если во время звучания вызвать tone для другого порта, ничего не произойдет. Вызов tone для уже звучащего порта обновит
частоту и длительность звучания.
Необходимо разместить компоненты так, чтобы светодиод не засвечивал фоторезистор.
20
Тип переменных boolean хранят только значения true (истина,
1) или false (ложь, 0). Эти значения являются результатом вычисления логических выражений. В данной лабораторной работе логическое выражение lightness < threshold. Это означает, что освещенность ниже порогового уровня будет истиной. Микроконтроллер
может сравнить значения переменных lightness и threshold, которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения.
Это логическое выражение взято в скобки только для наглядности.
Всегда лучше писать читабельный код. В других случаях скобки могут влиять на порядок действий, как в обычной арифметике.
В лабораторной работе логическое выражение будет истинным,
когда значение lightness меньше значения threshold, потому что
используется оператор <. Также можно использовать операторы >,
<=, >=, ==, !=, которые означают «больше», «меньше или равно»,
«больше или равно», «равно», «не равно» соответственно.
Необходимо быть внимательным с логическим оператором == и
не путать его с оператором присваивания =. В первом случае сравнивается значения выражений и получается логическое значение
(истина или ложь), а во втором случае присваивается левому операнду значение правого. Компилятор не знает намерений программиста и ошибку не выдаст, при этом можно случайно изменить значение какой-нибудь переменной и затем долго искать ошибку.
Условный оператор if (если) – один из ключевых в большинстве
языков программирования. С его помощью можно выполнять не
только жестко заданную последовательность действий, но принимать решения, по какой ветви алгоритма идти в зависимости от
конкретных условий.
У логического выражения lightness < threshold есть значение true
или false. После вычисления его значение помещается в булевую
переменную tooDark (слишком темно). Т.о., принимается условие:
если слишком темно, то включить светодиод.
Также можно сказать, что если освещенность меньше порогового уровня, то включить светодиод, т.е. передать в if всё логическое
выражение:
if (lightness < threshold) {
// ...
}
За условным оператором if обязательно следует блок кода, который выполняется в случае истинности логического выражения.
Нужно не забывать про обе фигурные скобки {}.
21
Если в случае истинности выражения нужно выполнить только
одну инструкцию, ее можно написать сразу после if (…) без фигурных скобок:
if (lightness < threshold)
digitalWrite(LED_PIN, HIGH);
Оператор if может быть расширен функцией else (иначе). Блок
кода, следующий за ней, будет выполнен только если логическое
выражение в if имеет значение false (ложь). Правила, касающиеся
фигурных скобок, такие же.
В лабораторной работе выполняется следующий алгоритм: если
слишком темно, включить светодиод, иначе выключить светодиод.
Контрольные вопросы
1. Каким сопротивлением должен обладать фоторезистор, чтобы
на аналоговый вход было подано напряжение 1 В?
2. Можно ли регулировать яркость светодиода, подключенного
к 11-му порту, во время звучания пьезоизлучателя?
3. Что изменится, если заменить резистор 10 кОм на 100 кОм?
4. Каков будет результат вызова map(30,0,90,90,-90)?
5. Как будет работать вызов tone без указания длительности
звучания?
6. Можно ли устроить полифоническое звучание с помощью
функции tone?
7. Можно ли подключить светодиод и потенциометр напрямую
к разным входам GND микроконтроллера?
8. В какую сторону нужно крутить переменный резистор для
увеличения яркости светодиода?
9. Что будет, если стереть из программы строчку pinMode(LED_
PIN, OUTPUT) и строчку pinMode(POT_PIN, INPUT)?
10. Зачем делить значение, полученное с аналогового входа, перед тем, как задать яркость светодиода? Что будет, если этого не
сделать?
11. Почему если установить фоторезистор между аналоговым
входом и землей, устройство будет работать наоборот – светодиод
будет включаться при увеличении количества света?
12. Какой результат работы устройства, если свет от светодиода
будет падать на фоторезистор?
13. Есть код if (условие) {действие;}. В каких случаях будет выполнено действие?
14. При каких значениях y выражение x+y>0 будет истинным,
если x>0?
22
15. Обязательно ли указывать, какие инструкции выполнять,
если условие в операторе if ложно?
16. Чем отличается оператор == от оператора =?
17. Использование конструкции if (условие) действие 1; else действие 2;. Может ли быть ситуация, когда ни одно из действий не
выполнится? Почему?
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
23
Лабораторная работа № 3
УПРАВЛЕНИЕ ПОРТАМИ МИКРОКОНТРОЛЛЕРА. СПОСОБЫ
УСИЛЕНИЯ ТОКА
Цель работы – изучить способы управления светодиодной сборкой с помощью цифровых портов. Изучить способы транзисторного
усиления тока.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Биполярный транзистор
BC337-16
Светодиодная шкала
ВС-10EWA
Активный резистор
220 Ом; 0,125 Вт
Активный резистор
1 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 3.1 и рис. 3.2).
2. Написать программы: для принципиальной схемы (рис. 3.1) –
программа 3.1; для принципиальной схемы (рис. 3.2) – программа
3.2. Проверить их путем проведения компиляции программ.
24
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 3.1,
3.2 на плату.
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 3.1 и
рис. 3.2).
+5 V
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
пин - 9
1 кОм
BC 337 - 16
Рис. 3.1. Исследование принципов усиления тока
25
DC-10EWA
пин 2
220 Ом
пин 3
220 Ом
пин 4
220 Ом
пин 5
220 Ом
пин 6
220 Ом
пин 7
220 Ом
пин 8
220 Ом
пин 9
220 Ом
пин 10
220 Ом
пин 11
220 Ом
Рис. 3.2. Исследование способов управления пинами
микроконтроллера
Программа 3.1
#define CONTROL_PIN 9
int brightness = 0;
void setup() {
pinMode(CONTROL_PIN, OUTPUT);
}
void loop() {
brightness = (brightness + 1) % 256;
26
analogWrite(CONTROL_PIN, brightness);
delay(5);
}
Программа 3.2
#define FIST_LED_PIN 2
#define LAST_LED_PIN 11
void setup() {
for (int pin = FIST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop() {
unsigned long int ms = millis();
int pin = FIST_LED_PIN + (ms / 120) % 10;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}
Пояснения к лабораторной работе
Светодиодная сборка – это несколько светодиодов в одном корпусе.
Если собрать схему без резистора между базой транзистора и
портом Arduino, то будет короткое замыкание порта на землю. Впоследствии это выведет из строя транзистор или ножку микроконтроллера.
Без транзистора такое количество светодиодов будет потреблять
ток более чем 40 мА, что превышает параметры микроконтроллера. Поэтому берется питание от порта 5V, рассчитанного на ток до
500 мА, а на цифровой порт ставится транзистор, чтобы с помощью
малого тока управлять большим.
В данном случае включается 10 светодиодов параллельно, каждый через отдельный резистор. Включать их через один резистор
неправильно: даже светодиоды из одной партии имеют минимальный разброс вольт-амперных характеристик, вследствие чего они
могут светиться с различной яркостью.
Из-за минимальной разницы во времени включения больший
ток, прошедший через первый включившийся светодиод, может
вывести его из строя и так далее по цепочке.
Функция analogWrite(pin, value) в качестве value принимает
значения от 0 до 255. Если передать значение из пределов этого
диапазона функция сработает, но в общем случае получится неожиданный результат.
27
Оператор X % Y дает остаток от деления X на Y. Если X меньше
Y, т.е. целая часть результата деления равна 0, оператор % будет
возвращать X. Т.о., пока brightness + 1 меньше 256, в brightness
записывается значение brightness + 1, как только brightness + 1
принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала.
Оператор % работает только с целыми операндами.
В выражении (brightness + 1) % 256 скобки используются для назначения порядка действий. Операция % имеет больший приоритет,
чем +, а сложение нужно выполнять раньше. С операциями умножения и деления оператор взятия остатка имеет одинаковый приоритет.
Светодиоды подключаются к цифровым портам, начиная с порта 2. Можно использовать порты 0 и 1, но они являются каналами
передачи данных последовательного порта и для каждой прошивки
платы придется отключать устройства, подключенные к ним.
В данной лабораторной работе для настройки портов на выход
с помощью выражения for организуется цикл со счетчиком. Чтобы
сделать такой цикл, нужно: инициализировать переменную-счетчик, присвоив ей первоначальное значение int pin = FIRST_LED_
PIN; указать условие, до достижения которого будет повторяться
цикл pin <= LAST_LED_PIN; определить правило, по которому будет изменяться счетчик ++pin.
Например, можно сделать цикл for (int i = 10; i > 0; i = i - 1).
В этом случае переменной i присваивается значение 10 – это значение удовлетворяет условию i > 0. Поэтому блок кода, помещенный
в цикл, выполняется первый раз. Значение i уменьшается на единицу согласно заданному правилу и принимает значение 9. Блок
кода выполняется второй раз. Всё повторяется снова и снова вплоть
до значения i = 0. Когда i станет равно 0, условие i > 0 не выполнится, и выполнение цикла закончится. Контроллер перейдет к коду,
следующему за циклом for.
Необходимо помещать код, который нужно зациклить, между
парой фигурных скобок {}, если в нем больше одной инструкции.
Переменная-счетчик, объявляемая в операторе for, может использоваться внутри цикла. Например, в данной лабораторной работе pin последовательно принимает значения от 2 до 11 и, будучи
переданным в pinMode, позволяет настроить 10 портов одной строкой, помещенной в цикл.
Переменные-счетчики видны только внутри цикла, т.е. если обратиться к pin до или после цикла, компилятор выдаст ошибку о
необъявленной переменной.
28
Конструкция i = i – 1 не является уравнением. Оператор присваивания = используется для того, чтобы в переменную i поместить
значение, равное текущему значению i, уменьшенному на 1.
Выражение ++pin, является оператором инкремента, примененным к переменной pin. Эта инструкция даст тот же результат,
что pin = pin + 1.
Аналогично инкременту работает оператор декремента --, уменьшающий значение на единицу.
Тип данных unsigned int используют для хранения целых чисел
без знака, т.е. только неотрицательных. За счет лишнего бита, который теперь не используется для хранения знака, можно хранить
в переменной такого типа значения до 65535.
Функция millis возвращает количество миллисекунд, прошедших с момента включения или перезагрузки микроконтроллера.
Она используется для отсчета времени между переключениями светодиодов.
С помощью выражения (ms / 120) % 10 определяется, какой из
10 светодиодов должен гореть сейчас, т.е. какой отрезок длиной
в 120 мс идет сейчас и каков его номер внутри текущего десятка.
Далее происходит добавление порядкового номера отрезка к номеру того порта, который в текущем наборе выступает первым.
Выключение светодиода с помощью digitalWrite(pin, LOW) всего через 10 мс после включения не заметно глазу, т.к. очень скоро
будет вновь вычислено, какой из светодиодов включать, и он будет
включен – только что погашенный или следующий.
Контрольные вопросы
1. Почему у светодиодной сборки на 10 сегментов 20 ножек?
2. Зачем в схеме нужен биполярный транзистор?
3. За счет чего увеличивается яркость шкалы?
4. Почему после достижения значения 255 переменная brightness
обнуляется?
5. Почему в данном эксперименте при подключении светодиодной сборки не используя транзистор?
6. Если включить светодиоды только на портах 5, 6, 7, 8, 9, что
нужно изменить в программе?
7. С помощью какой инструкции можно выполнить действие,
эквивалентное ++pin?
8. В чем разница между переменными типов int и unsigned int?
9. Что возвращает функция millis()?
10. Как вычисляется номер порта, на котором нужно включить
светодиод?
29
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
30
Лабораторная работа № 4
ИССЛЕДОВАНИЕ КНОПОЧНОГО УПРАВЛЕНИЯ. БОРЬБА
С ДРЕБЕЗГОМ КОНТАКТОВ
Цель работы – изучить способы подключения кнопок к микроконтроллерам, изучить способ подключения подтягивающих и стягивающих резисторов.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Тактовая кнопка
0650HIM-130G-G
Светодиод
АЛ307
Пьезоизлучатель звука
HPA17A
Активный резистор
220 Ом; 0,125 Вт
Активный резистор
10 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 4.1, рис. 4.2 и рис. 4.3).
2. Написать программы: для принципиальной схемы (рис. 4.1) –
программа 4.1; для принципиальной схемы (рис. 4.2) – программа
31
4.2; для принципиальной схемы (рис. 4.3) – программа 4.3. Проверить их путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 4.1,
4.2, 4.3 на плату.
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 4.1, рис. 4.2 и
рис. 4.3).
+5V
+5V
10 кОм
Кнопка 1
0650HIM130G-G
10 кОм
Кнопка 2
0650HIM130G-G
пин 7
+5V
пин 8
пин 13
10 кОм
Кнопка 3
0650HIM130G-G
HPA17A
пин 9
Рис. 4.1. Исследование кнопочного управления
с подтягивающими резисторами
АЛ307
0650HIM130G-G
пин 3
пин –9
220 Ом
Рис. 4.2. Исследование кнопочного управления с внутренними
подтягивающими резисторами
32
Кнопка «–»
Кнопка «+»
0650HIM130G-G
пин 2
0650HIM130G-G
пин 3
АЛ307
пин –9
220 Ом
Рис. 4.3. Исследование способов борьбы
с дребезгом контактов в кнопках
Программа 4.1
#define BUZZER_PIN 13
#define FIRST_KEY_PIN 7
#define KEY_COUNT 3
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
for (int i = 0; i < KEY_COUNT; ++i) {
int keyPin = i + FIRST_KEY_PIN;
boolean keyUp = digitalRead(keyPin);
if (!keyUp){
int frequency = 3500 + i *500;
tone(BUZZER_PIN, frequency, 20);
}
}
}
Программа 4.2
#define BUTTON_PIN 3
#define LED_PIN 13
boolean buttonWasUp = true;
boolean ledEnabled = false;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
33
void loop() {
boolean buttonIsUp = digitalRead(BUTTON_PIN);
if (buttonWasUp && !buttonIsUp){
delay(10);
buttonIsUp = digitalRead(BUTTON_PIN);
if (!buttonIsUp){
ledEnabled = !ledEnabled;
digitalWrite(LED_PIN, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}
Программа 4.3
#define PLUS_BUTTON_PIN 2
#define MINUS_BUTTON_PIN 3
#define LED_PIN 9
int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
analogWrite(LED_PIN, brightness);
plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35);
minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35);
}
boolean handleClick(int buttonPin, boolean wasUp, int delta)
{
boolean isUp = digitalRead(buttonPin);
if (wasUp && !isUp){
delay(10);
isUp = digitalRead(buttonPin);
if (!isUp)
brightness = constrain(brightness + delta, 0, 255);
}
return isUp;
}
34
Пояснения к лабораторной работе
Ножки тактовой кнопки, расположенные с одной стороны, разомкнуты, когда кнопка не нажата. Ножки, расположенные друг
напротив друга на противоположных сторонах breadboard, находятся на одной «рельсе». Воспользовавшись этим, можно расположить резистор с одной стороны breadboard, а провод, подключаемый к пину Arduino, с другой стороны.
В данной лабораторной работе применяется подключение кнопки по схеме с подтягивающим резистором. Для того, чтобы данный
вариант программы работал верно, важно, чтобы кнопки были подключены к пинам, находящимся рядом друг с другом, т.е. имеющим соседние номера.
Благодаря тому, что в начале программы определено значение
FIRST_KEY_PIN и KEY_COUNT, можно подключать произвольное
количество кнопок к любым идущим друг за другом цифровым пинам
и для корректировки программы не придется менять параметры цикла for. Изменить понадобится лишь эти константы, цикл в любом случае пробегает от 0 до KEY_COUNT; перед считыванием пина задается
смещение на номер первого используемого пина – FIRST_KEY_PIN.
Функция digitalRead(pin) возвращает состояние пина, номер которого передан ей параметром pin. Это может быть состояние HIGH или
LOW, т.е. высокое напряжение или низкое, 1 или 0, true или false.
Поскольку с пина получаем одно из двух состояний и сохраняем его в переменную уже знакомого типа boolean, можем работать
с ней как с логическим значением. Также используется логический
оператор отрицания «не» – !. Если keyUp имеет значение 0, выражение !keyUp будет иметь значение 1 и наоборот.
Поскольку применяется схема с подтягивающим резистором,
при нажатии кнопки будем получать на соответствующем порте 0.
Действия, описанные в условном выражении if, выполняются,
когда его условие имеет значение «истина» (единица). Поэтому для
выполнения действия по нажатию нужно инвертировать сигнал
с кнопки.
Можно один из контактов кнопки соединить проводом напрямую с одним из входов GND, но сначала нужно раздать «землю»
на длинный рельс breadboard. Это удобно, если работать с макетной
платой, т.к. в схеме могут появляться новые элементы, которые тоже нужно будет соединить с «землей».
Руководствуясь соображениями аккуратности изделия, катод
светодиода соединяется с другим входом GND отдельным проводом, который не мешает работать в середине breadboard.
35
Поскольку вход кнопки сконфигурирован как INPUT_PULLUP,
при нажатии на кнопку на данном пине будем получать 0. Поэтому,
когда кнопка отпущена получим значение true («истина») в булевой
переменной buttonIsUp («кнопка отпущена»).
Логический оператор && («и») возвращает значение «истина»
только в случае истинности обоих его операндов. В табл. 4.1 представлены значения истинности для выражения buttonWasUp &&
!buttonIsUp («кнопка была отпущена и кнопка не отпущена»).
В табл. 4.1 рассмотрены все возможные сочетания предыдущего и
текущего состояний кнопки. Видно, что условный оператор if сработает только в случае, когда кнопка нажата только что – предыдущее
состояние 1 «была отпущена», а текущее 0 «не отпущена».
Через 10 миллисекунд еще раз проводится проверка, нажата
ли кнопка: этот интервал больше, чем длительность «дребезга»,
но меньше, чем время, за которое человек успел бы дважды нажать на кнопку. Если кнопка всё еще нажата, значит, это был не
дребезг.
Передаем в digitalWrite не конкретное значение HIGH или
LOW, а просто булевую переменную ledEnabled. В зависимости от
того, какое значение было для нее вычислено, светодиод будет зажигаться или гаснуть.
Последняя инструкция в buttonWasUp = buttonIsUp сохраняет
текущее состояние кнопки в переменную предыдущего состояния,
ведь на следующей итерации loop текущее состояние уже станет неинтересным.
При переделке схемы в схему следующего опыта, важно обратить внимание, что на этот раз нужно подключить светодиод
к пину, поддерживающему ШИМ.
В работе можно пользоваться не только встроенными функциями, но и создавать собственные. Это обоснованно, когда нужно повторять одни и те же действия в разных местах кода или,
Таблица 4.1
Значения истинности для выражения buttonWasUp && !buttonIsUp
buttonWasUp
buttonIsUp
!buttonIsUp
buttonWasUp && !buttonIsUp
0
0
1
0
0
1
0
0
1
0
1
1
1
1
0
0
36
например, нужно выполнять одни и те же действия с разными
данными, как в данном случае: обработать сигнал с цифровых
портов 2 и 3.
Определять собственные функции можно в любом месте кода вне
кода других функций. Найдём функцию после loop. Чтобы установить собственную функцию, нужно объявить, какой тип данных
она будет возвращать. В нашем случае это boolean. Если функция
только выполняет какие-то действия и не возвращает никакого
значения, используйте ключевое слово void.
Идентификатор назначает функции имя. При этом действуют те
же правила, что при назначении имен переменных и констант. Называть функции принято в том же стиле, как и переменные.
В круглых скобках необходимо перечислить передаваемые
в функцию параметры, указав тип каждого. Это является объявлением переменных, видимых внутри вновь создаваемой функции,
и только внутри нее. Например, если в данном опыте попробуем
обратиться к wasUp или isUp из loop(), получим от компилятора
сообщение об ошибке. Точно так же переменные, объявленные
в loop, другим функциям не видны, но их значения можно передать в качестве параметров.
Между парой фигурных скобок необходимо написать код, выполняемый функцией. Если функция должна вернуть какое-то
значение, то с помощью ключевого слова return нужно указать,
какое значение возвращать. Это значение должно быть того типа,
который объявлен.
Так называемые глобальные переменные, т.е. переменные, к которым можно обратиться из любой функции, обычно объявляются
в начале программы. В нашем случае это brightness.
Внутри созданной функции handleClick происходит всё то же самое, что в опыте рис. 4.2.
При шаге прироста яркости 35 не более, чем через восемь нажатий подряд на одну из кнопок значение выражения brightness
+ delta выйдет за пределы интервала [0, 255]. С помощью функции constrain ограничиваем допустимые значения для переменной
brightness указанными границами интервала.
В выражении plusUp = handleClick(PLUS_BUTTON_PIN, plusUp,
+35) обращаемся к переменной plusUp дважды. Поскольку = помещает значение правого операнда в левый, сначала вычисляется, что
вернет handleClick. Поэтому, когда передается plusUp в качестве параметра, переменная имеет еще старое значение, вычисленное при
прошлом вызове handleClick.
37
Внутри handleClick вычисляется новое значение яркости светодиода и записывается в глобальную переменную brightness, которая на каждой итерации loop просто передается в analogWrite.
Контрольные вопросы
1. Почему пины, к которым подключены кнопки, настроены как
INPUT, и при этом схема функционирует адекватно?
2. Каким образом исключено написание отдельного кода для
чтения каждой кнопки?
3. Почему разные частоты, генерируемые пьезоизлучателем звука, звучат с разной громкостью?
4. Для чего используется оператор логического отрицания ! ?
5. В каком случае оператор && возвращает значение «истина»?
6. Что такое дребезг контактов в кнопке? Почему данный режим
нужно исключать? Как с ним бороться в программе?
7. Как можно избежать явного указания значения уровня напряжения при вызове digitalWrite?
8. Что необходимо для определения собственной функции?
9. Что означает ключевое слово void?
10. Как ведет себя программа при упоминании одной переменной с разных сторон от оператора присваивания = ?
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
38
Лабораторная работа № 5
СПОСОБЫ УПРАВЛЕНИЯ ДВИГАТЕЛЬНОЙ НАГРУЗКОЙ
Цель работы – изучить способы управления двигателем постоянного тока. Реализовать режим защиты микроконтроллера от генераторного режима.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Двигатель постоянного тока
FA-130
Полевой транзистор
IRF530
Тактовая кнопка
0650HIM-130G-G
Диод выпрямительный
1N4007
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрическую принципиальную схему (соединений)
лабораторной работы (рис. 5.1).
2. Написать программу для принципиальной схемы (рис. 5.1) – программа 5.1. Проверить ее путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и загрузить программу 5.1 на плату.
39
Кнопка 2
Кнопка 1
0650HIM130G-G
0650HIM130G-G
пин 5
пин 6
Vin
Кнопка 3
Я
FA-130
0650 HIM130 G -G
1N4007
пин 7
пин ~9
IRF530
Рис. 5.1. Исследование способов управления двигательной нагрузкой
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальной схеме (рис. 5.1).
Программа 5.1
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
void setup() {
pinMode(MOTOR_PIN, OUTPUT);
for (int i = 0; i < BUTTON_COUNT; ++i)
pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
for (int i = 0; i < BUTTON_COUNT; ++i){
if (digitalRead(i + FIRST_BUTTON_PIN))
continue;
int speed = i * SPEED_STEP;
analogWrite(MOTOR_PIN, speed);
}
}
40
Пояснения к лабораторной работе
Защитный диод нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не
вывел из строя транзистор.
Важно не перепутать полярность диода, иначе при открытии
транзистора можно устроить короткое замыкание.
Причина отсутствия подтягивающих или стягивающих резисторов в схеме обусловлена командой INPUT_PULLUP.
Питание двигателя постоянного тока берется с пина Vin потому,
что в отличие выхода 5V с него можно получить напряжение, подключенное к плате, без изменений и без ограничений по величине тока.
Использование нового режима работы пинов INPUT_PULLUP
позволило на цифровых пинах Arduino использовать встроенные
подтягивающие резисторы, которые можно включить указанным
образом одновременно с настройкой пина в режим входа. Т.о., можно не использовать резисторы при сборке схемы.
На каждой итерации цикла двигателю задается скорость вращения, пропорциональная текущему значению счетчика. Но выполнение инструкций не дойдет до задачи новой скорости, если при
проверке нажатия кнопки она окажется отпущенной. Инструкция
continue, которая выполнится в этом случае, отменит продолжение
данной итерации цикла, и выполнение программы продолжится со
следующей, а двигатель будет крутиться со скоростью, заданной
при последнем нажатии на какую-то из кнопок.
Контрольные вопросы
1. Зачем в схеме использован выпрямительный диод?
2. Почему использован полевой транзистор, а не биполярный?
3. Почему не использован резистор между пином Arduino и затвором полевого транзистора?
4. Как работает инструкция continue, использованная в цикле for?
В отчете представить
1. Схему для проведения эксперимента.
2. Программный код с комментариями по ходу выполнения программы.
3. Осциллограммы эксперимента.
4. Фото собранной на плате схемы для проведения эксперимента.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
41
Лабораторная работа № 6
РАБОТА С МАССИВАМИ ДАННЫХ
Цель работы – изучить способы работы с массивами данных, научиться создавать массивы пинов.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Светодиод
АЛ307
Пьезоизлучатель звука
HPA17A
Активный резистор
220 Ом; 0,125 Вт
Тактовая кнопка
0650HIM-130G-G
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрическую принципиальную схему (соединений)
лабораторной работы (рис. 6.1).
2. Написать программу для принципиальной схемы (рис. 6.1)
– программа 6.1. Проверить путем проведения компиляции программы.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и загрузить программу 6.1 на плату.
42
Кнопка 1
Кнопка 2
0650HIM-1
30G-G
0650HIM-130
G-G
пин 13
пин 3
АЛ307
пин 11
пин 12
220 Ом
АЛ307
HPA17A
пин 9
220 Ом
Рис. 6.1. Исследование способов работы с массивами данных
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальной схеме (рис. 6.1).
Программа 6.1
#define BUZZER_PIN 12
#define PLAER_COUNT 2
int buttonPins[PLAER_COUNT] = {3, 13};
int ledPins[PLAER_COUNT] = {9, 11};
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
for (int plaer = 0; plaer < PLAER_COUNT; ++plaer) {
pinMode(ledPins[plaer], OUTPUT);
pinMode(buttonPins[plaer], INPUT_PULLUP);
}
}
void loop() {
43
delay(random(2000, 7000));
tone(BUZZER_PIN, 3000, 250);
for (int plaer = 0; ; plaer = (plaer + 1) % PLAER_COUNT) {
if (!digitalRead(buttonPins[plaer])) {
digitalWrite(ledPins[plaer], HIGH);
tone(BUZZER_PIN, 4000, 1000);
delay(1000);
digitalWrite(ledPins[plaer], LOW);
break;
}
}
}
Пояснения к лабораторной работе
Массив состоит из элементов одного типа (в нашем случае int).
Объявить массив можно следующими способами:
– int firstArray[6] – 6 целых чисел с неопределёнными начальными значениями;
– int pwmPins[] = {3, 5, 6, 9, 10, 11} – 6 целых чисел, длина вычисляется автоматически;
– boolean buttonState[3] = {false, true, false} – можно использовать элементы любого типа.
Число всегда на 1 больше, чем номер последнего элемента (n-1),
т.к. индекс первого элемента – 0.
Считать или записать значение элемента массива можно обратившись к нему по индексу, например, firstArray[2] или
buttonState[counter], где counter – переменная (счетчик цикла).
В переменных типа long можно хранить значения до 2147483647.
Значит unsigned int в лабораторной работе будет недостаточно, потому что 65535 миллисекунд пройдут чуть больше, чем за минуту.
Функция random(min, max) возвращает целое псевдослучайное
число в интервале [min, max].
Благодаря массивам можно настраивать порты, считывать
кнопки и включать нагрузки в циклах со счетчиком, который используется как индекс элемента.
Использованный цикл for без условия его завершения не завершится, пока это не потребуется, – он будет крутиться до бесконечности.
Использование для счётчика цикла выражения player =
(player+1) % PLAYER_COUNT позволяет не только увеличивать
его на единицу каждый раз, но и обнулять при необходимости.
44
Инструкция break прекращает работу цикла и выполнение программы продолжается с инструкции после его конца.
Контрольные вопросы
1. Можно ли поместить в один массив элементы типа boolean и int?
2. Обязательно ли при объявлении массива заполнять его значениями?
3. Чем удобно использование массива?
4. Как обратиться к элементу массива, чтобы прочитать его значение?
5. Почему для хранения времени прошлого сигнала мы используем переменную типа long?
6. Чем отличаются инструкции continue и break?
В отчете представить
1. Схему для проведения эксперимента.
2. Программный код с комментариями по ходу выполнения программы.
3. Осциллограммы эксперимента.
4. Фото собранной на плате схемы для проведения эксперимента.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
45
Лабораторная работа № 7
РАБОТА С ЦИФРОВЫМИ ИНДИКАТОРАМИ. СПОСОБЫ
УПРАВЛЕНИЯ ИНДИКАТОРОМ
Цель работы – изучить способы вывода информации на семисегментные индикаторы, освоить выходные сдвиговые регистры.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Тактовая кнопка
0650HIM-130G-G
Семисегментный индикатор
SC56-11
Выходной сдвиговый регистр
74HC595
Активный резистор
220 Ом; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения работы.
4. Отладить работу программы и схемы на макете.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 7.1 и рис. 7.2).
2. Написать программы: для принципиальной схемы (рис. 7.1) –
программа 7.1; для принципиальной схемы (рис. 7.2) – программа
7.2. Проверить их путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 7.1 и
7.2 на плату.
46
SC56-11
1
пин 2
4
пин 3
7
2
пин 4
6
пин 5
7
пин 6
9
10 6
1
2
8
4
5
9
пин 7
10
пин 8
3,8
220 Ом
Все резисторы
Рис. 7.1. Исследование семисегментного индикатора
+5V
16
10
пин 12
пин 12
пин 3
0650HIM130G-G
14 DS
12 STcp
11 SHcp
1
7
Q2 2
6
Q3 3
2
Q4
4
1
Q5
5
4
Q1
MR
74HC595
пин 12
SC56-11
VCC
OE
Q6
6
10
8 GNG
Q7
7
9
13
220 Ом
Все резисторы
7
8
9
10 6
1
2
4
5
3,8
Рис. 7.2. Исследование выходного сдвигового регистра
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 7.1 и рис. 7.2).
Программа 7.1
#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
byte numberSegments[10] = {
47
0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};
void setup() {
for (int i = 0; i < SEGMENT_COUNT; ++i)
pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
}
void loop() {
int number = (millis() / 1000) % 10;
int mask = numberSegments[number];
for (int i = 0; i < SEGMENT_COUNT; ++i) {
boolean enableSegment = bitRead(mask, i);
digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
}
}
Программа 7.2
#define DATA_PIN 13
#define LATCH_PIN 12
#define CLOCK_PIN 11
#define BUTTON_PIN 10
int clicks = 0;
boolean buttonWasUp = true;
byte segments[10] = {
0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111,
0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111,
};
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
delay(10);
if (!digitalRead(BUTTON_PIN))
clicks = (clicks + 1) % 10;
}
buttonWasUp = digitalRead(BUTTON_PIN);
digitalWrite(LATCH_PIN, LOW);
48
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
digitalWrite(LATCH_PIN, HIGH);
}
Пояснения к лабораторной работе
Оба вывода 3 и 8 семисегментного индикатора являются катодами, к земле можно подключать любой из них.
При сборке схемы необходимо внимательно сопоставить сегменты индикатора с номерами его ножек, а последние, в свою очередь,
с пинами Arduino, к которым они подключаются.
Вывод 5 индикатора – это точка, которая не используется в лабораторной работе.
Сегменты индикатора – просто светодиоды, поэтому будем использовать резистор с каждым из них.
Создадим массив типа byte, каждый его элемент – это 1 байт (8
бит). может принимать значения от 0 до 255.
Символы арабских цифр закодированы состоянием пинов, которые соединены с выводами соответствующих сегментов: 0 – если
сегмент должен быть выключен; 1 – если включен.
В переменную mask помещается тот элемент массива
numberSegments, который соответствует текущей секунде, вычисленной в предыдущей инструкции.
В цикле for выполняется проход по всем сегментам, извлекая
с помощью встроенной функции bitRead нужное состояние для
текущего пина, в которое он и переходит с помощью digitalWrite
и переменной enableSegmen. Функция bitRead(x, n) возвращает
boolean значение: n-ный бит справа в байте x.
В лабораторной работе используется дополнительная микросхема – выходной сдвиговый регистр 74HC595. Выходной сдвиговый
регистр дает возможность сэкономить цифровые выходы микроконтроллера, использовав всего 3 вместо 8. Каскад регистров позволил бы давать 16 и более сигналов через те же три пина.
Для того, чтобы понять, откуда считать ножки микросхемы,
на них с одной стороны есть полукруглая выемка. Если мы расположим нашу микросхему выемкой влево, то в нижнем ряду будут
ножки 1–8, а в верхнем 16–9.
Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нужно подать LOW на latch pin
(вход STcp микросхемы), передать данные, а затем отправить HIGH на
latch pin, после чего на соответствующих выходах 74HC595 появится
переданная комбинация высоких и низких уровней сигнала.
49
Для передачи данных используется функция shiftOut(dataPin,
clockPin, bitOrder, value). Она ничего не возвращает, а в качестве параметров ей нужно сообщить: пин Arduino, который подключен к входу
DS микросхемы (data pin); пин Arduino, соединенный с входом SHcp
(clock pin); порядок записи битов LSBFIRST (least significant bit first)
начиная с младшего или MSBFIRST(most significant bit first) начиная
со старшего; байт данных, который нужно передать.
Функция работает с порциями данных в один байт, так что если
нужно передать больше, придется вызывать ее несколько раз.
Контрольные вопросы
1. К какой ножке семисегментного индикатора нужно подключать землю?
2. Как хранить закодированные символы цифр?
3. Каким образом выводить символ на индикатор?
4. Для чего нужен выходной сдвиговый регистр?
5. Как найти ножку микросхемы, на которую отправляются данные?
6. Что нужно сделать до и после отправки собственно данных на
74HC595?
7. Сколько данных можно передать с помощью shiftOut() и как
управлять порядком их передачи?
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
50
Лабораторная работа № 8
ВЫВОД МАССИВА ДАННЫХ НА ЭКРАН КОМПЬЮТЕРА
ЧЕРЕЗ МОНИТОР И ПЛОТТЕР ПОСЛЕДОВАТЕЛЬНОГО ПОРТА
Цель работы – изучить способы вывода информации на экран
компьютера через монитор и плоттер последовательного порта, освоить способы измерения температуры.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Светодиод
АЛ307
Термистор
B57164-K 103-J
Активный резистор
220 Ом; 0,125 Вт
Активный резистор
10 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200 точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 8.1 и рис. 8.2).
2. Написать программы: для принципиальной схемы (рис. 8.1) –
программа 1.1; для принципиальной схемы (рис. 8.2) – программа
1.2. Проверить их путем проведения компиляции программ.
51
АЛ307
пин 2
АЛ307
пин 3
АЛ307
10 кОм
пин А0
+5V
220 Ом
220 Ом
пин 4
пин 5
пин 6
пин 7
АЛ307
АЛ307
АЛ307
АЛ307
пин 8
пин 9
АЛ307
220 Ом
t°,C
B57164K 103-J
220 Ом
220 Ом
220 Ом
220 Ом
220 Ом
пин 10
пин 11
АЛ307
АЛ307
220 Ом
220 Ом
Рис. 8.1. Исследование способа измерения температуры
10 кОм
пин А0
+5V
t°,C
B57164K 103-J
Рис. 8.2. Исследование способа вывода информации на экран компьютера
через монитор и плоттер последовательного порта
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 8.1,
8.2 на плату.
52
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 8.1 и рис. 8.2).
Программа 8.1
#include <math.h>
#define FIRST_LED_PIN 2
#define LED_COUNT 10
void setup() {
for (int i = 0; i < LED_COUNT; ++i)
pinMode(i + FIRST_LED_PIN, OUTPUT);
}
void loop() {
float voltage = analogRead(A0) * 5.0 / 1023.0;
float temperature = 1.0 / (log(voltage / 2.5) / 4300.0 + 1.0 / 298.0)
- 273.0;
for (int i = 0; i < LED_COUNT; ++i) {
boolean enableSegment = (temperature >= 21+i);
digitalWrite(i + FIRST_LED_PIN, enableSegment);
}
}
Программа 8.2
#include <math.h>
int minute = 1;
void setup() {
Serial.begin(9600);
Serial.println(«Minute\tTemperature»);
}
void loop() {
float v = analogRead(A0) * 5.0 / 1024.0;
float temperature = -14.46 * log(
(10000.0 * v) / (5.0 - v) / 27074.0);
Serial.print(minute);
Serial.print(«\t»);
Serial.print(temperature);
delay(60000);
++minute;
}
Пояснения к лабораторной работе
Директивы для подключения библиотек #include включаются в начало программы. Для того, чтобы использовать функцию
53
взятия натурального логарифма x log(x), подключаем библиотеку
math.h.
В переменных типа float можно хранить дробные числа и числа
с плавающей точкой. При использовании переменных данного типа
необходимо учитывать следующее: при операциях с их использованием необходимо указывать нулевую дробную часть у целых констант; переменные могут принимать значения от -3,4028235×1038
до 3,4028235×1038, при этом количество значащих цифр из всех может быть 6-7, не только после запятой; точность вычислений с такими
данными невелика, могут возникнуть неожиданные ошибки – например, при использовании float в условном операторе; вычисления
с float происходят медленнее, чем с целыми числами.
Показания термистора связаны с температурой нелинейно, поэтому приходится использовать громоздкую формулу пересчета.
Очень часто бывает полезно обмениваться данными, например,
с компьютером. В частности, для отладки работы устройства можно,
например, смотреть, какие значения принимают переменные.
В данной лабораторной работе знакомимся со стандартным объектом Serial, который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) begin(), print() и println(),
которые вызываются после точки, идущей за именем объекта.
Чтобы обмениваться данными, нужно начать соединение, поэтому
Serial.begin(baudrate) вызывается в setup(). Serial.print(data) отправляет содержимое data. Если нужно отправить текст, можно просто заключить его в пару двойных кавычек « «. Кириллица, скорее всего,
будет отображаться некорректно. Serial.println(data) делает то же самое, только добавляет в конце невидимый символ новой строки.
В print() и println() можно использовать второй необязательный
параметр – выбор системы счисления, в которой выводить число (это
может быть DEC, BIN, HEX, OCT для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или
количество знаков после запятой для дробных чисел.
Например,
Serial.println(18,BIN);
Serial.print(3.14159,3);
10010
3.142
Монитор порта, входящий в Arduino IDE, открывается через меню Инструменты или сочетанием клавиш Ctrl+Shift+M. Необходимо следить за тем, чтобы в мониторе и в программе была указана
54
одинаковая скорость обмена данными baudrate. Скорости 9600 бит
в секунду обычно достаточно. Другие стандартные значения можно
посмотреть в выпадающем меню справа внизу окна монитора порта
(рис. 8.3).
Рис. 8.3. Вывод информации на монитор или плоттер
последовательного порта
55
Важно знать, что не удастся использовать цифровые порты 0
(RX) и 1 (TX) одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и
через USB-порт платы.
При запуске монитора порта программа в микроконтроллере
перезагружается и начинает работать с начала. Это удобно, если
нельзя упустить какие-то данные, которые начинают передаваться
сразу же, но в других ситуациях это может мешать.
Если нужно читать какие-то данные в реальном времени, то необходимо делать delay() хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать.
Можно отправлять данные и без задержки, а затем, к примеру,
скопировать их для обработки в стороннем приложении.
Последовательность \t выводится как символ табуляции (8 пробелов с выравниванием).
Также можно использовать, например, последовательность \n
для перевода строки. Если нужно использовать обратный слэш, его
надо экранировать вторым таким же \\.
Контрольные вопросы
1. Как нужно подключить термистор, чтобы получать на Arduino
данные о температуре?
2. Каким образом можно воспользоваться ранее разработанными функциями, не переписывая их в программный код?
3. Чем неудобно использование чисел с плавающей точкой на
Arduino?
4. Какое выражение стоит справа от = при объявлении булевой
переменной enableSegment?
5. Какие действия нужно предпринять, чтобы читать на компьютере данные с Arduino?
6. Какие ограничения следует учитывать при работе с последовательным портом?
7. Как избежать ошибки в передаче данных, содержащих обратный слэш \?
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
56
Лабораторная работа № 9
ОСОБЕННОСТИ УПРАВЛЕНИЯ СЕРВОПРИВОДОМ
Цель работы – изучить способы управления сервоприводом, реализовать режим управления по данным с аналогового датчика.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Конденсатор электролитический
220 мкф; 16 В
Сервопривод
FS90
Переменный активный резистор
1 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200
точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрическую принципиальную схему (соединений)
лабораторной работы (рис. 9.1).
2. Написать программы для принципиальной схемы (рис. 9.1)
– программа 9.1. Проверить её путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и загрузить программу 9.1.
57
+5V
пин A0
пин 9
1 кОм
красный
+5V
220 мкФ
оранжевый
+
коричневый
FS90
Рис. 9. Исследования режимов работы сервопривода
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальной схеме (рис. 9.1).
Программа 9.1
#include <Servo.h>
#define POT_MAX_ANGLE 270.0
Servo myServo;
void setup() {
myServo.attach(9);
}
void loop() {
int val = analogRead(A0);
int angle = int(val / 1024.0 * POT_MAX_ANGLE);
angle = constrain(angle, 0, 180);
myServo.write(angle);
}
Пояснения к лабораторной работе
Конденсатор в схеме нужен для того, чтобы при включении сервопривода избежать просадки питания микроконтроллера.
Нужно соблюдать полярность электролитического конденсатора. Короткая ножка (со стороны белой полосы на корпусе) – «минус».
Можно соединить провод сервопривода с макетной платой проводами «папа-папа»: коричневый – земля, красный – питание,
оранжевый – сигнал.
В данной лабораторной работе питание сервопривода подключается к пину 5V Arduino. С одним сервоприводом плата справится,
58
но если в каком-либо проекте нужно больше сервоприводов, нужно
использовать специальные платы-драйверы с отдельным источником питания.
В данной лабораторной работе исследуется объект, который нужен для управления сервопривода. В отличие от объекта Serial,
объекты типа Servo нужно явно создать, т.е. Servo myServo, предварительно подключив библиотеку <Servo.h>.
После этого можно использовать два метода для работы с объектом:
– myServo.attach(pin) – сначала подключается сервопривод
к пину, с которым физически соединен его сигнальный провод,
в этом случае команда pinMode() не нужна;
– myServo.write(angle) – задается угол, т.е. позиция, которую
должен принять вал сервопривода в диапазоне от 0° до 180°;
– myServo – имя объекта (идентификатор), который придумывается так же, как названия переменных. Например, если нужно
управлять двумя захватами, можно использовать объекты leftGrip
и rightGrip.
Использование функции int() необходимо для явного преобразования числа с плавающей точкой в целочисленное значение. Она
принимает в качестве параметра значение любого типа, а возвращает целое число. Когда в одном выражении имеется дело с различными типами данных, нужно позаботиться о том, чтобы не получить непредсказуемый ошибочный результат.
Контрольные вопросы
1. Зачем нужен конденсатор при включении в схему сервопривода?
2. Каким образом библиотека <Servo.h> позволяет работать
с сервоприводом?
3. Зачем ограничивать область допустимых значений для angle?
4. Как быть уверенным в том, что в переменную типа int после
вычислений попадет корректное значение?
В отчете представить
1. Схему для проведения эксперимента.
2. Программный код с комментариями по ходу выполнения программы.
3. Осциллограммы эксперимента.
4. Фото собранной на плате схемы для проведения эксперимента.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
59
Лабораторная работа № 10
ВЫВОД ИНФОРМАЦИИ НА LCD-ЭКРАН
Цель работы – изучить способы подключения LCD-экранов, научиться регулировать яркость и контрастность выводимого текста.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Текстовый экран
MT-16S2H; размерность 16х2
Переменный активный резистор
1 кОм; 0,125 Вт
Соединительные провода
Папа-папа
Breadboard
Монтажная плата без пайки на 200
точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения
работы.
4. Отладить работу программы и схемы на макете.
5. Снять осциллограммы сигналов согласно порядку выполнения работы.
Порядок выполнения работы
1. Собрать электрическую принципиальную схему (соединений)
лабораторной работы (рис. 10.1).
2. Написать программу для принципиальной схемы (рис. 10.1) –
программа 10.1. Проверить её путем проведения компиляции программ.
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и загрузить программу 10.1.
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальной схеме (рис. 10.1).
60
пин 10
пин 12
пин 13
пин 14
пин 4
пин 5
11
15
12
2
13
MT-16S2H
+5В
3
14
5
4
1
6
16
1 кОм
Рис. 10.1. Исследование LCD-экрана
Программа 10.1
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
void setup()
{
lcd.begin(16, 2);
lcd.print(« \xA8p\xB8\xB3»»e\xBF»);
lcd.setCursor(0, 1);
lcd.print(« from the SSV»);
}
void loop()
{
}
Пояснения к лабораторной работе
Существует большое количество разновидностей текстовых или,
как их ещё называют, знакосинтезирующих, жидкокристаллических экранов. Наиболее распространены дисплеи на базе чипов
HD44780 от Hitachi, KS0066 от Samsung или совместимых с ними.
Для работы с такими экранами существует стандартная Arduinoбиблиотека Liquid Crystal.
К таким дисплеям относятся в частности текстовые экраны
от Мэлт. Сборка начинается с того, что экран устанавливается на
breadboard и запитывается от рельс питания breaboard.
Фоновая подсветка дисплея – это отдельный контур, не связанный с остальным. Включить её можно подав +5 В на 15-й пин дис61
плея и подключив 16-й пин к земле. Соединив эти два пина с соответствующими рельсами, можно включить Arduino и увидеть, что
дисплей засветился.
Обратите внимание, что на некоторых моделях нумерация контактов идёт не просто справа - налево от первого до шестнадцатого,
а несколько более хитро. Так, например, на экране 16×2 от Мэлт
первый пин физически находится на 14-й позиции, второй на 13-й
и так далее справа - налево вплоть до 14-го на первой позиции, а
15-й и 16-й расположены справа. Нумерация около пинов дисплея
поможет не запутаться.
Далее необходимо подключить цепь, отвечающую за отображение символов. Для этого предназначены пины 1, 2 и 3 на дисплее.
Перед подключением отключите Arduino от питания.
Первый – это земля, соедините его с рельсой земли.
Второй – питание, соедините его с рельсой +5 В.
Третий – контрастность. Для получение максимально контрастного изображения соедините его с рельсой земли. Можно подать на
этот контакт произвольное напряжение от 0 до 5 В – чем оно выше,
тем тусклее будет изображение, но вместе с этим снизится энергопотребление. Для возможности плавной регулировки контрастности
можете подать на этот контакт выходной сигнал потенциометра.
После подключения цепи и при включении Arduino можно увидеть прямоугольные знакоместа. В зависимости от комбинации
цветов текста и подсветки они могут быть как яркими и хорошо заметными, так и едва заметными. Это нормально в любом случае,
текст будет виден хорошо.
Для коммуникации между Arduino и экраном необходимо использовать несколько линий взаимодействия:
– 2 или 3 для командования дисплеем;
– 4 или 8 для передачи данных (кодов символов и команд).
Таким образом, занятыми окажутся от 6-ти до 11-ти пинов от
обоих устройств. Если не требуется считывать с дисплея, что подходит под большинство сценариев использования, для команд понадобится 2 линии.
Если скорость обновления данных также не является проблемой, для передачи данных достаточно 4-х линий.
Итак, для подключения дисплея достаточно использовать 6 линий и 6 пинов на Arduino.
Нам незачем считывать с дисплея, будем в него только писать.
Поэтому соединим 5-й пин дисплея, который отвечает за выбор чтение/запись с рельсой земли – это означает «всегда писать».
62
Затем соединяем Arduino и экран нашими 6-ю линиями коммуникации. Какие именно контакты будут выбраны на Arduino не
имеет значения, зададим их далее в программе. В лабораторной работе выбрана следующая конфигурация:
– 4-й пин дисплея – 4-й пин Arduino. Это линия адресного сигнала, известная как A0 или RS. В зависимости от того, 0 она или 1,
дисплей распознает, имеется ли на линии данных команда вроде
«передвинуть курсор» или код символа для отображения;
– 6-й пин дисплея – 5-й пин Arduino. Это линия разрешения доступа к данным, известная как E или Enable. Когда эта линия становится единицей, дисплей исполняет команду или выводит символ с линии данных;
– 11-й, 12-й, 13-й, 14-й пин дисплея – 10-й, 11-й, 12-й, 13-й пин
Arduino соответственно. Это линии данных, известные как DB4,
DB5, DB6, DB7.
Для вывода текста с Arduino удобнее всего воспользоваться
встроенной библиотекой Liquid Crystal. Не все китайские и европейские аналоги дисплеев имеют в своём наборе символы кириллицы.
Вывод русских букв не совсем тривиален, нельзя просто написать lcd.print(«Ария»). Это связано с понятием кодировок. Каждому символу соответствует код и если при компиляции программы
строка содержит кириллицу, она будет сконвертирована в коды по
таблицам UTF-8, CP-1251 или какой-то другой в зависимости от настроек компилятора. Экран, в свою очередь, ожидает увидеть данные в собственной кодировке.
Так, например, букве «Я» соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить
в строку код символа:
– lcd.print(«\xB1ndex»).
Можно смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x, он считывает за ним
все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя просто
использовать символы из диапазона 0-9, a-f следом за двузначным
кодом символа – это вызовет ошибку компиляции. Чтобы обойти
этот момент, можно использовать тот факт, что две строки, записанные рядом, склеиваются. Так, если нужно написать «Яeee»:
– lcd.print(«\xB1eee»); // ошибка;
63
– lcd.print(«\xB1»»eee»); // правильно.
Полную таблицу символов с кодами можно найти в документации к используемому экрану.
Контрольные вопросы
1. Как регулировать яркость подсветки LCD-экрана?
2. Как регулировать контрастность LCD-экрана?
3. Как выводить и считывать информацию с LCD-экрана?
4. Как выводить кириллицу на LCD-экран?
В отчете представить
1. Схему для проведения эксперимента.
2. Программный код с комментариями по ходу выполнения программы.
3. Осциллограммы эксперимента.
4. Фото собранной на плате схемы для проведения эксперимента.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
64
Лабораторная работа № 11
ИССЛЕДОВАНИЕ ДАТЧИКОВ ИЗМЕРЕНИЯ РАССТОЯНИЯ
И ПОИСКА ЛИНИИ
Цель работы – изучить способы измерения расстояния при помощи ультразвукового датчика, а также способы поиска черной
линии при помощи инфракрасного датчика.
Оборудование и приборы
Наименование
Параметры
Плата микроконтроллера
Arduino
Персональный компьютер
Операционная система Windows
Программное обеспечение
Arduino IDE
USB-кабель
Тип А-В
Цифровой осциллограф
АКТАКОМ ADS-2031
Мультиметр
UNI-T UT53 MULTIMETER
Текстовый экран
MT-16S2H; размерность 16х2
Переменный активный резистор
1 кОм; 0,125 Вт
Ультразвуковой датчик
HC-SR04
Инфракрасный датчик
LineFinder v1.0
Соединительные провода
Папа-папа и папа-мама
Breadboard
Монтажная плата без пайки на 200
точек
Содержание работы
1. Изучить конструкцию и технические характеристики применяемого в лабораторной работе оборудования и приборов.
2. Собрать схему согласно порядку выполнения работы.
3. Написать программный код согласно порядку выполнения работы.
4. Отладить работу программы и схемы на макете.
Порядок выполнения работы
1. Собрать электрические принципиальные схемы (соединений)
лабораторной работы (рис. 11.1 и рис. 11.2).
2. Написать программы: для принципиальной схемы (рис.
11.1) – программа 11.1; для принципиальной схемы (рис. 11.2) –
программа 11.2. Проверить их путем проведения компиляции
программ.
65
3. Подключить микроконтроллер к персональному компьютеру
при помощи USB-кабеля и поочередно загрузить программы 11.1,
11.2 на плату.
4. Провести экспериментальные исследования и снять осциллограммы сигналов в принципиальных схемах (рис. 11.1 и рис. 11.2).
+5 В
Vcc
пин 7
TriG
пин 2
Echo
HC-SR04
GND
Рис. 11.1. Исследование ультразвукового
датчика измерения расстояния
+5 В
пин 3
Vcc
SIG
Line Finder v1.0
GND
Рис. 11.2. Исследование инфракрасного
датчика поиска черной линии
Программа 11.1
#define trigPin 7
#define echoPin 2
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
void setup() {
Serial.begin(9600);
66
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.begin(16, 2);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
int TemP = pulseIn(echoPin, HIGH);
int DiSt = (TemP/2)/29.1;
lcd.print(« «);
lcd.setCursor(0, 1);
lcd.print(DiSt);
lcd.print(« c»»\xBC «);
Serial.print(DiSt);
Serial.print(« cm»);
Serial.println();
delay(100);
}
Программа 11.2
int signalPin = 3;
void setup()
{
pinMode(signalPin, INPUT);
Serial.begin(9600);
}
void loop()
{
if(HIGH == digitalRead(signalPin))
Serial.println(«black»);
else Serial.println(«white»);
delay(1000);
}
Пояснения к лабораторной работе
Ультразвуковой дальномер определяет расстояние до объектов
точно так же, как это делают дельфины или летучие мыши. Он генерирует звуковые импульсы на частоте 40 кГц и слушает эхо. По
времени распространения звуковой волны туда и обратно можно
67
однозначно определить расстояние до объекта пользуясь формулой: расстояние равно время импульса с пина Echo, деленое на 58;
результат будет в сантиметрах.
Ультразвуковой датчик имеет следующую распиновку: Vcc – положительный контакт питания; Trig – цифровой вход, на который
для запуска измерения необходимо подать логическую единицу на
10 мкс, следующее измерение рекомендуется выполнять не ранее
чем через 50 мс; Echo – цифровой выход, на который после завершения измерения будет подана логическая единица на время, пропорциональное расстоянию до объекта; GND – отрицательный контакт питания.
Датчик линии идеально подходит для установки внизу мобильной платформы для того, чтобы заставить робота не выезжать за
пределы территории, обозначенной контуром, или чтобы он следовал за нарисованной линией. Датчик линии позволяет определять
цвет поверхности около него. Выходом является простой бинарный
цифровой сигнал: логический 0 или 1 в зависимости от цвета, который он видит перед собой. Единица – чёрный или пустота, ноль – не
чёрный.
Основной фотоэлемент работает в инфракрасном спектре. Дополнительно на сенсоре установлен светодиод, который загорается,
когда поверхность под датчиком светлая. Это удобно для диагностики и настройки.
Переменный резистор, установленный на сенсоре, позволит регулировать чувствительность сенсора в широких пределах. Это позволяет откалибровать датчик под конструкцию, материал покрытия и различные условия внешнего освещения.
Также его можно использовать в роли энкодера вращения: разместив на вращающемся объекте нарисованную чёрно-белую мишень, можно понять, с какой угловой скоростью вращается объект
и сколько оборотов он сделал.
Датчик подключается к управляющей электронике через три
провода (VCC, GND, SIG). Если необходимы градации в измерении
яркости цвета объекта, т.е. нужен аналоговый сигнал, необходимо
использовать аналоговый датчик линии.
Контрольные вопросы
1. Конструкция и принцип действия ультразвукового датчика.
2. Конструкция и принцип действия инфракрасного датчика.
3. Что такое диаграмма направленности датчика?
4. В чем отличие пина Trig от пина Echo?
68
В отчете представить
1. Схемы для проведения экспериментов.
2. Программные коды с комментариями по ходу выполнения
программ.
3. Осциллограммы экспериментов.
4. Фото собранных на плате схем для проведения экспериментов.
5. Выводы, содержащие анализ выполненного исследования.
6. Ответы на контрольные вопросы.
69
Рекомендуемая литература
1. Соммер У. Программирование микроконтроллерных плат
Arduino/Freeduino. СПб.: БХВ-Петербург, 2012. 256 с.: ил. – (Электроника).
2. Петин В.А. Проекты с использованием контроллера Arduino.
СПб.: БХВ-Петербург, 2014. 400 с.: ил. – (Электроника).
3. Руководство по освоению Arduino. ARDX Руководство с открытым исходным кодом для Arduino. SOLARBOTICS, 2013. 33 с.: ил.
4. Официальный сайт Амперка: http://amperka.ru. [Электронный ресурс] / Раздел ВИКИ / Проекты / Мини-проекты с Arduino,
режим доступа к ссылке: http://wiki.amperka.ru.
5. Официальный сайт IARDUINO.RU все для радиолюбителей:
http://iarduino.ru. [Электронный ресурс] / Раздел Уроки / Уроки
для Arduino, режим доступа к ссылке: http://lesson.iarduino.ru.
6. Видеоуроки по Arduino [Электронный ресурс], режим доступа
к ссылке:http://www.youtube.com/playlist?list=PLfDmj22jP9S759
DT250VVzfZs_4VnJqLa.
70
Содержание
Правила безопасности для студентов, выполняющих лабораторные
работы по дисциплине «Программное обеспечение
мехатронных и робототехнических систем»...................................
3
Правила внутреннего распорядка при выполнении лабораторных
работ по дисциплине «Программное обеспечение мехатронных
и робототехнических систем»......................................................
4
Правила оформления отчета по лабораторной работе.......................
5
Подготовка к работе с программным обеспечением для
контроллера Arduino в операционной системе Windows...................
7
Лабораторная работа № 1. Исследование логических
и широтно-импульсных выходов микроконтроллера.......................
11
Лабораторная работа № 2. Работа с аналоговыми входами.
Аналоговые датчики..................................................................
16
Лабораторная работа № 3. Управление портами
микроконтроллера. Способы усиления тока...................................
24
Лабораторная работа № 4. Исследование кнопочного управления.
Борьба с дребезгом контактов......................................................
31
Лабораторная работа № 5. Способы управления
двигательной нагрузкой..............................................................
39
Лабораторная работа № 6. Работа с массивами данных....................
42
Лабораторная работа № 7. Работа с цифровыми индикаторами.
Способы управления индикатором...............................................
46
Лабораторная работа № 8. Вывод массива данных на
экран компьютера через монитор и плоттер
последовательного порта............................................................
51
Лабораторная работа № 9. Особенности
управления сервоприводом..........................................................
57
Лабораторная работа № 10. Вывод информации на LCD-экран..........
60
Лабораторная работа № 11. Исследование датчиков
измерения расстояния и поиска линии..........................................
65
Рекомендуемая литература.........................................................
70
Документ
Категория
Без категории
Просмотров
6
Размер файла
2 950 Кб
Теги
solenyi
1/--страниц
Пожаловаться на содержимое документа