Аналоговый сигнал Arduino

В мире электроники и робототехники в частности, все устройства, как и люди, обмениваются информацией с помощью сигналов.
Сигналы — это электрические импульсы, которые содержат в себе данные, полученные с датчиков, к микроконтроллерам и от управляющих схем к исполнительным механизмам. Сигналы бывают двух основных типов: цифровые и аналоговые.

Несмотря на то, что данная статья об аналоговом сигнале, цифровой сигнал мы также обсудим, в качестве сравнительной единицы.
Так что такое аналоговый сигнал?
Хороший вопрос! Аналоговый сигнал - это непрерывное изменение напряжения или тока во времени, которое точно отражает некоторую физическую величину (скажем, температуру, освещенность, силу нажатия и тд).

В отличие от цифрового сигнала, который имеет только два состояния (1 и 0 или HIGH и LOW), аналоговый сигнал может принимать любое значение, но в сокращенном диапазоне. Для примера, датчик температуры выдает не просто “холодно” или “жарко”, а конкретное значение в вольтах, пропорциональное температуре. Точно также потенциометр изменяет сопротивление плавно, а не ступенчато.

Хороший вопрос! Аналоговый сигнал - это непрерывное изменение напряжения или тока во времени, которое точно отражает некоторую физическую величину (скажем, температуру, освещенность, силу нажатия и тд).

В отличие от цифрового сигнала, который имеет только два состояния (1 и 0 или HIGH и LOW), аналоговый сигнал может принимать любое значение, но в сокращенном диапазоне. Для примера, датчик температуры выдает не просто “холодно” или “жарко”, а конкретное значение в вольтах, пропорциональное температуре. Точно также потенциометр изменяет сопротивление плавно, а не ступенчато.

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

Какая роль у аналоговых сигналов в робототехнике?
Роботы непосредственно взаимодействуют с реальным миром, а он не бинарен, то есть никогда не пребывает в одном из двух состояний. Чтобы чувствовать окружающую среду, плавно управлять моторами и сервоприводами, а также адаптироваться к постоянно изменяющимся условиям, роботу жизненно необходимо поддерживать аналоговые сигналы. И даже если микроконтроллер вроде Arduino работает с чисто цифровыми данными, АЦП (аналого-цифровые преобразователи) переводят реальные физические величины на понятный для него язык нулей и единиц.

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

  • Фоторезистор. Полупроводниковый компонент, сопротивление которого уменьшается при увеличении освещенности. Используется для регулировки подсветки робота, для создания умных ночников, определения наличия или отсутствия объекта и много еще для чего. Вы только посмотрите, насколько он лаконичный:
  • Термистор. Проще говоря, термистор — это термо-резистор, то есть резистор, изменяющий свое сопротивление в зависимости от температуры. Есть два основных типа: NTC (сопротивление падает при нагреве) и PTC (сопротивление растет при нагреве). Он великолепно чувствует температуру, если приложить к нему какой-нибудь источник тепла, его сопротивление не изменится. Термистор входит в состав бытовых термометров, защищает устройства от перегрева и измеряет температуру воздуха или воды.
  • Потенциометр. Потенциометр регулирует напряжение в электроцепях. Вспомните гитарный усилитель или даже обычную колонку, везде в них будет хотя бы один такой ручной регулятор. Внутри потенциометр напоминает бутерброд: представьте два кусочка хлеба (два крайних контакта с постоянным сопротивлением) и колбаску между ними (средний контакт). Поворачивая ручку, колбаска перемещается между этими кусочками, и чем ближе она к одному из краев, тем меньше там сопротивление. Потенциометр используется для ручного управления, калибровки, регулировки яркости, звука и тд.
  • Тензодатчик. Сенсор, который чувствует давление, изгиб или растяжение. По сути, принцип его работы похож на электронные весы. В основе тензодатчика лежат тензорезисторы (элементы, которые меняют сопротивление при деформации). Чем сильнее мы давим или гнем его, тем больше изменяется сопротивление. Arduino, к примеру, переводит эти изменения в цифры. Тензодатчик применяется в роборуках, шагающих роботах и в промышленных манипуляторах.
Как Arduino работает с аналоговыми сигналами?
Самые популярные версии Arduino – UNO и Nano имеют встроенный 10-битный аналого-цифровой преобразователь (он же АЦП), который позволяет измерять аналоговые напряжения в диапазоне от 0 до 5 вольт с разрешением 1024 уровней.
Исходя из этого, Arduino UNO и Arduino Nano имеют аналоговые входы. У Arduino UNO их 6 (A0-A5), а вот у Arduino Nano – 8 (A0-A7).

Стоит сделать небольшую ремарку. Микроконтроллер ATmega328P, лежащий в основе этих плат, может принимать аналоговые сигналы извне и преобразовывать в цифровые, однако не способен генерировать их сам, что бывает необходимо, например, в случае с аудиоусилителями, динамиками и прочим, поскольку цифро-аналоговый преобразователь (ЦАП) ни в одну из этих плат не встроен.

Еще раз. Большинство плат Arduino, включая UNO и Nano, имеют встроенный аналого-цифровой преобразователь для обработки аналоговых сигналов и, соответветственно, аналоговые входы. У каждой платы это разное число. Однако цифро-аналоговых преобразователей у этих плат нет, поэтому и аналоговые выходы у них тоже отсутствуют. 
Обычно, для таких задач Arduino использует так называемую ШИМ (широтно-импульсную модуляцию), которая имитирует аналоговый сигнал. Именно ШИМ позволяет управлять скоростью и положением моторов, регулировать яркость света или громкость звука и т.д.

Принцип работы ШИМ весьма прост: ШИМ-контроллер имитирует аналоговый сигнал путем быстрого включения и выключения цифрового выхода. Мы, например, можем очень быстро включать и выключать свет, и если делать это на 50% времени, то будет казаться, что он наполовину яркий, если на 25% времени, то свет будет тусклее и так далее. Абсолютно то же самое происходит с электрическим сигналом.
Технически это реализовано через частоту 490 Герц (это значит, что сигнал включается 490 раз в секунду) и скважность (это процент времени, когда сигнал включен, именно как в примере со светом).
Где же расположены эти самые ШИМ-выходы? На Arduino UNO, как и на Arduino Nano, они обозначаются символом ~ (тильда) и номерами 3, 5, 6, 9, 10 и 11.

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

Фоторезистор соединяется одной ножкой с GND (земля), другой – с любым аналоговым входом (A0-A5). В отличие от светодиода, он не имеет полярности, так что подключить его можно любой стороной. Детально изучим схему подключения
Обратите внимание. Фоторезистор меняет сопротивление в зависимости от света: чем светлее, тем сопротивление меньше. Если подключить его напрямую к плате, без резистора, при большом уровне яркости он может создать короткое замыкание, ведь ток будет слишком сильным. Резистор на 1 кОм создает делитель напряжения, чтобы ограничивать ток в цепи и преобразовывать изменение сопротивления фоторезистора в понятное для Arduino напряжение, от 0 до 5 вольт. Можно использовать также резистор на 10 кОм, но 1 кОм будет достаточно.

Также со светодиодом. Он не имеет внутреннего ограничения тока и легко может сгореть, если сразу подать на него 5 вольт, поэтому он тоже нуждается в резисторе. Для светодиода достаточно резистора на 220 Ом.

Напишем код, который оживит всю схему:

const int LED_PIN = 13; // пин светодиода
const int PHOTOSENSOR_PIN = A0; // пин фоторезистора
const int LIGHT_THRESHOLD = 300; // порог

void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // гасим светодиод при старте
}

void loop() {
int sensorValue = analogRead(PHOTOSENSOR_PIN);

Serial.print("Уровень освещенности: ");
Serial.println(sensorValue);


if (sensorValue < LIGHT_THRESHOLD) {
digitalWrite(LED_PIN, HIGH); // включаем при недостаточном освещении
} else {
digitalWrite(LED_PIN, LOW); // выключаем при достаточном освещении
}

delay(100); // небольшая задержка, для стабильности
}

Как вы могли заметить, код небольшой. Для лучшего понимания рекомендуется не просто скопировать и вставить, а переписать посимвольно каждую строку. Поэкспериментируйте, поменяйте пины, добавьте свои условия.

Подарите ребёнку профессию будущего!

Обучение перспективной IT-профессии — легко и увлекательно! Онлайн-курсы программирования для детей и подростков.
Как насчет ШИМ-портов?
Умение работать с ШИМ-выходами тоже необходимо! Давайте не будем терять ни минуты и соберем новую схему.
Как вы могли заметить, схема с ШИМ напоминает предыдущую. Действительно, они похожи, однако теперь светодиод подключен не к обычному цифровому 13 пину, а к пину с тильдой. Теперь напишем код, который будет плавно зажигать и гасить светодиод:

const int LED_PIN = 10; // ШИМ-пин

void setup() {
pinMode(LED_PIN, OUTPUT);
}

void loop() {
for (int i = 0; i <= 255; i++) { // увеличиваем яркость
analogWrite(LED_PIN, i);
delay(10); // ПАУЗА
}
for (int i = 255; i >= 0; i--) { // уменьшаем яркость
analogWrite(LED_PIN, i);
delay(10); // ПАУЗА
}
}

И снова, все довольно просто и понятно. Обратите внимание, что для работы с ШИМ-выходами применяется функция analogWrite(), принимающая в качестве параметров номер пина, к которому подключается компонент, и значение в диапазоне от 0 до 255, отвечающее за силу напряжения. Не забудьте переписать код вручную!
Подведем итоги
  • Невзирая на отсутствие в большинстве плат цифро-аналогового преобразователя, работа с аналоговыми сигналами возможна как на входе, так и на выходе. Суммируем:
  • Аналоговые входы. Работа с ними реализуется при помощи 10-битного АЦП (аналого-цифрового преобразователя). На самых популярных платах, таких как Arduino UNO и Nano, их около 6-8 штук. Используются такие входы для датчиков, вроде термистора, фоторезистора, потенциометра и т.д.
  • Отсутствие аналоговых выходов. Практически ни одна плата из серии Arduino не поддерживает ЦАП. Помните, это не то же самое, что и АЦП. Без внешних модулей ЦАП невозможен.
  • Псевдоаналоговые выходы. Это та самая широтно-импульсная модуляция, которая имитирует аналоговые сигналы. Разрешение 8-битное, портов 6 как на UNO, так и на Nano, каждый из них помечен значком ~ (тильдой). Незаменима при управлении яркостью светодиодов и скоростью моторов. Однако это по прежнему не настоящие аналоговые выходы, а всего лишь среднее значение импульсов.

ENJOY ROBOTICS

Уникальные роботы для
изучения программирования

ОТЗЫВЫ КЛИЕНТОВ

Тим Козлов
Боевой робот— это сила!
Коля и Стёпа
Дом – как из будущего! Всё видит и делает сам
Григорий Соколов
папа Льва
Разобрались с сыном, отлично работает. Легко пользоваться программой
Мария Миронова
мама Олега
Классная развивающая игрушка для мальчиков и пап
Жанна Быкова
Интересно, когда делаешь сам и работает, как ты хочешь
Данил Артибашев
преподаватель
Комплекты чёткие и хорошо продуманные. Жду новых выпусков
Дима Никитин
Собрал своего Отто, он крутой!
София Муратова
Увлекательно понимать, как всё это устроено