
Большинство руководств по Arduino сразу переходят к коду. Но компоненты вокруг микроконтроллера — аналоговые: резистор, который защищает светодиод, делитель, превращающий показания датчика в напряжение, транзистор, коммутирующий двигатель, стабилизатор, который делает 5 В из сетевого адаптера. Когда что-то из этого собрано неправильно, никакой код это не исправит.
Velxio симулирует и эту половину. Он запускает ngspice — открытый симулятор электрических схем SPICE, скомпилированный в WebAssembly, — так что резисторы, конденсаторы, диоды, транзисторы, операционные усилители и стабилизаторы ведут себя как их реальные аналоги прямо в вашем браузере. Их можно измерять вольтметром, амперметром и осциллографом и менять любой номинал, пока схема работает.
Эта статья проведёт вас через семь проектов. В первых пяти нет ни одного микроконтроллера, только компоненты. В последних двух аналоговые схемы сочетаются с Arduino и ESP32. Каждый проект есть в галерее примеров, и каждое число ниже считано с симулятора и сверено с формулой, которая его объясняет.
Перед началом: три прибора
- Схемы без платы запускаются сразу при открытии. Щёлкните правой кнопкой по любой детали, чтобы открыть её инспектор и изменить номинал: сопротивление резистора, ёмкость конденсатора, уровень освещённости или температуру датчика. Схема пересчитывается с новым значением.
- Вольтметр и амперметр — такие же детали, как и все остальные: вольтметр подключается параллельно тому, что вы измеряете, амперметр — последовательно. В цепи постоянного тока они показывают одно число. В цепи переменного тока они показывают действующее значение, амплитуду и среднее по постоянному току, измеренные после установления режима.
- Осциллограф показывает, как напряжение меняется во времени. Щёлкните правой кнопкой по проводу и выберите Add to scope; каждый канал сам масштабируется под сигнал. Если на холсте есть плата, сначала остановите симуляцию: пока скетч выполняется, холст забирает клики себе для деталей.
Одна вещь, которую стоит знать: для схем с источниками переменного тока Velxio рассчитывает короткий интервал времени с момента подачи питания (несколько периодов сигнала) и показывает осциллограмму этого интервала. Расчёт повторяется при каждом изменении, так что картинка остаётся актуальной, но это не непрерывная запись.
1. Светодиод и резистор: закон Ома

Первая схема, которую собирает каждый новичок, и та, которую чаще всего собирают неправильно: светодиод, подключённый напрямую к батарее, сгорает, потому что ничто не ограничивает его ток. Эту задачу выполняет последовательный резистор.
Приборы рассказывают всю историю:
- Вольтметр параллельно резистору 470 Ом показывает 7,136 В.
- Амперметр показывает 15,18 мА. Закон Ома говорит то же самое: 7,136 В / 470 Ом = 15,2 мА.
- Остаток от 9 В падает на светодиоде: около 1,84 В — прямое напряжение красного светодиода.
Вот формула для выбора резистора: R = (Vпитания − VLED) / I. Для 15 мА от батареи на 9 В: (9 − 1,8) / 0,015 = 480 Ом, так что 470 Ом — ближайший стандартный номинал.
Попробуйте: щёлкните правой кнопкой по резистору и поставьте 1 кОм. Ток падает до 7,2 мА, светодиод тускнеет, а его собственное напряжение почти не меняется (1,81 В). Светодиод держит своё напряжение почти постоянным и позволяет резистору задавать ток.
Открыть схему «Светодиод и закон Ома» в Velxio
2. Блок питания на 5 В: выпрямитель, конденсатор и стабилизатор
Классический линейный блок питания, тот самый, что стоит внутри каждого старого сетевого адаптера, состоит из четырёх каскадов:
- Трансформатор. Он превращает сетевое переменное напряжение в более безопасное и низкое переменное. Здесь это вторичная обмотка 12-0-12 В со средним выводом, изображённая как два генератора сигналов в противофазе (по 12 В амплитуды каждый, 50 Гц).
- Выпрямитель. Два диода 1N4007, по одному на каждую половину вторичной обмотки. Каждый проводит в свой полупериод, поэтому на выходе получается положительный импульс каждые 10 мс: двухполупериодное выпрямление.
- Сглаживающий конденсатор. Конденсатор на 220 мкФ заряжается на каждом пике и питает нагрузку между ними. Напряжение на нём не плоское: между пиками оно проседает. Это проседание и есть пульсации.
- Стабилизатор. 7805 берёт это колеблющееся напряжение и держит на выходе ровно 5 В, пока на его входе остаётся хотя бы примерно на 2 В больше, чем на выходе.
Осциллограмма в начале статьи показывает 12 В переменного тока с трансформатора и выпрямленное напряжение на конденсаторе. Конденсатор колеблется между 10,1 В и 11,8 В — около 1,7 В пульсаций при нагрузке 50 мА, — а вольтметр на выходе показывает стабильные 5,000 В.
Быстрая оценка пульсаций: ΔV ≈ I / (2·f·C): 0,05 А / (2 × 50 Гц × 220 мкФ) = 2,3 В. Эта формула предполагает, что конденсатор питает нагрузку весь полупериод; в действительности диоды подзаряжают его немного раньше, поэтому измеренные 1,7 В ниже.
Попробуйте: щёлкните правой кнопкой по конденсатору и поставьте 47 мкФ. Пульсации вырастают до 6 В, впадины опускаются до 5,9 В — ниже того, что нужно 7805, — и его выход проседает до 3,9 В на каждом периоде. Вот почему в блоках питания ставят большие конденсаторы.
Открыть блок питания на 5 В в Velxio
3. Ночник на фоторезисторе и двух транзисторах

Автоматический ночник без микроконтроллера и без кода. Фоторезистор (LDR) измеряет освещённость, а два транзистора включают светодиод, когда становится темно.
Модуль датчика света — это делитель напряжения: фоторезистор сверху и резистор 10 кОм снизу. При дневном свете сопротивление фоторезистора мало, и выход модуля (AO) высокий; в темноте оно поднимается до сотен кОм, и AO падает почти до 0 В.
- Q1 — ключ датчика. Когда AO выше примерно 0,6 В, Q1 проводит и притягивает базу Q2 почти к 0 В.
- Q2 управляет светодиодом. Пока Q1 открыт, Q2 закрыт и светодиод не горит. Когда света становится меньше, Q1 перестаёт проводить, резистор 10 кОм подтягивает базу Q2 вверх, Q2 открывается и светодиод загорается.
Зачем два транзистора? Потому что один делал бы наоборот: зажигал светодиод, когда светло. Первый каскад инвертирует сигнал.
В симуляции при 20 люксах (тусклая комната) AO держится на 0,50 В, Q1 закрыт, и через светодиод течёт 13 мА. При 30 люксах AO равен 0,67 В, Q1 открывается и светодиод гаснет. Щёлкните правой кнопкой по датчику света и меняйте Illumination (lux) в этом диапазоне, чтобы переключать его:

4. Транзисторный усилитель: каскад с общим эмиттером

Вот так маленький сигнал становится большим: усилитель с общим эмиттером, строительный блок любого дискретного аудиоусилителя. Синусоида 1 кГц с размахом 0,4 В входит через разделительный конденсатор и выходит с коллектора примерно в четыре с половиной раза больше и перевёрнутой. (Источник 9 В — это символ лабораторного блока питания в левом верхнем углу; генератор сигналов — под ним.)
Работают здесь две вещи.
Смещение. Транзистор усиливает только тогда, когда он частично открыт. Делитель 47 кОм / 10 кОм задаёт на базе 1,54 В. Эмиттер находится на один диодный переход ниже, 0,89 В, поэтому через эмиттерный резистор 1 кОм течёт 0,89 мА. Тот же ток через коллекторный резистор 4,7 кОм создаёт падение 4,2 В, оставляя на коллекторе 4,83 В — около середины питания, с запасом для размаха в обе стороны.
Усиление. Изменение на базе появляется почти без изменений на эмиттере, поэтому оно меняет ток на ΔV / Re. Это изменение тока течёт через Rc и сдвигает коллектор на ΔV × Rc / Re в противоположную сторону. Значит, усиление равно −Rc/Re = −4,7. Симулятор измеряет 4,54: транзистор добавляет небольшое внутреннее сопротивление эмиттера около 26 мВ / Ie ≈ 29 Ом, и 4700 / 1029 = 4,57.
На экране осциллографа база (зелёный) колеблется на 0,4 В вокруг 1,5 В, а коллектор (красный) — на 1,8 В вокруг 4,8 В, причём его пики там, где у базы впадины.
Попробуйте: щёлкните правой кнопкой по генератору сигналов и увеличьте его амплитуду до 1 В. Коллектору потребовалось бы качаться на 9 В — больше, чем позволяет питание, поэтому вершина волны упрётся в 9 В, а низ — в насыщение: отсечка, звук перегруженного усилителя.
Открыть усилитель с общим эмиттером в Velxio
5. Термостат на компараторе с операционным усилителем

Термостат, который включает вентилятор, когда становится тепло, на одном операционном усилителе LM358 и без кода.
Датчик. Сопротивление термистора NTC падает при нагреве (10 кОм при 25 °C, около 7,4 кОм при 32 °C). Модуль ставит его под фиксированный резистор 10 кОм, поэтому его выходное напряжение падает с температурой: 2,50 В при 25 °C, 2,12 В при 32 °C.
Уставка. Потенциометр — это второй делитель. Его движок стоит на 2,336 В — напряжение, которое термистор даёт при 28 °C. Вольтметр это показывает.
Компаратор. У операционного усилителя без обратной связи такое большое усиление, что его выход прижимается к одному из питающих напряжений в зависимости от того, какой вход выше. Уставка идёт на + вход, а термистор — на − вход: ниже 28 °C напряжение термистора выше, и выход равен 0 В; выше 28 °C оно ниже, и выход скачком поднимается примерно до 3,7 В, зажигая светодиод. При 27 °C светодиод выключен, при 29 °C — включён.
Почему 3,7 В, а не 5 В? LM358 не может довести свой выход до положительного питания; он останавливается примерно на 1,3 В ниже. Проект 6 упирается в тот же предел.
Настоящий термостат добавляет гистерезис, чтобы не щёлкать туда-сюда, пока температура колеблется у порога. Проект 7 делает это в коде.
Попробуйте: щёлкните правой кнопкой по термистору и измените его температуру, или щёлкните правой кнопкой по потенциометру и измените его положение (от 0 до 1023), чтобы сдвинуть уставку.
Открыть термостат на операционном усилителе в Velxio
6. Arduino: превращаем ШИМ в настоящее аналоговое напряжение

У Arduino Uno нет ЦАП: analogWrite() выдаёт не напряжение, а ШИМ — прямоугольную волну 490 Гц, среднее значение которой задаётся скважностью. Светодиоду или мотору это безразлично, но многим схемам нужно настоящее, стабильное напряжение. Аналоговый фильтр его создаёт.
- RC-фильтр нижних частот. 10 кОм и 10 мкФ усредняют ШИМ. Его постоянная времени τ = R·C = 0,1 с в пятьдесят раз больше периода ШИМ, поэтому пульсации 490 Гц почти полностью подавляются. Цена — скорость: после изменения выходу нужно около 5τ = 0,5 с, чтобы установиться.
- Повторитель напряжения. LM358 с выходом, соединённым с его − входом, копирует напряжение фильтра на свой выход. Он почти не потребляет ток от фильтра, поэтому то, что вы подключите дальше, не просадит напряжение.
- Обратная связь. A0 считывает результат обратно, и скетч печатает, что он запросил и что получил.
PWM 0 expected 0.00 V measured 0.02 V
PWM 64 expected 1.25 V measured 1.26 V
PWM 128 expected 2.51 V measured 2.51 V
PWM 192 expected 3.76 V measured 3.77 V
PWM 255 expected 5.00 V measured 4.03 V
До 192 ЦАП точен до 10 мВ. На 255 он останавливается на 4,03 В: фильтр действительно доходит до 5 В, но LM358 с питанием 5 В не может так высоко поднять свой выход. Решение — операционный усилитель rail-to-rail, например MCP6002, или использование только того диапазона, который может выдать LM358.
Открыть ШИМ-ЦАП на Arduino в Velxio
7. ESP32: термометр, который включает вентилятор

Снова термостат, но на этот раз решает микроконтроллер, поэтому он может делать то, чего не может компаратор: показывать температуру в градусах и добавлять гистерезис.
Считывание температуры. Выход модуля NTC идёт на GPIO34 — входной вывод АЦП ESP32. Скетч усредняет 16 измерений, вычисляет сопротивление термистора из делителя (R = 10 кОм × V / (3,3 В − V)) и переводит его в градусы по уравнению Бета из даташита термистора: 1/T = 1/T₀ + ln(R/R₀)/β, где R₀ = 10 кОм при T₀ = 25 °C и β = 3950. Монитор порта печатает 25,0 °C, когда термистор настроен на 25 °C, и 35,0 °C при 35 °C.
Коммутация нагрузки. Вывод GPIO может дать несколько миллиампер, но не сотни, нужные вентилятору. Вместо этого GPIO25 через резистор 100 Ом управляет затвором MOSFET 2N7000, а MOSFET соединяет вентилятор (здесь — зелёный светодиод) с землёй. При 35 °C сток находится на 0,06 В: MOSFET полностью открыт.
Гистерезис. Вентилятор включается при 30 °C и выключается только ниже 28 °C. Без этого зазора в 2 °C температура, колеблющаяся у порога, включала бы и выключала вентилятор каждую секунду.
Для настоящего вентилятора используйте MOSFET с логическим уровнем, рассчитанный на ток вентилятора (2N7000 подходит только для малых нагрузок), и диод параллельно вентилятору, чтобы поглотить всплеск напряжения двигателя при выключении.
Открыть термометр и вентилятор на ESP32 в Velxio
Что мы исправили, пока всё это собирали
Написание этой статьи означало измерение каждой схемы, и измерения выявили проблемы в симуляторе — все исправлены до публикации:
- После
analogWrite(pin, 0)илиanalogWrite(pin, 255)вслед за каким-либо значением ШИМ схема продолжала видеть старое значение ШИМ. Таблица из проекта 6 это выявила. - Вольтметр и амперметр усредняли переходный процесс при включении в свои показания переменного тока: выход 7805 показывал 3,47 В вместо 5 В.
- Аналоговые каналы осциллографа имели фиксированный диапазон ±4 В, поэтому сигнал 5 В или 12 В рисовался за пределами экрана. Теперь они масштабируются автоматически.
- Регуляторы напряжения не потребляли ток от своего входа, поэтому блок питания вообще не показывал пульсаций.
Если вы соберёте аналоговую схему в Velxio и числа не сойдутся с формулой, напишите нам на GitHub. Именно так были найдены эти проблемы.