Аналоговые сигналы

Урок 5: Аналоговые сигналы

Цели урока:

  1. Познакомиться с понятием аналоговых сигналов.
  2. Научить использовать функции analogRead() и analogWrite().
  3. Объяснить, как работает АЦП (аналого-цифровой преобразователь).
  4. Закрепить знания на практике, создав проект с управлением яркостью светодиода с помощью потенциометра.

Теоретическая часть

Что такое аналоговые сигналы?

Аналоговые сигналы — это сигналы, которые могут принимать любое значение в пределах определенного диапазона. В отличие от цифровых сигналов, которые имеют только два состояния (HIGH и LOW), аналоговые сигналы могут плавно изменяться.

Примеры аналоговых сигналов:

  • Напряжение на потенциометре (от 0 до 5 В).
  • Данные с датчиков температуры, освещенности или влажности.

Почему это важно?

Аналоговые сигналы позволяют измерять и управлять параметрами, которые изменяются плавно, например, яркостью света, температурой или скоростью вращения мотора.

АЦП (аналого-цифровой преобразователь)

Что такое АЦП?

АЦП (аналого-цифровой преобразователь) — это устройство, которое преобразует аналоговый сигнал (например, напряжение) в цифровой код, который может быть обработан микроконтроллером.

Как это работает в Arduino?

  • Arduino Uno имеет встроенный 10-битный АЦП. Это означает, что он может преобразовать аналоговый сигнал в одно из 1024 значений (от 0 до 1023).
  • Диапазон входного напряжения: от 0 до 5 В.
    • 0 соответствует 0 В.
    • 1023 соответствует 5 В.

Пример:

Если на аналоговый пин подано напряжение 2.5 В, АЦП вернет значение примерно 512.

Зачем это нужно?

АЦП позволяет Arduino "понимать" аналоговые сигналы, такие как напряжение на потенциометре или данные с датчиков.

Функции для работы с аналоговыми сигналами

Функция analogRead()

Назначение:

Функция analogRead() используется для чтения аналогового значения с пина.

Синтаксис:

analogRead(pin);
  • pin: Номер аналогового пина (например, A0, A1, A2 и т.д.).

Как это работает:

  • Arduino Uno имеет 6 аналоговых входов (A0-A5).
  • Функция возвращает значение от 0 до 1023, где:
    • 0 соответствует 0 В.
    • 1023 соответствует 5 В.

Пример использования:

int sensorValue = analogRead(A0); // Чтение значения с аналогового пина A0

Объяснение:

  • Когда вы подключаете потенциометр к аналоговому пину, Arduino измеряет напряжение на среднем контакте потенциометра.
  • Например, если потенциометр повернут наполовину, напряжение будет около 2.5 В, и analogRead() вернет значение около 512.

Функция analogWrite()

Назначение:

Функция analogWrite() используется для управления аналоговыми устройствами с помощью ШИМ (широтно-импульсной модуляции).

Широтно-импульсная модуляция (ШИМ, или PWM — Pulse Width Modulation) — это цифровой способ имитации аналогового сигнала с помощью быстрого включения/выключения напряжения. Представьте, что вы включаете и выключаете свет очень быстро. Если он горит дольше, чем выключен, — кажется ярче. Если меньше — тусклее. Так работает ШИМ.

Синтаксис:

analogWrite(pin, value);
  • pin: Номер пина, поддерживающего ШИМ (например, 3, 5, 6, 9, 10, 11 на Arduino Uno). Помечается знаком ~.
  • value: Значение от 0 до 255, где:
    • 0 — 0% скважности (полностью выключено).
    • 255 — 100% скважности (полностью включено).

Скважность (Duty Cycle) - это отношение времени высокого уровня к периоду сигнала, выраженное в процентах:

Скважность = (Время "вкл"/Период) * 100%

  • 0% — всегда 0 В (полностью выключено).
  • 50% — половину времени 5 В, половину 0 В (среднее ~2.5 В).
  • 100% — всегда 5 В (полностью включено).

Как это работает:

  • ШИМ быстро переключает сигнал между HIGH и LOW, изменяя длительность импульсов.
  • Например, если value = 128, сигнал будет находиться в состоянии HIGH 50% времени, а в состоянии LOW — 50% времени.
  • Это позволяет управлять яркостью светодиода или скоростью мотора.

Пример использования:

analogWrite(9, 128); // Установить яркость светодиода на 50%

Объяснение:

  • Если вы хотите, чтобы светодиод светился на половину своей максимальной яркости, используйте значение 128.
  • Для полной яркости используйте 255, а для выключения — 0.

Потенциометр

Что такое потенциометр?

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

Как это работает:

  • Потенциометр имеет три контакта: два крайних и один средний.
  • При повороте ручки средний контакт изменяет свое положение, что приводит к изменению сопротивления и, соответственно, напряжения.

Пример использования:

  • Потенциометр можно использовать для управления яркостью светодиода или скоростью мотора.

Как подключить потенциометр:

  • Подключите один крайний контакт к 5V.
  • Подключите другой крайний контакт к GND.
  • Подключите средний контакт к аналоговому пину (например, A0).

Практическая часть

Задание: Управление яркостью светодиода с помощью потенциометра

Цель задания:

Создать проект, в котором яркость светодиода регулируется с помощью потенциометра.

Необходимые компоненты:

  • Светодиод.
  • Резистор 220 Ом.
  • Потенциометр.
  • Провода.
  • Макетная плата (можно и без нее).

Схема подключения (рисунок ниже):

  1. Подключите анод светодиода к пину 9 через резистор 220 Ом.
  2. Подключите катод светодиода к GND.
  3. Подключите крайние контакты потенциометра к 5V и GND.
  4. Подключите средний контакт потенциометра к аналоговому пину A0.
Схема подключения потенциометра к Arduino для работы с аналоговыми сигналами

Код программы:

void setup() {
  pinMode(9, OUTPUT); // Настройка пина 9 как выхода (ШИМ)
}

void loop() {
  int potValue = analogRead(A0); // Чтение значения с потенциометра (0-1023)
  int brightness = map(potValue, 0, 1023, 0, 255); // Преобразование в диапазон 0-255
  analogWrite(9, brightness); // Установка яркости светодиода
}

Вот готовый проект на Wokwi, нажмите кнопку "Start the simulation" и покрутите потенциометр.

Объяснение кода:

  1. В setup() настраиваем пин 9 как выход (ШИМ).
  2. В loop() читаем значение с потенциометра (от 0 до 1023) (код АЦП).
  3. Преобразуем это значение в диапазон 0-255 с помощью функции map().
  4. Устанавливаем яркость светодиода с помощью analogWrite().

Как работает функция map():

  • Функция map() преобразует (интерполирует) значение из одного диапазона в другой.
  • В данном случае она преобразует значение от 0-1023 (потенциометр) в диапазон 0-255 (ШИМ).

Вопросы для закрепления:

  1. Что такое аналоговый сигнал?
  2. Как работает АЦП в Arduino?
  3. Какие функции используются для работы с аналоговыми сигналами?
  4. Как работает потенциометр?
  5. Как преобразовать значение с аналогового пина в диапазон 0-255?

Домашнее задание:

  1. Создайте проект, где скорость мигания светодиода регулируется с помощью потенциометра.
  2. Подключите два светодиода и заставьте их менять яркость в противоположных направлениях (когда один становится ярче, другой тускнеет).

Советы по работе в Wokwi:

  1. Используйте встроенные компоненты в Wokwi для сборки схемы.
  2. Экспериментируйте с разными значениями в функции map(), чтобы лучше понять, как она работает.
  3. Не бойтесь ошибаться — симулятор позволяет легко исправлять ошибки и пробовать новые идеи.

Итог:

Теперь вы знаете, как работать с аналоговыми сигналами в Arduino! Вы научились использовать функции  analogRead() и analogWrite(), а также создали проект с управлением яркостью светодиода с помощью потенциометра.

Следующий урок: Работа с кнопками