Fanlab

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

ШИМ: яркость и звук

analogWrite(9, 64) — почему светодиод горит на 25 % и какую мелодию играет зуммер?

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

Ситуация

Передняя фара робота-машинки должна не включаться резко, а плавно разгораться и гаснуть, а ещё пусть подаёт звуковой сигнал. Но вывод Arduino знает только два состояния: 0 В или 5 В. Как получить «половинную» яркость? Если написать analogWrite(9, 64), светодиод загорится на четверть яркости — но на осциллографе видно, что никакого «четвертного» напряжения на выводе нет: только быстрое включение и выключение. Почему глаз воспринимает это как ровный свет? Почему яркость, растущая от 0 до 255 равными шагами, не кажется глазу равномерной? И откуда в tone(8, 440) взялось число 440?

Тема

ШИМ: analogWrite, яркость и звук. Светодиод плавно гаснет, зуммер играет мелодию: коэффициент заполнения и частота

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

  • Коэффициент заполнения
  • Глаз и гамма
  • tone() — частота

Формулы

D=v255,T=1f,tвкл=D⋅T

ШИМ (широтно-импульсная модуляция): `analogWrite(pin, v)` включает и выключает вывод с частотой f, на доле D периода — HIGH. Uno: на выводе 9 частота 490 Гц → T = 2,04 мс; v = 64 → D = 25 %, tвкл = 0,51 мс.

Uср=D⋅5 В,Iср=D⋅Iвкл,Iвкл=5−ULEDR+Rpin

Среднее напряжение и ток пропорциональны коэффициенту заполнения. Свет светодиода пропорционален среднему току — при 220 Ом Iвкл ≈ 12,7 мА.

L∗=116Y3−16

Глаз (CIE 1976 L∗): воспринимаемая яркость L∗ (0–100) близка к кубическому корню из доли света Y (0–1). Y = 10 % → L∗ ≈ 38, Y = 50 % → L∗ ≈ 76: одна десятая света кажется глазу больше чем на треть.

vk=255(kN)γ,γ≈2,2…3

Гамма-коррекция: чтобы шаги казались глазу равными, мы увеличиваем v, возводя в степень, — сначала маленькие шаги, в конце большие.

fn=440⋅2n/12

Ноты — это частоты: ля (A4) = 440 Гц, каждый полутон — в 212 ≈ 1,0595 раза выше. До (C4) = 262, ре 294, ми 330, фа 349, соль 392, ля 440, си 494, до (C5) 523 Гц. `tone(pin, f)` выдаёт волну этой частоты с коэффициентом заполнения 50 %.

Теория

ШИМ: «среднее» из двух состояний

Вывод микроконтроллера цифровой: 0 В или 5 В, ничего посередине. А `analogWrite(pin, v)` включает и выключает вывод сотни раз в секунду: v = 255 — всё время включён, 128 — половину времени, 64 — четверть времени. Это ШИМ — широтно-импульсная модуляция; доля включённого времени D=v/255 называется коэффициентом заполнения. Для цепи это «среднее» напряжение 5D вольт: средний ток светодиода и его яркость пропорциональны D. Глаз не замечает мигания с частотой 490 Гц — он «накапливает» свет примерно за 1/50 с: мигание быстрее 50–60 Гц выглядит как ровный свет.

Какие выводы и какая частота

На Uno ШИМ есть только на выводах со значком ~: 3, 5, 6, 9, 10, 11 — их обслуживают три таймера: Timer0 — 5 и 6 (≈ 980 Гц; этот же таймер считает `millis()`), Timer1 — 9 и 10 (490 Гц), Timer2 — 3 и 11 (490 Гц). Частота на яркость не влияет — важно только D; при 980 Гц период вдвое короче. На других выводах (и на 13-м) `analogWrite` — обычный переключатель: v<128 → LOW, v≥128 → HIGH. v = 0 и v = 255 на любом выводе дают ровно LOW / HIGH — как `digitalWrite`.

Глаз нелинеен

В программе Fade значение v растёт от 0 до 255 равномерно, но светодиод в начале разгорается очень быстро, а потом почти не меняется. Причина в глазе: ощущение пропорционально не самому свету, а примерно его кубическому корню (формула CIE 1976 L∗=116Y3−16, на ней основаны цветоведение и экраны). 10 % света кажутся глазу ≈ 38 %, 50 % — ≈ 76 %. Чтобы шаги казались равными, нужна гамма-коррекция: vk=255(k/N)γ, γ ≈ 2,2–3 — сначала мелкие шаги, в конце крупные. Такая таблица есть в каждом экране и в «диммере» каждой светодиодной лампы.

Как читать осциллограмму

Осциллограф рисует напряжение на выводе по времени: 1 мс/дел — на экран приходится 10 мс. При 490 Гц период T=1/490 ≈ 2,04 мс — на экране ≈ 5 периодов; при 980 Гц ≈ 10. Ширина импульса tвкл=D⋅T: при v = 64 — 0,51 мс, при v = 191 — 1,53 мс. Амплитуда всегда 5 В — ШИМ меняет не напряжение, а время. По этому признаку ШИМ отличают от настоящего аналогового напряжения (ЦАП): на Uno ЦАП нет.

tone(): звук — это тоже ШИМ

Пассивный пьезоизлучатель (пьезопластинка) сам не звучит — ему нужно подать колебания: `tone(pin, f)` включает и выключает вывод с частотой f и коэффициентом заполнения 50 % (активный зуммер при подаче 5 В пищит сам, одним и тем же тоном). В музыке каждая нота — это частота: ля (A4) 440 Гц, октава — в два раза, полутон — в 212 раза. `tone(pin, f, ms)` сама останавливается через заданное время и не задерживает программу; `noTone(pin)` выключает. На Uno одновременно звучит только один tone, он занимает Timer2 — в это время ШИМ на выводах 3 и 11 перестаёт работать. Пьезоизлучатель почти не потребляет тока; а магнитный зуммер на 16 Ом к выводу напрямую подключать нельзя: ток 5/(16+25) ≈ 120 мА — втрое больше предела 40 мА, чип сгорит (нужен транзистор или 100 Ом).

О модели

Осциллограмма строится идеальной по коэффициенту заполнения и частоте (резкие фронты; на настоящем выводе из-за ≈ 25 Ом и ёмкости фронты занимают несколько наносекунд). Считается, что свет светодиода пропорционален среднему току (в рабочей области светодиода это верно); значение «глаз ощущает» — это CIE L∗: глаз устроен гораздо сложнее (окружающий свет, адаптация), но кубический корень — хорошее первое приближение. Звук — прямоугольная волна из динамика компьютера, негромкая, и только если вы её включили; настоящий пьезоизлучатель звучит заметно громче, около 2–4 кГц (резонанс). Нагрев чипа упрощён, как в `arduinoblink`.

Знаете ли вы?

  • Пьезоэлектрический эффект в 1880 году открыли братья Жак и Пьер Кюри: если сжать кристалл кварца, в нём появляется заряд, а если подать напряжение — он колеблется. На этом эффекте работают пьезопластинка в зуммере, кварцевые часы и ультразвуковые датчики.
  • Нота ля 440 Гц — международный стандарт: в 1955 году её приняла как рекомендацию ISO, а нынешний стандарт ISO 16 действует с 1975 года. До этого оркестры настраивались по-разному — в Париже 19-го века 435 Гц, кое-где даже выше 450 Гц.

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

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

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