Fanlab

Робототехника · Микроконтроллеры · 7 класс

Аналоговый вход и «Монитор порта»

Ночник, который сам включается в темноте: откуда берутся числа 0–1023 и почему ночник мигает?

Открыть эксперимент

Ситуация

Ночник в коридоре сам включается с наступлением вечера и выключается на рассвете — никто не нажимает кнопку. Внутри у него фоторезистор и маленький «мозг». Arduino тоже может стать таким ночником: аналоговый вход A0 выдаёт не напряжение, а число от 0 до 1023. Сначала на потенциометре выясним, откуда берутся эти числа, и посмотрим их в мониторе порта, затем подключим фоторезистор. Будем приглушать настольную лампу — ночник включится… но в сумерках он дрожит и мигает. Почему? 1024 уровня, `map()`, порог и гистерезис — всё это в одном эксперименте.

Тема

Аналоговый вход и «Монитор порта». Потенциометр и фоторезистор: откуда берутся числа 0–1023, map() и Serial.println()

Ключевые понятия

  • analogRead, 10 бит
  • Делитель с фоторезистором
  • Монитор порта и гистерезис

Формулы

N=⌊U5 V⋅1024⌋,0≤N≤1023

АЦП (10 бит): `analogRead(A0)` делит напряжение на 1024 уровня; 5 В → 1023, 2,5 В → 512.

ΔU=5 V1024≈4,9 mV

Один уровень — наименьшая разница, которую АЦП «видит»; изменение мельче этого число не меняет.

UA0=5 V⋅R10kRLDR+R10k

Делитель с фоторезистором: на свету RLDR мал — на A0 почти 5 В (большое число); в темноте RLDR достигает мегаомов — число близко к нулю.

𝚖𝚊𝚙(𝙽, 𝟶, 𝟷𝟶𝟸𝟹, 𝟶, 𝟷𝟶𝟶)=⌊N⋅1001023⌋

`map()` переводит значение из одного диапазона в другой в целых числах: 512 → 50, дробная часть отбрасывается.

N<Nниз⇒вкл,N>Nверх⇒выкл

Гистерезис: пороги включения и выключения разные (450 / 550) — шум не может пересечь оба порога сразу, поэтому ночник не мигает.

Теория

Аналоговое и цифровое

`digitalRead` знает только два ответа: HIGH или LOW. А мир непрерывен: свет, температура, угол поворота ручки — любое значение. Выводы A0–A5 Arduino подключены к аналого-цифровому преобразователю (АЦП): он измеряет напряжение 0–5 В и выдаёт 10-битное число — 210=1024 уровня, от 0 до 1023. Один уровень — 5/1024≈4,9 мВ. Одно измерение занимает ≈ 100 мкс: около 10 000 раз в секунду. `analogRead(A0)` возвращает не напряжение, а число; в вольты вы переводите его сами: U=N⋅5/1023.

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

Крайние выводы потенциометра подключены к 5V и GND, средний — к A0: это делитель напряжения — ручка выдаёт долю k=α/270° от 5 В. В эксперименте «Потенциометр» светодиод «просаживал» делитель; а вход АЦП почти не потребляет тока (≈ 100 МОм), поэтому потенциометр на 10 кОм даёт ровно k⋅5 В: посередине 2,5 В → 512, в конце 5 В → 1023. В проценты число переводит `map(N, 0, 1023, 0, 100)` — в целых числах, дробная часть отбрасывается.

Фоторезистор (LDR)

Фоторезистор — диск со слоем сульфида кадмия (CdS): на свету его сопротивление резко падает. Типичный GL5528: при 10 лк ≈ 10 кОм, при дневном свете — сотни ом, в темноте ≈ 1 МОм. АЦП измеряет не сопротивление, а напряжение — поэтому нужен делитель: 5V → LDR → A0 → 10 кОм → GND. На свету LDR мал, на A0 почти 5 В (900+); в темноте LDR велик, на A0 около нуля (10–50). 10 кОм взяты не случайно: это сопротивление LDR в «сумерках» — порог получается посередине, около 512. Если закрыть ладонью, за две секунды число упадёт до сотни.

Монитор порта и Serial Plotter

`Serial.begin(9600)` открывает связь с компьютером по USB: 9600 бод ≈ 960 символов в секунду. `Serial.print(x)` выводит число, `println` — с новой строки. Монитор порта показывает текст, а Serial Plotter рисует график, превращая число в каждой строке в точку — самый быстрый способ «увидеть» датчик. В этом эксперименте график строится автоматически: A0 и состояние ночника по времени. Числа `float` выводятся с двумя знаками после запятой: 2.50.

Порог, мигание и гистерезис

Ночник: `if (N < 500) вкл; else выкл;`. На свету и в темноте он работает, но в сумерках — когда N как раз около 500 — ночник дрожит: блики лампы, тени, шум АЦП качают число на ±10–20, и оно десятки раз в секунду пересекает порог. Лекарство — гистерезис: два порога, включение при 450, выключение при 550; пока число в промежутке из 100 уровней, ничего не меняется, и шум до него не дотягивается. Термостат, уличные фонари, холодильник — всё работает так. Второй помощник — среднее из нескольких измерений.

О модели и опасность

АЦП: N=⌊1024U/5⌋ (не больше 1023), шум ±1 уровень; LDR: R=10 кОм⋅(E/10 лк)−0,7, в темноте 1 МОм; освещённость колеблется на ±4 % (лампа и тени); лампа 0–100 % → 1–1000 лк. Передача по Serial в модели мгновенна (в действительности строка на 9600 бод ≈ 5 мс). Опасность: на A0 нельзя подавать больше 5,5 В — если запитать делитель от батареи 9 В, на свету на A0 будет 8 В: откроется защитный диод вывода, через чип потекут несколько мА, и ATmega328P сгорит (при тусклом свете там ещё 4,5 В — он выживет, и вы ничего не заметите!).

Знаете ли вы?

  • АЦП в ATmega328P тратит на одно измерение ≈ 100 микросекунд (тактовая частота 125 кГц, 13 тактов) — в документации Arduino сказано «примерно 10 000 измерений в секунду»; поэтому даже в `loop()` без `delay()` вход A0 читается не чаще 10 тысяч раз в секунду.
  • Вещество, сопротивление которого меняется на свету, в 1873 году открыл английский инженер Уиллоуби Смит (Willoughby Smith) — это был селен, «дедушка» фоторезистора; нынешние дешёвые фоторезисторы делают из сульфида кадмия (CdS), и они автоматически включают уличные фонари.

Что внутри эксперимента

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

Другие эксперименты раздела