Audytor.ru

Теплоснабжение "Аудитор"
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Муниципальное общеобразовательное учреждение Гимназия №6 г. Воркуты

  • Печать

На прошлом уроке мы научились управлять схемой, собранной на макетной плате. На этом уроке мы разработаем схему для управления свечением светодиода с помощью кнопки, используя функцию ветвления.

Создавать небольшие проекты и программировать можно и при отсутствии платы Ардуино, в онлайн программном комплексе TinkerCad (https://www.tinkercad.com/). Для быстрого доступа (чтобы избавить вас от длительной процедуры регистрации) учащихся МОУ «Гимназия №6» г. Воркуты создан специальный виртуальный класс Arduino214 (как вы догадались, по номеру кабинета робототехники). Для реализации данного способа входа в программный комплекс необходимо:

  1. Зайти в класс Arduino214 по адресу https://www.tinkercad.com/joinclass/NDK3RBS86WX6.
  2. Ввести псевдоним, назначенный преподавателем (Если вы не получили или забыли псевдоним, то можно сделать запрос в электронном дневнике, отправив письмо на имя Янактаева Евгения Владимировича).

Практическая работа 4.1. Управление с помощью кнопки.

На этом уроке будем создавать в программном комплексе TinkerCad программу для управления с помощью кнопки на основе схемы, в которую входят: плата Arduino Uno, малая макетная плата, светодиод, кнопка, два резистора.

После входа в программный комплекс выберите в левом меню Circuits и нажмите Создать цепь.

Создадим схему для управления свечением светодиода с помощью кнопки, подключив к разъему GND и к линии « » проводник синего цвета, к порту 5V и к поперечной контактной рельсе макетной платы проводник красного цвета. Подключим кнопку так, чтобы кнопка находилась концами ножек на разных частях макетной платы, левая ножка кнопки находилась на одной поперечной контактной рельсе с красным проводником, а правая ножка находилась на одной поперечной контактной рельсе с резистором, который другим контактом подключён к линии « ». Подключим порт 2 к одной поперечной контактной рельсе с правой ножкой кнопки. Светодиод разместим так, чтобы анод находился на одной поперечной контактной рельсе со вторым резистором, а поперечную контактную рельсу, на которой находится катод, соединим проводником жёлтого цвета с линией « ». Подключим порт 5 проводником красного цвета к одной поперечной контактной рельсе с другим контактом второго резистора.

При сборке схемы, как реальной, так и виртуальной придерживайтесь следующих рекомендаций (применяются в заданиях чемпионата WorldSkills «Электроника»):

  • проводники питания положительной полярности выполнить проводниками (перемычками) красного цвета;
  • проводники питания отрицательной полярности (нулевой провод или GND ) выполнить проводниками (перемычками) синего цвета;
  • соединение с элементами индикации (светодиодами) выполнить соединение с элементами индикации (светодиодами) выполнить проводниками (перемычками) желтого цвета;
  • остальные сигнальные линии выполнить проводниками (перемычками) зеленого цвета;
  • сначала выполнить соединения более короткими проводниками (перемычками), затем более длинными;
  • повороты проводников (перемычек), если они необходимы, должны осуществляться строго под углом 90 градусов;
  • соединения проводниками (перемычками) необходимо выполнять параллельно линиям гнезд макетной платы;
  • проводники (перемычки) не должны проходит поверх или под компонентами схемы;
  • компоненты схемы, такие как резисторы, конденсаторы, диоды и т. д., должны быть установлены вертикально или горизонтально параллельно линиям гнезд макетной платы.

Создадим программу для управления встроенным светодиодом.

В верхнем меню справа выберите Код и поменяйте в выпадающем меню Блоки на Текст.

При появлении предупреждения нажмите на кнопку Продолжить. В рабочей области текстового редактора появится следующий код:

Читайте так же:
Постановление установки водомерных счетчиков

Удалим все команды в процедурах void setup() и void loop() для того, чтобы получился чистый шаблон для кода:

Так как мы подключили светодиод через резистор к порту 5, а правую ножку кнопки к порту 2, целочисленной переменной btn присваиваем значение 5, целочисленной переменной led присваиваем значение 2. Затем в функции void setup() для порта, отвечающего за управление светодиодом (led), устанавливаем в функции pinMode() режим подачи управляющего сигнала (OUTPUT), а для порта, отвечающего за управление светодиодом (btn), устанавливаем в функции pinMode() режим подачи управляющего сигнала (INPUT). В процедуре void loop() организуем ветвление, в котором в зависимости от уровня сигнала, поступающего на порт 2 (HIGH или LOW), подаётся уровень сигнала на порт 5, отвечающий за свечение светодиода.

Получится следующий код:

Нажмите на кнопку Начать моделирование. Светодиод должен светиться в случае нажатия кнопки.

Подведём итоги

Мы научились управлять свечением светодиода с помощью кнопки, подключённым через резистор, к определённому порту. Для этого в управляющей программе в процедуре void setup() установили значение параметров pinMode() в режим подачи управляющего сигнала. В процедуре void loop() с помощью оператора ветвления, происходит управление подачей высокого и низкого уровня сигнала с помощью функции digitalWrite().

Таким образом, в зависимости от наличия тока на участке цепи со светодиодом с кнопкой возникает электрический ток.

Задание для самостоятельного выполнения:

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

Разработать кодовый замок на Arduino, который управляет электромагнитным реле. При правильном вводе 5-значного кода, срабатывает реле и загорается зеленый светодиод. Через 5 секунд реле приходит в изначальное состояние и зеленый светодиод гаснет. Если код введен неверно, то загорается красный светодиод в течение 5 секунд. Код можно вводить бесконечное количество раз.

Давайте для начала смоделируем схему в Proteus

Кодовый замок на Arduino

На схеме мы видим матрицу из кнопок, два светодиода и вместо катушки реле для удобства взят спикер, который при эмуляции начинает трещать. При правильном наборе кода загорается светодиод L_1 и трещит спикер LS1 в течение 5 секунд.

Описание кода

Для того чтобы мы могли обрабатывать, нажатия клавиш на нашей клавиатуре, мы могли бы написать сами с нуля, библиотеку обработки, но это заняло бы много времени, и в данном случае, программируя на Ардуино, на языке высокого уровня, в этом нет необходимости. Достаточно только подключить готовую библиотеку, которая идет в комплекте библиотек с нашей Arduino IDE.

В данном проекте, нам потребуется использовать три значения, которые мы будем использовать при написании нашего кода. Мы могли бы пойти стандартным путем и создать три переменные, присвоить им имена и значения, и затем просто использовать их. Но мы решили пойти немножко дальше, и показать, как можно еще более удобным способом решить данную задачу. Мы создаем 4 директивы, LED1, LED2 и RELAY, NUM_KEYS и присваиваем им постоянное значение, которое идет после названия директивы. После значения, точку с запятой, как мы привыкли, закрывать нашу строку, ставить не требуется.

Читайте так же:
Выровнять счетчик по центру код

Здесь мы знакомимся с новым типом массивов и переменных char, в котором помимо цифровых значений, могут храниться символьные, например буквы, и различные знаки. Итак, мы создаем массив myarraw, который содержит 5 знаков, (не забываем про создание директивы). В данный массив мы записываем 5 значений, которые содержатся в фигурных скобках. Они будут являться кодом, по которому будет открываться наш замок, их вы впоследствии сможете поменять на любые другие. Затем нам нужно создать еще один массив, также 5 знаков, в котором будут храниться значения, наших нажатых кнопок.

Здесь мы объявляем две переменные, к и s, и присваиваем им значение 0. В первой из них у нас будет храниться количество нажатий, а во второй количество совпадений, кода для открытия замка, который мы задали ранее в массиве, с кодом набранным на клавиатуре.

Здесь же, мы задаем 2 константы формата byte, в целях экономии памяти, нашего контроллера мы пользуемся форматом для хранения переменных byte, а не привычный многим формат int. В данном случае он будет избыточен, для наших задач.

Теперь же, нам нужно будет создать, таблицу соответствия, кнопок клавиатуры символам, которые будут сохраняться в наших массивах. Как мы видим, их расположение, совпадает с нанесенными значками на клавиатуре.

Ну а здесь, нам требуется создать два массива, по 4 знака каждый, соответственно по количеству строк и столбцов, и задать, к каким пинам ардуино они у нас будут подключены. Формат переменной, как и в прошлом случае, у нас выбран byte.

Здесь нужно остановиться подробнее: Библиотека Keypad, описывает класс работы с клавиатурой. Т.е. создает тип данных «клавиатура», у этого типа данных свои параметры, которые мы указываем в скобках. Типа то, что клавиатура 4*4, к каким пинам подключены строки, к каким столбцы, и таблицу соответствия кнопок нашим символам. Т.е. Keypad это тип данных, наподобие int или char. Затем мы пишем имя своей переменной (создаваемого объекта) keypad с параметрами этой переменной в скобках. Как будто присваиваем значение этой переменной. И дальше работаем как с переменной, у которой можно менять параметры.

Тактовые кнопки предназначены для коммутации электрических цепей и широко используются в радиоэлектронной аппаратуре.

Trema-кнопка имеет три вывода: Signal (S), Vcc (V), GND (G). В не нажатом состоянии на выходе S присутствует уровень логического «0» (выход прижат к GND через резистор). В нажатом состоянии на выходе S устанавливается уровень логической «1» (выход соединяется с Vcc).

Для работы с модулем нужно сконфигурировать вывод Arduino, подключённый к выходу модуля, как вход. И считывать состояние логического уровня с данного вывода.

Trema-кнопка со светодиодом имеет четыре вывода: Signal (S), Vcc (V), GND (G), Light (L). В не нажатом состоянии на выходе S присутствует уровень логического «0» (выход прижат к GND через резистор). В нажатом состоянии на выходе S устанавливается уровень логической «1» (выход соединяется с Vcc). Чтобы загорелся светодиод на вывод L необходимо подать уровень логической «1».

При считывании показаний с модулей нужно учитывать такое явление как дребезг контактов. При нажатии или отпускании кнопки, её контакты сначала многократно и неконтролируемо замыкаются и размыкаются по причине упругости их металла, а постоянный логический уровень устанавливается только после окончания дребезга. Это значит, что если 1 раз нажать на кнопку и отпустить её, то алгоритм программы может зафиксировать многократное нажатие на кнопку, если в нём не учитывается подавление дребезга.

Читайте так же:
Kyocera 2040 сброс счетчика

Для подавления влияния дребезга на алгоритм скетча, нужно после фиксации изменения логического уровня на выходе кнопки выдержать паузу, равную или превышающую время дребезга.

3 Алгоритм подавления«дребезга» контактов

Чтобы реализовать задачу подавления дребезга контактов, первое, что приходит в голову:

  • запоминать предыдущее состояние кнопки;
  • сравнивать с текущим состоянием;
  • если состояние изменилось, то меняем состояние светодиода.

Напишем такой скетч и загрузим в память Arduino.

Скетч обработки нажатия кнопки без учёта эффекта дребезга контактов

При включении схемы в работу, сразу виден эффект дребезга контактов. Он проявляется в том, что светодиод загорается не сразу после нажатия кнопки, или загорается и тут же гаснет, или не выключается сразу после нажатия кнопки, а продолжает гореть. В общем, схема работает не стабильно. И если для задачи с включением светодиода это не столь критично, то для других, более серьёзных задач, это просто неприемлемо.

Дребезг кнопки ардуино

В процессе работы с кнопками мы можем столкнуться с очень неприятным явлением, называемым дребезгом кнопки. Как следует из самого названия, явление это обуславливается дребезгом контактов внутри кнопочного переключателя. Металлические пластины соприкасаются друг с другом не мгновенно (хоть и очень быстро для наших глаз), поэтому на короткое время в зоне контакта возникают скачки и провалы напряжения. Если мы не предусмотрим появление таких “мусорных” сигналов, то будем реагировать на них каждый раз и можем привести наш проект к хаусу.

Для устранения дребезга используют программные и аппаратные решения. В двух словах лишь упомянем основные методы подавления дребезга:

  • Добавляем в скетче паузу 10-50 миллисекунд между полкучением значений с пина ардуино.
  • Если мы используем прерывания, то программный метд использоваться не может и мы формируем аппаратную защиту. Простейшая из них – RC фильтр с конденсатором и сопротивлением.
  • Для более точного подавления дребезга используется аппаратный фильтр с использованием триггера шмидта. Этот вариант позволит получить на входе в ардуино сигнал практически идеальной формы.

Более подробную информацию о способах борьбы с дребезгом вы можете найти в этой статье об устранении дребезга кнопок.

Все бы ничего, если бы мы жили в идеальном мире с идеальными кнопками. Реальные механические контакты, которые присутствуют в кнопках никогда не замыкаются и не размыкаются мгновенно. В течении непродолжительного промежутка времени происходит многократное замыкание и размыкание контактов ключа (кнопки) в результате чего на вход микроконтроллера поступает не единичный перепад напряжения, а целая пачка импульсов. Это явление носит название «дребезг контактов».

В примере выше, когда при помощи кнопки мы просто включали и выключали светодиод мы не заметили это, так как включение/выключение светодиода в момент «дребезга» происходило очень быстро и мы просто не увидели это глазом.

Читайте так же:
Схема управления счетчик моточасов

Типичная осциллограмма в момент отпуская кнопки выглядит следующим образом:

Осцилограмма с дребезгом контактов

Осцилограмма с дребезгом контактов

Продолжительность этого процесса отличается для различных переключателей и составляет от долей миллисекунды до сотен миллисекунд. Также видно, что продолжительности отдельных импульсов различны. На приведенной осцилограмме длительность дребезга контактов составляет примерно 0.5 мс. В процессе эксплуатации, число ложных переключений и их общая продолжительность возрастают вследствие механического износа контактных площадок.

В результате дребезга контактов на входе вместо изменения состояния из нуля в единицу (кнопка отпущена) мы получим целую последовательность 010101010101. Это создает для нас ложные сигналы.

С эффектом дребезга контактов можно бороться либо аппаратными, либо программными методами. Рассмотрим их подробно.

Аппаратный способ борьбы с дребезгом контактов

Одним из схемотехнических способов борьбы с дребезгом контактов является использование RS-триггера. Эта схема используется в случае, когда кнопка или другой механический датчик выполнены в виде группы переключающихся контактов.

Схема антидребезга на основе RS-триггера

Схема антидребезга на основе RS-триггера

RS-триггер состоит из двух логических элементов И-НЕ и имеет вход установки S (от англ. set — устанавливать) и вход сброса R (от Reset). На оба входа через токоограничивающие резисторы подано напряжение питания. На входе RS-триггера, который не подключен в данный момент к подвижному контакту, присутствует сигнал логической единицы.

Если подвижной контакт замыкает вход на землю, то но нем формируется уровень логического нуля. При нажатии и отпускании кнопки (либо при срабатывании другого механического датчика) при помощи подвижного контакта то один, то другой вход триггера подключается к земле.

Пусть контакт подключает вход S триггера к земле. Как только на вход триггера поступит первый логический ноль из пачки импульсов, которые вызваны дребезгом контактов, триггер переключится и на выходе устройства устанавливается логический ноль. Остальные импульсы уже не изменят состояния триггера.

Это состояние сменится на противоположное только тогда, когда подвижный контакт сомкнется в верхним контактом. Как только на вход R триггера поступит первый отрицательный импульс, триггер переключится и на выходе появится логическая единица. В этом состоянии триггер будет находиться до тех пор, пока при помощи подвижного контакта вход S опять не будет подключен к земле.

Работа схемы не зависит от числа и продолжительности импульсов, вызванных дребезгом контактов.

Еще одним способом борьбы с дребезгом контактов является использование RC-фильтров для сглаживания колебаний. Сглаженный сигнал затем подается на вход триггера Шмидта или другого логического элемента с высокоимпедансным входом. Ниже приведена схема с использованием КМОП-инвертера. На выходе триггера Шмидта мы будем иметь сигнал, избавленный от дребезга контактов. Ниже приведена схема для антидребезговой RC-цепочки.

RC-цепочка для подавления дребезга контактов

RC-цепочка для подавления дребезга контактов

Когда ключ переключается из разомкнутого состояния в замкнутое (нажатие кнопки), конденсатор C разряжается на землю через резистор R2. Выражение для напряжения на конденсаторе VC как функция времени t в момент разряда дается выражением (1)

В это время происходит переход из состояния логической единицы в состояние логического нуля. Мы можем сделать так, чтобы время этого перехода превысило время дребезга. Самым простым способом сделать это является установка VC = логическому нулю для триггера Шмидта, взяв стандартный или имеющийся в наличии конденсатор емкостью C и измерить время дребезга системы, используя осциллограф или логический анализатор. Тогда R2 можно выразить следующим образом:

Читайте так же:
Как определить модель счетчика

здесь V — напряжение, соответствующее уровню логического нуля.

Когда ключ переключается из замкнутого состояния в разомкнутое (отпускание кнопки), конденсатор C заряжается до напряжения VDC через соединение R1 + R2. Выражение для VC(t) в процессе зарядки:

Это период времени, в течение которого происходит изменение уровня с логичекого нуля в логическую единицу. Мы можем сделать так, чтобы этот переход занял времени больше, чем происходит дребезг контактов. Используя то же самое время t что и ранее, а также значение R2, найденное из уравнения (2), мы можем записать выражение для R1:

Пример расчета: пусть время дребезга для кнопки, подключаемой к микроконтроллеру составляет 10 мкс. Напряжение питания VDC = + 5 В и в наличии имеется конденсатор емкостью 10 нФ. Тогда параметры элемнтов антидребезговой цепочки составят:

  1. t = 10 мкс, С = 10 нФ, V = 1.3 В, VDC = 5 В. Подставив эти значения в уравнение (2), получим R2 = 742 Ома.
  2. t = 10 мкс, С = 10 нФ, V 1 = 3.7 В, VDC = 5 В. Подставив эти значения в уравнение (4), получим R1 = 2579 Ом.
  3. Используем неинвертирующий КМОП-буфер между кнопкой и входом микроконтроллера.

Программный способ борьбы с дребезгом контактов

Самый простой способ борьбы с дребезгом контактов программным способом — это использование задержек.

Дребезг контактов приводит к тому, что на входном пине вместо изменения состояния с единицы в ноль при нажатии кнопки, мы получим целую серию импульсов (как на осцилограмме выше). Чтобы избавиться от их паразитного влияния нужно обнаружить нажатие кнопки, приостановить выполнение программы и реализовать некоторую задержку. Время задержки необходимо выбрать таким образом, чтобы оно превышало дребезг контактов. Такую же процедуру задержки нужно реализовать и после обнаружения отпускания кнопки.

Библиотека Bounce2 для Arduino

Для борьбы с дребезгом контактов для Arduino существует специальная библиотека, которая называется Bounce2.

Скачать ее можно с репозитория GitHub или по ссылке ниже.

Библиотека Bounce2

Category:Programs
Date:04.07.2015

Если вы не знаете как устанавливать библиотеки в среде Arduino IDE, то можете предварительно ознакомиться с установкой библиотек в Arduino IDE.

Эта библиотека включает следующие методы:

  • Bounce () — инициализация объекта Bounce
  • void interval (unsigned long interval) — устанавливает время антидребезга в миллисекундах
  • void attach (int pin) — устанавливает пин, к которому подключена кнопка и подключает на этом выводе встроенный подтягивающий резистор
  • int update () — поскольку Bounce не использует прерывания Arduino, вы «обновляете» объект до того, как считываете его состояние и это нужно делать постоянно (например, внутри loop). Метод update обновляет объект и возвращает TRUE (1), если состояние пина изменилось (кнопка была нажата или же, наоборот, отпущена) и FALSE (0) в противном случае. Вызов метода update внутри loop необходимо производить только один раз.
  • int read () — возвращает обновленное состояние пина

По умолчанию, библиотека Bounce использует интервал стабилизации (stable interval) для реализации антидребезга. Это проще для понимания и позволяет не знать длительность дребезга.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector