Текущее время: 12 дек 2017, 08:51

Часовой пояс: UTC + 10 часов




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: ARDUINO Подавление дребезга
СообщениеДобавлено: 30 апр 2013, 13:56 
Не в сети
Аватар пользователя

Зарегистрирован: 10 янв 2012, 08:31
Сообщений: 34
Откуда: Хабаровск
Благодарил (а): 0 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Подавляем дребезг кнопки с библиотекой Arduino Bounce

Дребезг контактов - крайне неприятная вещь, от которой нужно избавляться. Можно это делать софтверно. К счастью, нам не придется самостоятельно ручками писать алгоритм в Arduino IDE, поскольку для нас разработчики уже написали библиотеку. Знакомимся с Bounce.

Дребезг

Когда мы нажимаем на кнопку, мы ожидаем от нее, что она нам что-то включит, и это будет радостно работать. То есть сигнал будет вести себя так:
Вложение:
01.png
01.png [ 2.01 KiB | Просмотров: 164566 ]

Но все далеко не так радужно. Из-за дребезга при нажатии кнопки сигнал ведет себя вот так:
Вложение:
02.png
02.png [ 4.44 KiB | Просмотров: 164566 ]

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

Дребезг можно подавлять как хардверно, так и софтверно. Распространены два программных алгоритма подавления дребезга.
Тупой алгоритм заключается в простой задержке срабатывая на несколько сот микросекунд после нажатия кнопки. Этот алгоритм тормозной и не исключает случайного нажатия.
Продвинутый алгоритм считает время нахождения кнопки в положении "нажато". Если это время больше некоторого значения, то кнопка считается действительно нажатой. Как только кнопка меняет свое состояние, счетчик обнуляется.
С Arduino нам можно не размышлять об этом, а использовать библиотеку Bounce.
Библиотека Bounce
Библиотека Bounce предназначена для подавления дребезга. Она предоставляет нам в пользование замечательный класс Bounce, в котором мы можем создавать объекты.

Сам объект выглядит так:
Bounce (byte pin, unsugned long debounce_interval),
где pin - это номер пина Arduino, на котором сидит кнопка, а debounce_interval - время дребезга.

Полезные функции в этом классе:

int update() - проверка смены состояния, возвращает 1, если состояние пина изменилось;
void interval(unsigned long interval) - изменяет время дребезга (в мс);
int read() - читает состояние пина;
void write(int state) - устанавливает значение пина;
void rebounce(unsignet long interval) - заставляет пин менять состояние через промежуток времени, указанный в interval, даже если на самом деле оно не меняется;
unsigned long duration(void) - возвращает время в мс, в которое пин был в текущем состоянии;
bool risingEdge() - возвращает 1 во время первого чтения, если состояние пина сменилось с 0 на 1;
bool fallingEdge() - возвращает 1 во время первого чтения, если состояние пина сменилось с 1 на 0.

Библиотечку качаем отсюда. Распаковываем это безобразие в Папку_Arduino/libraries.

Собираем схему

Кнопка при нажатии соединяет две ее левые ноги с двумя правыми. Левую ее ногу посадим на +5V, а правую подключим к пину 2. Пин 2 также должен быть притянут к земле через резистор. Светодиод подключаем к пину 8 (мне просто так захотелось) через ограничивающий резистор.
Вложение:
03.png
03.png [ 90.8 KiB | Просмотров: 164566 ]

Пишем скетч

//подключаем библиотеку Bounce
#include <Bounce.h>
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 2
#define LED 8
//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,5);

//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;

void setup() {
//определяем режимы работы пинов
pinMode(BUTTON,INPUT);
pinMode(LED,OUTPUT);
}

void loop() {
//если сменилось состояние кнопки
if ( bouncer.update() ) {
//если считано значение 1
if ( bouncer.read() == HIGH) {
//если свет был выключен, будем его включать
if ( ledValue == LOW ) {
ledValue = HIGH;
//если свет был включен, будем выключать
} else {
ledValue = LOW;
}
//записываем значение вкл/выкл на пин со светодиодом
digitalWrite(LED,ledValue);
}
}
}


Автор: Nestor Oak
Источник


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 10 часов


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB