Ардуино: кнопки

Кнопка — всем известное механическое устройство, которое может замыкать и размыкать электрическую цепь по желанию человека. Есть множество видов кнопок, работающих по разным правилам. Например, тактовая кнопка (push button), используемая в этом уроке, замыкает цепь только пока палец давит на неё. Кнопка на размыкание, напротив, разрывает цепь при нажатии.

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

button_6

Тактовые кнопки, можно найти практически в каждом электронном приборе: в клавиатуре компьютера, в телефоне, в пульте от телевизора, и т.д.

button_5

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

button_2

Или другой вариант — большие кнопки для экстренной остановки оборудования. Они окрашены в яркие цвета, чтобы привлекать внимание человека. По сути — обычные тактовые кнопки на размыкание, или кнопки с фиксацией.

button_4

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

Подключение кнопки

Итак, мы будем работать с самой простой тактовой кнопкой, которую попробуем подключить к Ардуино Уно. Обычно, при работе с беспаечными макетными платами используется кнопка с выводами под пайку. На фото в начале урока видно, что у такой кнопки есть четыре немного загнутых вывода. Есть кнопки и с двумя прямыми выводами, они тоже подходят для наших занятий.

На электрических схемах кнопка изображается так:

button_sh_2

Если посмотреть внутрь четырехтактной кнопки, то можно увидеть вот такую схему:

Схема тактовой кнопки с четырьмя контактами

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

А вот так выглядит схема двухконтактной кнопки.

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

С этой кнопкой сложно запутаться: два контакта, которые соединяются при нажатии кнопки.

На макетной плате оба типа тактовых кнопок обычно ставятся следующим образом:

Тактовые кнопки на макетной плате

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

button_схема

Полученная схема выполняет нехитрую функцию: нажимаем на кнопку — светодиод зажигается, отпускаем — гаснет.

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

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

Принципиальная схема

Схема подключения кнопки к Ардуино

Внешний вид макета

Схема подключения кнопки к Ардуино

На этой схеме мы видим уже привычную цепь для зажигания светодиода. Также видим кнопку, соединенную с выводом Ардуино №3. Здесь может вполне резонно возникнуть вопрос: зачем мы соединили кнопку ещё и с землей, через резистор 10кОм? Чтобы разобраться с этим вопросом, представим что мы подключили кнопку по «наивной» схеме без всяких дополнительных резисторов.

button_sh_3

Здесь между выводом №3 и землей изображен небольшой конденсатор, который способен накапливать заряд. Такая особенность есть у многих микроконтроллеров.

Теперь представим, что мы замыкаем кнопку. Ток начинает бежать от +5В, прямиком в контакт №3, попутно заряжая ёмкость. Ардуино успешно регистрирует нажатие кнопки. Но после того, как мы убираем палец с тактовой кнопки, вопреки нашим ожиданиями, микроконтроллер продолжает считать что кнопка нажата! Еще бы, ведь заряженный конденсатор постепенно отдает накопленный заряд в ногу №3. Это будет продолжаться до тех пор, пока ёмкость не разрядится ниже уровня логической единицы.

Чтобы такого не случилось и нужен так называемый стягивающий резистор (или подтягивающий к земле). При замыкании кнопки ток пойдет по пути наименьшего сопротивления, то есть на вывод №3. А вот как только кнопка будет отжата, паразитная ёмкость мгновенно разрядится на землю, через резистор.

Подключение модуля тактовых кнопок ROC к Ардуино

Специально для ваших проектов мы в RobotClass сделали модуль из двух тактовых кнопок. На модуле уже есть необходимые резисторы и даже два светодиода для индикации нажатия кнопок.

Модуль тактовых кнопок ROC

Разберемся с подключением этого модуля к Ардуино Уно.

Принципиальная схема

Схема подключения модуля тактовых кнопок ROC

Внешний вид макета

Схема подключения модуля тактовых кнопок ROC

Как можно было заметить, независимо от того, какие всё-таки кнопки мы будем использовать — схема подключения не сильно меняется. Не будет менять и программа для работы с ними.

Программа для работы с кнопкой на Ардуино

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

digitalRead( номер_контакта );

Эта функция возвращает логическое значение, которое Ардуино считала с заданного контакта. Это означает, что если на контакт подать напряжение +5В, то функция вернет истину*. Если контакт соединить с землей, то получим значение ложь. В языке C++, истина и ложь эквивалентны числам 1 и 0 соответственно.

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

pinMode( номер_контакта, INPUT );

Наконец, соберем всё вместе, и напишем программу.

const int led = 2;
const int button = 3;
int val = 0;

void setup(){
    pinMode( led, OUTPUT );
    pinMode( button, INPUT );
}

void loop(){
    // записываем в переменную val состояние кнопки 
    val = digitalRead( button );
    // если состояние кнопки - истина, выполняем действие
    if( val == HIGH ){
        // цикл от 0 до 2, с шагом 1
        for( int i=0; i<3; i++ ){
            digitalWrite( led, HIGH );
            delay( 500 );
            digitalWrite( led, LOW );
            delay( 500 );
        }
    }
}

Загружаем программу на Ардуино Уно, и проверяем работу программы. Если всё сделано правильно, должно получиться как на картинке:

button_led_300

Ну вот и всё. Теперь мы можем управлять нашими устройствами при помощи кнопок. Если вы уже прошли урок по подключению ЖК дисплея, то мы вполне сможем сделать часы с будильником!

Программа для кнопки-триггера

Еще один пример, заслуживающий внимания — кнопка-триггер. Работает она так: один раз нажали кнопку — светодиод загорелся, второй раз нажали — потух.

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

const int led = 2;
const int button = 3;
int val = 0;
byte state = 0; // переменная состояния
void setup(){
    pinMode( led, OUTPUT );
    pinMode( button, INPUT );
}
void loop(){
    // записываем в переменную val состояние кнопки 
    val = digitalRead( button );
    // если состояние кнопки - истина, выполняем действие
    if( val == HIGH ){
        // меняем состояние на противоположное
        state = !state;
        if( state == HIGH ){
            // если текущее состояние - истина, зажигаем светодиод
            digitalWrite( led, HIGH );
        } else {
            // если текущее состояние - ложь, гасим светодиод
            digitalWrite( led, LOW );
        }
        delay( 300 );
    }
}

Загружаем программу на Ардуино и проверяем работу схемы. Быстро нажмем кнопку — светодиод зажжется. Снова нажмем — погаснет. А вот если нажать кнопку и не отпускать, то светодиод начнет мигать с периодом 600мс! Почему так? Попробуйте разобраться.

Задания

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

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

Изменено:

Ардуино: кнопки: 6 комментариев

    • for( int i=0; i<3; i++ ){
      digitalWrite( led, HIGH );
      delay( 500 );
      digitalWrite( led, LOW );
      delay( 500 );
      }
      Это цикл. Означает, что всё, что находится между {…} повторится 3 раза

  1. Всем привет и хорошего настроения. Большое спасибо за полезные советы и учения.
    Помогите пожалуйста мне написать простой скетч примером :
    (для каждой кнопки свой пин и для светодиодов тоже)
    Нажата кн1 горит светодиод1
    (отпускаем не горит)
    Нажата кн2 горит светодиод 2
    (отпускаем не горит)
    При нажатии двух кнопок оба светодиода потухают
    Или второй вариант
    Первая нажатая кнопка блокирует вторую или наоборот.
    Тоесть защита от двойного включения кнопок на кранбалках или каких-то реверсах (нельзя чтобы горели два светодиода одновременно!!!)

    • А не проще вам просто использовать кнопки с двумя ппрами контактов? Одна пара NO другая NC.

      • Или второй вариант. На самих пускателях, если есть доп контакты, собрать схему так что если первый пускатель включен, то через его доп контакт питание на второй не пойдет.

Добавить комментарий для Алекс Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.