Первая программа

Программа Arduino связывает написанные на C++ команды с физическим устройством. После загрузки микроконтроллер выполняет их сам: компьютер можно отключить, если плата получает питание другим подходящим способом. Начнём с минимального скетча, разберём две обязательные функции и пройдём весь путь от текста до наблюдаемого результата.
Скетч Arduino содержит функции setup() и loop(). setup() выполняется один раз после запуска или сброса контроллера, а loop() вызывается снова и снова. Среда Arduino проверяет и собирает код, затем загружает готовую программу в выбранную плату через выбранный порт.
Зачем это нужно
Даже простой робот должен подготовить оборудование перед работой, а затем постоянно выполнять основной алгоритм. Например, в начале программа настраивает вывод светодиода и запускает последовательный порт. После этого она повторяет цикл: читает датчик, принимает решение и обновляет исполнительные устройства.
Первый скетч помогает проверить всю инструментальную цепочку:
- плата подключена и получает питание;
- в среде выбрана правильная модель платы;
- выбран нужный последовательный порт;
- код компилируется без ошибок;
- загрузчик принимает программу;
- физический выход меняется так, как задумано.
Если сразу начать со сложного робота, неисправность может скрываться в проводах, библиотеке, настройках платы или алгоритме. Короткий рабочий скетч служит контрольной точкой: он отделяет исправное рабочее место от проблем конкретной схемы.
Главная идея
Скетч описывает два этапа жизни программы:
включение или сброс -> setup() один раз -> loop() -> loop() -> loop() -> ...
setup() подходит для начальной настройки. loop() содержит действия, которые должны повторяться, пока контроллер работает. Эти функции не нужно вызывать вручную: их вызывает программное ядро Arduino.
| Функция | Когда выполняется | Что обычно размещают внутри |
|---|---|---|
setup() | один раз после питания или сброса | настройку пинов, запуск Serial, начальное положение устройства |
loop() | многократно после завершения setup() | опрос датчиков, расчёты, реакции и обновление выходов |

На иллюстрации верхняя мятная область и стрелка обозначают однократный этап setup(), а круговая стрелка в нижней области — повторение loop(). Это схема потока программы, а не электрические соединения. Справа показана концептуальная цепь «вывод — резистор — светодиод — общий провод»; номера пинов конкретной платы нужно сверять с её документацией.
Минимальный скетч
Самый короткий корректный каркас выглядит так:
void setup() {
}
void loop() {
}
Он ничего не настраивает и не делает, но показывает обязательную структуру. Слово void означает, что функция не возвращает значение. После имени стоят круглые скобки, а тело функции находится между фигурными скобками.
Чтобы получить наблюдаемый результат, дальше используем встроенный светодиод платы и пример Blink. Сначала запишем номер пина явно, а затем улучшим код с помощью константы.
| Фрагмент | Назначение | Типичная ошибка новичка |
|---|---|---|
pinMode(..., OUTPUT) | переводит контакт в режим цифрового выхода | вызов пропущен или помещён не в ту функцию |
digitalWrite(..., HIGH) | задаёт высокий логический уровень | перепутан номер контакта |
digitalWrite(..., LOW) | задаёт низкий логический уровень | ожидание полного выключения при иной внешней схеме |
delay(500) | приостанавливает выполнение на указанное число миллисекунд | число принято за секунды |
; | завершает инструкцию | точка с запятой пропущена |
Как скетч становится программой
Кнопка проверки запускает сборку, но не изменяет память платы. Среда подготавливает проект, компилирует скетч и подключённые библиотеки, затем компонует их с ядром выбранной платформы. На этом этапе обнаруживаются синтаксические ошибки, неизвестные имена и часть несоответствий типов.
Кнопка загрузки сначала тоже собирает проект, а затем передаёт полученный двоичный образ в плату. Способ передачи зависит от модели: часто используется загрузчик и последовательное соединение через USB, но у разных платформ возможны другие механизмы. Поэтому выбор платы влияет не только на подписи в меню, но и на параметры компиляции и загрузки.
скетч + библиотеки + ядро платы
↓
проверка и сборка
↓
двоичная программа
↓
загрузка в плату
| Этап | Что проверяется | Что не гарантируется |
|---|---|---|
| проверка/сборка | синтаксис, известность имён, доступность библиотек | правильность подключения и замысла |
| загрузка | связь с выбранной платой и возможность записать программу | корректная работа датчика или привода |
| запуск | реальное выполнение кода микроконтроллером | безопасность механизма при любой неисправности |
Компилятор может подтвердить, что инструкция записана допустимо, но не знает, к какому пину подключён ваш светодиод. Успешная сборка и правильное поведение — разные проверки.
Плата и порт — не одно и то же
Выбор платы сообщает инструментам, для какой аппаратной платформы собирать программу. Выбор порта указывает, через какое обнаруженное соединение обращаться к конкретному устройству.
Если выбрана неверная плата, код может не собраться, получить неподходящую раскладку контактов или не загрузиться. Если выбран неверный порт, среда обращается не к тому устройству либо не находит загрузчик. При нескольких подключённых платах полезно отключить и снова подключить нужную: так легче увидеть, какой порт появился.
Перед загрузкой проверьте:
- USB-кабель поддерживает данные, а не только питание;
- модель платы и при необходимости вариант процессора выбраны верно;
- порт принадлежит нужной плате;
- Serial Monitor или другая программа не удерживает порт, если платформа не допускает совместный доступ;
- внешняя схема не создаёт короткого замыкания.
После первой успешной загрузки измените только один хорошо заметный параметр, например длительность паузы. Повторная загрузка должна изменить именно этот признак. Так вы убеждаетесь, что наблюдаете новую программу на нужной плате, а не старый скетч на соседнем устройстве. Зафиксируйте выбранные плату и порт в журнале стенда: при следующем подключении операционная система может назначить соединению другое имя.
Если используется внешний светодиод, сначала обесточьте схему, проверьте полярность и добавьте последовательный резистор, рассчитанный для вашего питания и светодиода. Не проверяйте цифровой выход коротким замыканием и не подключайте к нему мотор: допустимые напряжения и токи берут из документации конкретной платы, а силовую нагрузку управляют через подходящий драйвер.
Как читать первую ошибку
Рассмотрим испорченный фрагмент:
void setup() {
pinMode(LED_BUILTIN, OUTPUT)
}
После вызова pinMode отсутствует ;. Сообщение может указывать на закрывающую скобку или следующую строку: там компилятор окончательно понял, что инструкция не закончена. Поэтому сначала читайте первое сообщение и проверяйте не только отмеченную строку, но и строку перед ней.
Полезный порядок отладки:
- сохраните рабочую или исходную версию;
- прочитайте первое сообщение полностью;
- найдите имя файла и номер строки;
- исправьте одну понятную причину;
- соберите заново;
- только после успешной загрузки проверяйте физическое поведение.
Не меняйте одновременно код, проводку и настройки среды: иначе непонятно, какое действие помогло.
Пример: blink
Первую программу Arduino часто называют Blink: по-английски это означает «мигание». Название точное: плата попеременно включает и выключает встроенный светодиод. Такой пример проверяет IDE, порт, загрузку и базовую структуру setup() / loop() без внешней схемы.
Самый простой вариант явно использует пин 13. На классической Arduino UNO встроенный светодиод подключён именно к нему:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
В setup() пин 13 настраивается как выход. В loop() программа подаёт HIGH, ждёт одну секунду, подаёт LOW и снова ждёт одну секунду. После конца loop() Arduino автоматически запускает loop() заново.
Когда понятно, что делает программа, номер пина лучше вынести в константу:
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Теперь значение 13 написано один раз. Если светодиод будет подключён к другому пину, достаточно изменить только строку с ledPin. Константа также помогает читать код: ledPin сразу говорит, что число относится к светодиоду.
Что запомнить о первом скетче
setup()выполняет однократную подготовку после старта или сброса.loop()повторяет основной алгоритм, пока контроллер работает.- Проверка компилирует код, а загрузка дополнительно записывает программу в плату.
- Модель платы и последовательный порт решают разные задачи.
- Успешная компиляция не подтверждает правильность проводки и алгоритма.
- Наблюдаемый короткий тест удобнее сложного проекта при проверке рабочего места.
Практика
- Создайте пустой скетч с
setup()иloop(). Добавьте комментариями по одному будущему действию робота в каждую функцию и объясните выбор размещения. - Загрузите пример мигания со встроенным светодиодом. Измените длительности так, чтобы импульс и пауза заметно отличались. Измерьте полный период секундомером.
- Намеренно удалите одну точку с запятой. Запишите первое сообщение компилятора, отмеченную строку и фактическое место причины, затем восстановите рабочий вариант.
- Составьте журнал загрузки: выбранная плата, выбранный порт, результат сборки, результат загрузки и наблюдаемое поведение. Повторите после переподключения платы.
Проверьте себя
- Когда вызывается
setup()? - Что происходит после завершения
setup()? - Почему
loop()не нужно вызывать вручную? - Чем проверка скетча отличается от загрузки?
- Для чего выбирают модель платы?
- Для чего выбирают порт?
- Почему успешная компиляция не доказывает правильность электрической схемы?
- Где искать причину, если ошибка отмечена на строке после пропущенной
;?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Значение |
|---|---|
| скетч | программа Arduino, организованная вокруг функций setup() и loop() |
setup() | функция однократной начальной настройки |
loop() | функция повторяющейся основной работы |
| компиляция | перевод исходного кода с проверками в машинно исполняемую форму |
| компоновка | соединение скомпилированных частей программы и библиотек |
| загрузка | передача собранной программы в память контроллера |
| загрузчик | программа или механизм, принимающий новый образ прошивки |
| порт | обнаруженное системой соединение с устройством |
| сброс | повторный запуск программы контроллера из начального состояния |
LED_BUILTIN | символическое имя контакта встроенного светодиода для выбранной платы |
Связанные темы
- Подготовка среды — установка Arduino IDE 2, выбор платы и порта.
- Переменные — хранение показаний, настроек и состояний.
- Монитор порта Serial — вывод сообщений при запуске и во время работы.
- Циклы — управляемое повторение действий внутри программы.
- Функции — разделение скетча на понятные операции.
- digitalWrite: мигание светодиодом — подробная работа с цифровым выходом.
- Библиотеки — подключение готового кода к скетчу.