Контроль положения контактов 3-х позиционного переключателя с помощью ардуино

Содержание

Arduino.ru

Скетч переключателя на 4 положения

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Нужен скетч для Pro Micro с использованием переключателя на 4-е фиксированных положения. Алгоритм на рисунке.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

И что этот скетч должен делать?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Не знаю, в чем подвох такой простой задачи, но пишите: wrk.sadman@gmail.com

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Как что делать? Корованы грабить! Вы ж сами вчера писали!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ардуинка должна включать и отключать реле в зависимости от положения фиксированного переключателя. Подвоха нет просто сам в этом не бум-бум, а времени все изучать нет.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну. два исполнителя есть — пишите любому.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

просто сам в этом не бум-бум, а времени все изучать нет.

и при этом не слушаете ничего.
схема электрическая вашего переключателя где?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Не понимаю какая схема вам нужна. Используется обыкновенный переключатель на 4-е положения с 5 контактами.

Питание ардуино и модулей реле от блока питания — 5в. Схема комутации выходов реле думаю вам не нужна. Схемы подключения переключателя и модулей реле к ардуине нет. И скетча тоже нет.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А вообще все это решается просто кучкой диодов.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А вообще все это решается просто кучкой диодов.

А схему полную подключения не подскажите

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ты смеешься или плачеш ? Признавайся !

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

Не, просто у меня пириф, я отдыхаю от мускульного сенсора с распознаванием фигуры сложеной из пальцев 🙂

Ну и пока онкель не гадит.

А че, думаешь, релюшки будут залипать ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А схему полную подключения не подскажите

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

спасибо за схему. действительно все оказалось очень просто

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

действительно все оказалось очень просто

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Еще вопрос. По такой схеме можно подключить твердотельное реле малой мощности с выходом на МОП-транзисторах?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ссылку на реле дайте.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

1-на +5 вольт через резистор 750ом. 1.5ком

2-на управляющую ногу ардуино

А как вы будете использовать выходной каскад реле — это ваше дело.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А как поточнее расчитать резистор по питанию?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

Второй подход, тупо покупаете резистор 1.1 ком, ставите и не паритесь.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Спасибо выберу второй подход для 5 вольт.

Извините за назойливость, а для 12 какой резистор нужно? Хочу использовать блок питания от светодиодной ленты на 12 в и 1,25.а

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да, брукли. повезло тебе ))

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вспоминаете закон ома и считаете.

Клапуций же запретил закон Ома!

Так что придётся Вам и про

А если затвр у ТС появится БП на 15 вольт . в общем безработица Вам не грозит!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Извините за назойливость, а для 12 какой резистор нужно? Хочу использовать блок питания от светодиодной ленты на 12 в и 1,25.а

Как вы его хотите использовать ?! Куда ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А если затвр у ТС появится БП на 15 вольт . в общем безработица Вам не грозит!

Это я уже понял . 🙁

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Да, брукли. повезло тебе ))

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Как вы его хотите использовать ?! Куда ?

Хотел использовать один БП для всего. Кроме этих реле будут еще и другие потребители (подсветка и т.д.) на 12 вольт

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну волшебно, вот и подключайте к немк потребители. А ардуино она только до пяти ардуино, а выше уже не ардуино. А 12 вольт вроде больше 5, хотя я могу ошибаться.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Ну волшебно, вот и подключайте к немк потребители. А ардуино она только до пяти ардуино, а выше уже не ардуино. А 12 вольт вроде больше 5, хотя я могу ошибаться.

А при чем здесь ардуино? Я по схеме с диодами.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А какой там резистор, вы его где увидали ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А какой там резистор, вы его где увидали ?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

А какой там резистор, вы его где увидали ?

На схеме указаны электомагнитные реле. Я хочу их заменить на твердотельные(избавиться от щелчков и т.д.) малой мощности с напряжением питания 1,5 вольта. Питание будет 12 вольт. Необхдимо поставить последовательно с цетью питания твердотельного реле резистор определенного номинала. Вот про него я и спрашиваю.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Аааа. вы хотите использовать оптореле вместо обыкновенных. Ясно, а что будите ими коммутировать ?

Из даташита оптореле: прямое напряжение диода — 1,2 (max 1,5), ток от 5мА до 25мА.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Аааа. вы хотите использовать оптореле вместо обыкновенных. Ясно, а что будите ими коммутировать ?

Из даташита прямое напряжение диода — 1,2 (max 1,5), ток от 5мА до 25мА.

Комутировать буду слаботочные цепи управления игровым рулем Logitech G27 и игрового контроллера. Другими словами есть подрулевой переключатель на 4-е положения. Хочу его прикрутить к игровому рулю. Переключатель от Приоры помоему который на дворники и омыватель. На самом переключатиле есть три не фиксированные кнопки для управления бортовым компьютером в машине. Задумка что бы в каждом из 4-ех положений переключателя эти три кнопки выполняли различные функции. Всего должно получиться 12 функций. Поэтому такая комутация.

А подскажите еще как доработать схему с диодами, что бы иметь возможность светодиодной индикации положений переключателя?

Albion76 › Блог › Опыт изучения Arduino. Пост четвёртый. Фиксация тактовой кнопки, операторы ветвления, борьба с дребезгом.

Доброго времени суток!

Продолжаю рассказывать вам о своем опыте знакомства с микроконтроллерами на примере Arduino. Ранее я рассказал, как управлять светодиодом при помощи тактовой кнопки. Задача была в следующем: нажали кнопку светодиод загорелся, отпустили — погас. Однако, на практике чаще стоит задача зафиксировать действие кнопки, т.е. нажал кнопку — светодиод загорелся, нажал еще раз — погас.
Если описать алгоритм человеческим языком, то получится следующее: если кнопка нажималась и светодиод горит, то погасить светодиод, если кнопка нажималась и светодиод не горит, то зажечь светодиод.

if (условие)
<

// здесь находятся команды, которые выполнятся, если условие выполняется (т.е. не равно нулю)
>
else
<

// здесь находятся команды, которые выполнятся, если условие не выполняется (т.е. равно нулю)
>
на примере моего скетча это выглядит так:
if (0 == onOff) // если светодиод не горит, …
<
onOff = 1;
digitalWrite(13, HIGH);
// …то зажигаем его, …
>
else
// … иначе …
<
onOff = 0;
digitalWrite(13, LOW);
// … гасим
>

Загружаем скетч в Arduino и пробуем понажимать кнопку. Иногда всё работает верно. Иногда светодиод еле заметно моргнет и погаснет. Иногда ничего не происходит. Почему такая разница в результате, при выполнении одной и той же программы? Вроде бы делаем всё правильно… Виной тому явление, в электронике называемое «дребезгом контактов».

Для реализации такой задержки в пустой цикл ожидания отпускания кнопки я добавил команду задержки delay(1) (цифра в скобках-это длительность задержки в миллисекундах(1/1000 секунды)).
Также в цикле появился счётчик cycle++. Эту запись программисты называют инкрементом. При каждом выполнении этой команды переменная cycle увеличивается на единицу. Эту же строчку можно записать так: cycle = cycle + 1. Никакой ошибки не будет. Загружаю дополненный скетч в Arduino и проверяю. Теперь всё работает чётко. Задача выполнена.

Читайте также:  Стабилизированный регулятор мощности паяльника на микроконтроллере

Жмите кнопки) Для Вас это — щелчок мышью, а для меня — повод продолжать делиться своими наработками.

Всем Мира и правильных решений!
До свидания.

Комментарии 24

Здравствуйте напишите скетч на управление акппПередачи включаются нужно 2 кнопки включение верх + и включение вниз-
НОМЕР ПЕРЕДАЧИ 1 СОЛЕНОИД А — ВКЛ СОЛЕНОИД В – ВКЛ. НОМЕР ПЕРЕДАЧИ 2 СОЛЕНОИД А — ВЫК СОЛЕНОИД В – ВКЛ. НОМЕР ПЕРЕДАЧИ 3 СОЛЕНОИД А — ВЫК СОЛЕНОИД В – ВЫК. НОМЕР ПЕРЕДАЧИ 4 СОЛЕНОИД А — ВКЛ СОЛЕНОИД В – ВЫК .Соленоид блокировки гидротрансформатора включается от кнопки с возможностью сброса при переходе на другую передачу и невозможностью вкл на 1.2 передачи raptor-64@bk.ru

а как реализовать зависимые кнопки ? те при выборе любой из кнопок, выключается включенная.

Опрашиваете кнопки.
Если обнаружено изменение, то выполняете действие по нажатой, а остальным присваиваете значение «отжата».
Если на выходе светодиоды или что-то подобное, то даже с антидребезгом заморачиваться не надо.

на выходе реле через ULN2003 или ключ.

Выходы А1 и А2. От них через мосфеты ШИМ будет подан на инверсный вход DIM импульсного драйвера. В драйвере встроен силовой мосфет 1А. Нагрузкой будет 11красных и 7синих одноваттных светодиодов с максимальным током 350мА,
С помощью ШИМ я хочу изменять этот ток от 10 до 350мА. Такую задачу себе поставил.
Выбрал именно этот драйвер потому, что у него минимальная обвязка.
Сейчас я использую грубое изменение соотношения тумблерами, что увеличивает к-во проводов на светильниках, да и просто неудобно.
здесь видео моего бокса

А какое Arduino ? например, на Nano на этих выводах ШИМ получить штатными средствами не удастся.

Штатно ШИМ работает на выводах 3,5,6,9,10,11 выводах.

Я ошибся — просто забыл. А ведь в прошлом году пробовал командой
analogWrite(RED, brightness(100)); на #define RED 3 . r
Это значит те выводы, что обозначены DIGITAL ( PWM) -как в UNO ?
Тото не мог понять -осциллограф не фиксирует ШИМ ниже скважности 120 на аналоговом выходе А1.
Скоро попробую.
Но пока для меня главный вопрос по фиксации сигнала нажатой кнопки. Спасибо за науку!

Да. Что в Нано, что в Уно один и тот же камень стоит.

Вечером Вам скетч накидаю. На работе Arduino IDE не установлено.

А какое Arduino ? например, на Nano на этих выводах ШИМ получить штатными средствами не удастся.

Штатно ШИМ работает на выводах 3,5,6,9,10,11 выводах.

Только что проверил на УНО — все так! Любую скважность отрабатывает на 3 выходе.
Благодарю!

byte RED = 9, // выход синего канала — пин 9
BLUE = 10, // выход красного канала — пин 10
button1 = 5, // вход первой кнопки — пин 5
button2 = 6, // вход второй кнопки — пин 6
button3 = 7, // вход третьей кнопки — пин 7
buttonstate = 0,
b = 0,
r = 0;
void setup() <
// put your setup code here, to run once:
pinMode(RED, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(button3, INPUT);
>

void loop() <
// put your main code here, to run repeatedly:

while (!buttonstate) < // ожидаем нажатие кнопки или комбинации кнопок
buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4;
>
switch (buttonstate)
<
case 1: b = 255; r = 255; break; // если нажата кнопка 1, красный и синий по 100%
case 2: b = 82; r = 255 ; break; // если нажата кнопка 2, синий 30% и красный 100%
case 4: b = 255; r = 0; break; // если нажата кнопка 3, синий 100% и красный 0%
>
while (buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4); // ждем отпускания нажатой комбинации
analogWrite(RED, r); // включаем красный канал
analogWrite(BLUE, b); // включаем синий канал
>

Здорово и оригинально!
Мне еще нужно понять саму запись, я ведь не знаком отдельными командами. но суть понимаю так:
каждой кнопке свои параметры скважности
эта строка совсем непонятна:
while (buttonstate = digitalRead(button1) * 1 + digitalRead(button2) * 2 + digitalRead(button3) * 4);
Буду разбираться . Огромное спасибо!

В предыдущем цикле мы вычислили, какое сочетание кнопок было нажато. Записали его в переменную buttonstate. А в этом цикле мы сравниваем текущее состояние с запомненным. Как только оно изменится, считаем что кнопку отпустили.

Только что проверил на УНО — все так! Любую скважность отрабатывает на 3 выходе.
Благодарю!

Я сегодня соберу прототип заново. В том, что получится я даже не сомневаюсь.
Я понял, что пара switch и case — это условие. А можно было использовать if . else?

Можно. Но когда ветвлений больше двух, я предпочитаю использовать switch и case.
www.drive2.ru/b/456724211990266406/
тут я подробно эту конструкцию описывал.

Так я выращиваю рассаду под светодиодами

Уважаемый Albion76!
Очень нравятся Ваши доходчивые посты.
Благодаря Вам, стал интересоваться Ардуино и решил приучать внука 9лет к творчеству,
Я бывший радиолюбитель, современны схемы мне понятны, но программирование с трудом — память подводит. Решил я с внуком сделать диммируемую подсветку для рассады. Ардуино будет управлять двумя драйверами с помощью ШИМ. Один драйвер — мощные красные светодиоды 660нм, , второй синие- 440нм
Будет 3 режима, в смысле соотношения по яркости между красным и синим цветом, типа 1:1 . 3:1 и 0:1
Решил использовать 3 кнопки, Скетч составил, но взаимодействие между ними не могу сообразить, чтобы нажатие и фиксация одной кнопки сбрасывала предыдущее нажатие.
Если не трудно, подскажите пожалуйста как поправить. Благодарю заранее.

А как у Вас кнопки подключены физически?

обычное подключение: кнопка к плюсу, вход притянут 10кОм на землю.
При нажатии «1» есть, но фиксации нет ( просто не знаю как), Можно тумблер поставить, но все равно проблема исключения ситуации, когда включено два одновременно.
Проблема моя в незнании программирования. Учиться уже сложно в 70лет. Однако стараюсь копипастом.
На жесткой логике я могу собрать, но мне все равно нужна ардуинка с прицелом на расширение функций управления светильником- поддержание температуры, влажности и время свечения (таймер).

Драйверы я уже собрал на NCL30160. Но пока не опробовал

Отвык я уже от управления по единице. Обычно вход притягивают к U пит встроенным резистором, а кнопку цепляют между входом и массой. Внешний резистор в этом случае не нужен. Ну да ладно, это лирика…

Следующий вопрос: выходы красного и синего канала на какие пины вешаете? А1 и А2?

Как избавиться от дребезга контактов при подключении кнопки к Arduino

Мы уже рассматривали подключение кнопки к Arduino и затрагивали вопрос «дребезга» контактов. Это весьма неприятное явление, которое вызывает повторные нажатия кнопки и усложняет программную обработку нажатий кнопки. Давайте же поговорим о том, как избавиться от дребезга контактов.

Инструкция по гашению дребезга контактов с помощью Arduino

Для проекта нам понадобится:

  • Arduino UNO или иная совместимая плата;
  • тактовая кнопка;
  • резистор номиналом 10 кОм (рекомендую приобрести набор резисторов с номиналами от 10 Ом до 1 МОм);
  • светодиод (к примеру, вот из такого набора);
  • соединительные провода;
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1 Проявление эффекта «дребезга» контактов

«Дребезг» контактов – это явление, свойственное механическим переключателям, кнопкам, тумблерам и реле. Из-за того, что контакты обычно делают из металлов и сплавов, которые обладают упругостью, при физическом замыкании они не сразу устанавливают надёжное соединение. В течение короткого промежутка времени контакты несколько раз смыкаются и отталкиваются друг от друга. В результате этого электрический ток принимает установившееся значение не моментально, а после череды нарастаний и спадов. Длительность этого переходного эффекта зависит от материала контактов, от их размера и конструкции. На иллюстрации показана типичная осциллограмма при замыкании контактов тактовой кнопки. Видно, что время от момента переключения до установившегося состояния составляет несколько миллисекунд. Это и называется «дребезгом».

Так выглядит эффект дребезга контактов на осциллограммах

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

Этот эффект не заметен в электрических цепях управления освещением, двигателями или другими инерционными датчиками и приборами.

Но в цепях, где идёт быстрое считывание и обработка информации (где частоты того же порядка, что и импульсы «дребезга», или выше), это является проблемой. В частности, Arduino UNO, который работает на частоте 16 МГц, отлично ловит «дребезг» контактов, принимая последовательность единиц и нулей вместо единичного переключения от 0 к 1.

2 Подключение кнопки к Arduino для демонстрации подавления «дребезга»

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

Схема подключения кнопки к Arduino для демонстрации подавления эффекта «дребезга» контактов

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

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

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

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

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

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

4 Подавление дребезга контактовс помощью задержки

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

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

В данном скетче мы объявим процедуру debounce() («bounce» по-английски – это как раз «дребезг», приставка «de» означает обратный процесс), на вход которой мы подаём предыдущее состояние кнопки. Если нажатие кнопки длится более 5 мсек, значит это действительно нажатие. Определив нажатие, мы меняем состояние светодиода.

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

5 Библиотеки для подавлениядребезга контактов

Аналогичная функциональность обеспечивается специальными библиотеками, например, библиотекой Bounce2. Для установки библиотеки помещаем её в директорию /libraries/ среды разработки Arduino и перезапускаем IDE .

Читайте также:  Проверка проводки автомобиля мультиметром

Библиотека Bounce2 содержит следующие методы:

НазваниеНазначение
Bounce()инициализация объекта Bounce;
void interval (мсек)устанавливает время задержки в миллисекундах;
void attach (номерПина)задаёт вывод, к которому подключена кнопка;
int update()обновляет объект и возвращает true, если состояние пина изменилось, и false в противном случае;
int read()считывает новое состояние пина.

Перепишем наш скетч с использованием библиотеки. Можно также запоминать и сравнивать прошлое состояние кнопки с текущим, но давайте упростим алгоритм.

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

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

Подавление дребезга контактов с помощью Arduino

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

Контроль положения контактов 3-х позиционного переключателя с помощью ардуино

Здесь мы инвертируем значение, считанное с входного порта, путем использование логического НЕ, обозначаемого восклицательным знаком перед функцией digitalRead, так как при нажатой кнопке мы считываем 0, а для включения светодиода в порт нам нужно отправить 1.

Дребезг контактов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(1)

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

(2)

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

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

(3)

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

(4)

Пример расчета: пусть время дребезга для кнопки, подключаемой к микроконтроллеру составляет 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 или по ссылке ниже.

Category:Programs
Date:04.07.2015

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

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

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

Параметр stable interval библиотеки Bounce

в файле Bounce.h можно включить альтернативный метод борьбы с дребезгом. Этот метод позволяет быстрее реагировать на изменение состояния кнопки, однако, требует установить продолжительность дребезга, а эта величина, как я отметил выше увеличивается с течением времени, а значит, потребуется вносить изменения в код, либо установить заведомо большее значение.

Параметр lock-out interval библиотеки Bounce

Приведу пример использования этой библиотеки:

Включение светодиода кнопкой Ардуино

Ардуино кнопка и светодиод ► рассмотрим несколько примеров: включение и выключение светодиода от кнопки, управление яркостью и мигание светодиода Arduino.

Включение светодиода кнопкой Ардуино можно осуществить различными способами — можно управлять светодиодом одной или двумя кнопками, а можно плавно менять яркость светодиода. Рассмотрим, все варианты подключения кнопки и светодиода к плате Arduino Uno с примерами программ. Рассмотрев представленные скетчи, вы сможете использовать в своих проектах тактовые кнопки для управления Ардуино.

Подключение кнопки и светодиода к Ардуино


Включение и выключение светодиода кнопкой Ардуино производится с помощью подключения одной тактовой кнопки к цифровому пину без подтягивающего резистора. Дело в том, что платы Arduino имеют встроенные резисторы, которыми можно управлять. Для этого следует использовать в pinMode() параметр INPUT_PULLUP, которая сконфигурирует пин на вход с подтягивающим резистором.

Обратите внимание, что при использовании INPUT_PULLUP происходит подтяжка цифрового входа к 5 вольтам, поэтому значение входящего сигнала будет инвертирован. То есть, при отпущенной кнопке, которая подключена к заземлению — GND, на цифровом входе будет высокий сигнал. При нажатии на кнопку — на входе, который сконфигурирован с помощью INPUT_PULLUP, будет низкий сигнал.

Как подключить кнопку и светодиод к Ардуино

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • светодиод;
  • 2 резистора 220 Ом;
  • 2 тактовых кнопки;
  • провода «папа-папа».

Схема для включения/выключения светодиода кнопкой от Ардуино

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

Скетч. Управление светодиодом Ардуино через кнопку

Пояснения к коду:

  1. boolean — это глобальная переменная Ардуино, которая может принимать всего два значения – true (истина) и false (ложь);
  2. задержка delay(10); в программе позволяет избежать «дребезг контактов» кнопки и исключить ложное срабатывание.

Схема управления светодиодом двумя кнопками от Ардуино

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

Пояснения к коду:

  1. данный пример программы позволяет включать светодиод нажатием одной кнопки и выключать светодиод нажатием второй кнопки;
  2. задержка Ардуино delay(10); позволяет избежать «дребезг контактов» кнопки и исключить возможность ложного срабатывания.

Следующий пример тоже потребует для подключения к Ардуино две кнопки, два светодиода, как на предыдущей схеме. Но вместо простого включения/выключения диода, мы будем увеличивать и уменьшать яркость светодиода с помощью ШИМ сигнала микроконтроллера. Загрузите пример программы для «Светодиод и кнопка Ардуино ШИМ», чтобы получить понятие о принципе работы кнопки с Arduino Uno.

Скетч. Управление яркостью светодиода кнопкой Ардуино

Пояснения к коду:

  1. для подключения светодиода следует использовать пин с ШИМ модуляцией;
  2. начальное значение яркости int brightness равен ста, в программе прирост и уменьшение яркости (20) можно поменять по своему усмотрению.

Заключение. Мы рассмотрели сразу несколько примеров для управления светодиодом Ардуино с помощью кнопки. Вы узнали, что светодиодом можно управлять с помощью одной кнопки, или производить включение/выключение двумя кнопками. Кроме того, можно менять яркость с помощью кнопки и ШИМ сигнала. Все рассмотренные примеры можно использовать в различных проектах на Arduino для начинающих.

Подключение кнопки к ардуино

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

Кнопка ардуино

Кнопка (или кнопочный переключатель) – самый простой и доступный из всех видов датчиков. Нажав на нее, вы подаете контроллеру сигнал, который затем приводит к каким-то действиям: включаются светодиоды, издаются звуки, запускаются моторы. В своей жизни мы часто встречаемся с разными выключателями и хорошо знакомы с этим устройством.

Тактовые кнопки и кнопки-переключатели

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

Что такое кнопка? По сути, это достаточно простое устройство, замыкающее и размыкающее электрическую сеть. Выполнять это замыкание/размыкание можно в разных режимах, при этому фиксировать или не фиксировать свое положение. Соответственно, все кнопки можно поделить на две большие группы:

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

Вариантов различных кнопок великое множество, это действительно один из самых распространенных видов электронных компонентов.

Кнопки ардуино для простых проектов

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

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

Для удобства работы в комплекте с тактовой кнопкой обычно идет пластмассовый колпачок какого-то цвета, он достаточно очевидно надевается на кнопку и придает проекту менее хакерский вид.

Подключение кнопки Ардуино

Включение и выключение светодиода с помощью кнопки

Давайте начнем с самого простого способа подключения тактовой кнопки. Рассмотрим схему с Arduino в качестве источника питания, светодиода, ограничительного резистора номиналом 220 Ом и кнопки, которая будет замыкать и размыкать цепь.

При подключении кнопки с двумя парами ножек важно правильно выбрать размыкающие контакты. Посмотрите на изображение внимательно: пары ножек расположены по бокам кнопки. Сама кнопка квадратная, но расстояния между парами контактов визуально заметны: можно сразу выделить два на одной стороне и два а другой. Так вот, именно между одной «парой» на стороне и будет реализован выключатель. Для включения в схему мы соединяемся с одним и с другим контактом, между которыми минимальное расстояние. Вторая пара контактов просто дублирует первую.

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

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

Подключение кнопки с подтягивающим резистором

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

В скетче мы будем отслеживать факт нажатия и выводить сообщение в монитор порта. Более интересный пример и подробное объяснение самой схемы мы приведем чуть позже.

Следует обратить внимание на сопротивление 10 К, которое мы добавили в этой схеме. Более подробно о его предназначении мы поговорим позже, просто имейте в виду, что такой резистор необходим для правильной работы схемы.

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

Подключение кнопки в режиме INPUT_PULLUP

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

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

И все. Можно собрать вот такую сложную схему и работать с кнопкой в скетче.

Мигание светодиода после нажатия на кнопку

В предыдущем примере со светодиодами мы подключили кнопку к плате ардуино и поняли, как она работает. Светодиод включался и выключался, но делал это в совершенно пассивном режиме – сам контроллер здесь был абсолютно лишним, его можно было бы заменить батарейками. Поэтому давайте сделаем наш новый проект более «интеллектуальным»: при нажатии на кнопку заставим светодиод непрерывно мигать. Обычной схемой с лампочкой и выключателем этого уже не сделаешь – мы будем использовать мощь нашего микроконтроллера для решения этой пусть и простой, но не тривиальной задачи.

Полная схема проекта изображена на рисунке:

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

Нажимаем и держим – светодиод мигает. Отпускаем – он гаснет. Именно то , что хотели. Хлопаем от радости в ладоши и приступаем к анализу того, что сделали.

Давайте посмотрим на скетч. В нем мы видим довольно простую логику.

  1. Определяем, нажата ли кнопка.
  2. Если кнопка не нажата, то просто выходим из метода loop, ничего не включая и не меняя.
  3. Если кнопка нажата, то выполняем мигание, используя фрагмент стандартного скетча:
    1. Включаем светодиод, подавая напряжение на нужный порт
    2. Делаем нужную паузу при включенном светодиоде
    3. Выключаем светодиод
    4. Делаем нужную паузу при выключенном светодиоде

Логика поведения кнопки в скетче может зависеть от способа подключения с подтягивающим резистором. Об этом мы поговорим в следующей статье.

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

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

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

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

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

Переключение режимов с помощью кнопки

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

Факт нажатия мы определяем с помощью функции digitalRead(). В результате мы получим HIGH (1, TRUE) или LOW(0, FALSE), в зависимости от того, как подключили кнопку. Если мы подключаем кнопку с помощью внутреннего подтягивающего резистора, то нажатие кнопки приведет к появлению на входе уровня 0 (FALSE).

Для хранения информации о нажатии на кнопку можно использовать переменную типа boolean:

boolean keyPressed = digitalRead(PIN_BUTTON)==LOW;

Почему мы используем такую конструкцию, а не сделали так:

boolean keyPressed = digitalRead(PIN_BUTTON);

Все дело в том, что digitalRead() может вернуть HIGH, но оно не будет означать нажатие кнопки. В случае использования схемы с подтягивающим резистором HIGH будет означать, что кнопка, наоборот, не нажата. В первом варианте (digitalRead(PIN_BUTTON)==LOW ) мы сразу сравнили вход с нужным нам значением и определили, что кнопка нажата, хотя и на входе сейчас низкий уровень сигнала. И сохранили в переменную статус кнопки. Старайтесь явно указывать все выполняемые вами логические операции, чтобы делать свой код более прозрачным и избежать лишних глупых ошибок.

Как переключать режимы работы после нажатия кнопки?

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

Логика работы программы очень проста:

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

Как определить нажатие нескольких кнопок?

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

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector