Аналоговый ввод: потенциометр и analogRead
Кнопка знает только «да» и «нет». Потенциометр — это крутилка, которая отвечает на вопрос «насколько?» бесконечным числом оттенков.
Аналоговый ввод — это умение Arduino измерять напряжение, а не просто видеть «есть/нет». Крутишь ручку — получаешь число от 0 до 1023. Это глаза и уши всех датчиков.
Сейчас подключим потенциометр (переменный резистор-крутилку) и будем читать его положение числом. На этом принципе работают регуляторы громкости, джойстики и большинство датчиков.
Потенциометр — это делитель напряжения
5V ----[ верхняя половина R ]----+---- A0 (сюда идёт измеряемое напряжение)
|
(ползунок крутилки)
|
GND ---[ нижняя половина R ]-----+
Крутим ручку -> меняется соотношение половин -> меняется напряжение на A0
У потенциометра три ножки: крайние на 5V и GND, средняя (ползунок) — на A0. Поворот ручки сдвигает ползунок, меняя, какую долю от 5 В мы снимаем со средней ножки. Это и есть делитель напряжения.
Делитель напряжения
Vвых = Vпит * R2 / (R1 + R2)
5V --[ R1 ]--+--[ R2 ]-- GND
|
Vвых (например, на A0)
Это фундаментальная схема всей электроники: два сопротивления делят напряжение пропорционально. У потенциометра R1 и R2 — это две части одной дорожки, которые меняются при повороте.
Код
void setup() {
Serial.begin(9600);
}
void loop() {
int value = analogRead(A0); // 0..1023
Serial.println(value);
delay(100);
}
Как работает под капотом
Внутри чипа сидит АЦП (аналого-цифровой преобразователь). Он измеряет напряжение на пине и переводит его в число. У классической Uno АЦП 10-битный: диапазон 0–5 В превращается в число 0–1023 (2 в степени 10 = 1024 уровня). 0 В → 0, 5 В → 1023, 2.5 В → ~512. У Uno R4 АЦП может быть точнее (до 14 бит), но по умолчанию тоже отдаёт 0–1023.
# Та же логика на Python: напряжение -> число АЦП и обратно
def adc_from_voltage(volts, vref=5.0, max_value=1023):
volts = max(0.0, min(vref, volts))
return round(volts / vref * max_value)
def voltage_from_adc(value, vref=5.0, max_value=1023):
return round(value / max_value * vref, 2)
for v in (0.0, 1.25, 2.5, 5.0):
a = adc_from_voltage(v)
print(v, "В ->", a, "-> снова", voltage_from_adc(a), "В")
Частые ошибки
- Используют digitalRead вместо analogRead. Тогда получишь только 0 или 1, а не плавную шкалу.
- Путают analogRead и analogWrite. Read — измерить (0–1023), Write — выдать ШИМ (0–255).
- Крайние ножки потенциометра перепутаны местами. Не страшно — просто крутилка работает «наоборот».
Best practices
- Открой монитор порта (Serial Monitor, 9600 бод) и смотри числа — это лучший способ понять, что читает плата.
- Запомни магические границы: analogRead даёт 0–1023, analogWrite принимает 0–255. Их часто нужно «состыковать» функцией map().
- Не подавай на аналоговый пин больше 5 В — это повредит АЦП.
Разрядность и что значат 1024 уровня
Почему именно 0–1023, а не 0–1000 или 0–100? Потому что АЦП хранит результат в двоичном виде, а 10 бит дают ровно 2 в степени 10 = 1024 разных значения (от 0 до 1023). Это называется разрядностью АЦП. Чем больше бит, тем мельче «ступенька» измерения: 10 бит на диапазоне 5 В дают шаг около 5 мВ — то есть плата различает изменения напряжения примерно в пять тысячных вольта. Для большинства датчиков этого с запасом достаточно.
У новых плат вроде Uno R4 АЦП можно перевести в режим повышенной разрядности (например, 14 бит — до 16383 уровней), что полезно для точных измерений. Но по умолчанию, ради совместимости со всем существующим кодом, analogRead везде отдаёт привычные 0–1023. Поэтому в учебных примерах мы всегда исходим из этого диапазона — и именно его подставляем в map(), когда переводим показания датчика в яркость или градусы.
Итоги
Потенциометр — это управляемый делитель напряжения. analogRead через АЦП превращает 0–5 В в число 0–1023. Так Arduino получает «чувство меры». Осталось научиться красиво перекладывать один диапазон в другой — это функция map().