Кнопку к Arduino можно подключить двумя способами. Первый способ описан в комментарии к скетчу Button в меню Examples->Digital.

Схема:

arduino button1

В данном случае, когда кнопка не нажата, то её контакты разомкнуты, и на входе Digital 2 логический ноль. Если кнопку нажать, контакты замкнутся, и на входе Digital 2 появится напряжение +5В, соответствующее логической единице.

Второй способ подключения отличается от первого тем, что кнопка подключается к земле, а резистор к источнику напряжения +5В:

arduino button2

В данном случае резистор выполняет функцию подтягивающего (pull-up) резистора, "подтягивающего" напряжение на входе Digital 2 до уровня +5В (логическая единица). При замыкании контактов кнопки потенциал на выводе Digital 2 становится равным потенциалу земли (0 вольт), и таким образом на входе Digital 2 единицу сменяет логический ноль.

Можно заметить, что в первом случае резистор также выполняет функцию подтягивающего резистора, только подтягивает он напряжение на входе микроконтроллера не вверх (pull-up), а к земле (pull-down). Если бы резистора не было, то напряжение на входе "гуляло" бы, ловя статическое напряжение в атмосфере, как это происходит, если оставить вход Gate полевого транзистора не подключенным.

В коде скетча Button вызовом функцим pinMode() с аргументом INPUT вывод Digital 2 переводится в режим ввода, и вызовом функции digitalRead() производится опрос текущего состояния кнопки.

Надо заметить, что в скетче Button не учитывается так называемый дребезг контактов, который проявляется в том, что при нажатии на кнопку контакты физически приближаются друг к другу, и на некотором расстоянии разность потенциалов на контактах начинает пробивать электрическое сопротивление воздуха. Происходит это очень быстро - кнопку вполне достаточно опрашивать с частотой в 32 Гц, в то время как функция loop() без задержки вызывается возможно в тысячу, а то и в десятки тысяч раз чаще. Для сравнения - микроконтроллер Arduino, работая на частоте 16 МГц, может выполнить 32 раза в секунду по 500000 команд.

Несложно добавить в конце функции loop() вызов функции delay() для организации задержки в 31 мс:

void loop(){
   ... // Код функции
   delay(31);
}

Если использовать большое время задержки, например 3000 мс (3 сек.), то нажимая на кнопку можно заметить, как микроконтроллер не сразу реагирует на нажатия - кнопку приходится нажимать и ждать, пока сработает, потому что иначе он просто не замечает нажатия, будучи занят ожиданием окончания выполнения функции delay().

Добавить комментарий


Защитный код
Обновить