Номера выводов Arduino — это не номера ножек микроконтроллера. Пин 13 Arduino Uno — это линия PB5 микросхемы ATmega328P, пин A4 — линия PC4, а у Arduino Mega даже номера прерываний не совпадают с номерами прерываний микроконтроллера. Инструмент сводит обе нумерации: каждому пину — порт, вывод корпуса, функции, таймер ШИМ, прерывание и код на регистрах.
Коротко
- Uno и Nano: D0–D7 — PD0–PD7, D8–D13 — PB0–PB5, A0–A5 (D14–D19) — PC0–PC5 микроконтроллера ATmega328P.
- ШИМ: у Uno и Nano — пины 3, 5, 6, 9, 10, 11; на 5 и 6 частота 976,6 Гц, на остальных 490,2 Гц.
- Прерывания: у Uno и Nano — пины 2 и 3 (INT0, INT1), у Mega — 2, 3, 18–21 с другой нумерацией attachInterrupt().
- Nano: A6 и A7 — только аналоговые входы.
- Mega 2560: SPI на 50–53, I²C на 20 и 21, A8–A15 — порт K.
Как пользоваться
- Выберите плату: Arduino Uno, Nano или Mega 2560.
- Найдите вывод по номеру Arduino (13, A4), по порту (PB5), по функции микросхемы (OC1A, SDA, PCINT5) или по номеру вывода корпуса. Фильтр над таблицей оставляет только выводы с ШИМ, АЦП, прерываниями или интерфейсами.
- Нажмите на вывод в таблице. Справа — всё о нём, под таблицей — код: вызовы Arduino и то же самое на регистрах.
Номера выводов корпуса даны для микросхем ATmega328P в корпусах DIP-28 и TQFP-32 и ATmega2560 в корпусе TQFP-100 по данным Microchip. Плата и выбранный вывод хранятся в адресе страницы — ссылкой можно поделиться.
Откуда берётся карта выводов
Ядро Arduino хранит соответствие в файле pins_arduino.h своего варианта платы: массивы номер → порт, номер → бит и номер → таймер. У Uno и Nano вариант один и тот же (у Nano добавлены два аналоговых входа), у Mega — свой на 70 цифровых выводов. Функции порта, которые ядро не использует (выходы второго канала таймера, PCINT, вход компаратора), и номера выводов корпусов взяты из атласа микроконтроллеров — из описаний Microchip, сверенных с даташитами. Тесты проверяют, что источники согласны: у каждого пина с ШИМ микросхема выводит нужный выход сравнения OCnx, у каждого пина с прерыванием — нужный вход INTn.
Частота ШИМ
Функция analogWrite() не настраивает таймер, а только подключает выход сравнения и записывает скважность в регистр OCRnx. Таймеры настраивает init() при запуске скетча: делитель 64 у всех, Timer0 — в режиме Fast PWM, остальные — Phase Correct PWM с 8-битным счётом. Частоты по формулам даташита ATmega328P:
Timer0 заодно отсчитывает millis() и delay(): прерывание по его переполнению приходит каждые 64 · 256 тактов, при 16 МГц — каждые 1024 мкс. Если поменять его делитель ради другой частоты ШИМ, собьются все задержки скетча. Другой таймер можно перенастроить свободно, только пропадёт ШИМ analogWrite() на его выводах. Делители и период под нужную частоту считает калькулятор таймера.
Прерывания
attachInterrupt() принимает номер прерывания ядра, а не номер пина и не номер INTn. У Uno и Nano всё совпадает: пин 2 — прерывание 0 — INT0, пин 3 — 1 — INT1. У Mega 2560 номера ядра сохранены для совместимости с Uno, а за ними стоят другие входы:
| Пин Mega | attachInterrupt | Вход ATmega2560 | Порт |
|---|---|---|---|
| 2 | 0 | INT4 | PE4 |
| 3 | 1 | INT5 | PE5 |
| 21 | 2 | INT0 | PD0 |
| 20 | 3 | INT1 | PD1 |
| 19 | 4 | INT2 | PD2 |
| 18 | 5 | INT3 | PD3 |
Поэтому номер всегда получают через digitalPinToInterrupt(pin). Кроме того, у многих выводов есть прерывание по изменению уровня PCINT: у Uno и Nano — у всех линий портов B, C и D, у Mega — у порта B, части порта J, порта K и линии PE0. Ядро его не использует, но оно доступно через регистры PCICR и PCMSKn; номер PCINT инструмент показывает для каждого пина.
Arduino Mega 2560
У Mega четыре аппаратных UART: Serial на пинах 0 и 1, Serial1 — на 19 и 18, Serial2 — на 17 и 16, Serial3 — на 15 и 14. SPI выведен на пины 50–53, а не на 10–13, как у Uno, а I²C — на 20 и 21, а не на A4 и A5. Шилд для Uno, который берёт SPI с пинов 11–13, на Mega без перемычек к пинам 50–52 работать не будет. Аналоговые входы A0–A7 — порт F, A8–A15 — порт K; для каналов 8–15 analogRead() ставит бит MUX5 в регистре ADCSRB.
Ограничения
- Только платы на ATmega328P и ATmega2560 с ядром Arduino AVR: Uno, Nano (ATmega328P) и Mega 2560. Leonardo, Micro, Nano Every и Uno R4 построены на других микроконтроллерах и устроены иначе.
- Расположение разъёмов на плате, питание и схема платы здесь не показаны — для этого будут страницы плат.
- Клоны повторяют карту выводов, если используют тот же микроконтроллер и вариант ядра. Отличаться может загрузчик: для Nano в ядре есть вариант «ATmega328P (Old Bootloader)» со скоростью загрузки 57 600 бит/с вместо 115 200.
Частые вопросы
Какому выводу микроконтроллера соответствует пин 13 Arduino Uno?
Пин 13 — это линия PB5 микроконтроллера ATmega328P: вывод 19 в корпусе DIP-28 и 17 в корпусе TQFP-32. Ядро Arduino назначает его встроенному светодиоду (LED_BUILTIN), а у микроконтроллера это ещё и линия SCK интерфейса SPI. На регистрах вывод переключают битом 5 регистров DDRB, PORTB и PINB.
Какие пины Arduino Uno поддерживают ШИМ?
Шесть: 3, 5, 6, 9, 10 и 11. За ними стоят выходы сравнения таймеров OC2B, OC0B, OC0A, OC1A, OC1B и OC2A. После init() ядра все таймеры работают с делителем 64, поэтому при 16 МГц на выводах 5 и 6 (Timer0, режим Fast PWM) частота ШИМ — 976,6 Гц, а на остальных (режим Phase Correct PWM) — 490,2 Гц.
Почему на выводах 5 и 6 частота ШИМ выше?
Их обслуживает Timer0, который ядро Arduino запускает в режиме Fast PWM: период — 256 тактов таймера, частота 16 МГц / (64 · 256) = 976,6 Гц. Timer1 и Timer2 работают в режиме Phase Correct PWM, где счётчик идёт вверх и вниз, период — 510 тактов и частота 490,2 Гц. Timer0 же отсчитывает millis() и delay() по своему переполнению, поэтому его делитель лучше не менять.
Какие пины Arduino Mega поддерживают внешние прерывания?
Шесть: 2, 3, 18, 19, 20 и 21. Номера attachInterrupt() у них не совпадают с номерами прерываний микроконтроллера: пин 2 — прерывание 0 и INT4, пин 3 — 1 и INT5, пин 21 — 2 и INT0, пин 20 — 3 и INT1, пин 19 — 4 и INT2, пин 18 — 5 и INT3. Чтобы не ошибиться, номер берут через digitalPinToInterrupt(pin).
Можно ли использовать A6 и A7 на Arduino Nano как цифровые выводы?
Нет. У ATmega328P в корпусе TQFP-32 это отдельные входы ADC6 и ADC7 без линии порта, поэтому pinMode(), digitalWrite() и digitalRead() с ними не работают — только analogRead(). В ядре Arduino для Nano им даны номера 20 и 21, но в таблице портов этих номеров нет.
Чем digitalWrite() отличается от записи в регистр PORT?
digitalWrite() по номеру пина находит в таблицах порт и бит, выключает ШИМ, если пин подключён к таймеру, и меняет бит при запрещённых прерываниях. Запись PORTB |= (1 << 5) делает только последнее. Поэтому регистры удобны, когда нужно быстро переключать вывод, а digitalWrite() — когда важна переносимость между платами.
Источники
- Arduino. ArduinoCore-avr, коммит 11b9130 (github.com/arduino/ArduinoCore-avr) — variants/standard, eightanaloginputs и mega/pins_arduino.h — порт и бит каждого номера Arduino, таймеры ШИМ, аналоговые входы, выводы SPI, I2C и светодиода, digitalPinToInterrupt; cores/arduino/WInterrupts.c — какое прерывание INTn стоит за номером attachInterrupt; wiring.c — режимы и делители таймеров после init(), millis() от Timer0; wiring_analog.c и wiring_digital.c — что делают analogRead(), analogWrite() и digitalWrite(); boards.txt — микроконтроллер, частота и скорость загрузчика. Файлы распространяются по LGPL-2.1, на сайте — только факты о выводах
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — функции выводов и их номера в корпусах; 15.7.3 и 15.7.4 — частота Fast PWM fclk/(N·256) и Phase Correct PWM fclk/(N·510)
- Atmel. ATmega640/1280/1281/2560/2561 datasheet, 2549Q–AVR–02/2014 — функции выводов ATmega2560 и их номера в корпусе TQFP100
- Microchip. ATmega Series Device Support (ATmega_DFP) 3.6.299 — описания устройств atdf: выводы и сигналы ATmega328P и ATmega2560, по которым построены страницы атласа; лицензия Apache-2.0
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/arduino-pins/" title="Пины Arduino и выводы микроконтроллера" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/arduino-pins/">Пины Arduino и выводы микроконтроллера</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?