Arduino Uno: обзор платы, питание, порты и память

Как устроена самая известная плата на ATMega328: связь с компьютером, варианты питания, назначение выводов, типы памяти и встроенная защита.
Что такое Arduino Uno
Arduino Uno — отладочная плата на микроконтроллере ATMega328. Она служит посредником между разработчиком и микроконтроллером: даёт удобный доступ к его выводам и позволяет загружать прошивку прямо из среды программирования. Плату с открытой архитектурой разработали итальянские инженеры, а с ростом популярности появилось множество клонов, полностью совместимых программно и аппаратно. Размер платы — 7 на 5,5 см.

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


Связь с компьютером и запись прошивки
USB-разъём выполняет две задачи: обмен данными с ПК и запись прошивки. За обмен отвечает модуль UART микроконтроллера ATMega328, выведенный на контакты 0 (RX) и 1 (TX). Между ним и компьютером стоит отдельный микроконтроллер ATMega16 со специальной прошивкой, благодаря которой плата определяется как виртуальный COM-порт. Во время обмена мигают светодиоды RX и TX.
Прошивка записывается одной кнопкой в Arduino IDE: плата поставляется с загрузчиком, работающим по протоколу STK500, и внешний программатор не нужен. Для записи в обход загрузчика есть колодка ICSP. DFU-загрузчик самого ATMega16 тоже можно переписать через аналогичную колодку. В качестве альтернативы стандартной среде называют PlatformIO.
Способы питания
Вариантов три:
- через USB-разъём тем же кабелем, что служит для программирования;
- от адаптера AC/DC с выходным напряжением 7–12 В через разъём внешнего питания;
- подачей 7–12 В на контакт Vin, при этом минус источника соединяют с одним из контактов GND.
При любом способе встроенные линейные стабилизаторы формируют на отдельных контактах 5 В и 3,3 В; с вывода 3,3 В можно снять не более 50 мА. Подавать питание на плату через эти выводы рискованно: напряжение идёт мимо стабилизатора, и любой скачок способен сжечь микроконтроллер.
Все контакты GND соединены между собой. Значительная часть необъяснимых сбоев в проектах возникает оттого, что землю платы забыли соединить с землёй подключённых модулей и датчиков. Вывод IOREF сообщает шилдам уровень бортового напряжения: модуль, способный работать и от 5 В, и от 3,3 В, по нему выбирает режим.
Некоторая защита от перегрузок на плате есть: восстанавливаемые предохранители с порогом 500 мА берегут USB-порт компьютера от перегрузок и замыканий.
Цифровые и аналоговые выводы
У платы 14 цифровых выводов с номерами от 0 до 13 и 6 аналоговых. Каждый цифровой вывод работает как вход или как выход, направление задаёт функция pinMode(). Программно включается подтягивающий резистор к плюсу питания номиналом 20–50 кОм. Выходное напряжение вывода — до 5 В, ток — до 40 мА; превышение нагрузки может повредить микроконтроллер.
Аналоговые выводы A0–A5 подключены к 10-битному АЦП, то есть каждый канал выдаёт 1024 значения. По умолчанию измеряется диапазон 0–5 В: нулю вольт соответствует 0, пяти — 1023. Верхнюю границу можно изменить, подав собственное опорное напряжение на AREF. Аналоговые выводы без ограничений используются и как цифровые. Низкий уровень на выводе RESET сбрасывает микроконтроллер.
| 0, 1 | Serial: RX и TX |
| 2, 3 | Вход внешних прерываний |
| 3, 5, 6, 9, 10, 11 | ШИМ, функция analogWrite() |
| 10, 11, 12, 13 | SPI: SS, MOSI, MISO, SCK |
| 13 | Светодиод на плате |
| A4, A5 | I2C: SDA и SCL |

Вывод 13 соединён со светодиодом на плате через резистор 220 Ом, поэтому питать от него нагрузку не стоит: реле на этом выводе может работать нестабильно, хотя на остальных сбоев нет.
Три вида памяти
Flash-память объёмом 32 кБ хранит скомпилированные скетчи; 2 кБ из них занимает загрузчик, упрощающий запись кода.
EEPROM на 1 кБ сохраняет данные после отключения питания и обычно используется для настроек. Ресурс её ограничен: производитель гарантирует 100000 циклов перезаписи каждой ячейки, поэтому писать в неё следует как можно реже. Для работы с ней в Arduino IDE есть библиотека EEPROM.h.
Оперативной памяти SRAM 2 кБ, здесь лежат переменные и объекты программы, которые пропадают при выключении. У неопытных разработчиков она быстро заканчивается. Расход планируют заранее: меньше глобальных переменных, внимание к типам данных, большие однотипные массивы — в память программ.
Программный сброс
Перезагрузить плату можно без кнопки и вывода RESET. В начале программы объявляют указатель на функцию с нулевым адресом — void(*resetFunc) (void) = 0; — и в нужном месте вызывают resetFunc().
В целом Uno подходит и начинающим, и опытным разработчикам: при скромных размерах её возможностей хватает большинству проектов, а обилие библиотек, примеров и учебных материалов сокращает путь от идеи до работающего устройства.