Аналоговый вход выход, вывод в монитор порта
Считывание аналогового сигнала и использование map() для ШИМ на Arduino
Освойте аналоговые входы и выходы на Arduino! Этот пример показывает, как считывать значения с потенциометра на пине A0, преобразовывать их в диапазон 0-255 с функцией map(), управлять яркостью светодиода через ШИМ на пине 9 и выводить данные в Serial Monitor. Простой проект для понимания АЦП, ЦАП и PWM в Arduino – вращайте ручку и наблюдайте изменения!
Необходимые компоненты для аналогового управления яркостью на Arduino
Используйте детали для этого проекта с потенциометром и ШИМ:
- Плата Arduino (Uno или аналогичная)
- Потенциометр (10 кОм рекомендуется)
- Красный светодиод
- Резистор 220 Ом для защиты LED
Схема подключения потенциометра и светодиода к Arduino
Подключение простое: потенциометр к 5V, GND и A0, LED через резистор к пину 9.
Боковые пины потенциометра – к +5V и GND, центральный – к A0. Резистор 220 Ом к пину 9, анод LED к резистору, катод – к GND.
Полная схема проекта с аналоговым входом и выходом
Код для Arduino: analogRead(), map() и analogWrite() с Serial выводом
В setup() инициализируйте Serial. В loop() считывание значений из A0, преобразование 0-1023 в 0-255, на пин 9 и выводите в монитор. Delay 2 мс для стабильности.
Полный скетч Arduino для аналогового ввода-вывода
/*
Аналоговый вход, аналоговый выход, вывод в последовательный монитор
Считывает аналоговый сигнал с пина ввода, отображает результат в диапазон от 0 до 255
и использует его для установки ширины импульсов модуляции (ШИМ) на выходном пине.
Также выводит результаты в монитор последовательного порта.
Схема:
- потенциометр подключен к аналоговому пину 0.
Центральный пин потенциометра подключен к аналоговому пину.
Боковые пины потенциометра подключены к +5V и GND.
- светодиод подключен к цифровому пину 9 и GND.
*/
// Эти константы не будут меняться. Они используются для именования используемых пинов:
const int analogInPin = A0; // Аналоговый пин ввода, к которому подключен потенциометр
const int analogOutPin = 9; // Аналоговый пин вывода, к которому подключен светодиод
int sensorValue = 0; // Значение, считанное с потенциометра
int outputValue = 0; // Значение, выводимое в ШИМ (аналоговый выход)
void setup() {
// Инициализация последовательной связи со скоростью 9600 бит/с:
Serial.begin(9600);
}
void loop() {
// Считывание значения аналогового входа:
sensorValue = analogRead(analogInPin);
// Преобразование значения в диапазон аналогового выхода:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// Изменение значения аналогового выхода:
analogWrite(analogOutPin, outputValue);
// Вывод результатов в монитор последовательного порта:
Serial.print("sensor = ");
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
// Ожидание 2 миллисекунды перед следующей итерацией для устранения эффекта осцилляции
// аналого-цифрового преобразования после последнего считывания:
delay(2);
}
преобразует его в диапазон 0–255 для ШИМ.
управляет яркостью светодиода на пине 9.
выводит sensorValue и outputValue в Serial каждые 2 мс.
Функция map() масштабирует значения: из 10-битного (0-1023) в 8-битный (0-255) для ШИМ. В Serial Monitor увидите raw и mapped значения.
5 примеров использования аналогового ввода с map() и ШИМ в Arduino
Этот подход универсален для сенсоров и actuators. Вот идеи для проектов:
- Управление яркостью RGB LED: Используйте три потенциометра для регулировки цвета, значения на пине ШИМ для динамического освещения.
- Регулировка громкости buzzer: Подключите пьезоизлучатель вместо LED, изменяйте «яркость» для тона или громкости в звуковых проектах.
- Контроль скорости DC мотора: Аналоговый сигнал от джойстика или сенсора на драйвер мотора (например, L298N) для плавного разгона.
- Сенсор освещенности с фоторезистором: Измеряйте свет, на LED или реле для автоматического освещения (ночник).
- Терморегулятор с термистором: Измеряйте температуру, преобразуйте в ШИМ для управления вентилятором или нагревателем в инкубаторе.
Советы по доработке проекта с аналоговым входом на Arduino
Добавьте фильтр (constrain() или среднее значение) для сглаживания шумов. Экспериментируйте с constrain() вместо map() для ограничения значений. Интегрируйте в IoT: отправляйте данные по Serial в ESP или мониторьте через Bluetooth!
FAQ — аналоговый ввод и ШИМ вывод на Arduino
Что делает analogRead() на Arduino?
Функция analogRead() считывает аналоговое напряжение на входе A0–A5 и преобразует его АЦП в значение от 0 до 1023. Это 10-битный результат: 0 соответствует 0V, 1023 — примерно 5V.
Для чего нужна функция map() в Arduino?
map() пересчитывает одно числовое значение в другой диапазон. Например, преобразует результат analogRead() (0–1023) в диапазон ШИМ (0–255), чтобы управлять яркостью LED или скоростью мотора.
Что делает analogWrite() и является ли это настоящим аналоговым сигналом?
analogWrite() выводит ШИМ — импульсную модуляцию, а не настоящий аналоговый сигнал. Она быстро включает и выключает пин, создавая эффект изменения напряжения для светодиодов, моторов и других нагрузок.
Почему используется диапазон 0–255 для ШИМ?
Arduino использует 8-битное значение ШИМ, поэтому доступно 256 уровней (0–255). Это стандарт аппаратного PWM на большинстве плат Arduino Uno/Nano.
Почему на Arduino Uno есть только некоторые пины с PWM?
ШИМ генерируется аппаратными таймерами микроконтроллера. Только определённые пины подключены к этим таймерам (например, 3, 5, 6, 9, 10, 11 на Uno). Другие пины могут считывать аналог, но не могут выводить PWM.
Как уменьшить шумы при чтении аналогового сигнала?
Используйте сглаживание: среднее значение нескольких измерений, фильтр low-pass, delay(2), или функции filter/median. Также помогает экранированный провод и блокировочный конденсатор на входе.