4.01.2. Лабораторная работа №4.1.2.md


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

Тема работы

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

Цель

  • Научиться подключать кнопки к GPIO пинам, используя внешние и внутренние подтягивающие и стягивающие резисторы.
  • На практике увидеть, как способ подключения влияет на логику программы.
  • Освоить команду digitalRead() для считывания цифровых сигналов.
  • Создать интерактивную схему, где состояние светодиодов зависит от нажатия кнопок.

Оборудование и материалы

  • Отладочная плата Рудирон.
  • Макетная плата.
  • 4 тактовые кнопки.
  • 4 светодиода (любого цвета).
  • 4 резистора номиналом 220 Ом (для светодиодов).
  • 2 резистора номиналом 10 кОм (для кнопок).
  • Соединительные провода.
  • USB-кабель для подключения Рудирона к компьютеру.
  • Компьютер с настроенной средой Arduino IDE.

Ход работы

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

1. Подключение светодиодов

Сначала подготовим индикацию. Это поможет нам визуально отслеживать нажатие каждой кнопки.

  • Вставьте четыре светодиода в макетную плату.
  • К коротким ножкам (катодам) каждого светодиода подключите по одному резистору на 220 Ом.
  • Вторые выводы резисторов соедините с GND на плате Рудирон.
  • Длинные ножки (аноды) светодиодов подключите к пинам Рудирона:
    • Первый светодиод — к пину 12.
    • Второй светодиод — к пину 13.
    • Третий светодиод — к пину 14.
    • Четвертый светодиод — к пину 15.

2. Подключение кнопок четырьмя способами

Теперь самое интересное — подключаем кнопки.

Способ №1. Внешний стягивающий резистор (Pull-down) В этой схеме, когда кнопка не нажата, пин через резистор «стянут» к земле (LOW). При нажатии на пин подаётся напряжение (HIGH).

  • Подключите первую кнопку к пину 0.
  • Один контакт кнопки соедините с пином 5V.
  • Другой контакт кнопки соедините с пином 0 и с одним из выводов резистора на 10 кОм.
  • Второй вывод резистора подключите к GND.

Способ №2. Внешний подтягивающий резистор (Pull-up) Здесь всё наоборот. Когда кнопка не нажата, пин «подтянут» к питанию (HIGH). При нажатии пин соединяется с землёй (LOW).

  • Подключите вторую кнопку к пину 1.
  • Один контакт кнопки соедините с GND.
  • Другой контакт кнопки соедините с пином 1 и с одним из выводов резистора на 10 кОм.
  • Второй вывод резистора подключите к 5V.

Способ №3. Внутренний подтягивающий резистор (INPUT_PULLUP) Это самый простой способ, так как не требует внешнего резистора. Мы активируем внутренний резистор Рудирона, который подтянет пин к 3.3В. Логика работы такая же, как в Способе №2.

  • Подключите третью кнопку к пину 2.
  • Один контакт кнопки соедините с GND.
  • Другой контакт кнопки соедините с пином 2.

Способ №4: Внутренний стягивающий резистор (INPUT_PULLDOWN) Рудирон поддерживает и этот удобный режим. Внутренний резистор «стягивает» пин к земле (LOW). При нажатии на пин нужно подать напряжение, и мы прочитаем HIGH.

  • Подключите четвертую кнопку к пину 3.
  • Один контакт кнопки соедините с пином 3.3V на Рудироне.
  • Другой контакт кнопки соедините с пином 3.

Общая схема сборки Вот как все эти подключения будут выглядеть вместе на макетной плате:

3. Написание и загрузка кода

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

  • Убедитесь, что перемычка PRG | RUN стоит в положении PRG.
  • Откройте Arduino IDE и введите следующий код:

    // Пины для светодиодов
    const int led1Pin = 12;
    const int led2Pin = 13;
    const int led3Pin = 14;
    const int led4Pin = 15;
    
    // Пины для кнопок
    const int button1Pin = 0; // Внешний pull-down
    const int button2Pin = 1; // Внешний pull-up
    const int button3Pin = 2; // Внутренний pull-up
    const int button4Pin = 3; // Внутренний pull-down
    
    void setup() {
      // Настраиваем пины светодиодов на выход
      pinMode(led1Pin, OUTPUT);
      pinMode(led2Pin, OUTPUT);
      pinMode(led3Pin, OUTPUT);
      pinMode(led4Pin, OUTPUT);
    
      // Настраиваем пины кнопок на вход
      pinMode(button1Pin, INPUT);
      pinMode(button2Pin, INPUT);
      pinMode(button3Pin, INPUT_PULLUP);
      pinMode(button4Pin, INPUT_PULLDOWN);
    }
    
    void loop() {
      // Считываем состояние каждой кнопки
      bool button1State = digitalRead(button1Pin); // При нажатии будет HIGH
      bool button2State = digitalRead(button2Pin); // При нажатии будет LOW
      bool button3State = digitalRead(button3Pin); // При нажатии будет LOW
      bool button4State = digitalRead(button4Pin); // При нажатии будет HIGH
    
      // Напрямую управляем светодиодами на основе состояния кнопок
      digitalWrite(led1Pin, button1State);
      digitalWrite(led2Pin, button2State);
      digitalWrite(led3Pin, button3State);
      digitalWrite(led4Pin, button4State);
    }
    
  • Нажмите кнопку «Upload», чтобы загрузить код на плату.

4. Проверка работы

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

  • Нажмите кнопку 1 (pull-down) - светодиод 1 загорится.
  • Нажмите кнопку 2 (pull-up) - светодиод 2 погаснет (потому что при нажатии на пин приходит LOW).
  • Нажмите кнопку 3 (внутренний pull-up) - светодиод 3 тоже погаснет.
  • Нажмите кнопку 4 (внутренний pull-down) - светодиод 4 загорится.

Результаты

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

Анализ результатов

  • Схемы pull-down (кнопки 1 и 4). Резистор (внешний или внутренний) «стягивает» пин к земле. По умолчанию на пине LOW. При нажатии кнопки на пин подаётся напряжение, и digitalRead() возвращает HIGH.
  • Схемы pull-up (кнопки 2 и 3). Резистор «подтягивает» пин к питанию. По умолчанию на пине HIGH (поэтому светодиоды 2 и 3 горят). При нажатии кнопки пин замыкается на землю, и digitalRead() возвращает LOW (светодиоды гаснут).

Выводы

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

Вопросы для самопроверки

  1. Что такое «плавающее» состояние пина и почему его нужно избегать?
  2. В чём разница между pull-up и pull-down резисторами?
  3. Какую логику (HIGH или LOW) мы считываем с пина при нажатии кнопки, если он настроен как INPUT_PULLUP?
  4. Почему способы с INPUT_PULLUP и INPUT_PULLDOWN часто являются предпочтительными?
  5. Как изменить код так, чтобы при нажатии на вторую кнопку (с pull-up) светодиод не гас, а, наоборот, загорался?

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