12 февраля 2023 - Admin

Пины Aрдуино: описание, характеристики, примеры скетчей

Ардуино с подключенными выводами

На плате Ардуино есть несколько видов пинов (с английского pin — контакт, вывод). Их количество может отличаться на разных платах, но всегда присутствуют следующие типы: пины питания, цифровые пины, аналоговые пины. О предназначении этих выводов и работе с ними и пойдёт речь в статье.

Краткое содержание:

Пины ардуино

Пины Ардуино на примере Arduino UNO

Пины питания

Режим работы пинов питания жестко задан, его нельзя поменять программно. Сюда входят:

  • GND — это «земля» (англ. ground), ноль, общий провод. Таких пинов может быть несколько. Сюда подключается минусовой вывод источника питания.
  • Vin — Пин для подключения плюса от внешнего источника питания. Напряжение может быть от 5 до 12 В.
  • 5v — стабилизированные 5 вольт, которые выдаёт плата. Сюда можно подключить маломощных внешних потребителей, которые требуют стабильное питание (датчики и т.п.)
  • 3.3v — стабилизированные 3.3 вольта.

Заметим также, что Ардуино может получать питание и через usb-разъем, в этом случае не нужно подключать внешний источник.

Цифровые пины. Режим выхода

Эта группа пинов обозначена на плате словом digital (по-английски digital - цифровой).

Цифровой пин работает с двумя состояниями: 0 (эквивалентно земле) и 1 (эквивалентно напряжению питания). Причём любой цифровой пин может работать и как вход, и как выход.

Сначала разберёмся с режимом «выход». Соберём вот такую простенькую схему, где цифровой pin №5 будет управлять свечением светодиода:

Подключение светодиода к цифровому пину ардуино

Схема 1. Подключение светодиода к цифровому пину Ардуино

Номинал резистора в этой схеме зависит от модели светодиода. Обычно для тех светодиодов, что идут в различных наборах Ардуино, требуется резистор 330 Ом.

А вот скетч для этой схемы:

void setup() {  // Код в этом методе выполнится только один раз, при запуске Arduino
  pinMode(5, OUTPUT);  // Переключаем пин №5 в режим выхода
}

void loop() {  // Код в этом методе будет выполняться в цикле бесконечное количестово раз
  digitalWrite(5, HIGH);  // Устанавливаем высокий уровень — светодиод загорается
  delay(500);  // Задержка в миллисекундах. Всё это время светодиод горит.
  digitalWrite(5, LOW);  // Устанавливаем низкий уровень — светодиод гаснет
  delay(500);  // И снова задержка
}

Если всё правильно собрано, светодиод будет моргать с частотой примерно 1 Гц (цикл горит - не горит занимает 1 секунду).

Ну и давайте сразу привыкать программировать правильно. В нашем скетче в трёх местах используется «магическое число» 5 — номер нашего пина. А если мы решили изменить схему и подключить светодиод к пину 6? Хорошо, когда скетч такой вот небольшой, и можно быстро найти все места, где упоминается пятёрка и поменять её на 6. А если скетч большой? Можно, во-первых, забыть где-то поменять номер пина, а, ещё хуже, случайно заменить постороннюю пятёрку, которая имела совсем другой смысл.

Всё это приводит к ошибкам в программе. Но есть способ уменьшить вероятность их появления. В данном конкретном случае можно запомнить номер пина в переменной, и затем везде использовать её.

int ledPin = 5;   // пин подключения светодиода
int dl     = 500; // задержка

void setup() { 
  pinMode(ledPin, OUTPUT); 
}

void loop() { 
  digitalWrite(ledPin, HIGH);
  delay(dl); 
  digitalWrite(ledPin, LOW); 
  delay(dl); 
}

Теперь мы можем при необходимости менять параметры в секции инициализации и не трогать весь остальной код. Да и саму программу читать легче — по имени переменной становится понятно, что происходит в той или иной строчке кода.

Цифровой пин в режиме входа

Как говорилось выше, цифровой пин может работать в режиме входа. С него можно считывать его текущее состояние с помощью метода digitalRead(<номер пина>). Но, поскольку вариантов всего два (1 и 0), то и подключить к нему можно какое-то устройство, которое имеет два состояния, типа кнопки (нажата / не нажата).

И снова разберём на примере. Покажем, как подключить кнопку к Ардуино:

Схема подключения кнопки к цифровому входу ардуино

Схема 2. Подключение кнопки к цифровому входу Ардуино

int ledPin = 13;   // Пин 13 - это пин встроенного светодиода
int  buttonPin = 2; // Пин, к которому подключена кнопка
void setup() { 
  pinMode(ledPin, OUTPUT);  
  pinMode(buttonPin, INPUT);
}

void loop() { 
  if (digitalRead(buttonPin) == HIGH) {  // Проверяем: если есть высокий уровень на входе (кнопка нажата)...
    digitalWrite(ledPin, HIGH);          // … то включам светодиод ...
  } else {                               // … иначе ...
    digitalWrite(ledPin, LOW);           // … светодиод выключаем
  }
}

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

Подтягивающий резистор

Вы вправе спросить, зачем в схеме резистор? Это так называемый подтягивающий резистор, с помощью которого можно задать состояние на входе «по-умолчанию».

Дело в том, что входы Ардуино имеют очень высокое входное сопротивление. Поэтому, ни к чему не подключённый, «висящий» вход может оказаться в состоянии 1 за счёт, к примеру, статического электричества. Это приведёт к ложным срабатываниям: кнопка не нажата, но программа считывает с пина высокий уровень.

Чтобы этого избежать, вход подтягивают (в данном случае, к нулю) резистором номиналом 10-20кОм. Когда кнопка отпущена, этот резистор устанавливает 0 на входе. Но, при этом его сопротивление слишком велико, чтобы помешать нажатой кнопке установить на входе 1: ток через резистор будет очень мал, и, в совокупности с большим входным сопротивлением пина на нём установится практически напряжение питания.

К слову, микроконтроллер ATmega имеет программируемые встроенные подтягивающие резисторы 20 кОм. Включение данных резисторов осуществляется так:

pinMode(buttonPin, INPUT); // переключаем пин в режим входа
digitalWrite(buttonPin, HIGH); // включаем подтягивающий резистор — в данном случае, подтягиваем к 1

ШИМ-пины

Вы могли обратить внимание, что на плате напротив некоторых цифровых пинов стоит знак ~ (тильда).

Так обозначены пины, которые могут работать в режиме ШИМ -  широтно-импульсной модуляции (по-английски PWM).

То есть, на такой пин можно вывести псевдо-аналоговое напряжение. Технически, это будут прямоугольные импульсы частотой 488,28 Гц и амплитудой 5 вольт. Но, за счёт регулировки скважности (соотношения длины импульса и паузы между импульсами), можно плавно регулировать эффективную мощность на нагрузке. Тема ШИМ заслуживает отдельной статьи, а пока, возможно, вышесказанное станет чуть понятнее из рисунка:

ШИМ-сигнал

График ШИМ-сигнала. В данном случае пауза длиннее импульса в три раза, то есть период заполнен импульсом на 25%. Это соответствует постоянному напряжению 0.25 * 5 = 1.25 Вольт

Для установления ШИМ-режима на пине служит метод  analogWrite(<номер пина>, <значение>).

Значение может меняться от 0 до 255, причём 255 соответствует напряжению питания. Таким образом, например, 128 — это половина напряжения питания, 2.5 В.

Давайте заставим наш светодиод из первого примера плавно набирать яркость и также плавно гаснуть:

int ledPin = 5;   // пин подключения светодиода

void setup() { 
  pinMode(ledPin, OUTPUT); 
}

void loop() { 
  for(int i=0;i<=255;i++) {  // Плавное включение светодиода. Переменная i последовательно принимает все значения от 0 до 255 
    analogWrite(ledPin, i);  // устанавливаем текущие значение переменной i
    delay(10);  // небольшая задержка для плавности включения светодиода
  }

  for(int i=255;i>=0;i--) {  // Плавное выключение светодиода. Перебираем все значения от 255 до 0 
    analogWrite(ledPin, i); 
    delay(10); 
  }
}

Аналоговые пины

В их обозначении присутствует буква А: А0, А1 и т.д. Работают эти пины на вход, так что нет необходимости задавать режим через pinMode(). Чтобы считать показания, применяется метод analogRead(<номер пина>). По сути, этот метод измеряет напряжение на аналоговом пине, разбив диапазон от нуля до напряжения питания на 1024 кусочка. К примеру, если analogRead вернул значение 512 — это соответствует половине напряжения питания.

Аналоговые пины в режиме цифровых

Все аналоговые пины можно переключить в режим цифрового выхода (но не в режим ШИМ-выхода). Достаточно переключить пин в режим OUTPUT:

pinMode(A3, OUTPUT); // переключаем пин A3 в режим цифрового выхода

К слову, можно пользоваться чисто цифровой нумерацией, без букв. Пину A0 соответствует цифровой пин 14, A1 — 15 и так далее.

Ограничение по току

При работе пинов в режиме выходов нужно не забывать об ограничениях по максимальному току. Для одного пина оно составляет 40 мА (или 50 мА для плат, работающих от питания 3.3 В). А суммарный ток со всех пинов не должен превышать 200 мА, иначе Ардуинка может выйти из строя.

Если нужно подключить к плате Ардуино более мощного потребителя, превышающего указанные предельные токи, следует подключать его через релейные модули или усилительные ключи с использованием внешнего источника питания:

Схема подключение мощной нагрузки к ардуино

Пример подключения мощной нагрузки к Ардуино через релейный блок: реле подключает к нагрузке внешний источник питания, от него же питается сама плата Ардуино.

Пины коммуникации

Для полноты картины осталось упомянуть о пинах коммуникации.

Пины SDA и SCL используются для подключения устройств, поддерживающих протокол I2C. Аналогично, пины TX и RX используются для коммуникаций по протоколу UART.

Поделиться в соцсетях:

Комментарии (2)

7 февраля 2024 - Влад

А если я не использую внешний кварц и мне нужны пины В6 и В7 как входы или выходы? То есть я только программирую на ардуино, а контроллер ставлю в другую плату.

Ответить
9 февраля 2024 - Admin

B6 и B7 - это вроде не про ардуино, а про более низкий уровень, ARM-микроконтроллеры. Тут не могу подсказать.

Ответить

Добавить комментарий