Цифровые пины
В уроке про возможности микроконтроллера мы обсуждали такое понятие, как GPIO - входы-выходы общего назначения, которые позволяют читать и выдавать цифровой сигнал. Давайте посмотрим на распиновке, какие пины умеют так делать.
Нумерация пинов
AVR (Arduino Nano)
- Нет прямой нумерации GPIO, всё поделено на порты и пины (не указаны на распиновке), о них мы поговорим в отдельном уроке.
- На плате выведенные GPIO подписаны как Dцифра и Aцифра и в программе мы можем обращаться к ним по этой нумерации:
- К пинам GPIO, подписанным как D (D0-D13), можно обращаться по номеру: D2 - просто
2
. - К пинам GPIO, подписанным как A (A0-A5), можно обращаться по подписи на плате: A2 -
A2
. Также нумерация A пинов продолжает нумерацию D пинов по порядку, то есть A0 это14
, A1 это15
.. A5 -19
.
- К пинам GPIO, подписанным как D (D0-D13), можно обращаться по номеру: D2 - просто
ESP8266 (Wemos Mini)
- Имеется прямая нумерация GPIO (номера подписаны на распиновке зелёным), по этим номерам можно обращаться к пинам в программе как к цифрам: GPIO5 - просто
5
. - На плате пины подписаны как Dцифра. Эта нумерация не совпадает с номерами GPIO, но по ней также можно обращаться к пинам в программе: D1 это
D1
, и этот же пин - просто5
, как номер GPIO (см. распиновку выше).
Режимы работы пинов
Цифровой пин может находиться в двух состояниях, вход и выход. В режиме входа пин может считывать напряжение от 0 до напряжения питания МК, а в режиме выхода - выдавать такое же напряжение. Режим работы выбирается при помощи функции pinMode(pin, mode)
, где pin
это номер пина, а mode
это режим:
INPUT
- входOUTPUT
- выходINPUT_PULLUP
- подтянутый к питанию вход
Если со входом/выходом всё понятно, то с подтяжкой давайте разберёмся. В режиме входа пин МК не подключен никуда и ловит из воздуха всякие наводки, получая практически случайное значение. Для задания пину "состояния по умолчанию" используют подтяжку резистором к земле или питанию. Режим INPUT_PULLUP
включает встроенную в микроконтроллер подтяжку пина к питанию при помощи внутреннего резистора. Подробнее об этом, со схемами и примерами я рассказывал в начале вот этого видео урока.
Вывод цифрового сигнала
Цифровой пин в режиме выхода (OUTPUT
) может генерировать цифровой сигнал, т.е. выдавать напряжение. Так как понятие "цифровой" обычно связано с двумя состояниями, 0 и 1, цифровой пин тоже может выдать 0 или 1, точнее сигнал низкого или высокого уровня:
- Сигнал низкого уровня это 0V, пин подключается к GND микроконтроллера.
- Сигнал высокого уровня подключает пин к VCC микроконтроллера, то есть к питанию.
Если вы вспомните урок по питанию платы, то поймёте, что сигнал высокого уровня на цифровом пине будет варьироваться в зависимости от того, от какого напряжения питается плата. При питании напрямую от источника 5V на пине будет 5V, при питании от USB с потерей на защитном диоде мы получим около 4.7V.
Самый главный момент касательно цифровых пинов: микроконтроллер - логическое устройство, которое создано для управления другими устройствами при помощи логических сигналов. Логическое - означает не силовое, то есть питать от пина МК нельзя ничего мощнее светодиода или слабой микросхемы:
- Для AVR Arduino рекомендуемый ток с пина GPIO - не более 20 мА, максимальный ток - 40 мА.
- Для esp8266 максимальный ток с пина GPIO - не более 12 мА.
Вернёмся к вопросу подачи цифрового сигнала: для этого у нас есть функция digitalWrite(pin, value)
:
pin
- пин GPIO (нумерацию смотри выше).value
- уровень сигнала:HIGH
высокий,LOW
низкий. Также можно использовать цифры1
и0
соответственно.
Пример, в котором пины инициализируются как выходы и на них подаётся сигнал (на примере Arduino Nano):
void setup() { pinMode(10, OUTPUT); // D10 как выход pinMode(A3, OUTPUT); // A3 как выход pinMode(19, OUTPUT); // A5 как выход (Nano/UNO) digitalWrite(10, HIGH); // высокий сигнал на D10 digitalWrite(A3, 1); // высокий сигнал на A3 digitalWrite(19, 1); // высокий сигнал на A5 } void loop() {}
Чтение цифрового сигнала
Цифровой пин может измерять напряжение, но сообщить он может только о его отсутствии (сигнал низкого уровня, LOW
) или наличии (сигнал высокого уровня, HIGH
), причём отсутствием напряжения считается промежуток от 0 до ~VCC/2 Вольт, а от VCC/2 до VCC микроконтроллер считает за наличие сигнала высокого уровня.
Для чтения уровня сигнала на пине используется функция digitalRead(pin)
, где пин - номер GPIO (нумерацию смотри выше).
Следующий код будет выводить в порт сигнал на пине D5. Если подключить его проводом к VCC - получим 1
, если к GND - получим 0
.
void setup() { Serial.begin(9600); } void loop() { Serial.println(digitalRead(5)); }
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])