Урок 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.
Другой вывод кнопки соедините с землёй.
Ссылка на эту симуляцию на Autodesk Tinkercad
Нажмите «Начать симуляцию» в модуле 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);
Измените эту строку кода в вашем эскизе и удалите резистор из вашей цепи.
Загрузить код; его поведение должно оставаться прежним.
Продолжение следует…
перевод с английского. Источник>>
Я Вам очень благодарен за информацию. Мне это очень пригодилось.