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

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

Плата ложится на холст, и подписи пинов видны сразу. Найдите метку 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);
}

В скетчах 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 — схема и код из этой статьи уже собраны. Без аккаунта, без установки. Когда светодиод мигнёт вам в ответ, вы официально программист встраиваемых систем. Ну, почти.