Uncategorized

Мигаем светодиодом на Arduino прямо в браузере — без платы

Первый проект почти каждого на Arduino — это скетч blink. Это «Hello, World!» мира микроконтроллеров, и он не зря живёт уже десятилетия: он доказывает, что ваша плата работает, код выполняется, а монтаж делает именно то, что вы думаете, — и всё это с одним маленьким светодиодом.

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

Схема — это сама плата

Большинство туториалов «собери схему» начинаются со списка деталей. Этот — нет, потому что Arduino Uno уже несёт всю схему на своей печатной плате: маленький светодиод (помечен буквой L) намертво подключён к цифровому пину 13, а токоограничивающий резистор стоит прямо на плате. Ничего втыкать, ничего паять, ничего сжигать.

Плата Arduino Uno на холсте браузерного симулятора, настроенная для примера с мигающим светодиодом

Если позже вы перейдёте на реальную плату и захотите внешний светодиод вместо встроенного, рецепт такой: анод (длинная ножка) → пин 13 через резистор 220Ω, катод (короткая ножка) → GND. Подойдёт что угодно от 220Ω до 1кΩ; чем меньше номинал, тем ярче и злее светит. Но пока — проще, проще.

Кладём плату на холст

Откройте симулятор и нажмите Add (или кнопку Components, в зависимости от вида). Появится окно выбора компонентов с поиском и сеткой плат. Наберите «Arduino Uno», перетащите её на холст — готово.

Диалог добавления компонента со списком плат Arduino Uno, Nano, Mega, Raspberry Pi Pico и ESP32

Плата ложится на холст, и подписи пинов видны сразу. Найдите метку L рядом с пином 13 — это ваш светодиод. Пока симуляция не запущена, выглядит он скромно.

Четыре строки, которые всё делают

Переключитесь в редактор кода. Вот весь скетч целиком:

// Blink: toggle the onboard LED once a second

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

Скетч blink в редакторе кода симулятора: pinMode, digitalWrite и delay на пине 13

В скетчах Arduino всегда две функции. setup() выполняется один раз при включении; loop() потом крутится вечно, сверху вниз, снова и снова. Всю работу делают четыре строки:

  • pinMode(13, OUTPUT) — говорит чипу, что пин 13 будет выдавать напряжение, а не читать сигналы. Пропустите это — пин останется входом; светодиод будет светиться тускло или не будет вовсе, и в первый раз это сбивает с толку всех.
  • digitalWrite(13, HIGH) — поднимает пин до 5В. Светодиод горит.
  • delay(1000) — просто стоит 1000 миллисекунд, ничего не делая. Без неё светодиод мерцал бы миллионы раз в секунду и казался бы постоянно горящим.
  • digitalWrite(13, LOW) — опускает пин до 0В. Светодиод гаснет, а второй delay(1000) держит его так, пока цикл не повторится.

Это и правда вся программа. Если ощущение «и это всё?» возникло — отлично, в этом и смысл blink.

Жмите Run

Нажмите кнопку Run на панели редактора. Симулятор скомпилирует ваш скетч и начнёт выполнять его на виртуальном чипе AVR — том же семействе, что стоит в настоящем Uno.

Панель редактора симулятора с кнопкой запуска и вкладкой файла скетча

Смотрите на светодиод L на холсте: секунда горит, секунда не горит. На панели холста есть ещё пауза, стоп и сброс, а также последовательный монитор и осциллограф, которые пока не нужны — но скоро понадобятся.

Панель холста симулятора с выбором платы, последовательным монитором, осциллографом и управлением масштабом

О чём симулятор вам не расскажет

Симуляция — добрый учитель, но она пропускает несколько уроков, которые реальное железо преподаёт сразу:

  • В симуляторе светодиоды не сгорают. Подключите настоящий светодиод напрямую к пину без резистора — и он поработает. Недолго. Потом сгорит или потихоньку убьёт GPIO. Симулятор будет гонять эту схему вечно, так что привычку ставить резистор вырабатывайте уже сейчас.
  • Настоящие Uno мигают при загрузке. Бутлоадер несколько раз мигает светодиодом L при подаче питания. Новички регулярно принимают это за сбой своего кода. Это норма.
  • Клоны бывают разными. На дешёвых клонах Uno светодиод L может быть другого цвета, тусклее или стоять чуть в другом месте. Симулятор показывает одну идеализированную плату; ящик вашего стола — нет.
  • delay() блокирует всё. В этом скетче это неважно. В реальном проекте с кнопками или датчиками эти замороженные 1000 мс превращаются в баг. Запомните это ощущение «почему оно не отвечает, пока ждёт» — оно ещё вернётся.

Ошибки, которые стоят людям времени

Я видел, как падают многие первые скетчи. Почти всегда виновато одно из этого:

  • Нет pinMode() в setup(). Классика. Всё компилируется, ничего не горит.
  • Внешний светодиод воткнут наоборот. Длинная ножка к пину, короткая к земле. В перевёрнутом виде он просто остаётся тёмным — без ущерба, без света, без удовольствия.
  • Код отредактировали, а Run снова не нажали. Симуляция сама себя не перезапускает.
  • Номер пина набран буквой или по привычке взят пин 12. Встроенный светодиод слушает только пин 13.

Куда двигаться дальше

Как только мигание раз в секунду наскучит — а это случится минуты через две — начинайте менять. Уменьшите задержки до 250 мс и посмотрите на стробоскоп. Перенесите внешний светодиод на пин 12 со своим резистором и перепишите скетч. Попробуйте analogWrite() на пине, помеченном ~ (это пины с PWM), и плавно гасите светодиод вместо переключения. Или добавьте кнопку и заставьте светодиод слушаться вашего пальца.

Откройте бесплатный симулятор и загрузите пример Blink — схема и код из этой статьи уже собраны. Без аккаунта, без установки. Когда светодиод мигнёт вам в ответ, вы официально программист встраиваемых систем. Ну, почти.

Leave a Reply

Your email address will not be published. Required fields are marked *