Урок 02Новичок25 минOʻZ · РУ · ENЕсть в симуляторе

Arduino Uno: пины и ваша первая программа

Пины и питание Arduino Uno, HIGH и LOW, зачем светодиоду резистор и ваш первый скетч: два светодиода горят по очереди. От setup() и loop() до кнопки «Загрузить».

Видеона YouTube

Главное

  • Цифровые пины D0–D13 работают как выходы или входы; HIGH — это около 5 В, а LOW — 0 В.
  • Пины с ШИМ отмечены знаком ~ (D3, D5, D6, D9, D10, D11); A0–A5 — аналоговые входы.
  • Пин безопасно отдаёт 20 мА, а максимум — 40 мА, поэтому светодиоду всегда нужен резистор.
  • setup() выполняется один раз, а затем снова и снова выполняется loop().
  • «Проверить» компилирует и проверяет скетч, а «Загрузить» ещё и записывает его в плату.

Arduino Uno — это небольшая плата, в центре которой одна микросхема: микроконтроллер ATmega328P. Всё остальное на плате обслуживает эту микросхему: подводит к ней питание, соединяет её с вашим компьютером и выводит её пины на ряды гнёзд вдоль краёв платы. В эти гнёзда и вставляют провода.

Что есть на плате

Пины Uno: цифровые D0–D13 сверху, питание (5V, GND) и аналоговые A0–A5 снизу, гнездо USB и светодиод L на D13.
Часть платы Для чего она
Гнездо USB Соединяет плату с компьютером. Даёт плате около 5 В (до 500 мА), через него идут загрузка скетчей и сообщения Serial.
Круглое гнездо питания Принимает 7–12 В от батареи или блока питания. Стабилизатор платы делает из них 5 В.
ATmega328P Микроконтроллер: 16 МГц, 32 КБ флеш-памяти для скетча, 2 КБ оперативной памяти (RAM), 1 КБ EEPROM.
Цифровые пины D0–D13 Выходы или входы для сигналов «включено/выключено». Через D0 и D1 ещё и идёт последовательная связь по USB.
Пины с широтно-импульсной модуляцией (ШИМ), отмеченные ~ D3, D5, D6, D9, D10 и D11 умеют ещё и очень быстро включаться и выключаться, чтобы задавать скорость или яркость.
Аналоговые входы A0–A5 Измеряют напряжение от 0 до 5 В и выдают результат числом от 0 до 1023.
Пины питания 5V, 3.3V, GND и VIN (см. ниже).
Светодиод L Маленький светодиод, подключённый к D13. Его использует ваш первый скетч.
Светодиод ON Горит, когда на плату подано питание.
Светодиоды TX и RX Мерцают, когда данные идут в компьютер или из него.
Кнопка сброса Запускает ваш скетч заново, с самого начала.

Пины питания

  • 5V выдаёт 5 В для датчиков и модулей. А в робот-машине через этот пин, наоборот, приходит питание: сюда его подаёт для Uno драйвер моторов L298N. У пина 5V нет защиты, поэтому никогда не подавайте на него больше 5 В.
  • 3.3V выдаёт 3,3 В (примерно до 50 мА) для небольших деталей, которым нужно именно такое напряжение. В робот-машине этот пин не используется.
  • GND — это земля, 0 В. Все напряжения на плате отсчитываются от GND. У Uno три пина GND, и на плате они соединены между собой.
  • VIN принимает 7–12 В, как и круглое гнездо питания. Собственный стабилизатор платы делает из этого напряжения 5 В.

HIGH и LOW

У цифрового пина, работающего как выход, два состояния. HIGH соединяет пин с питанием платы: это около 5 В, когда Uno работает от USB. LOW соединяет его с GND: 0 В. Промежуточных значений нет. digitalWrite(2, HIGH) подаёт на D2 около 5 В, а digitalWrite(2, LOW) — 0 В.

Пин, работающий как вход, делает обратную работу. digitalRead(pin) сообщает скетчу, высокое на пине напряжение или низкое. После сброса все пины — входы. Чтобы пин мог чем-то управлять, скетч сначала должен сделать его выходом с помощью pinMode(pin, OUTPUT).

Коротко о ШИМ и аналоговых пинах

Пины со знаком ~ умеют очень быстро переключаться между HIGH и LOW: примерно 980 раз в секунду на D5 и D6 и примерно 490 раз в секунду на остальных. analogWrite(pin, value) задаёт, какую долю времени на пине держится HIGH. Значение — от 0 до 255: 0 означает «всегда LOW», 255 — «всегда HIGH», а 128 — HIGH примерно половину времени. В уроке Моторы и драйвер L298N так задают скорость мотора.

Аналоговые входы A0–A5 измеряют напряжение. analogRead(A0) возвращает 0 при 0 В, 1023 при 5 В, а между ними — промежуточные значения.

Какой ток может дать пин

Пин безопасно отдаёт около 20 мА. Абсолютный максимум — 40 мА. При большем токе пин может навсегда выйти из строя. 20 мА хватает для светодиода. А для мотора, которому нужно до 1 А, это слишком мало. Вот почему моторам нужен драйвер.

Зачем светодиоду резистор

Светодиод сам не ограничивает свой ток. Красному светодиоду, чтобы загореться, нужно около 2 В. Если напряжение хоть немного выше, ток растёт очень резко — пока не сгорит светодиод или пин. Резистор, включённый последовательно со светодиодом, не даёт этому случиться.

В модуле светодиода, который используется на этом сайте, есть свой резистор на 220 Ом. Вот какой ток он пропускает:

  • Пин выдаёт 5 В, и около 2 В из них забирает красный светодиод.
  • На резистор остаётся около 3 В.
  • Ток = 3 В / 220 Ом ≈ 0,014 А = 14 мА.

При 14 мА светодиод горит ярко, и это с запасом меньше 20 мА, допустимых для пина.

Подключаем модуль светодиода

S модуля светодиода на D2, − на GND. Модуль и светодиод L на D13 горят по очереди каждые 500 мс.

У модуля светодиода два пина: S (сигнал) и - (минус, земля). Подключите S к D2, а «-» — к одному из пинов GND платы Uno. Светодиод L на D13 — часть платы, поэтому провод ему не нужен.

ОткудаКудаЗачем
Uno GNDМодуль светодиода GNDЗемля
Uno D2Модуль светодиода SHIGH зажигает светодиод
Детали для урока

Скетч

Blink.ino
// Blink: the LED module on D2 and the Uno's own "L" LED on D13 take turns.
// Wiring: LED module S -> D2, LED module - (GND) -> GND.

const byte LED_MODULE = 2;   // the module's S pin
const byte LED_BOARD = 13;   // the L LED soldered on the Uno

void setup() {
  pinMode(LED_MODULE, OUTPUT);  // pins start as inputs: make these two outputs
  pinMode(LED_BOARD, OUTPUT);
}

void loop() {
  digitalWrite(LED_MODULE, HIGH);  // 5 V on D2: the module's LED lights
  digitalWrite(LED_BOARD, LOW);    // 0 V on D13: the L LED goes dark
  delay(500);                      // wait half a second
  digitalWrite(LED_MODULE, LOW);
  digitalWrite(LED_BOARD, HIGH);
  delay(500);
}

Имена для пинов

const byte LED_MODULE = 2; даёт пину 2 имя. byte — это целое число от 0 до 255, а const означает, что значение никогда не меняется. С именами скетч легче читать. Если вы переставите провод, нужно будет изменить одно число вверху, а остальной скетч останется прежним.

setup() выполняется один раз

Когда плата запускается (после включения питания, сброса или загрузки), она один раз выполняет setup(). Здесь setup() делает D2 и D13 выходами.

loop() выполняется бесконечно

После setup() плата выполняет loop(). Дойдя до конца, loop() снова начинается сверху — и так, пока у платы есть питание. Один проход этого loop() состоит из двух половин:

  1. На D2 HIGH, на D13 LOW: светодиод модуля загорается, а светодиод L гаснет. Затем скетч ждёт 500 мс.
  2. На D2 LOW, на D13 HIGH: модуль гаснет, а светодиод L загорается. Затем скетч ждёт ещё 500 мс.

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

Три функции

Функция Что делает Пример из скетча
pinMode(pin, mode) Делает пин выходом (OUTPUT) или входом (INPUT) pinMode(LED_MODULE, OUTPUT);
digitalWrite(pin, value) Подаёт на пин-выход HIGH (около 5 В) или LOW (0 В) digitalWrite(LED_MODULE, HIGH);
delay(ms) Ждёт указанное число миллисекунд delay(500);

Во время delay() Uno не выполняет ни одной другой строки вашего скетча. Для Blink это нормально. Но роботу, который должен всё время следить за датчиком, нужен другой способ отсчитывать время — о нём рассказывает урок Программы, которые никогда не ждут.

Кнопки «Проверить» и «Загрузить»

В Arduino IDE две главные кнопки:

  • «Проверить» (галочка, Ctrl+R) компилирует скетч: превращает ваш код на C++ в машинный код и проверяет его. Если есть ошибка, например пропущена точка с запятой, появится сообщение об ошибке с номером строки.
  • «Загрузить» (стрелка, Ctrl+U) компилирует скетч и записывает его во флеш-память платы. Затем плата перезапускается и выполняет новый скетч.

У встроенной Arduino IDE в симуляторе те же кнопки и те же сочетания клавиш.

В новой плате Uno обычно уже записан скетч Blink, поэтому, когда вы впервые подключаете плату, её светодиод L мигает. В симуляторе плата, в которую ещё не загружали скетч, тоже выполняет этот заводской Blink.

Попробуйте в симуляторе

Здесь весь робот — это Uno и модуль светодиода на столе в Гараже. Uno работает от USB ноутбука, поэтому батарея не нужна. После загрузки красный модуль светодиода и светодиод L горят по очереди: пока один горит, другой погашен, и каждые полсекунды они меняются. Теперь замените обе строки delay(500) на delay(100) и снова загрузите скетч. Светодиоды будут меняться в пять раз быстрее.

Сообщения через Serial

Uno умеет ещё и отправлять текст на компьютер по USB-кабелю. Это простой способ увидеть, что делает ваш скетч. Вот setup() из Blink с двумя добавленными строками:

void setup() {
  pinMode(LED_MODULE, OUTPUT);
  pinMode(LED_BOARD, OUTPUT);
  Serial.begin(9600);              // open the link at 9600 baud
  Serial.println("Blink started"); // send one line of text
}

Serial.begin(9600) запускает последовательную связь на скорости 9600 бод (бит в секунду). Serial.println() отправляет текст и завершает строку. Serial.print() отправляет текст, не завершая строку. Чтобы прочитать сообщения с настоящей платы, откройте в Arduino IDE Инструменты > Монитор порта (Tools > Serial Monitor) и выберите 9600 бод. Пока Serial включён, сообщения идут через D0 и D1, поэтому не подключайте к этим двум пинам другие провода.

В симуляторе монитор порта (Serial Monitor) находится на арене, где робот работает от своей батареи. В уроке Измеряем расстояние с помощью HC-SR04 в него выводятся расстояния.

Что дальше

Проверьте себя

1Чем setup() отличается от loop()?

setup() выполняется один раз, когда плата запускается. Затем loop() выполняется снова и снова, пока у платы есть питание.

2Зачем в модуле светодиода свой резистор на 220 Ом?

Светодиод сам не ограничивает свой ток. Резистор держит ток на уровне около 14 мА: это безопасно для светодиода и меньше 20 мА, которые может отдать пин.

3Какие пины Uno могут выдавать ШИМ с помощью analogWrite()?

Пины, отмеченные знаком ~: D3, D5, D6, D9, D10 и D11.

Задание

В симуляторе переставьте провод S модуля светодиода с D2 на D8. Затем измените скетч так, чтобы модуль снова мигал, загрузите его и проверьте результат на столе.

Подсказка

Номер пина модуля записан в скетче только в одном месте.