Сенсоры с аналоговым сигналом

При использовании аналогового сигнала, показания датчика передаются в виде переменного напряжения на сигнальном проводе. Сигнальное напряжение может принимать значение от 0 В до напряжения питания. Хотя обычно «рабочий диапазон» напряжений более узкий.

На Arduino Uno имеется 6 аналоговых входов с помощью которых можно считывать переменное напряжение, и исходя из его значения получать значения с датчика. Эти входы объединены на плате в группу «Analog In» и пронумерованы от A0 до A5.

Протокол

Между измеряемой величиной и возвращаемым обратно напряжением установлена определённая зависимость. Например: чем больше величина, тем больше напряжение; или наоборот: чем больше величина, тем напряжение меньше. Иногда зависимость более сложная: напряжение растёт до определённого значения, затем падает пропорционально ему. Всё зависит от сенсора.

Так например, инфракрасный дальномер измеряет расстояние до объекта перед ним. Для него чем меньше расстояние, тем больше напряжение. Если объект находится на расстоянии 20 см, сенсор выдаёт ~2,5 В на сигнальном проводе; на расстоянии 60 см ~ 1 В; на расстоянии 150 см ~ 0,4 В. Точная диаграмма зависимости напряжения от расстояния для инфракрасного дальномера от Sharp приведена в его datasheet’е.

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

Программирование

Считать данные с аналогового сенсора крайне просто. Для этого в Arduino существует стандартная функция analogRead. Так, например, если вы подключили сенсор к контакту A5, чтобы получить показания сенсора в переменную value достаточно исполнить:

int value = analogRead(A5);

Диапазон входного напряжения от 0 до 5 В в программе проецируется на диапазон целочисленных значений от 0 до 1023. Перевести полученное значение в физические единицы, такие как, например, расстояние, поможет функция map. Подробнее об этом рассказывает Джереми Блюм, в своём 4-м видеоуроке по Arduino.

Таким образом, программа, которая раз в секунду считывает показания аналогового сенсора, подключенного к контакту А5, и посылает их на компьютер может выглядеть так:

analogSensorRead.pde
#define SENSOR_PIN A5
 
void setup()
{
    Serial.begin(9600);
}
 
void loop()
{
    delay(1000);
    int val = analogRead(SENSOR_PIN);
    Serial.println(val);
}

Преимущества и недостатки аналогового сигнала

Преимуществом сенсоров с аналоговым сигналом является крайняя простота их использования с Arduino. Кроме того, поскольку показания датчика можно считывать «из коробки» всего одной командой, драгоценные килобайты памяти на микроконтроллере не расходуются на хранение алгоритма расшифровки протокола, присущего цифровым сенсорам.

Главным недостатком аналогового сигнала является неустойчивость к внешним шумам. Если провод от сенсора до микроконтроллера будет достаточно длинным, он начнёт работать как антенна и улавливать внешние электромагнитные поля: провод сам будет влиять на выходное напряжение и тем самым искажать показания. Поэтому разумный предел длины провода для аналогового сенсора — не более 50 см.

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

#define SENSOR_PIN A5
 
void setup()
{
    Serial.begin(9600);
}
 
void loop()
{
    delay(1000);
    long val = 0;
    for (int i=0; i<100; ++i) {
        val = val + analogRead(SENSOR_PIN);
    }
    val = val/100;
    Serial.println(val);
}

Аналоговый сигнал при чтении на Arduino может иметь максимум 1024 градации. С учётом того, что рабочий диапазон почти всегда уже допустимого, полезных градаций ещё меньше. Этого может оказаться недостаточно для высокоточных измерений.

На ATmega328p, установленном на Arduino, как и на большинстве других микроконтроллеров аналоговых входов немного. Поэтому количество одновременно контролируемых аналоговых сенсоров ограничено. У Arduino Uno их 6, у Mega 2560 — 16.

Если какой-либо из недостатков существенен для вашего проекта, обратите внимание на цифровые сенсоры.