Arduino Uno: пины и ваша первая программа
Пины и питание Arduino Uno, HIGH и LOW, зачем светодиоду резистор и ваш первый скетч: два светодиода горят по очереди. От setup() и loop() до кнопки «Загрузить».
Главное
- Цифровые пины D0–D13 работают как выходы или входы; HIGH — это около 5 В, а LOW — 0 В.
- Пины с ШИМ отмечены знаком ~ (D3, D5, D6, D9, D10, D11); A0–A5 — аналоговые входы.
- Пин безопасно отдаёт 20 мА, а максимум — 40 мА, поэтому светодиоду всегда нужен резистор.
- setup() выполняется один раз, а затем снова и снова выполняется loop().
- «Проверить» компилирует и проверяет скетч, а «Загрузить» ещё и записывает его в плату.
Arduino Uno — это небольшая плата, в центре которой одна микросхема: микроконтроллер ATmega328P. Всё остальное на плате обслуживает эту микросхему: подводит к ней питание, соединяет её с вашим компьютером и выводит её пины на ряды гнёзд вдоль краёв платы. В эти гнёзда и вставляют провода.
Что есть на плате
| Часть платы | Для чего она |
|---|---|
| Гнездо 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 (сигнал) и - (минус, земля). Подключите S к D2, а «-» — к одному из пинов GND платы Uno. Светодиод L на D13 — часть платы, поэтому провод ему не нужен.
| Откуда | Куда | Зачем |
|---|---|---|
| Uno GND | Модуль светодиода GND | Земля |
| Uno D2 | Модуль светодиода S | HIGH зажигает светодиод |
Arduino Uno R3Есть в симуляторе× 1Цену смотрите в магазине
Модуль светодиода 5 мм, красныйЕсть в симуляторе× 1Цену смотрите в магазине
Кабель USB A–B для Arduino Uno× 1Цену смотрите в магазине
Скетч
// 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() состоит из двух половин:
- На D2 HIGH, на D13 LOW: светодиод модуля загорается, а светодиод L гаснет. Затем скетч ждёт 500 мс.
- На 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 в него выводятся расстояния.
Что дальше
- Соберите ту же схему по-настоящему в проекте Blink.
- Заставьте два светодиода мигать с разной скоростью и без
delay()в уроке Программы, которые никогда не ждут. - Заставьте колёса крутиться в уроке Моторы и драйвер L298N.
Проверьте себя
1Чем setup() отличается от loop()?
setup() выполняется один раз, когда плата запускается. Затем loop() выполняется снова и снова, пока у платы есть питание.
2Зачем в модуле светодиода свой резистор на 220 Ом?
Светодиод сам не ограничивает свой ток. Резистор держит ток на уровне около 14 мА: это безопасно для светодиода и меньше 20 мА, которые может отдать пин.
3Какие пины Uno могут выдавать ШИМ с помощью analogWrite()?
Пины, отмеченные знаком ~: D3, D5, D6, D9, D10 и D11.
Задание
В симуляторе переставьте провод S модуля светодиода с D2 на D8. Затем измените скетч так, чтобы модуль снова мигал, загрузите его и проверьте результат на столе.
Подсказка
Номер пина модуля записан в скетче только в одном месте.