Программирование и IT

Arduino для начинающих

Arduino — плата с микроконтроллером, которой можно объяснить, когда зажечь светодиод, а когда прочитать датчик. Программа пишется на упрощённом C++, заливается по USB и работает сама, без компьютера. Первое мигание светодиодом занимает минут двадцать.

Обновлено
В этой статье

Техника безопасности — до первой схемы#

Правила короткие, и нарушать их не стоит даже «один раз, аккуратно».

Сетевое напряжение 220 В — не для начинающих. Всё, что включается в
розетку, разбирать, переделывать и подключать к плате нельзя. Управление
комнатным светом, чайником, обогревателем выглядит соблазнительной первой
задачей и таковой не является: ошибка здесь стоит жизни, а не сгоревшей платы.
Начинай и первый год оставайся в низковольтных схемах: питание от USB,
батареек или адаптера на 5–12 В.

Не замыкай питание накоротко. Провод между выводами 5V и GND — это
короткое замыкание: плата греется, порт компьютера уходит в защиту, дорожки
могут выгореть. Перед подачей питания глазами пройди по схеме от плюса к
минусу и убедись, что на пути есть нагрузка.

Светодиод — только через резистор. Без него светодиод выходит из строя
почти сразу и может утянуть за собой вывод платы.

Отключай USB перед перекоммутацией. Переставлять провода на работающей
плате — надёжный способ что-нибудь спалить.

Мотор напрямую к выводу не подключается. Вывод Arduino Uno рассчитан
примерно на 20 мА, а двигатель, реле или длинная светодиодная лента потребляют
в десятки раз больше. Между ними ставят транзистор или готовый модуль-драйвер
с отдельным питанием.

Соблюдай полярность. Электролитический конденсатор, включённый наоборот,
вздувается и может хлопнуть; у светодиода длинная ножка — плюс.

Что такое плата и какую взять#

Arduino Uno — плата, на которой стоит микроконтроллер ATmega328P, разъём USB
для связи с компьютером и ряды выводов по краям. Ключевые числа: тактовая
частота 16 МГц, 32 КБ памяти под программу, 2 КБ оперативной, рабочее
напряжение 5 В.

Выводы делятся на три группы:

  • цифровые, с номерами 0–13 — умеют только два состояния, «есть 5 вольт» и
    «нет»; шесть из них (3, 5, 6, 9, 10, 11) дополнительно умеют выдавать
    среднее значение;
  • аналоговые входы A0–A5 — измеряют напряжение и превращают его в число;
  • питание — выводы 5V, 3.3V, GND (общий, «земля») и VIN.

Первой платой бери именно Uno: у неё самый большой запас готовых примеров и
разъёмы, в которые провод просто втыкается. Nano — та же начинка в меньшем
корпусе, удобна, когда схема переезжает в корпус готового устройства.

Кроме платы нужен набор мелочи: макетная плата без пайки, перемычки,
светодиоды, резисторы на 220 и 330 Ом, тактовые кнопки. Всё это продаётся
стартовыми наборами и стоит недорого.

Среда и первая заливка#

Скачай Arduino IDE с официального сайта и установи. Дальше три шага:

  1. подключи плату кабелем USB;
  2. в меню «Инструменты» выбери тип платы — Arduino Uno;
  3. там же выбери порт: в Windows это COM3 и подобные, в Linux
    /dev/ttyUSB0 или /dev/ttyACM0, в macOS — /dev/cu.usbmodem….

Если в Linux порт виден, но заливка отказывает по правам, пользователя
добавляют в группу dialout и перезаходят в систему — эта логика разобрана в
разделе о правах доступа в шпаргалке по командам
Linux.

Две кнопки вверху окна: галочка проверяет программу, стрелка компилирует и
заливает её в плату. Загруженная программа остаётся в памяти микроконтроллера
и стартует сама при каждой подаче питания — компьютер после заливки не нужен.

Первая программа: мигание#

Программу для Arduino называют скетчем. В ней всегда есть две функции.

void setup() {
  pinMode(13, OUTPUT);   // вывод 13 работает на выход
}

void loop() {
  digitalWrite(13, HIGH);  // подать напряжение
  delay(1000);             // ждать 1000 миллисекунд
  digitalWrite(13, LOW);   // снять напряжение
  delay(1000);
}

setup() выполняется один раз при включении — в ней настраивают выводы и
связь. loop() повторяется бесконечно, пока есть питание. pinMode задаёт
режим вывода: OUTPUT — выдавать, INPUT — читать. digitalWrite ставит на
выводе высокий или низкий уровень. delay останавливает программу на заданное
число миллисекунд, то есть 1000 — это одна секунда.

Залей скетч — и светодиод, впаянный на самой плате рядом с выводом 13,
замигает. Вместо числа 13 обычно пишут LED_BUILTIN: на разных платах
встроенный светодиод сидит на разных выводах.

Своя схема со светодиодом#

Теперь тот же скетч, но со светодиодом на макетной плате.

Собери цепь: вывод 8 платы → резистор → длинная ножка светодиода; короткая
ножка светодиода → GND. В скетче замени 13 на 8 в обеих функциях.

Номинал резистора считается по закону Ома. Светодиод не сопротивление, у него
своё падение напряжения — примерно 2 В у красного. Остаток напряжения гасит
резистор:

R = (U питания − U светодиода) / I
R = (5 В − 2 В) / 0,01 А = 300 Ом

Ток 10 мА (0,01 А) — комфортная для светодиода величина. Точно на 300 Ом
резистора в наборе не будет; берут ближайший больший из ряда — 330 Ом, и это
правильная сторона округления: меньший номинал даёт больший ток. Резистор на
220 Ом тоже распространён и допустим — ток получится около 13,6 мА.

Полярность светодиода: длинная ножка — анод, подключается к выводу платы через
резистор; короткая — катод, идёт на землю. Вставили наоборот — не загорится, но
и не сломается.

Читать входы и датчики#

Кнопка подключается между выводом и землёй, а внутренний подтягивающий резистор
включается прямо в программе:

void setup() {
  pinMode(2, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int state = digitalRead(2);       // нажата — LOW, отпущена — HIGH
  digitalWrite(LED_BUILTIN, state == LOW ? HIGH : LOW);
  Serial.println(state);
  delay(50);
}

Перевёрнутая логика тут не ошибка: при INPUT_PULLUP вывод сам подтянут к
питанию, а нажатая кнопка соединяет его с землёй.

Serial.begin(9600) открывает связь с компьютером, Serial.println шлёт туда
строку. Окно «Монитор порта» в среде показывает эти строки — это основной
инструмент отладки: переменную нельзя посмотреть отладчиком, зато можно
напечатать.

Аналоговые входы измеряют напряжение и выдают число от 0 до 1023, где 0 — ноль
вольт, а 1023 — пять. Так читаются потенциометр, фоторезистор, датчик
влажности почвы:

int raw = analogRead(A0);              // 0…1023
float volts = raw * 5.0 / 1023.0;      // перевод в вольты

Обратная операция — analogWrite(pin, value) со значением от 0 до 255: вывод
быстро переключается между нулём и пятью вольтами, и светодиод светится вполнакала,
а мотор через драйвер крутится медленнее.

Датчики для начала: DHT11 или DHT22 — температура и влажность, HC-SR04 —
расстояние ультразвуком, DS18B20 — точная температура, фоторезистор — уровень
освещённости. К большинству из них есть библиотека: «Инструменты» →
«Управление библиотеками», найти по названию, установить, взять пример из меню
«Файл» → «Примеры».

План первых проектов#

  1. Мигание и его вариации. Два светодиода поочерёдно, потом «бегущий
    огонь» из пяти — здесь же осваивается массив и цикл for.
  2. Кнопка. Включение по нажатию, затем переключатель, который меняет
    состояние по каждому нажатию. Столкнёшься с дребезгом контактов и реши
    его паузой или проверкой времени.
  3. Плавное свечение. analogWrite в цикле — светодиод разгорается и гаснет.
  4. Датчик и порог. Фоторезистор зажигает свет, когда темнеет; значения
    смотри в мониторе порта и подбирай порог по ним.
  5. Показания наружу. Экран на I2C или трёхцветный светодиод как индикатор
    состояния.
  6. Устройство целиком. Термометр с экраном, автополив по влажности почвы,
    счётчик у двери. Здесь появляется первая настоящая задача — уйти от
    delay, который блокирует всю программу, к сравнению millis().

Отдельный совет про delay: пока в скетче одна задача, он удобен. Как только
нужно одновременно мигать и слушать кнопку, пауза начинает мешать, потому что
на это время плата не делает ничего. Приём «запомнить millis() и сравнивать»
разбирается в примере BlinkWithoutDelay из стандартного набора среды.

Частые ошибки#

Не выбран порт или плата. Самая частая причина сообщения об ошибке при
заливке. Проверь оба пункта меню «Инструменты».

Забыт общий провод. Если у схемы своё питание, её «земля» обязана быть
соединена с GND платы, иначе показания хаотичны, а модуль молчит.

pinMode в loop. Режим настраивают один раз в setup; в цикле он
просто тратит время.

Светодиод без резистора «на попробовать». Работает ровно до того момента,
когда перестаёт.

Долгие вычисления внутри loop. Микроконтроллер не многозадачен: пока
считается одно, остальное не выполняется.

Язык скетчей — это C++ с готовым набором функций и без ручного запуска сборки.
Всё, что ты выучишь про типы, циклы и функции в обычном
си плюс плюс, здесь работает один в один.

План по этапам

  1. Подключить и залить примерПоставить среду, выбрать плату и порт, залить Blink из стандартных примеров.
  2. Собрать свою цепьВынести светодиод на макетную плату через резистор, посчитав номинал по закону Ома.
  3. Добавить входПодключить кнопку через INPUT_PULLUP и управлять светодиодом по нажатию.
  4. Прочитать датчикСнять значения с аналогового входа, вывести их в монитор порта и подобрать порог срабатывания.
  5. Уйти от delayПереписать мигание на сравнение millis() так, чтобы кнопка отзывалась мгновенно.
  6. Собрать устройствоСоединить датчик, индикатор и логику в одну законченную вещь, работающую без компьютера.

Начать изучать эту тему у себя

План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.

Начать план

Проверь себя

1.Какая функция скетча выполняется один раз при включении платы?

2.Какая функция задаёт вывод на работу в режиме выхода?

3.Питание 5 В, падение напряжения на светодиоде 2 В, нужный ток 0,01 А. Сколько ом должен быть резистор по закону Ома?

4.Какое число передать в delay(), чтобы пауза длилась 2 секунды?

Источники

  • Документация ArduinoПервоисточник: описание плат, справочник функций языка, руководства
    бесплатно
  • Справочник языка ArduinopinMode, digitalWrite, analogRead и остальные функции с примерами
    бесплатно
  • Tinkercad CircuitsСборка и запуск схемы с Arduino в браузере, без покупки платы
    бесплатно

Было полезно?

Ещё темы

Программирование и IT Python: задачи с решениями Подборка задач по возрастанию сложности — от разворота строки до генератора и декоратора-счётчика. Сначала решай сам и только потом открывай разбор: сравнение своего кода с чужим даёт больше, чем чтение готового. Все решения проверены на Python 3. Программирование и IT Как изучить Python с нуля Python хорош для первого знакомства с программированием: код читается почти как текст, а стандартная библиотека закрывает большинство бытовых задач. Этот план ведёт от установки интерпретатора до собственных скриптов, покрытых тестами, — примерно за четыре месяца при занятиях около часа в день. Программирование и IT Си плюс плюс (C++) с нуля Си плюс плюс — компилируемый язык, на котором пишут там, где важны скорость и прямой доступ к памяти: движки игр, браузеры, базы данных, прошивки. Порог входа выше, чем у Python, но первая работающая программа собирается в первый же вечер. Программирование и IT Как изучить SQL с нуля SQL — язык запросов к реляционным базам данных. Он нужен разработчикам, аналитикам, тестировщикам и менеджерам, которые хотят сами доставать цифры. Базовые запросы осваиваются за несколько недель, уверенная работа со сложными отчётами — за два-три месяца практики. Ниже — порядок тем и способы тренироваться на настоящей базе. Программирование и IT Как изучить Linux с нуля Linux работает на большинстве серверов, в контейнерах и на множестве устройств, поэтому командная строка нужна разработчику, тестировщику, аналитику и системному администратору. Осваивать систему удобнее всего не чтением списков команд, а ежедневной работой в терминале и решением небольших практических задач. Ниже — последовательность тем на два-три месяца. Программирование и IT Как изучить Java с нуля Java — строго типизированный язык, на котором написаны банковские системы, серверы крупных сервисов и Android-приложения. Строгость поначалу замедляет, зато компилятор ловит многие ошибки до запуска. Этот план рассчитан примерно на полгода занятий по часу в день и ведёт от первой программы до небольшого серверного приложения.

Ещё сценарии