Третий год я держал в голове миф: «Mega — для профи, до неё мне далеко». А потом один проект упёрся в потолок Uno за вечер: гирлянда из шестнадцати светодиодов вроде бегущих огней, экран на I2C, пара серв и кнопка. Считаем: у Uno 14 цифровых пинов, из них 6 с ШИМ; гирлянда съела двенадцать, серво — ещё две. I2C сидит на A4 и A5, кнопка требует вход, и всё — пины кончились на этапе макетки, до корпуса и питания дело даже не дошло. Добавьте сюда, что ШИМ у Uno живёт только на шести пинах: раскладка «кто где сидит» превращается в головоломку раньше, чем проект заработает.
Вторая ловушка выстрелила, когда я начал копить журнал показаний: массив на четыреста целых чисел — это 800 байт, а у Uno всего 2 КБ ОЗУ, из которых половину уже отъели строки, библиотеки и стек. Скетч работал минуту и падал намертво — классическая порча памяти, о которой вы узнаете по внезапным кракозябрам в мониторе. Честных выходов было два: переписывать всё на PROGMEM-экономию или взять плату с большей оперативкой. Я выбрал второе и ни разу не пожалел: переписывание логики под нехватку памяти — проигрышная гонка.
Разберём, что Mega 2560 даёт по числам, где она действительно необходима, а где покупка — трата денег и лишние пятнадцать сантиметров макетки. Внизу — сравнительная таблица Uno, Nano и Mega и рабочий скетч с буфером, который на Uno выглядел бы роскошью.
Что внутри: числа против Uno
Сердце Mega — чип ATmega2560, и все его цифры выросли в разы против ATmega328P. Флеш-память: 256 КБ против 32 — крупный скетч со шрифтами, меню и таблицами больше не упирается в потолок; примерно 8 КБ из этого занимает загрузчик. Оперативка: 8 КБ против 2 КБ у Uno — именно это спасает журналы, буферы и крупные массивы. Постоянная EEPROM: 4 КБ против 1 КБ — там переживают отключение питания счётчики и настройки, как мы делали в уроке про первую запись в EEPROM. Для ориентира: скетч с тремя библиотеками, меню на дисплее и таблицей шрифтов легко выходит за 28 килобайт — на Uno он уже не собирается, на Mega едва заметен.
Пины: 54 цифровых входа-выхода (15 из них с ШИМ — диапазон со знаком «~» от 2 до 13) против 14 у Uno, и 16 аналоговых входов A0–A15 против шести. Плюс четыре аппаратных UART: Serial, Serial1, Serial2, Serial3. На Uno второй порт эмулируется библиотекой SoftwareSerial и задыхается выше 38400 бод; на Mega Serial1 — честный аппаратный: подключайте Bluetooth-модуль или GPS и продолжайте спокойно смотреть монитор. Рабочий диапазон SoftwareSerial — от 4800 до 38400 бод, на верхах он теряет байты; аппаратный порт держит 115200 без потерь.
Что не изменилось: частота всё те же 16 МГц и логика 5 В. Mega не быстрее Uno — код выполняется с той же скоростью, у платы просто больше места и больше рук. Если проект тормозит от вычислений, Mega его не оживит; тормоза лечатся алгоритмом, планировщиком на millis или другой платформой вроде ESP32.
| Параметр | Uno | Nano | Mega 2560 |
|---|---|---|---|
| Микроконтроллер | ATmega328P | ATmega328P | ATmega2560 |
| Флеш-память | 32 КБ | 32 КБ | 256 КБ |
| ОЗУ | 2 КБ | 2 КБ | 8 КБ |
| EEPROM | 1 КБ | 1 КБ | 4 КБ |
| Цифровые пины | 14 (6 ШИМ) | 14 (6 ШИМ) | 54 (15 ШИМ) |
| Аналоговые входы | 6 | 8 | 16 |
| Аппаратных UART | 1 | 1 | 4 |
| Частота и логика | 16 МГц, 5 В | 16 МГц, 5 В | 16 МГц, 5 В |
| Габариты, мм | 68 × 53 | 45 × 18 | 102 × 53 |
Когда Mega нужна, а когда это переплата
Моё правило с границей: берите Mega, когда пинов Uno физически не хватает или в ОЗУ живёт больше пары килобайт данных. Живые примеры: световые кубы и длинные гирлянды, ЧПУ и степперы, проекты с дюжиной датчиков и опросом по расписанию, экраны с большим буфером кадра, устройства, где одновременно крутятся Bluetooth, GPS и монитор. Во всех остальных случаях это трата: для мигалки, кнопки и пары датчиков Mega избыточна, а её габариты уже не встают в макетку по ширине — провода идут дюпонами, и их вдвое больше.
Переход со скетчем Uno безболезненный в девяти случаях из десяти: Serial.begin, digitalWrite, analogRead — всё то же, плата загружается через тот же USB и тот же порт в IDE. Десятый случай — библиотеки с прямой записью в регистры портов: код, который байтами дёргал пины 0–13 через PORTB на Uno, на Mega указывает на другие адреса; он компилируется, но управляет не тем, что вы хотели. Библиотеки из менеджера почти все кроссплатформенные, а самодельный «быстрый digitalWrite» проверяйте отдельно. Классический симптом такой ошибки — светодиод, который мигает не на том пине, что в скетче: байт уходит в чужой регистр, а компилятор молчит.
Питание тоже заметно выросло: под нагрузкой из серв и лент Mega просит уже не USB, а блок на 7–12 В через винтовой разъём. И ещё привычка: экономия строк через PROGMEM и функцию F() нужна и здесь — 8 КБ ОЗУ не бесконечность, а строковые меню на Mega съедают так же охотно.
Про питание отдельно, потому что это первая ловушка после покупки. Разъём круглый тот же, но аппетит периферии другой: две-три серво, лента в метр и пара драйверов шаговых двигателей легко поднимают потребление выше ампера — USB-порт компьютера на такое не подписывался. Рабочая схема для стационарного проекта: блок на 7–12 В в винтовой разъём, тяжёлая нагрузка — от отдельного источника с общей землёй. Перед первым включением проверяю, что перемычка выбора питания стоит как в инструкции к моей ревизии: у клонов её бывает перепаивают.
Практика: буфер, который Uno не потянула бы
Запас памяти видно руками. В макетке ниже скетч ведёт кольцевой буфер на восемь значений потенциометра на A0: считывает, усредняет и гасит дрожание ручки. Массив из восьми int — это 16 байт из 2048 у Uno и те же 16 байт из 8192 у Mega; смысл не в размере, а в привычке — журнал на несколько тысяч измерений, который убил бы Uno, на Mega занимает проценты оперативки. Устройство буфера простое: новый замер вписывается на место старейшего, а сумма обновляется вычитанием старого значения — пересчитывать весь массив каждый цикл расточительно, да и на 16 МГц этой экономии всё равно не видно.
Кнопка на D2 сбрасывает буфер — так проверяют, что усреднение не помнит старые значения. Светодиод на D12 зажигается, когда среднее перевалило за половину шкалы: грубый пороговый автомат, ровно тот, с которого начинается любой датчик-тревога. Если среднее «залипает» после сброса — ищите забытый элемент: сброс обязан обнулять и сумму, и массив, иначе старые значения дадут шлейф. В мониторе идут пары v= и avg= — их же построит плоттер.
Почему кольцо, а не растущий массив: в Arduino-скетче память под массивы выделяется заранее, и «наивный» рост через переприсваивание быстро фрагментирует кучу. Кольцо же занимает фиксированные 16 байт с первого цикла и кучу не трогает — падать нечему. Запас Mega позволяет держать кольца на сотни значений: тот же код с размером 500 потянет килобайт — восьмую часть ОЗУ, рискованно, но допустимо; на Uno это уже самоубийство.
void setup() { Serial.begin(9600); // USB: монитор порта Serial1.begin(9600); // пины 19 (RX1) и 18 (TX1) Serial.println("Mega: most Serial1 gotov");} void loop() { if (Serial1.available()) { Serial.write(Serial1.read()); } if (Serial.available()) { Serial1.write(Serial.read()); }}- Mega 2560: ATmega2560, 256 КБ флеша (около 8 КБ под загрузчик), 8 КБ ОЗУ, 4 КБ EEPROM, 54 цифровых пина (15 ШИМ), 16 аналоговых входов, 4 UART
- Берите Mega, когда кончаются пины или в ОЗУ живёт больше пары килобайт; для «на вырост» это переплата — частота та же 16 МГц
- Serial1/Serial2/Serial3 — аппаратные порты: RX1/TX1 на пинах 19/18, SoftwareSerial не нужен
- Библиотеки с прямой записью в регистры портов (PORTB и company) на Mega ведут себя иначе — проверяйте отдельно
- Под сервами и лентами питание — от блока 7–12 В через винтовой разъём, не от USB
- 1. Проект: 18 светодиодов, экран, серво и кнопка. Что впервые заявит о себе на Uno?
- 2. Сколько ОЗУ у Mega 2560 по сравнению с Uno?
- 3. Что у Mega НЕ изменилось против Uno?
- 4. Второй аппаратный UART Mega — это...
- 5. Скетч с байтовой записью в PORTB перенесли с Uno на Mega без правок. Что произойдёт?
Частые вопросы по теме урока
- Проект: 18 светодиодов, экран, серво и кнопка. Что впервые заявит о себе на Uno?
- У Uno 14 цифровых пинов — 18 светодиодов уже не разместить; Mega с её 54 пинами создана для таких сценариев; I2C на A4 и A5 спасает экран, но не гирлянду. Кончатся цифровые пины
- Сколько ОЗУ у Mega 2560 по сравнению с Uno?
- 8 КБ ОЗУ против 2 КБ у Uno; 256 КБ — это флеш-память для скетчей, её часто путают с ОЗУ; запомните пару цифр — 8 и 256, а не наоборот. 8 КБ против 2 КБ
- Что у Mega НЕ изменилось против Uno?
- Частота и напряжение прежние: Mega не быстрее, у неё больше места и больше пинов. Тактовая частота 16 МГц и логика 5 В
- Второй аппаратный UART Mega — это...
- Serial1 — аппаратный: RX1 на 19-м, TX1 на 18-м; для второго порта SoftwareSerial на Mega не нужен — софтверная эмуляция осталась для Uno и для третьего-четвёртого портов, если вдруг понадобятся. Serial1 на пинах 19 (RX) и 18 (TX)
- Скетч с байтовой записью в PORTB перенесли с Uno на Mega без правок. Что произойдёт?
- Регистры портов у ATmega2560 другие: код собирается, но управляет не тем, чем на Uno; выручает переписывание на честный digitalWrite. Прямую работу с регистрами проверяйте отдельно. Скомпилируется, но дёргать может не те пины