Практическое программирование Arduino/CraftDuino — цифровой ввод — кнопка


0. Начало

1. Цифровой ввод — кнопка

Настало время попробовать поработать с вводом 🙂
Для начала, возьмём обычную кнопку и соберём такую простую схему:

как видно – это просто дополненная схема Blink-а 🙂
Что же происходит на 12-м цифровом порту? Если к порту ничего не подключено – его состояние меняется между 0V и 5V (LOW & HIGH).
Подключая резистор между портом и землёй — мы тем самым «прижимаем» порт к 0 (LOW), а при нажатии кнопки происходит соединение с напряжением питания и тем самым порт «подтягивается» к 5V (HIGH).
Тем самым мы узнаём – нажата кнопка или нет – просто считывая значение на входе 12 цифрового порта и проверяя – HIGH это или LOW.

код скетча прост:

/*
 * LED with button
 */

int ledPin = 13;                // сетодиод
int btnPin = 12;                // кнопка
int val=0;

void setup()                     
{
  pinMode(ledPin, OUTPUT);      // это выход - светодиод
  pinMode(btnPin, INPUT);       // а это вход - кнопка
  Serial.begin(9600);           // будем записывать в COM-порт
}

void loop()                      
{
  val = digitalRead(btnPin);    // узнаём состояние кнопки
  if(val==HIGH)                 // кнопка нажата
  {
    digitalWrite(ledPin, HIGH); // зажигаем светодиод
    Serial.println("H");
  }
  else                          // кнопка не нажата
  {
    digitalWrite(ledPin, LOW);  // гасим светодиод
    Serial.println("L");
  }
  delay(100);
}


а вот что увидим в мониторе последовательного порта:

Вот и всё. А теперь можно проявить фантазию и использовать вместо обычной кнопки что-нибудь поинтереснее, например — геркон 🙂

читать далее: 2. Аналоговый вывод — Fading

По теме
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)


0 комментариев на «“Практическое программирование Arduino/CraftDuino — цифровой ввод — кнопка”»

  1. Где-то читал, что ATmega уже содержит «подтягивающие» резисторы включаемые программно… а как это можно сделать? никто не знает? ведь тогда бы, насколько я понял не нужен бы был R1

    • Почитать как включается подтяжка можно здесь (абзац после слов «схема включения») — это на Wiring-е, на С зависит от компилятора (тут для WinAVR-а).
      Только резистор этот подтягивает ногу к питанию — чтение будет возвращать 1, значит кнопкой пин нужно прижимать к земле.НО! тут вылезает один нюанс — если «кто-то что-то перепутает» и пин будет сконфигурирован как OUTPUT, HIGH то кнопка ему устроит КЗ на землю — можно подпалить МК. И пришлось бы снова, «на всякий случай», ставить резистор.
      Эта схема включения выбрана как наиболее безопасная и простая в программной реализации=)

  2. Вопрос про подключение кнопки

    Что же происходит на 12-м цифровом порту? Если к порту ничего не подключено – его состояние меняется между 0V и 5V (LOW & HIGH).
    Подключая резистор между портом и землёй — мы тем самым «прижимаем» порт к 0 (LOW), а при нажатии кнопки происходит соединение с напряжением питания и тем самым порт «подтягивается» к 5V (HIGH).

    Почему нельзя просто поставить кнопку между пин12 и землёй? На пин12 вроде бы как есть своё напряжение?

    • Т.е. напрямую ногу садить на землю со «своим напряжением»?

    • Да. Может, с резистором ещё? На пин12 вроде бы напряжение тоже 5 вольт.

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

    • Этот вопрос мучает меня. В чём смысл этого «подтягивания» почему не делают как я спросил? А-а-а! Panic!

    • Вот смотри, когда к нему ничего не подцеплено, то значения на нем непредсказуемы. Когда мы садим на землю то мы получаем ноль, и можем быть уверены в том что на этой ноге нет ничего кроме ноля. А через кнопку мы помимо земли садим на ногу +5, и значение будет уже не 0 (low) a High, резистор нужен что бы не замыкать напрямую землю и +5. Если делать как предложил ты, то ты просто выжжешь ногу, посадив ногу с +5 напрямую, без нагрузки к земле

    • Этот резистор не есть ли то, что называют «делителем напряжения»? Где можно о подобных приёмах почитать поподробнее?

    • А по какому принципу рассчитан номинал резистора? Какой диапазон?

    • Для кнопки то?
      Как обычоно, по закону ома=)
      Задача прижать PIN12 к земле так(таким сопротивлением), чтоб витающие в эфире помехи не повлияли на устойчивое чтение нуля пока кнопка не нажата(не навели напряжение достаточное для признание его еденицей)- то есть чем меньше сопротивление тем лучше.
      С другой стороны не хочется получить короткое замыкание(ну или просто увеличение потребления) в момент когда кнопка будет нажата (мыж фактически "+" с "-" соеденияем через резистор) — то есть чем больше сопротивление тем лучше.
      Нужно высчитать компромиссное значение!
      Но так как всем лень искать по датащитам значения внутреннего сопротивления пина в режиме чтения (тока потребления) и прикидывать интенсивность помех наводимых на этот пин, ставят то что под рукой есть.
      Обычно 1к до 100к. (часто можно видеть на схемах такие номиналы — 1к, 10к, 100к)
      Можно даже от 500ом, в данном случае не принципиально.

    • Ну вот на Ардуино Uno насколько я помню рекомендуемый максимальный ток — 40мА (или путаю)
      Вольтаж тут — 5В
      Итого минимальное сопротивление, чтобы не превысить ток — 125 Ом. Получается 200 омного с головой бы хватало?

    • угу, хватит, чтоб посадить батарейку(«крону»)за несколько десятков нажатий на кнопку =D
      Вы не так поняли,
      речь о ПОТРЕБЛЯЕМОМ ПИНОМ токе и о напряжении ПОМЕХИ.
      А если говорить о «критерии ДОПУСТИМОГО потребления при нажатой кнопке», то тогда конечно, да, и 10ом хватит =D
      Ведь стабилизатор на плате может дать до 0.8-1А =D
      Только зачем на кнопку такой вообще ток расходовать?!
      И вообще не забивайте себе голову,
      ставьте 1к, и не парьтесь =)

  3. привет всем.
    не знал куда задать свой вопрос, решил здесь.помогите кто нибудь. как сделать так чтобы пока нажата клавиша на клаве светодиод горит, отпускаешь — тухнет. понимаю надо будет писать прогу под винду. (чуть понимаю с++, лучше с#) плюс скетч к ардуино. подскажите, пожалуйста, на примерах. или где об этом можно больше почитать? читал тут с# + ардуино, как-то не то.
    надеюсь на вашу помощь.

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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение