====== Подключение аналоговых трёхпроводных сенсоров к Arduino ====== {{:схемы-подключения:сенсоры:analog-all.jpg?nolink&|}} Существует большое количество сенсоров с аналоговым сигналом, совместимых с [[amp>collection/arduino|Arduino]], которые подключаются по трём проводам: * Питание (Vcc) — красный провод. На него должно подаваться напряжение, указанное в документации на сенсор. Чаще всего 5 В — это норма. * Земля (GND) — чёрный провод. Должен быть соединён с землёй микроконтроллера. * Сигнальный (S) — синий провод. С него считываются показания сенсора. ===== Способ передачи данных ===== При использовании аналогового сигнала, показания датчика передаются в виде переменного напряжения на сигнальном проводе. Сигнальное напряжение может принимать значение от 0 В до напряжения питания. Хотя обычно «рабочий диапазон» напряжений более узкий. Между измеряемой величиной и возвращаемым обратно напряжением установлена определённая зависимость. Например: чем больше величина, тем больше напряжение; или наоборот: чем больше величина, тем напряжение меньше. Иногда зависимость более сложная: напряжение растёт до определённого значения, затем падает пропорционально ему. Всё зависит от сенсора. Так например, [[amp>product/infrared-range-meter-150|инфракрасный дальномер]] измеряет расстояние до объекта перед ним. Для него чем меньше расстояние, тем больше напряжение. Если объект находится на расстоянии 20 см, сенсор выдаёт ~2.5 В на сигнальном проводе; на расстоянии 60 см ~ 1 В; на расстоянии 150 см ~ 0.4 В. Точная диаграмма зависимости напряжения от расстояния для инфракрасного дальномера от Sharp приведена в его datasheet’е. {{:схемы-подключения:сенсоры:range-voltage-diagram.png?nolink&|}} Для других сенсоров диаграммы можно так же найти в документации или получить экспериментально. На [[amp>product/arduino-uno|Arduino Uno]] имеется 6 аналоговых входов с помощью которых можно считывать переменное напряжение, и исходя из его значения получать значения с датчика. Эти входы объединены на плате в группу «Analog In» и пронумерованы от A0 до A5. ===== Подключение через IO Shield ===== Провода на таких сенсорах с одного конца обжаты коннектором для подключения к плате сенсора, а с другого конца — коннектором предназначенным для включения в штырьковые контакты на принимающей стороне. IO Shield, плата расширения для Arduino делает процесс подключения сенсора к нужным контактам микроконтроллера тривиальным: она, помимо всего прочего, имеет 6 троек штырьковых контактов, соединённых с соответствующими входами A0-A5 на Arduino. {{:схемы-подключения:сенсоры:analog-io-shield.jpg?nolink&500|}} Для подключения сенсора достаточно просто включить его коннектор в одну из троек. {{:схемы-подключения:сенсоры:io-irrange.jpg?nolink&|}} Обратите внимание на маркировку возле контактов и убедитесь что она соответствует назначению проводов, выходящих из коннектора к сенсору. Если вы вставите коннектор вверх ногами, сенсор просто не заработает: никаких повреждений приченено не будет. {{:схемы-подключения:сенсоры:analog-io-shield-connect.jpg?nolink&|}} ===== Программирование ===== Считать данные с аналогового сенсора крайне просто. Для этого в Arduino существует стандартная функция [[http://www.arduino.cc/en/Reference/AnalogRead|analogRead]]. Так, например, если вы подключили сенсор к контакту A5, чтобы получить показания сенсора в переменную ''value'' достаточно исполнить: int value = analogRead(A5); Диапазон входного напряжения от 0 до 5 В в программе проецируется на диапазон целочисленных значений от 0 до 1023. Перевести полученное значение в физические единицы, такие как, например, расстояние, поможет функция [[http://www.arduino.cc/en/Reference/Map|map]]. Подробнее об этом рассказывает Джереми Блюм, в своём [[видеоуроки:4-аналоговые-входы|4-м видеоуроке по Arduino]]. Таким образом, программа, которая раз в секунду считывает показания аналогового сенсора, подключенного к контакту А5, и посылает их на компьютер может выглядеть так: #define SENSOR_PIN A5 void setup() { Serial.begin(9600); } void loop() { delay(1000); int val = analogRead(SENSOR_PIN); Serial.println(val); } ===== Преимущества и недостатки аналоговых сенсоров ===== Преимуществом сенсоров с аналоговым сигналом является крайняя простота их использования с Arduino. Кроме того, поскольку показания датчика можно считывать «из коробки» всего одной командой, драгоценные килобайты памяти на микроконтроллере не расходуются на хранение алгоритма расшифровки протокола, присущего цифровым сенсорам. Главным недостатком аналогового сигнала является неустойчивость к внешним шумам. Если провод от сенсора до микроконтроллера будет достаточно длинным, он начнёт работать как антенна и улавливать внешние электромагнитные поля: провод сам будет влиять на выходное напряжение и тем самым искажать показания. Поэтому разумный предел длины провода для аналогового сенсора — не более 50 см. Аналоговый сигнал при чтении на Arduino может иметь максимум 1024 градации, чего может оказаться недостаточно для высокоточных измерений. На ATmega328p, установленном на Arduino, как и на большинстве других микроконтроллеров аналоговых входов не много. Поэтому количество одновременно контролируемых аналоговых сенсоров ограничено. У [[amp>product/arduino-uno|Arduino Uno]] их 6, у [[amp>product/arduino-mega-2560|Mega 2560]] — 16. Если какой-либо из недостатков существеннен для вашего проекта, обратите внимание на цифровые сенсоры.