НАШ МАГАЗИН - SHOP.MUSBENCH.COM
Карта Сайта

Урок 9. Ввод и Вывод.

Учебный курс Ардуино. Опрос кнопок и датчиков


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

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


Что потребуется для этого урока:

- Компьютер с программой Arduino

- Плата Arduino Uno

- USB A - B кабель

- Макетная плата - breadboard половинного размера

- Гибкие провода-перемычки для breadboard

- Потенциометр на 10 К

- Одна маленькая кнопка

- Один красный светодиод

- Один резистор сопротивлением от 220 Ом до 1 К

- Один резистор сопротивлением 10 К

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

- Небольшой мотор постоянного тока

- Транзистор PN2222

- Диод 1N4001


Часть 1. Цифровой вход
    
   
 
     
Давайте подготовиться к составлению новой схемы. Возьмите несколько проводов - перемычек для макетной платы, красный светодиод, резистор 1K (код: коричневый-черный-красный-золотой), резистор 10K (код: коричнево-черно-оранжевое золото) и небольшую кнопку из вашего комплекта. Отформуйте выводы вашему 10K резистору также, как вы это делали в предыдущих уроках.
  
  
  
  
Во-первых, подключите светодиод к контакту 13 Arduino, как и в первой схеме, с проводом от контакта 13 платы до положительного вывода вашего светодиода и соедините резистора 1K, с отрицательным выводом светодиода и с землей.
  
   
   
   
Затем подключите кнопку как на фото, чтобы она опиралась на разделительную линию центра вашего макета. Подключите резистор 10K от одного из выводов кнопки на шину питания 5В. Подключите провод к этому же ряду и подсоедините его к контакту 2 Arduino.
  
  
   
   
Другой вывод кнопки соедините с землёй.
  
  
Нажмите «Начать симуляцию» в модуле Tinkercad Circuits и попробуйте нажать (и удерживать) кнопку, чтобы увидеть, что делает код. Нажмите кнопку «Код», чтобы просмотреть текст программы.
   
   
  
   
Этот пример можно найти в программном обеспечении Arduino, перейдя в меню Файл -> Примеры -> 02.Digital -> Button. Откройте его на своем компьютере и загрузите в плату Arduino Uno. Светодиод должен загораться, но при каждом нажатии кнопки выключаться.
  
   
   
Дальше мы рассмотрим код программы более подробно
  
   
// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);

Первые строки этой программы объявляют константы, которые напоминают переменные в том смысле, что они хранят часть информации. Однако, как вы можете догадаться, константы не меняются во время работы программы, и поэтому отлично подходят для обозначения номеров контактов. Они занимают меньше места в памяти, чем переменные. Вывод 2 Arduino сконфигурирован в качестве входа, поэтому мы можем «прослушивать» электрическое состояние кнопки, подключенной к нему.
В основном цикле функция digitalRead (); проверяет состояние вывода 2 (на котором будет либо 5 В, то есть ВЫСОКОЕ, либо "земля", то есть НИЗКОЕ), и сохраняет это состояние в переменной с именем buttonState.
     
if (buttonState == HIGH) содержит оператор if, который проверяет, имеет ли buttonState значение HIGH (== это оператор сравнения, его не следует путать с =, который является оператором присваивания). Если условие выполнено, выполняется команда digitalWrite (ledPin, HIGH);  Если нет, вместо этого выполняется код, содержащийся в else {: digitalWrite (ledPin, LOW) ;.
    
Возможно вы заметили, что ваша кнопочная схема выполняет действие, противоположное описанному в коде? Я сделал это специально, чтобы напрячь ваши умственные мышцы. Давайте еще немного поговорим об этой схеме. В состоянии покоя провода переключателя не связаны друг с другом. Контакт 2 подключен через резистор 10K к шине 5В. Когда кнопка нажата, контакты замыкаются, что соединяет контакт 2 с землей напрямую, без резистора. Поскольку электрический ток идет по пути наименьшего сопротивления, вывод микроконтроллера будет преимущественно "ощущать" соединение с землей и проигнорирует слабое (через резистор 10К) соединение к шине 5В. Но когда нет никакого другого сигнала (когда кнопка не нажата), это слабое соединение с шиной 5 В - это все, что может почувствовать порт контроллера. Таким образом, говорят что резистор "подтягивает контакт" к 5 В, и поэтому он называется подтягивающим резистором. Без него контакт 2 не был бы подключен ни к чему, пока кнопка не будет нажата. Это называется "плавающим" потенциалом и может привести к случайному шуму от статического электричества и электромагнитных помех. Точно так же резистор может использоваться, чтобы связать штырь с землей, тогда этот резистор называется понижающим резистором.

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

if (buttonState == HIGH) {
    // turn LED on

так, чтобы изменилась логика работы кнопки (HIGH поменяйте на LOW)
Вот что должно у нас получиться:

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);  // check if the pushbutton is pressed.

  // if it is, the buttonState is LOW:
  if (buttonState == LOW) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}
Загрузите обновленный скетч в плату Arduino Uno и убедитесь, что кнопка теперь включает светодиод, а не выключает.

Контроллер Arduino имеют встроенные подтягивающие резисторы на многих портах (внутри чипа), и вы можете получить к ним доступ, включив его в настройке:

pinMode (buttonPin, INPUT_PULLUP);

Измените эту строку кода в вашем эскизе и удалите резистор из вашей цепи.

Загрузить код; его поведение должно оставаться прежним.
 

Следующий урок...