Arduino — это открытая платформа для электроники: платы с микроконтроллером, среда разработки Arduino IDE и библиотека функций поверх C++, которая прячет работу с регистрами за понятными вызовами вроде digitalWrite(). Начать изучение с нуля проще всего так: плата уровня Uno, стартовый набор деталей, Arduino IDE 2 и три первых скетча — мигание светодиода, кнопка и мигание без delay().
Содержание
Ниже — что купить, как загрузить первую программу, как не сжечь пин и что делать, если плата не прошивается.
Четыре слова, которые путают новички
- Микроконтроллер — сама микросхема: процессор, память и порты ввода-вывода на одном кристалле (на Uno R3 это ATmega328P).
- Плата Arduino — микроконтроллер плюс все, что нужно для работы: питание, USB, кварц, разъемы.
- Скетч — программа в Arduino IDE, файл
.ino. Это обычный C++ с библиотекой Arduino, а не отдельный язык: IDE перед компиляцией добавляет#include <Arduino.h>и объявления функций. - Прошивка — скомпилированный скетч, записанный во флеш-память. На большинстве плат его загружает по USB небольшой загрузчик (bootloader), отдельный программатор новичку не нужен.
Какую плату купить для старта
Критерий выбора для первого месяца — не мощность, а количество готовых уроков и схем под плату. Большинство учебников и примеров написано под Uno.
| Плата | Микроконтроллер | Логика | Когда брать |
|---|---|---|---|
| Uno R3 (и совместимые клоны) | ATmega328P, 16 МГц, 32 КБ флеш, 2 КБ ОЗУ | 5 В | первая плата: под нее больше всего уроков и шилдов |
| Uno R4 Minima / WiFi | Renesas RA4M1 (Arm Cortex-M4), 48 МГц | 5 В | тот же форм-фактор, больше памяти; WiFi-версия — с Wi-Fi и матрицей светодиодов |
| Nano (классическая) | ATmega328P | 5 В | то же, что Uno, но компактно и вставляется в макетную плату |
| Платы на ESP32 | ESP32 | 3,3 В | когда нужен Wi-Fi/Bluetooth; 5 В на вход подавать нельзя |
Клон Uno работает с теми же скетчами, что и оригинал, но часто использует USB-микросхему CH340: на части систем для нее нужен драйвер. Оригинал поддерживает проект Arduino, клон дешевле — для обучения подходят оба.
Кроме платы, для первых проектов нужны: макетная плата без пайки, провода-перемычки «папа-папа», 5-10 светодиодов, резисторы 220 Ом, 470 Ом (для Uno R4) и 10 кОм, тактовые кнопки и USB-кабель с линиями данных (кабель только для зарядки плату не покажет). Стартовый набор обычно содержит все это сразу, плюс датчики на будущее.
Arduino IDE: установка и первая загрузка
- Скачайте Arduino IDE 2 с официального сайта Arduino и установите. Есть и браузерный Arduino Cloud Editor, но для начала удобнее локальная IDE.
- Подключите плату по USB. На плате загорится индикатор питания.
- В выпадающем списке вверху окна выберите плату и порт. На Windows порт выглядит как
COM3, на macOS —/dev/cu.usbmodem...или/dev/cu.usbserial..., на Linux —/dev/ttyACM0или/dev/ttyUSB0. - Для платы не из семейства AVR (Uno R4, ESP32) поставьте пакет поддержки через Boards Manager.
- Откройте пример
File -> Examples -> 01.Basics -> Blinkи нажмите кнопку загрузки (стрелка вправо). Внизу пройдет компиляция, затем загрузка.
Если светодиод на плате начал мигать раз в секунду — цепочка «IDE -> компилятор -> загрузчик -> плата» работает.
Первый скетч: мигание светодиода
Вот минимальный полный скетч. Его можно вставить в пустое окно IDE и загрузить на Uno, Nano или Uno R4 без изменений.
// Blink: мигаем встроенным светодиодом раз в секунду
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // пин светодиода - выход
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // включить
delay(500); // подождать 0,5 с
digitalWrite(LED_BUILTIN, LOW); // выключить
delay(500);
}
Результат: встроенный светодиод (на Uno и Nano он подключен к пину 13, в скетче это константа LED_BUILTIN) полсекунды горит, полсекунды не горит.
Разбор:
setup()выполняется один раз после включения питания или сброса. Здесь задают режимы пинов, открываютSerial, настраивают датчики.loop()вызывается снова и снова, пока есть питание. Как часто — зависит от кода внутри: в этом скетче один проход занимает около секунды из-за двухdelay(500).pinMode(pin, OUTPUT)делает пин выходом,digitalWrite()выставляет на нем высокий (5 В на Uno) или низкий (0 В) уровень.delay(ms)останавливает программу на заданное число миллисекунд. Для первого скетча это удобно, но пока идетdelay(), плата не делает ничего другого.
Внешний светодиод: зачем резистор
Следующий шаг — собрать схему на макетной плате: пин 8 -> резистор 220 Ом -> длинная ножка светодиода (анод), короткая ножка (катод) -> GND. В скетче Blink замените LED_BUILTIN на 8.
Без резистора ток через светодиод ограничивает только сам пин, и его можно повредить. Оценка для Uno R3: (5 В - 2 В на красном светодиоде) / 220 Ом ≈ 14 мА. Это в пределах рекомендуемых для ATmega328P 20 мА на пин (40 мА — абсолютный максимум, работать на нем нельзя). У других плат лимиты другие, их смотрят в документации конкретной платы. У Uno R4 допустимый ток пина всего 8 мА: 220 Ом для нее мало, ставят резистор от 470 Ом (3 В / 470 Ом ≈ 6 мА). У ESP32 логика 3,3 В, поэтому и ток через тот же резистор меньше, и 5 В на вход подавать нельзя. Мотор, реле или ленту светодиодов напрямую от пина не питают: нужен транзистор или драйвер.
Кнопка: подтяжка и дребезг
Кнопку подключают между пином 2 и GND и включают встроенный подтягивающий резистор INPUT_PULLUP. Тогда отпущенная кнопка читается как HIGH, нажатая — как LOW. Без подтяжки вход «висит в воздухе» и читает случайные значения.
Первый вариант, который пишут почти все:
const int BUTTON_PIN = 2;
const int LED_PIN = 8;
bool ledOn = false;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // кнопка нажата
ledOn = !ledOn; // переключаем на КАЖДОМ проходе loop
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
}
Что получится: пока палец держит кнопку, loop() успевает пройти тысячи раз, и светодиод переключается на каждом проходе. После отпускания он остается в случайном состоянии. Вторая причина — дребезг: механические контакты в момент нажатия несколько миллисекунд замыкаются и размыкаются, и одно нажатие выглядит как серия.
Исправление: реагировать на переход из «отпущена» в «нажата» и только после того, как состояние продержалось 30 мс.
// Кнопка переключает светодиод: нажал - включился, нажал еще раз - погас
const int BUTTON_PIN = 2; // кнопка между пином 2 и GND
const int LED_PIN = 8; // светодиод через резистор 220 Ом
const unsigned long DEBOUNCE_MS = 30; // время успокоения контактов
bool ledOn = false;
int stableState = HIGH; // подтвержденное состояние кнопки
int lastReading = HIGH; // последнее сырое чтение
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // встроенная подтяжка: отпущена = HIGH
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
Serial.println("ready");
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) { // контакт дрогнул - перезапускаем таймер
lastChange = millis();
lastReading = reading;
}
if (millis() - lastChange >= DEBOUNCE_MS && reading != stableState) {
stableState = reading; // состояние держится дольше 30 мс
if (stableState == LOW) { // реагируем только на нажатие
ledOn = !ledOn;
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
Serial.println(ledOn ? "LED on" : "LED off");
}
}
}
Откройте Tools -> Serial Monitor и выставьте скорость 9600 бод, как в Serial.begin(9600). После сброса появится ready, затем каждое нажатие даст одну строку: LED on, LED off и так далее. Удержание кнопки больше ничего не переключает. Порог 30 мс подходит для типовых тактовых кнопок; у изношенных контактов дребезг бывает дольше, тогда порог увеличивают.
Если не получилось
| Симптом | Частая причина | Что сделать |
|---|---|---|
| В IDE нет порта | кабель без линий данных; нет драйвера CH340 у клона | другой кабель; установить драйвер; переподключить |
| Ошибка загрузки со словом avrdude | выбран не тот порт или плата; у клона Nano старый загрузчик | проверить плату и порт; для Nano выбрать Processor -> ATmega328P (Old Bootloader) |
| Загрузилось, но внешний светодиод не горит | перевернут светодиод; не тот пин; нет общего GND | длинная ножка к резистору и пину, короткая к GND; сверить номер пина |
| Кнопка срабатывает сама | вход без подтяжки | INPUT_PULLUP и кнопка на GND |
| В Serial Monitor «мусор» | скорость монитора не совпадает с Serial.begin |
выставить ту же скорость, 9600 |
Что изучать дальше
Порядок, который приводит к законченному устройству, а не к набору разрозненных уроков:
- Мигание без
delay()черезmillis()— основа любой программы, которая делает несколько дел сразу (пример ниже). - Аналоговый вход и ШИМ:
analogRead()с потенциометра, яркость светодиода черезanalogWrite()на ШИМ-пинах (на Uno R3 они помечены~). - Serial Monitor для отладки: печатать значения датчиков и переменных вместо угадывания.
- Библиотеки и шины: датчик температуры и влажности, дисплей по I2C, установка библиотек через Library Manager.
- Первый артефакт: например, термометр с дисплеем и кнопкой переключения режимов. Уложить все в один скетч без
delay()— хороший итоговый тест базы.
Сроки у всех разные: кто-то проходит этот путь за несколько недель по вечерам, кто-то дольше, и это нормально.
// Мигание без delay(): loop не блокируется и может опрашивать кнопку
const unsigned long INTERVAL_MS = 500;
unsigned long lastToggle = 0;
bool ledOn = false;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
unsigned long now = millis();
if (now - lastToggle >= INTERVAL_MS) { // вычитание корректно и после переполнения millis()
lastToggle = now;
ledOn = !ledOn;
digitalWrite(LED_BUILTIN, ledOn ? HIGH : LOW);
}
// здесь можно делать что-то еще: читать датчик, кнопку, порт
}
Результат тот же, что у Blink, но loop() проходит тысячи раз в секунду и между переключениями свободен для другой работы. millis() на 32-битном unsigned long переполняется примерно через 49,7 суток; запись now - lastToggle >= INTERVAL_MS переживает переполнение, а сравнение вида now >= lastToggle + INTERVAL_MS — нет.
Выводы
- Arduino — это плата, IDE и библиотека над C++; скетч — обычный C++ с функциями
setup()иloop(). - Для старта с нуля берите плату уровня Uno (R3, клон или R4) и набор с макеткой, резисторами и кнопками.
- Внешний светодиод — только через резистор, ток пина ограничен (Uno R3 — 20 мА рекомендуемо, Uno R4 — 8 мА); нагрузку мощнее светодиода подключают через транзистор или драйвер.
- Кнопку читают с
INPUT_PULLUP, реагируют на переход и подавляют дребезг по времени. - Следующий шаг после Blink —
millis()вместоdelay(), затем датчики, дисплей и первое законченное устройство.
Где применяется / связь с практикой
Освойте тему на практике
Arduino — удобный вход в встраиваемые системы: на нем быстро собирают прототипы датчиков, учебные стенды и устройства для дома. Дальше неизбежно понадобится база электроники — закон Ома, делители, транзисторные ключи, питание, чтение схем и даташитов. Ее системно дает курс «Электроника и электротехника». Чтобы посмотреть формат обучения, можно начать с бесплатных открытых уроков Otus.
FAQ
Нужно ли знать программирование, чтобы начать с Arduino?
Нет, первые скетчи понятны без опыта, а переменные, условия и функции осваиваются по ходу. Дальше пригодится базовый C++: типы, массивы, функции.
Можно ли учиться без платы, в симуляторе?
Да, онлайн-симуляторы Arduino позволяют собрать схему и запустить скетч в браузере. Но дребезг, плохие контакты и нехватку питания увидеть можно только на реальной плате.
Можно ли писать для Arduino на MicroPython?
Для части плат (например, на ESP32 и некоторых Arm-платах) — да. Для классической Uno на ATmega328P — нет, ей не хватает памяти; там пишут на C++.



