Arduino с нуля: с чего начать изучение и первый скетч

Arduino с нуля: с чего начать изучение и первый скетч Полезное

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: установка и первая загрузка

  1. Скачайте Arduino IDE 2 с официального сайта Arduino и установите. Есть и браузерный Arduino Cloud Editor, но для начала удобнее локальная IDE.
  2. Подключите плату по USB. На плате загорится индикатор питания.
  3. В выпадающем списке вверху окна выберите плату и порт. На Windows порт выглядит как COM3, на macOS — /dev/cu.usbmodem... или /dev/cu.usbserial..., на Linux — /dev/ttyACM0 или /dev/ttyUSB0.
  4. Для платы не из семейства AVR (Uno R4, ESP32) поставьте пакет поддержки через Boards Manager.
  5. Откройте пример 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

Что изучать дальше

Порядок, который приводит к законченному устройству, а не к набору разрозненных уроков:

  1. Мигание без delay() через millis() — основа любой программы, которая делает несколько дел сразу (пример ниже).
  2. Аналоговый вход и ШИМ: analogRead() с потенциометра, яркость светодиода через analogWrite() на ШИМ-пинах (на Uno R3 они помечены ~).
  3. Serial Monitor для отладки: печатать значения датчиков и переменных вместо угадывания.
  4. Библиотеки и шины: датчик температуры и влажности, дисплей по I2C, установка библиотек через Library Manager.
  5. Первый артефакт: например, термометр с дисплеем и кнопкой переключения режимов. Уложить все в один скетч без 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++.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)