Цифровые пины

В уроке про возможности микроконтроллера мы обсуждали такое понятие, как GPIO – входы-выходы общего назначения, которые позволяют читать и выдавать цифровой сигнал. Давайте посмотрим на распиновке, какие пины умеют так делать.

Нумерация пинов

AVR (Arduino Nano)


blank

  • Нет прямой нумерации GPIO, всё поделено на порты и пины (не указаны на распиновке), о них мы поговорим в отдельном уроке.
  • На плате выведенные GPIO подписаны как Dцифра и Aцифра и в программе мы можем обращаться к ним по этой нумерации:
    • К пинам GPIO, подписанным как D (D0-D13), можно обращаться по номеру: D2 – просто 2.
    • К пинам GPIO, подписанным как A (A0-A5), можно обращаться по подписи на плате: A2 – A2. Также нумерация A пинов продолжает нумерацию D пинов по порядку, то есть A0 это 14, A1 это 15.. A5 – 19.

ESP8266 (Wemos Mini)


blank

  • Имеется прямая нумерация GPIO (номера подписаны на распиновке зелёным), по этим номерам можно обращаться к пинам в программе как к цифрам: GPIO5 – просто 5.
  • На плате пины подписаны как Dцифра. Эта нумерация не совпадает с номерами GPIO, но по ней также можно обращаться к пинам в программе: D1 это D1, и этот же пин – просто 5, как номер GPIO (см. распиновку выше).

Режимы работы пинов


Цифровой пин может находиться в двух состояниях, вход и выход. В режиме входа пин может считывать напряжение от 0 до напряжения питания МК, а в режиме выхода – выдавать такое же напряжение. Режим работы выбирается при помощи функции pinMode(pin, mode), где pin это номер пина, а mode это режим:

  • INPUT – вход
  • OUTPUT – выход
  • INPUT_PULLUP – подтянутый к питанию вход

Если со входом/выходом всё понятно, то с подтяжкой давайте разберёмся. В режиме входа пин МК не подключен никуда и ловит из воздуха всякие наводки, получая практически случайное значение. Для задания пину “состояния по умолчанию” используют подтяжку резистором к земле или питанию. Режим INPUT_PULLUP включает встроенную в микроконтроллер подтяжку пина к питанию при помощи внутреннего резистора. Подробнее об этом, со схемами и примерами я рассказывал в начале вот этого видео урока.

По умолчанию (при запуске программы) все пины сконфигурированы как входы (INPUT)

Вывод цифрового сигнала


Цифровой пин в режиме выхода (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 соответственно.
Для вывода сигнала пин должен быть переведён в режим OUTPUT при помощи pinMode()

Пример, в котором пины инициализируются как выходы и на них подаётся сигнал (на примере 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 (нумерацию смотри выше).

Для чтения сигнала пин должен быть переведён в режим INPUT при помощи pinMode()

Следующий код будет выводить в порт сигнал на пине D5. Если подключить его проводом к VCC – получим 1, если к GND – получим 0.

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(digitalRead(5));
}

Видео


Полезные страницы


  • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)
5/5 - (13 голосов)
Назад Функции времени
Вперёд Аналоговые пины
Подписаться
Уведомить о
guest
28 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии