====== Подключение цифровых 3-проводных сенсоров с двумя состояниями к Arduino ======
{{:схемы-подключения:сенсоры:digital-all.jpg?nolink&|}}
Существует большое количество Arduino-совместимых цифровых сенсоров, имеющих всего два состояния, которые подключаются по трём проводам:
* Питание (Vcc) — красный провод. На него должно подаваться напряжение, указанное в документации на сенсор. Чаще всего 5 В — это норма.
* Земля (GND) — чёрный провод. Должен быть соединён с землёй микроконтроллера.
* Сигнальный цифровой (D) — //зелёный// провод. С него считываются показания сенсора: логический ноль или единица.
===== Способ передачи данных =====
При использовании цифрового сигнала, сенсор в любой момент времени выдаёт на сигнальный провод либо 0 В, либо напряжение своего питания — 5 В. Промежуточных значений нет. Для того, чтобы абстрагироваться от конкретных значений напряжения, которые не важны при обработке цифровых сигналов, существуют понятия логического нуля (LOW) и логической единицы (HIGH). 0 В — это логический ноль, напряжение питания — это логическая единица.
В этой статье речь идёт о простых сенсорах у которых есть всего два состояния: чёрный/не-чёрный, лево/право и т.д. Их очень легко подключить и считать показания: сенсоры передают свой сигнал непрерывно, а значение на сигнальном проводе напрямую соответствует их показаниям.
На [[amp>collection/Platy/product/Arduino-Uno|Arduino Uno]] имеется 14 цифровых входов, любой из которых может быть использован для подключения такого датчика.
Существуют также сенсоры с цифровым сигналом, которые измеряют множество градаций определённой физической величины вроде расстояния или температуры. Но для передачи своих данных с использованием лишь двух значений, каждый такой сенсор определяет //протокол//, в котором описывается какие последовательности нулей и единиц, с какими задержками, несут в себе передаваемые данные. Принимающая сторона, такая как Arduino, должна реализовать алгоритм, который будет считывать показания в соответствии с протоколом. Протокол у каждого сенсора свой, он описывается в его документации. Arduino — очень популярная платформа, поэтому чаще всего реализацию алгоритма расшифровки протокола можно найти в виде готовой библиотеки, написанной энтузиастами или самим производителем сенсора.
===== Подключение через IO Shield =====
Провода на таких сенсорах с одного конца обжаты коннектором для подключения к плате сенсора, а с другого конца — коннектором предназначенным для включения в штырьковые контакты на принимающей стороне. [[amp>product/arduino-mega-io-shield|IO Shield]], плата расширения для Arduino делает процесс подключения сенсора к нужным контактам микроконтроллера тривиальным: она, помимо всего прочего, имеет 14 троек штырьковых контактов, соединённых с соответствующими цифровыми входами 0-13 на Arduino.
{{:схемы-подключения:сенсоры:digital-io-shield.jpg?nolink&500|}}
Для подключения сенсора достаточно просто включить его коннектор в одну из троек.
{{:схемы-подключения:сенсоры:io-with-digital.jpg?nolink&|}}
Обратите внимание на маркировку возле контактов и убедитесь что она соответствует назначению проводов, выходящих из коннектора к сенсору. Если вы вставите коннектор вверх ногами, сенсор просто не заработает: никаких повреждений приченено не будет.
{{:схемы-подключения:сенсоры:digital-io-shield-connect.jpg?nolink&|}}
===== Программирование =====
Считать данные с цифрового сенсора с двумя состояниями крайне просто. Поскольку цифровые контакты могут являться как входами, так и выходами, для начала нужно сконфигурировать контакт, к которому подключен сенсор в режим ввода. Это нужно сделать единожды, поэтому функция ''setup'' — подходящее для этого место. Для конфигурирования режима используется стандартная функция [[http://www.arduino.cc/en/Reference/PinMode|pinMode]]. Так, например, если вы подключили сенсор к контакту 9, код конфигурации будет выглядеть так:
void setup()
{
pinMode(9, INPUT);
}
Затем, чтобы считать состояние в любой момент времени, существует стандартная функция [[http://www.arduino.cc/en/Reference/DigitalRead|digitalRead]]. Продолжая пример, чтобы получить состояние сенсора в переменную ''value'' достаточно исполнить:
int value = digitalRead(9);
Входное напряжение до 2 В проецируется на целочисленное значение 0, что соответствует значению константы [[http://www.arduino.cc/en/Reference/Constants|LOW]]; напряжение более 3 В проецируется на целочисленное значение 1, что соответствует значению константы [[http://www.arduino.cc/en/Reference/Constants|HIGH]]. Напряжение от 2 до 3 В спроецируется на 0 или 1 случайным образом, но это не является проблемой, так как цифровые сенсоры не должны выдавать такой сигнал.
Таким образом, программа, которая раз в секунду считывает показания цифрового сенсора с двумя состояниями, подключенного к контакту 9, и посылает их на компьютер может выглядеть так:
#define SENSOR_PIN 9
void setup()
{
pinMode(SENSOR_PIN, INPUT);
Serial.begin(9600);
}
void loop()
{
delay(1000);
int val = digitalRead(SENSOR_PIN);
Serial.println(val);
}
===== Преимущества и недостатки цифровых сенсоров с двумя состояниями =====
Преимуществом сенсоров с цифровым сигналом и всего двумя состояниями является крайняя простота их использования с Arduino.
Кроме того, поскольку возможных значений всего 2, а возможные отклонения в сигнальном напряжении «округляются» микроконтроллером в ближайшую сторону, такие сенсоры можно подключать с помощью достаточно длинных (много метров) проводов, не опасаясь искажения сигнала из-за влияния на провод внешних электромагнитных полей.
Недостаток очевиден — наличие всего двух состояний. Если необходимо измерять градации какой-либо величины, стоит взять схожий [[схемы-подключения:сенсоры:аналоговые-3-провода|аналоговый сенсор]] или сенсор с цифровым сигналом, который передаёт свои измерения по определённому протоколу.