Подключение кнопки к Arduino. Подключение кнопки запуска компьютера к «материнке Как работают тактовые кнопки в плеере

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

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

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

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

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

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

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






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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* Пример использования тактовой кнопки в ардуино. Кнопка подключена к пину 2. */ const int PIN_BUTTON = 2; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); } void loop() { // Получаем состояние кнопки и выводим в мониторе порта int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); delay(50); }

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

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

PinMode(PIN_BUTTON, INPUT_PULLUP);

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

PinMode(PIN_BUTTON, INPUT_PULLUP); digitalWrite(PIN_BUTTON, HIGH);

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

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

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

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

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

/* Скетч для схемы с использованием тактовой кнопки и светодиода Светодиод мигает, пока нажата кнопка. Кнопка подтянута к земле, нажатию соответствует HIGH на входе */ const int PIN_BUTTON = 2; const int PIN_LED = 13; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); } void loop() { // Получаем состояние кнопки int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); // Если кнопка не нажата, то ничего не делаем if (!buttonState) { delay(50); return; } // Этот блок кода будет выполняться, если кнопка нажата // Мигаем светодиодом digitalWrite(PIN_LED, HIGH); delay(1000); digitalWrite(PIN_LED, LOW); delay(1000); }

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

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

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

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

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

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

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

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

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

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

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

    Некоторые кнопки после нажатия оставляют проводники соединёнными (фиксирующиеся кнопки ), другие - сразу же после отпускания размыкают цепь (нефиксирующиеся кнопки ).

    Также кнопки делят на:

    • нормально разомкнутые ,
    • нормально замкнутые .
    Первые при нажатии замыкают цепь, вторые - размыкают.

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

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

    Кнопка - очень простое и полезное изобретение, служащее для лучшего взаимодействия человека и техники. Но, как и всё в природе, она не идеальна. Проявляется это в том, что при нажатии на кнопку и при её отпускании возникает т.н. «дребезг» ("bounce" по-английски). Это многократное переключение состояния кнопки за короткий промежуток времени (порядка нескольких миллисекунд), прежде чем она примет установившееся состояние. Это нежелательное явление возникает в момент переключения кнопки из-за упругости материалов кнопки или из-за возникающих при электрическом контакте микроискр.


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

    3 Некорректное подключение кнопки

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


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

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

    Сначала подключим к Arduino кнопку по схеме с подтягивающим резистором. Для этого один контакт кнопки соединим с землёй, второй - с цифровым выходом "2". Цифровой выход "2" также подключим через резистор номиналом 10 кОм к питанию +5 В.


    Напишем вот такой скетч для обработки нажатий на кнопку и загрузим в Arduino.

    // Задаём номера выводов: const int buttonPin = 2; const int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { int buttonState = digitalRead(buttonPin); // считываем состояние кнопки if (buttonState == HIGH) { digitalWrite(ledPin, HIGH); // зажигаем светодиод при нажатии кнопки } else { digitalWrite(ledPin, LOW); // гасим светодиод при отпускании кнопки } }

    Встроенный светодиод на выводе "13" постоянно горит, пока не нажата кнопка. Т.е. на порте "2" Arduino всегда присутствует высокий логический уровень HIGH. Когда нажимаем кнопку, напряжение на "2" порте принимает состояние LOW, и светодиод гаснет.

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

    Теперь соберём схему со стягивающим резистором. Один контакт кнопки соединим с питанием +5 В, второй - с цифровым выходом "2". Цифровой выход "2" подключим через резистор номиналом 10 кОм к земле. Скетч менять не будем.


    При включении схемы на цифровом порте "2" Arduino низкий уровень LOW, и светодиод не горит. При нажатии на кнопку на порт "2" поступает высокий уровень HIGH, и светодиод загорается.

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

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

    Подключим кнопку без использования контроллера, пропустив ток из 5V . При нажатии кнопки цепь замкнётся и светодиод будет светиться. Ничего неожиданного.

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

    Int buttonPin = 12; int ledPin = 3; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); } void loop() { bool val = digitalRead(buttonPin); digitalWrite(ledPin, val); }

    Код прекрасно работает при нажатии кнопки. А когда мы отпускаем кнопку и создаём разрыв в цепи, то возникает проблема. Вывод 12 становится свободным и висит в неопределённом состоянии в режиме INPUT (вспоминаем урок про цифровые выводы). В результате мы получаем случайные значения и светодиод то включается, то выключается от наводок.

    Чтобы избежать этой проблемы, можно добавить резистор от 10 до 100 кОм и прижать кнопку к земле. В этом случае цепь будет замкнута даже при отпущенной кнопке. В этом случае резистор называют стягивающим (pull down). Это рабочая схема, которую можно использовать в учебной программе.

    Несмотря на рабочую схему с стягивающим резистором, мы получаем проблему при работе со сложным проектом. Дело в том, что возможна ситуация, когда многие устройства в схеме используют разные значения питания. И тогда придётся к каждой кнопке устройства подавать свой отдельный стягивающий резистор. На практике принято подключаться не к питанию, а к земле, которая всегда одинакова и равно 0. В этом случае сам резистор следует подключить к питанию - подтянуть. Резистор в этом случае является подтягивающим (pull up). Правда, при этом возникает другая проблема - поведение светодиода изменилось противоположным образом - при нажатии светодиод выключается, а при отпускании - включается. Решается проблема просто - меняем одну строчку кода.

    DigitalWrite(ledPin, !val);

    Мы просто меняем значение переменной на противоположное. Это стандартный подход при работе с кнопкой. Теперь вам будет легче разобраться с примерами из Arduino IDE.

    Стоит отметить, что у платы Arduino у выводов уже есть встроенные подтягивающие резисторы (кроме вывода 13) и мы можем убрать внешний резистор. Но тогда надо также явно указать использование данного резистора через код с параметром INPUT_PULLUP .

    Int buttonPin = 12; int ledPin = 3; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { bool val = digitalRead(buttonPin); digitalWrite(ledPin, !val); delay(100); }

    01.Basics: DigitalReadSerial (Чтение цифрового вывода)

    Изучим пример DigitalReadSerial из File | Examples | 01.Basics .

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

    Приблизительно собранная схема может выглядеть следующим образом:

    Вкратце опишу на словах данную схему. Вставляем в центре макетной платы кнопку таким образом, чтобы между парными ножками проходил жёлоб макетной платы. Далее соединяем перемычками питание 5V и землю GND на Arduino с рельсами на макетной плате. Потом соединяем перемычкой цифровой вывод под номером 2 на Arduino с одной ножкой кнопки на макетной плате. Эту же ножку кнопки, но с другой стороны соединяем с резистором, который выполняет роль стягивающего резистора . После чего сам резистор соединяем с землёй. Третью ножку кнопки соединяем к положительной рельсе на макетной плате. Осталось только соединить между собой боковые рельсы на макетной плате, и мы готовы изучать новый пример.

    Кнопка выполняет очень важную функцию - она замыкает цепь при нажатии. Когда кнопка не нажата, то ток не проходит между ножками кнопки, и не можем поймать сигнал с цифрового вывода под номером 2. Поэтому состояние вывода определяется системой как LOW или 0. При нажатии на кнопку его две ножки соединяются, позволяя току пройти от питания к цифровому выводу 2, а система считывает проходящий сигнал как HIGH или 1.

    Разберём код по кусочкам

    // Второй вывод связан с кнопкой int pushButton = 2; void setup() { Serial.begin(9600); pinMode(pushButton, INPUT); } void loop() { int buttonState = digitalRead(pushButton); Serial.println(buttonState); delay(1); // задержка для стабильности }

    В функции setup() устанавливаем связь с портом для считывания данных на скорости 9600 бит в секунду с Arduino на ваш компьютер: Serial.begin(9600) .

    Вторая строчка нам уже знакома, но здесь теперь используется параметр INPUT - мы устанавливаем второй цифровой вывод на режим чтения данных, поступающих с кнопки: pinMode(pushButton, INPUT);

    В цикле считываем поступающую информацию. Для начала нам понадобится новая переменная buttonState , которая будет содержать значения 0 или 1, поступающие от функции digitalRead() .

    Чтобы мы могли видеть поступающую информацию, нужно вывести получаемые результаты в окно Serial Monitor при помощи команды println() .

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

    Если вы сейчас запустите программу и откроете также окно Serial Monitor (меню Tools | Serial Monitor ), то на экране увидите бесконечные нули. Программа постоянно опрашивает состояние нашей конструкции и выводит результат - отсутствие тока. Если нажать на кнопку и удерживать её, то увидите, что цифры сменяются с 0 на 1. Значит в нашей цепи появился ток и информация изменилась.

    02.Digital: Button

    Работа с кнопкой рассматривается также в примере File | Examples | 02.Digital | Button . Кнопка соединяется с выводом 2, а светодиод с выводом 13. К кнопке также следует подвести питание и землю через резистор на 10K. Сам принцип работы остался без изменений. Только на этот раз мы не будем выводить информацию о состоянии кнопки на экран, а будем включать светодиод. Такой вариант более наглядный. При нажатии и отпускании кнопки встроенный светодиод должен загораться или гаснуть.

    Const int buttonPin = 2; // вывод для кнопки const int ledPin = 13; // вывод для светодиода int buttonState = 0; // статус кнопки - нажата или отпущена void setup() { // режим вывода для светодиода pinMode(ledPin, OUTPUT); // режим ввода для кнопки pinMode(buttonPin, INPUT); } void loop() { // считываем состояние кнопки buttonState = digitalRead(buttonPin); // если кнопка нажата, то её состояние HIGH: if (buttonState == HIGH) { // включаем светодиод digitalWrite(ledPin, HIGH); } else { // иначе выключаем светодиод digitalWrite(ledPin, LOW); } }

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

    If (buttonState == LOW)

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

    Нужно поменять полярность цепи! Провод от резистора, который на землю, нужно воткнуть в 5V, а провод, который шёл из 5V к кнопке, перекинуть на землю. При включении ток пойдёт из питания на вывод 2 без всяких помех и будет получено значение HIGH . При нажатии кнопки получится другая цепь, и вывод 2 останется без питания.

    02.Digital: StateChangeDetection

    В примере File | Examples | 02.Digital | StateChangeDetection идёт подсчёт щелчков кнопки и состояние кнопки (включён или выключен). Схема осталась прежней. Кнопка соединяется с выводом 2, а светодиод с выводом 13 (можно использовать встроенный). К кнопке также следует подвести питание и стягивающий резистор к земле на 10K.

    Const int buttonPin = 2; // кнопка на выводе 2 const int ledPin = 13; // светодиод на выводе 13 int buttonPushCounter = 0; // счётчик нажатия кнопки int buttonState = 0; // текущее состояние кнопки int lastButtonState = 0; // предыдущее состояние кнопки void setup() { // устанавливаем режим ввода для кнопки pinMode(buttonPin, INPUT); // устанавливаем режим вывода для светодиода pinMode(ledPin, OUTPUT); // включаем последовательную передачу данных Serial.begin(9600); } void loop() { // считываем показания с вывода кнопки buttonState = digitalRead(buttonPin); // сравниваем состояние с предыдущим состоянием if (buttonState != lastButtonState) { // если состояние изменилось, увеличиваем счётчик if (buttonState == HIGH) { // если текущее состояние HIGH, значит кнопка включена buttonPushCounter++; Serial.println("on"); Serial.print("number of button pushes: "); Serial.println(buttonPushCounter); } else { // если текущее состояние LOW, значит кнопка выключена Serial.println("off"); } // небольшая задержка для устранения эффекта дребезга delay(50); } // сохраняем текущее состояние как последнее состояние для следующего раза lastButtonState = buttonState; // включаем светодиод при каждом четвёртом нажатии, проверяя деление по остатку счётчика нажатий if (buttonPushCounter % 4 == 0) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }

    02.Digital: Debounce (Дребезг)

    У кнопок существует такой эффект, как "дребезг". При замыкании и размыкании между пластинами кнопки возникают микроискры, провоцирующие до десятка переключений за несколько миллисекунд. Явление называется дребезгом (англ. bounce). Это нужно учитывать, если необходимо фиксировать «клики». Поэтому первичным показаниям верить нельзя. По этой причине часто в скетчах делают небольшую задержку, а уже потом считывают показания. В обычном состоянии, когда мы не нажимаем кнопку или держим кнопку нажатой, эффекта дребезга не наблюдается. Иногда для этих целей в учебных примерах используют функцию delay() , но на практике следует использовать функцию millis() , как в примере File | Examples | 02.Digital | Debounce . Схема подключения остаётся без изменений.

    Const int buttonPin = 2; // кнопка на выводе 2 const int ledPin = 13; // светодиод на выводе 13 int ledState = HIGH; // текущее состояние светодиода int buttonState; // текущее состояние вывода для кнопки int lastButtonState = LOW; // предыдущее состояние вывода для кнопки // используем тип без знака, чтобы использовать большие числа unsigned long lastDebounceTime = 0; // последнее время unsigned long debounceDelay = 50; // задержка, увеличьте в случае необходимости void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); } void loop() { // считываем состояние кнопки int reading = digitalRead(buttonPin); // если нажали кнопку, // то немного ожидаем, чтобы исключить дребезг // если состояние изменилось (дребезг или нажатие) if (reading != lastButtonState) { // сбрасываем таймер lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it"s been there for longer than the debounce // delay, so take it as the actual current state: // если состояние кнопки изменилось if (reading != buttonState) { buttonState = reading; // переключаем светодиод, если новое состояние кнопки стало HIGH if (buttonState == HIGH) { ledState = !ledState; } } } // устанавливаем светодиод digitalWrite(ledPin, ledState); // сохраняем состояние кнопки. В следующий раз в цикле это станет значением lastButtonState: lastButtonState = reading; }

    02.Digital: DigitalInputPullup (Встроенный подтягивающий резистор)

    У цифровых выводов уже есть резисторы на 20 кОм, которые можно использовать в качестве подтягивающих при работе с кнопками. Рассмотрим пример File | Examples | 02.Digital | DigitalInputPullup .

    Схема подключения - соединим первый вывод кнопки с выводом 2 на плате, а второй вывод кнопки с выводом GND . Во время работы скетча будем считывать показания второго вывода.

    Void setup() { Serial.begin(9600); // настроим вывод 2 на режим ввода и включим встроенный подтягивающий резистор pinMode(2, INPUT_PULLUP); pinMode(13, OUTPUT); // светодиод } void loop() { // снимаем показания кнопки int sensorVal = digitalRead(2); // выводим в Serial Monitor Serial.println(sensorVal); // Помните, что при использовании подтягивающего к питанию резистора, состояние кнопки инвертировано // В не нажатом состоянии кнопка имеет значение HIGH, и LOW при нажатии. // При нажатии на кнопку включим светодиод, при отпускании - выключим if (sensorVal == HIGH) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } }

    Если запустить скетч, то увидим, что на монитор выводятся числа 1 (HIGH ). При нажатии на кнопку значения поменяются на 0 (LOW ).

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

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

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

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

    Когда все «железо» скомпоновано, предстоит соединить с материнской платой сам корпус системного блока. На него выведены важные элементы управления и контрольные индикаторы.

    Речь идет о кнопках включения питания (Power) и принудительной перезагрузки ПК (Reset), а также об индикаторах питания и работы жесткого диска.

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

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

    • Power SW (Power Switch) - разъем, который идет от кнопки питания (Power). Нажатием на эту кнопку запускается компьютер;
    • Reset SW (Reset Switch) - разъем, идущий от кнопки принудительной перезагрузки компьютера;
    • Power Led - коннектор индикатора включения/выключения ПК;
    • HDD Led - провод, идущий от индикатора состояния жесткого диска ПК;
    • SPEAKER - разъем для подключения системного динамика («пищалки»);
    • HD Audio - микрофон и наушники;
    • USB - коннектор USB-разъема.

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

    Для правильного подключения кнопок Power и Reset к материнской плате нужно иметь под рукой инструкцию. На схеме платы необходимо найти информацию о месте расположения блока контактов.

    В большинстве случаев производители обозначают его как «F_Panel», «Front Panel» или просто «Panel». Если инструкция затерялась, нужно просто внимательно осмотреть материнскую плату и отыскать на ней данную группу разъемов.

    1. Сначала подключаем к плате разъем кнопки включения питания Power SW (Power Switch). Место для него на материнской плате обозначено как «PWR_BTN». Поскольку это кнопка, а не индикатор, то полярность подключения кнопки питания к материнской плате значения не имеет. Шлейф кнопки питания можно подсоединить любой стороной.
    2. Далее подключаем кнопку принудительной перезагрузки Reset SW (Reset Switch). Место для данного разъема на материнской плате обозначено как «Reset» или «RESET_SW», оно расположено непосредственно под коннектором кнопки питания. В данном случае полярность также значения не имеет.
    3. Подключаем индикаторы системного блока к материнской плате
    4. Ориентируясь на схему из инструкции или условные обозначения, нанесенные на материнскую плату, необходимо подключить коннекторы индикации.

    При подключении индикаторов важно соблюдать полярность, поскольку в противном случае они попросту не будут гореть. На самой плате указана полярность символами «+» и «-«.

    Она также должна присутствовать и на разъемах. Если ее нет или не видно, то следует воспользоваться подсказкой: белый провод - это минус, цветной - плюс.

    Место для коннектора индикатора включения/выключения ПК (Power Led) на материнской плате обозначено как «PWR_LED» , для подключения разъема HDD Led - «HDD_LED» .

    ВИДЕО ИНСТРУКЦИЯ

    Если после запуска компьютера какой-то из индикаторов не будет работать, достаточно просто переподключите коннектор, развернув его другой стороной.

    Аналогичным образом к материнской плате подключаются и другие разъемы, идущие от корпуса системного блока - SPEAKER, HD Audio и USB.

    Как подключить тактовую кнопку к цифровым и аналоговым входам на Arduino Uno правильно. Расскажем, как избежать «дребезг контактов», рассмотрим схему подключения одной и нескольких кнопок к плате Ардуино. Рассмотрим функции digitalRead и analogRead в языке программирования C++, которые часто требуется использовать при создании различных проектов на Ардуино для начинающих.

    Работа с тактовыми кнопками на Ардуино

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

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

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

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

    • плата Arduino Uno / Arduino Nano / Arduino Mega;
    • макетная плата;
    • 1 светодиод;
    • резисторы на 220 Ом и 10 кОм;
    • 1 тактовая кнопка;
    • провода «папа-папа» и «папа-мама».
    Принципиальная схема. Подключение кнопки к Ардуино Уно

    Используем цифровые порты на плате для подключения тактовой кнопки и команду digitalRead для считывания данных. Соберите схему, как на рисунке выше и загрузите скетч. Обратите внимание, что при отпущенной кнопке на Pin2 поступает логический «0». С помощью кнопки будем выключать и включать встроенный светодиод , подключенный к цифровому 13 порту на плате микроконтроллера Ардуино.

    Скетч для подключения кнопки к Ардуино

    void setup () { pinMode (13, OUTPUT ); pinMode (2, INPUT ); // объявляем пин 2 как вход } void loop () { if (digitalRead (2) == HIGH ) // когда на пин 2 поступает высокий сигнал // зажигаем светодиод } if (digitalRead (2) == LOW ) // когда на пин 2 поступает низкий сигнал // выключаем светодиод } }

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

    1. процедура setup выполняется один раз, используется процедура для конфигурации портов микроконтроллера (назначение режима работы портов);
    2. процедуры setup и loop должны присутствовать в любой программе (скетче);
    3. использованные константы: INPUT , OUTPUT , LOW , HIGH , пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку.

    Скетч для подключения кнопки к Arduino

    Можно также сделать подключение кнопок к аналоговому входу Ардуино (обозначены, как Analog In на плате). Принципиальное отличие данной схемы — это использование аналогового порта на микроконтроллере. Для включения и выключения светодиода будем также использовать встроенный светодиод на плате. Переключите тактовую кнопку к аналоговому входу A1 и загрузите в плату следующий скетч.

    void { pinMode (13, OUTPUT ); // объявляем пин 13 как выход pinMode (A1, INPUT ); // объявляем пин A1 как вход } void loop () { if (analogRead (A1) > 300) // когда аналоговая кнопка нажата { digitalWrite (13, HIGH ); // зажигаем светодиод } if (analogRead (A1) < 300) // когда аналоговая кнопка отпущена { digitalWrite (13, LOW ); // выключаем светодиод } }

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

    1. в данном скетче мы используем функцию analogRead для считывания значений с аналогового входа A1 , при этом порт можно использовать, как цифровой;
    2. значения на аналоговом входе могут отличаться (все зависит от сопротивления резистора в схеме) и могут принимать значения в диапазоне от 0 до 1023.