При использовании аналогового сигнала, показания датчика передаются в виде переменного напряжения на сигнальном проводе. Сигнальное напряжение может принимать значение от 0 В до напряжения питания. Хотя обычно «рабочий диапазон» напряжений более узкий.
На Arduino Uno имеется 6 аналоговых входов с помощью которых можно считывать переменное напряжение, и исходя из его значения получать значения с датчика. Эти входы объединены на плате в группу «Analog In» и пронумерованы от A0 до A5.
Между измеряемой величиной и возвращаемым обратно напряжением установлена определённая зависимость. Например: чем больше величина, тем больше напряжение; или наоборот: чем больше величина, тем напряжение меньше. Иногда зависимость более сложная: напряжение растёт до определённого значения, затем падает пропорционально ему. Всё зависит от сенсора.
Считать данные с аналогового сенсора крайне просто. Для этого в Arduino существует стандартная функция analogRead
. Так, например, если вы подключили сенсор к контакту A5, чтобы получить показания сенсора в переменную value
достаточно исполнить:
int value = analogRead(A5);
Таким образом, программа, которая раз в секунду считывает показания аналогового сенсора, подключенного к контакту А5, и посылает их на компьютер может выглядеть так:
#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);
int val = analogRead(SENSOR_PIN);
Serial.println(val);
}
Аналоговый сигнал при чтении на Arduino может иметь максимум 1024 градации. С учётом того, что рабочий диапазон почти всегда уже допустимого, полезных градаций ещё меньше. Этого может оказаться недостаточно для высокоточных измерений.