Arduino - Функции ввода / вывода
Контакты на плате Arduino могут быть настроены как входы или выходы. Мы объясним работу контактов в этих режимах. Важно отметить, что большинство аналоговых выводов Arduino можно настроить и использовать точно так же, как цифровые выводы.
Контакты настроены как ВХОД
Контакты Arduino по умолчанию настроены как входы, поэтому их не нужно явно объявлять как входы с pinMode()когда вы используете их в качестве входных данных. Контакты, сконфигурированные таким образом, считаются находящимися в состоянии высокого импеданса. Входные контакты предъявляют чрезвычайно низкие требования к цепи, в которой они осуществляют выборку, что эквивалентно последовательному резистору 100 МОм перед контактом.
Это означает, что для переключения входного контакта из одного состояния в другое требуется очень небольшой ток. Это делает выводы полезными для таких задач, как реализация емкостного сенсорного датчика или считывание светодиодов в качестве фотодиода.
Контакты, сконфигурированные как pinMode (pin, INPUT), к которым ничего не подключено, или с подключенными к ним проводами, которые не подключены к другим цепям, сообщают о кажущихся случайными изменениях состояния контактов, улавливании электрического шума из окружающей среды или емкостной связи состояния ближайшей булавки.
Подтягивающие резисторы
Подтягивающие резисторы часто используются для перевода входного контакта в известное состояние, если вход отсутствует. Это можно сделать, добавив на вход подтягивающий резистор (до +5 В) или подтягивающий резистор (резистор к земле). Резистор 10 кОм - хорошее значение для повышающего или понижающего резистора.
Использование встроенного подтягивающего резистора с выводами, настроенными как вход
В микросхему Atmega встроено 20 000 подтягивающих резисторов, доступ к которым можно получить из программного обеспечения. Доступ к этим встроенным подтягивающим резисторам можно получить, установивpinMode()как INPUT_PULLUP. Это эффективно меняет поведение режима INPUT, где HIGH означает, что датчик выключен, а LOW означает, что датчик включен. Величина этого подтягивания зависит от используемого микроконтроллера. На большинстве плат на базе AVR гарантированное значение составляет от 20 кОм до 50 кОм. На Arduino Due оно составляет от 50 до 150 кОм. Чтобы узнать точное значение, обратитесь к таблице данных микроконтроллера на вашей плате.
При подключении датчика к контакту, сконфигурированному с INPUT_PULLUP, другой конец должен быть подключен к земле. В случае простого переключателя это приводит к тому, что вывод показывает ВЫСОКИЙ, когда переключатель разомкнут, и НИЗКИЙ, когда переключатель нажат. Подтягивающие резисторы обеспечивают ток, достаточный для включения светодиода, тускло подключенного к выводу, настроенному как вход. Если светодиоды в проекте работают, но очень тускло, скорее всего, это и происходит.
Те же регистры (ячейки внутренней памяти микросхемы), которые определяют, является ли вывод ВЫСОКИМ или НИЗКИМ, управляют подтягивающими резисторами. Следовательно, вывод, который настроен на включение подтягивающих резисторов, когда вывод находится в режиме INPUT, будет иметь вывод, сконфигурированный как HIGH, если вывод затем переключается в режим OUTPUT с помощью pinMode (). Это работает и в другом направлении, и на выходном контакте, который остается в ВЫСОКОМ состоянии, будет установлен подтягивающий резистор, если он переключен на вход с помощью pinMode ().
Example
pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor
Контакты настроены как ВЫХОД
Контакты, сконфигурированные как ВЫХОД с помощью pinMode (), считаются находящимися в состоянии низкого импеданса. Это означает, что они могут обеспечивать значительный ток для других цепей. Контакты Atmega могут подавать (обеспечивать положительный ток) или отводить (обеспечивать отрицательный ток) до 40 мА (миллиампер) тока в другие устройства / цепи. Этого тока достаточно, чтобы ярко загореться светодиод (не забудьте о последовательном резисторе) или запустить множество датчиков, но недостаточно тока для работы реле, соленоидов или двигателей.
Попытка запустить сильноточные устройства с выходных контактов может повредить или разрушить выходные транзисторы на контакте или повредить весь чип Atmega. Часто это приводит к "мертвому" выводу микроконтроллера, но оставшиеся микросхемы по-прежнему работают нормально. По этой причине рекомендуется подключать выводы OUTPUT к другим устройствам через резисторы 470 Ом или 1 кОм, если для конкретного применения не требуется максимальный ток, потребляемый от выводов.
Функция pinMode ()
Функция pinMode () используется для настройки определенного вывода, чтобы он работал либо как вход, либо как выход. Можно включить внутренние подтягивающие резисторы в режиме INPUT_PULLUP. Кроме того, режим INPUT явно отключает внутренние подтягивания.
Синтаксис функции pinMode ()
Void setup () {
pinMode (pin , mode);
}
pin - номер пина, режим которого вы хотите установить
mode - INPUT, OUTPUT или INPUT_PULLUP.
Example
int button = 5 ; // button connected to pin 5
int LED = 6; // LED connected to pin 6
void setup () {
pinMode(button , INPUT_PULLUP);
// set the digital pin as input with pull-up resistor
pinMode(button , OUTPUT); // set the digital pin as output
}
void setup () {
If (digitalRead(button ) == LOW) // if button pressed {
digitalWrite(LED,HIGH); // turn on led
delay(500); // delay for 500 ms
digitalWrite(LED,LOW); // turn off led
delay(500); // delay for 500 ms
}
}
digitalWrite (), функция
В digitalWrite()Функция используется для записи ВЫСОКОГО или НИЗКОГО значения на цифровой вывод. Если вывод был настроен как ВЫХОД с помощью pinMode () , его напряжение будет установлено на соответствующее значение: 5 В (или 3,3 В на платах 3,3 В) для ВЫСОКОГО, 0 В (земля) для НИЗКОГО. Если вывод настроен как INPUT, digitalWrite () включит (HIGH) или отключит (LOW) внутреннюю подтяжку на входном выводе. Рекомендуется установить для pinMode () значение INPUT_PULLUP, чтобы включить внутренний подтягивающий резистор.
Если вы не установите для pinMode () значение OUTPUT и не подключите светодиод к контакту, при вызове digitalWrite (HIGH) светодиод может потускнеть. Без явной установки pinMode () digitalWrite () включит внутренний подтягивающий резистор, который действует как большой токоограничивающий резистор.
Синтаксис функции digitalWrite ()
Void loop() {
digitalWrite (pin ,value);
}
pin - номер пина, режим которого вы хотите установить
value - ВЫСОКИЙ или НИЗКИЙ.
Example
int LED = 6; // LED connected to pin 6
void setup () {
pinMode(LED, OUTPUT); // set the digital pin as output
}
void setup () {
digitalWrite(LED,HIGH); // turn on led
delay(500); // delay for 500 ms
digitalWrite(LED,LOW); // turn off led
delay(500); // delay for 500 ms
}
Функция analogRead ()
Arduino может определить, есть ли напряжение на одном из его контактов, и сообщить об этом с помощью функции digitalRead (). Существует разница между датчиком включения / выключения (который обнаруживает присутствие объекта) и аналоговым датчиком, значение которого постоянно изменяется. Чтобы считывать данные с датчика этого типа, нам понадобится штырь другого типа.
В правом нижнем углу платы Arduino вы увидите шесть контактов с пометкой «Analog In». Эти специальные контакты не только показывают, есть ли на них напряжение, но и его значение. ИспользуяanalogRead() функция, мы можем прочитать напряжение, приложенное к одному из контактов.
Эта функция возвращает число от 0 до 1023, которое представляет напряжение от 0 до 5 вольт. Например, если к контакту номер 0 приложено напряжение 2,5 В, analogRead (0) возвращает 512.
Синтаксис функции analogRead ()
analogRead(pin);
pin - номер аналогового входа для чтения (от 0 до 5 на большинстве плат, от 0 до 7 на Mini и Nano, от 0 до 15 на Mega)
Example
int analogPin = 3;//potentiometer wiper (middle terminal)
// connected to analog pin 3
int val = 0; // variable to store the value read
void setup() {
Serial.begin(9600); // setup serial
}
void loop() {
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
}