Arduino IDE имеет набор стандартных функций для управления входом/выходом. Вы можете легко обрабатывать как цифровые сигналы, так и аналоговые. Ниже приведен список функций с кратким описанием и примерами использования.
Цифровой вход/выход
Цифровые выводы Arduino могут быть использованы как входы или как выходы. Поэтому необходимы функции, которые позволят установить (настроить) выводы на запись или чтение данных.
Функция pinMode()
Функция pinMode() позволяет определить работу отдельных контактов. Ее синтаксис выглядит следующим образом:
[slh lang=»php»]
pinMode(pin, mode);
[/slh]
pin — код — это указать номера контакта системы Arduino
mode — это одна из предопределенных констант: INPUT, OUTPUT или INPUT_PULLUP
Предназначение данных констант описано в другой статье. Примеры режим работы выводов:
[slh lang=»php»]
pinMode(13,OUTPUT);
pinMode(8,INPUT);
#define ledPin 10
pinMode(ledPin,OUTPUT);
const byte button=4;
pinMode(button,INPUT_PULLUP);
int button2=5;
pinMode(button2,INPUT_PULLUP);
[/slh]
Как вы можете видеть, конфигурирование контактов не такой уж сложный процесс. Стоит обратить внимание на тот факт, что тот же эффект можно получить несколькими способами.
Первые два примера основаны на непосредственном вводе номера контакта и определении режима его работы. Это правильная декларация, однако, она не рекомендуется для использования. Стоит использовать один из последующих способов.
Прямое обращение к номерам выводов может привести к путанице и ошибкам, поскольку во время написания и тестирования программы постоянно необходимо держать в голове какой номер за что отвечает. Лучшее решение — использовать определение, константу или переменную.
Определение — название для конкретного контакта (имя), которое определяет его использование. Безусловно, легче запомнить, что ledPin это вывод, к которому подключен светодиод, чем просто светодиод подключен к контакту 10.
Стоит помнить, что при объявлении соответствующего имени, мы так же будем ссылаться на него и в программе, а не только при определении режима работы вывода. Определение имен с помощью директивы define или const совпадает с практической точки зрения. Компилятор заменит данное имя на присвоенное ему значение.
Разработчики Arduino IDE рекомендуют использовать const. Мы в отношении контактов рекомендуем использовать define как четкое отличительное назначение контактов для имени.
Дополнительным преимуществом использования define является то, что он обычно размещается в начале кода, что облегчает модификацию электронной схемы в будущем. При изменении выводов в электронной схеме, в скетче нам необходимо будет только изменить номера контактов в определении выводов.
В последнем примере показано использование переменной в качестве имени контакт. Такое определение приведено на официальном сайте документации Arduino. На наш взгляд, это не лучший вариант, так как переменная займет ценное место в памяти. Единственно оправданным случаем использования переменной может быть ситуация, когда мы хотим в цикле выполнять операции над несколькими выводами. Это, однако, особый случай.
Иногда в каком-либо проекте нет необходимости в аналоговых входах, тогда эти выводы можно использовать в качестве цифрового входа или выхода. В этом случае с помощью функции pinMode() можно установить необходимый режим для контактов A0 — A5.
[slh lang=»php»]
#define power A0
void setup()
{
pinMode(power,OUTPUT);
}
[/slh]
Использование одного или нескольких контактов из A0… A5 как цифровых не приведет к невозможности использования оставшихся в качестве аналоговых входов. Можно использовать, например, 2 аналоговых входа и 4 цифровых выходов из A0… A5.
Функция digitalWrite()
Функция digitalWrite() позволяет установить состояние вывода как цифровой выход. Ее синтаксис (как и в pinMode()) требует двух параметров: первый — это номер контакта, второй — логическое значение LOW или HIGH.
Установка значения LOW приведет к тому, что напряжение на выходе будет 0В (короткое замыкание на массу), значение HIGH около 3,3В или 5В в зависимости от напряжения питания Arduino. Ниже приведен пример использования функции digitalWrite():
[slh lang=»php»]
#define ledPin 13
void setup()
{
pinMode(ledPin,OUTPUT);
}
void loop()
{
digitalWrite(ledPin,HIGH); //включить LED
delay(500); //подождать 500ms (0,5 сек)
digitalWrite(ledPin,LOW); //выключить LED
delay(500); //подождать 500ms (0,5 сек)
}
[/slh]
В примере видно как можно установить соответствующее состояние вывода. Использованная в примере функция delay() позволяет выполнять задержку исполнения кода. Подробнее об этом будет обсуждаться далее.
При использование функции digitalWrite() в случае, когда вывод настроен как вход, необходимо включить или выключить режим PULLUP, то есть подключить подтягивающий резистор. В более поздних версиях Arduino IDE, безусловно, лучше использовать pinMode() с параметром INPUT_PULLUP.
Функция digitalRead()
Функция digitalRead() позволяет считывать состояние с вывода, определенного как цифровой вход. Эта функция возвращает значение LOW или HIGH. Необходимо указать номер контакта, с которого мы хотим прочитать состояние.
[slh lang=»php»]
digitalRead(pin);
[/slh]
Если вывод, с которого мы считываем состояние в данный момент не подключен к схеме («висит в воздухе»), то функция может возвратить случайное значение — LOW или HIGH. Следует помнить об этом во время проектирования электронного оборудования. Для предотвращения такой ситуации необходимо использовать подтягивающий резистор. Ниже приведены примеры чтения состояния цифрового входа:
[slh lang=»php»]
#define ledPin 13 // светодиод подключен к контакту 13
#define inPin 7 // кнопка подключена к контакту 7
int val = 0; // переменная, хранящая состояние входа
void setup()
{
pinMode(ledPin, OUTPUT); // pin 13 как выход
pinMode(inPin, INPUT_PULLUP); // pin 7 как вход
}
void loop()
{
val = digitalRead(inPin); // считываем состояние с контакт 7
digitalWrite(ledPin, val);// состояние светодиода зависит от состояния входа
}
[/slh]
Приведенный выше пример показывает, как считывать состояние входа, и использовать эту информацию для управления выходом.
Переменная val может содержать значение LOW или HIGH, в зависимости от состояния входа. Функция digitalWrite() задает состояние выхода в зависимости от переменной val.
Довольно часто бывает необходимо выполнять некоторые операции, которые напрямую зависят от состояния на входе. В такой ситуации мы можем написать так:
[slh lang=»php»]
#define ledPin 13 // светодиод подключен к контакту 13
#define inPin 7 // кнопка подключена к контакту 7
void setup()
{
pinMode(ledPin, OUTPUT); // pin 13 как выход
pinMode(inPin, INPUT_PULLUP); // pin 7 как вход
}
void loop()
{
if(digitalRead(inPin)) //более явный способ: if(digitalRead(inPin)==HIGH)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
}
[/slh]
Приведенный выше пример программы также зажигает и гасит светодиод в зависимости от состояния подключенной кнопки. Действия те же самые, но синтаксис программы немного другой. Можно использовать оба вышеупомянутых решения, в некоторых случаях проще применить первый пример, в других — второй.