Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:laboratory_iot:exp3 [2020/05/13 12:21] – [Схема эксперимента] labuser29 | products:laboratory_iot:exp3 [2024/11/12 16:31] (текущий) – [Программный код эксперимента] labuser30 |
---|
===== Эксперимент 3. Кнопка и подтягивающий резистор ===== | ===== Эксперимент 3. Железнодорожный переезд ===== |
| |
Познакомимся с кнопкой— важным электронным компонентом. Кнопка нужна везде, где требуется взаимодействие электроники с человеком. Для начала, рассмотрим, как устроена кнопка. Как можно догадаться, внутри корпуса кнопки находится пара металлических контактов. Когда кнопка находится в нормальном состоянии, ее контакты разомкнуты, а при нажатии— замыкаются. | В этом эксперименте разберемся с полярностью светодиодов и способами их подключения. Целью эксперимента является создание конструкции с двумя светодиодами, мигающими по очереди, как лампы в железнодорожном переезде. |
{{ :products:esp-iot:exp3.1.png?nolink |}} | |
//Рисунок 1. Внешний вид тактовых кнопок и обозначение на электрических схемах// | |
| |
==== Подключение кнопки ==== | ==== Подключение светодиодов ==== |
Как мы [[theory:logic_1_0|узнали ранее]], микроконтроллер оперирует с понятиями //логического нуля// и //логической единицы//, но как получить их с помощью кнопки? Логично подключить кнопку между выводом микроконтроллера и напряжением питания. Когда кнопка нажимается, напряжение питания подается на ножку, что является //логической единицей//. Такая схема изображена на рисунке 2. | Как мы уже разобрались ранее, светодиод— полярный элемент. У него есть //анод// и //катод//. Чтобы светодиод светился, его нужно подключить в прямом направлении— анод к плюсу питания, катод— к минусу. Если подключить наоборот, светодиод светиться не будет, хотя и не испортится. Просто светодиод в первую очередь //диод//— полупроводниковый электронный компонент, пропускающий электрический ток только в одном направлении. |
| |
{{ :products:esp-iot:exp3.2.png?nolink |}} | {{ :products:esp-iot:led.png?nolink&600 |}} |
//Рисунок 2. Неправильная схема подключения кнопки// | //Рисунок 1. Светодиод. Внешний вид и обозначение на электрических принципиальных схемах// |
| |
Почему же эта схема неправильная? Дело в том, что когда кнопка нажата, на ножку микроконтроллера, действительно, подается напряжение питания, что является уровнем логической единицы, однако, когда кнопка не нажата, то на ножку не подается ничего. Говорят, что она "висит в водздухе"— то есть никуда не подключена. Такое состояние не является состоянием логического нуля. Состояние такого вывода может самопроизвольно меняться, например из-за статического электричества, или даже радиоволны. Чтобы получить состояние логического нуля, нужно подключить ножку к //земле//. Так называют минус питания, "общий" провод, относительно которого и отсчитывается напряжение во всей схеме. | В прошлом эксперименте мы подключали один светодиод к одной ножке микроконтроллера. Если нам нужно 2 светодиода, то можно было бы подключить каждый к своей ножке и управлять ими независимо. Но мы подключим оба светодиода к одной ножке. Как же в таком случае зажигать их по- очереди? Воспользуемся свойством полярности светодиодов. Просто подключим их разной полярностью. |
| |
Но как подключить кнопку, чтобы в одном состоянии она соединяла ножку с питанием, а в другом— с землей, ведь у нее только один контакт, который лизо замкнут, либо разомнкут? В таком случае используют резистор, с помощью которого ножку микроконтроллера //подтягивают// к противоположному уровню. | ==== Схема эксперимента ==== |
| |
{{ :products:esp-iot:exp3.3.png?nolink |}} | {{ :products:esp-iot:exp3.1.1.png?nolink&400 |}} |
//Рисунок 3. Правильные схемы подключения кнопки// | //Рисунок 2. Электрическая принципиальная схема эксперимента// |
| |
На рисунке 3 изображено два варианта правильного подключения кнопки. | Давайте разберемся как работает эта схема. Светодиод VD2 подключен точно так же, как в прошлом эксперименте, но появился второй светодиод— VD1. Его катод подключен к выводу микроконтроллера, а анод к питанию. |
| |
Вариант А: Когда кнопка не нажата, ножка микроконтроллера подключена к земле через резистор, что является состоянием логического нуля. Сопротивление подтягивающего резистора выбирают достаточно большим, чтобы уменьшить протекающий через него ток, например, 10 килоом. Когда кнопка нажата, вывод микроконтроллера подключается к плюсу питания, что является логической единицей. Хотя, в это же время, соединение с землей через резистор также сохраняется, но ток, протекающий через него, слишком мал, чтобы "соперничать" с прямым подключением к питанию, поэтому он не может помешать установлению логической единицы на ножке микроконтроллера. | Когда на выводе микроконтроллера логическая единица (высокий уровень напряжения, равный напряжению питания), светодиод VD2 включен в прямом направлении. На его аноде +3.3 вольта (напряжение питания от контроллера), а на катоде 0 вольт (так как он подключен к //земле//. Так называют минус питания, «общий» провод, относительно которого и отсчитывается напряжение во всей схеме.) Поэтому через светодиод протекает ток и VD2 светится. В это же время светодиод VD1 не светится. Так как его катод подключен к ножке микроконтроллера, где напряжение +3.3 В, а его анод— к напряжению питания, также + 3.3 В. На обоих выводах светодиода VD1 получается одинаковое напряжение и тока не возникает. |
| |
Вариант Б: Когда кнопка не нажата, ножка микроконтроллера подключена к питанию через резистор, что является состоянием логической единицы. А когда нажата— к земле, что является логическим нулем. | Когда на выводе микроконтроллер логический 0 (0 вольт), светодиод VD1 оказывается включенным в прямом направлении и светится. На его катоде, подключенном к ножке МК, 0 вольт, а на аноде + 3.3 в. А светодиод VD2 не светится так как теперь на обоих его контактах 0 вольт. |
| |
Теперь мы знаем как правильно подключать кнопку, а из предыдущего эксперимента возьмем схему подключения светодиода. Объединим это в одну схему. | Соберем эту схему как показано на Рисунке 3. |
| |
==== Схема эксперимента ==== | {{ :products:esp-iot:exp3_1.png?direct&400 |}} |
| //Рисунок 3. Монтажная схема эксперимента// |
{{ :products:esp-iot:exp3.4.png?direct |}} | |
//Рисунок 4. Электрическая принципиальная схема эксперимента №3// | |
| |
На рисунке изображен токоограничительный резистор последовательно со светодиодом. При сборке схемы мы не будем устанавливать его сами так как он уже установлен на плате конструктора. | |
| |
Соберем эту схему: | |
{{ :products:esp-iot:exp3.png?direct&600 |}} | |
//Рисунок 5. Монтажная схема эксперимента №3// | |
| |
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== |
Теперь напишем программный код. Пусть, когда кнопка не нажата, светодиод не горит. А при нажатии кнопки— горит. | |
| |
<file python Exp3.py[enable_line_numbers="2", start_line_numbers_at="1"]> | <file python Exp3.py[enable_line_numbers="2", start_line_numbers_at="1"]> |
from machine import Pin | from machine import Pin |
| import time |
_init() | _init() |
| |
ButtonPin = 16 | LedPin = 16 |
LedPin = 0 | |
| led = Pin(LedPin, Pin.OUT) |
Button = Pin(ButtonPin, Pin.IN) | |
Led = Pin(LedPin, Pin.OUT) | |
while True: | while True: |
button_value = Button.value() | led.off() |
if button_value == 1: | time.sleep(1) |
Led.on() | led.on() |
else: | time.sleep(1) |
Led.off() | |
</file> | </file> |
| |
Как и в прошлом эксперименте, сначала подключаем необходимые библиотеки, а именно ''Pin'' из системной библиотеки ''machine''. Вызываем функцию инициализации платы. | Никаких отличий от программы из прошлого эксперимента нет. Два светодиода мигают по- очереди только благодаря схемотехнике. |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="4"]> | |
ButtonPin = 16 | |
LedPin = 0 | |
</code> | |
| |
Создаем переменные, в которые записываем номера выводов микроконтроллера для подключения кнопки и светодиода. Кнопку подключаем к 16 выводу, светодиод к 0. | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="4"]> | |
Button = Pin(ButtonPin, Pin.IN) | |
Led = Pin(LedPin, Pin.OUT) | |
</code> | |
| |
Создаем объекты выводов микроконтроллера и настраиваем их. Ножку для кнопки настраиваем как вход (''Pin.IN''), а для светодиода— как выход (''Pin.OUT''). Теперь можно работать с этими выводами. | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="10"]> | |
while True: | |
</code> | |
| |
Начинаем бесконечный цикл | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="11"]> | |
button_value = Button.value() | |
if button_value == 1: | |
Led.on() | |
else: | |
Led.off() | |
</code> | |
Тело цикла. Этот код повторяется бесконечное количество раз, пока программа не будет прервана пользователем с помощью кнопки {{ :products:2020-05-04_12-35-46.png?nolink |}} | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="12"]> | |
button_value = Button.value() | |
</code> | |
Сначала мы считываем состояние вывода, к которому подключена кнопка, с помощью вызова функции ''Button.value()'' и записываем это состояние в переменную ''button_value''. Если кнопка нажата, то (в соответствии со схемой на рисунке 4) на выводе микроконтроллера состояние логической единицы, значит в переменную ''button_value'' запишется ''1''. А если кнопка не нажата, на ножке логический ноль, в переменную запишется 0. | |
| |
<code python[enable_line_numbers="2", start_line_numbers_at="12"]> | |
if button_value == 1: | |
</code> | |
| |
Здесь мы впервые сталкиваемся с //условным оператором//. Оператор if проверяет выполнение условия и исполняет код в зависимости от того выполнено условие или нет. Если условие выполняется, то выполняется код в блоке прямо под ним. Если условие ложно, то исполняется код в блоке ''else''. | |
| |
В нашем случае условием является ''button_value == 1''. Символ двойного равенства ''=='' это оператор сравнения. Он сравнивает значение выражения слева от себя со значением выражения справа от себя. Если эти значения равны, то равенство выполняется, иначе— нет. | |
| |
<WRAP center round important 60%> | |
Ранее мы уже сталкивались с оператором присвоения = . Этот оператор предназначен для присвоения значения переменной. Например | |
<code python> | |
a = 2 | |
</code> | |
присваивает значение 2 переменной ''a''. Теперь же мы использовали оператор сравнения == . Он сравнивает два значения. По виду они похожи, но это совершенно разные операторы и путать их нельзя. | |
</WRAP> | |
| |
Итак, в строке 12 с помощью оператора ''if'' мы проверяем выполнение условия равенства переменной button_value цифре 1. По сути это проверка нажата ли кнопка. Если да, если условие выполняется, то выполняется код | |
<code python[enable_line_numbers="2", start_line_numbers_at="13"]> | |
Led.on() | |
</code> | |
который зажигает светодиод. А если условие не верно, а значит кнопка не нажата, то выполняется код в блоке ''else'' | |
<code python[enable_line_numbers="2", start_line_numbers_at="15"]> | |
Led.off() | |
</code> | |
который гасит светодиод. | |
| |
Теперь, когда мы разобрали каждую строку программы, взглянем опять на алгоритм целиком: программа постоянно, бесконечное количество раз, проверяет нажата ли кнопка. Если кнопка нажата, то на светодиод зажигается, если же кнопка не нажата то светодиод выключается. | |
| |
==== Дополнительное задание ==== | |
<WRAP center round tip 60%> | |
1. Как изменить программу, чтобы наоборот, когда кнопка не нажата— светодиод светился, а если нажата— гас? | |
| |
2. Как изменить электрическую схему, чтобы добиться такого же результата, но без изменения программы? | |
</WRAP> | |
| |