
Я — самодельщик-ардуинщик со стажем. Люблю пихать ардуины во всякие подходящие и не очень места. Как-то раз я уже показывал свою коллекцию Arduino-совместимых плат, и с тех пор она только росла и ширилась. Теперь в ней случилось особенное пополнение: русская (пока не) народная «Ардуина» ELBEAR от сибирской компании «Элрон» на базе отечественного микроконтроллера MIK32 «Амур», о существовании которой я узнал несколько дней назад из статьи на Хабре.
В статье я изложу частный опыт искушённого любителя, который пытается импортозаместить зарубежную Arduino и приспособить данную плату для своих любительских нужд, не залезая в дебри. Конечно, это далеко не первая подобная публикация, с поездкой на поезде хайпа я припозднился примерно на годик. Зато она отражает актуальное положение дел и демонстрирует, чем чреват смелый прыжок веры прямо в неизвестность без предварительного изучения вопроса.
К тому же, я не самый обычный ардуинщик. Вкусы мои специфичны: я не сделал ни одной метеостанции, мой дом глуп как пробка, и даже мои часы на Arduino — стрелочные. Вместо этого я делаю вещи, так или иначе связанные с электронными и видеоиграми, демосценой, звуком и музыкой с уклоном в ретро. И разнообразные ардуины мне нужны и интересны именно в этом контексте. А значит, есть шанс, что будет интересно.
▍ Рвало на Родину
Для начала хочется рассказать, чем, когда и обо что нужно удариться, чтобы одним прекрасным днём решить выложить из собственного отечественного кармана 6209 отечественных рублей за отечественную плату, уступающую по возможностям китайским платам за 600.

Впервые я столкнулся с компьютерной техникой в тот переходный период, когда в домах ещё встречались БК-шки, РК-шки, и может быть даже Векторы, а в школах стояли УКНЦ. Но всё больше и больше всё это заменяли Спектрумы, Денди, Сеги и IBM PC. В эпоху открытия границ разница между отечественным и зарубежным была весьма наглядной: тут тебе и цвет, и звук, и музыка, и увлекательные сюжеты в играх.
Всё это, однако, стоило немалых денег, и не было мне доступно. Немало времени тогда было уделено чтению советских книжек и справочников по радиоэлектронике, разглядыванию схем компьютеров типа ЮТ-88, Специалист, Радио-86РК, и вялым попыткам их собрать. Заложенная этим идея, что недоступный компьютер можно сделать своими силами, сохранилась на многие годы. Позже я слегка успел прикоснуться к остаткам советской техники, к элементам ЕС и СМ ЭВМ, принтерам, дисководам и терминалам. Весь этот опыт заложил основу будущей ностальгии и тёплых чувств к отечественной аппаратуре.

Появление интернета по карточкам и преодоление языкового барьера открыли мне ранее недоступное море информации по увлечениям. Я узнал про историю компьютерной техники множество интересных вещей, увидел лучшее, что было создано в мире. Тогда в воздухе ещё витал миф про особую мощь отечественных программистов, и я находил тому подтверждения: вот же наша демосцена, вот отечественные программы, творящие невиданные ранее вещи на 8-битном железе. Этим я стремился поделиться с миром, обратно, чтобы кто-нибудь в Японии или США тоже мог поудивляться тому, что было создано в наших краях.

В те же времена стала более доступна новая, современная элементная база, снова подогрев мой интерес к радиоэлектронике. Я смотрел на зарубежные и отечественные самоделки на разных AVR, PIC, ARM и прочих Altera, пробовал делать что-то сам на ATtiny и ATmega, в том числе пытался изобрести самодельное игровое устройство или компьютер. Но по старой памяти всегда хотелось соорудить что-нибудь интересное именно из отечественных компонентов. И я примерялся к советской номенклатуре: ВМ80, ВМ1, ВЕ49 и вот это всё. Увы, это были остатки древней, более развитой цивилизации, а не что-то, что могло пригодиться в новом тысячелетии.

Тогда, в начале 2000-х годов, надежды на будущее отечественной микроэлектроники, ещё не полностью рассосались, и я периодически интересовался, не появилось ли чего-нибудь новенького. Я удивлялся новостям про R100-XP, созданный для весьма специфических нужд, и вроде как несущий на борту клон звукового чипа AY-3-8910. КоЕ-кто из коллег-спектрумистов успешно применял в своих разработках тогда свежий отечественный микроконтроллер КР1878ВЕ1 на оригинальном ядре «Тесей». И я примерялся к нему, но для моих затей он был слишком немощным.

Позже заглядывался на «Мультиклет Р1», весьма оригинальный и интересный, но крайне специфичный, сложный в запуске за отсутствием инфраструктуры, и также не очень-то доступный по деньгам. Все прочие позиции были из области фантастического чтива — доступ к ним можно было получить по коммерческому запросу с астрономическими суммами от лица серьёзной организации, и даже документация была секретной.

Шли годы. Я утратил надежды прикоснуться к свежим отечественным компьютерно-процессорным разработкам и перестал следить за новостями. И вдруг из статьи на Хабре я узнал, в кои-то веки есть кое-то в свободной продаже, что можно просто пойти и купить на Озоне. Ещё и в форм-факторе популярной Arduino Uno, и с готовой инфраструктурой, даже с поддержкой в Arduino IDE! И хотя внутри у ней неонка, то есть вполне знакомая уже архитектура RISC-V, прикоснуться к которой сейчас можно и за гораздо меньшие деньги, это было предложение, от которого просто невозможно отказаться.
Побежал и купил. Цена не просто кусалась, цена разрывала жабу на куски: 6209 отечественных рублей. Для энтузиаста это был сильный удар по карману. Но перспектива закрытия давнего гештальта перевесила боль финансовых потерь, и пока платки не кончились на Озоне, я заказал себе одну — самую дешёвую из имевшихся в наличии на тот момент. Справедливости ради, существуют и почти вдвое более дешёвые версии с меньшим объёмом памяти, но на момент приобретения их просто не было в наличии.
▍ Очная ставка
Плата прибыла в фирменной коробочке, которая была заботливо положена в прозрачный полиэтиленовый пакетик. Зная, как обходится с такими пакетиками Озон в процессе доставки, это было весьма самонадеянно. Но обошлось, плата успешно пережила путешествие.

Фирменная коробочка состоит из картонки, рукава с шелкографией и фирменной символикой, пары поролоновых вставок, и собственно платы. Полагаю, сибирские платы статического электричества не боятся, потому что антистатический пакетик не предусмотрен. Больше совершенно ничего — никаких кабелей, гребёнок, или хотя бы какой-нибудь мало-мальской бумажки — в комплекте нет.
Я всё понимаю про экономику малых серий, но за такие деньги приятно было бы получить хотя бы значок, что я дурачок, и потратил кучу денег на поддержку отечественного производителя. Будучи издавна глубоко вовлечённым в разного рода DIY и самиздат, я знаю, что это вполне осуществимо, и подобные малосерийные дорогостоящие вещи снабжаются хотя бы какими-нибудь наклейками как раз, чтобы не расстраивать их покупателя.

Ну и ладно, главное, что в комплекте есть сама плата. Посмотрим же на неё скорее!
▍ Железо
И вот в моих руках платка ELBEAR ACE-UNO AC VER Flash 32MB. Похожа на платы формата Uno с другими контроллерами, радикально чёрного цвета, с логотипом с мордой медведя и некоторым количеством русских надписей в шелкографии, особенно на задней стороне. И, конечно, есть главная среди прочих надписей — «произведено в России».

Самая интересная деталь на плате, и, вероятно, единственная отечественная, не считая текстолита — собственно микроконтроллер MIK32 «Амур» с обозначением К1948ВК018, выполненным почему-то явной латиницей.
Если честно, я не знал никаких подробностей про «Амур», его разработку и производство, только мельком видел новости и слышал краем уха о перспективах его внедрения в одной известной мне теме. Про производителя платы я и вовсе ничего не знал. Поэтому в качестве вводной могу только пересказать Википедию и официальный сайт.

Чип разработан и производится на мощностях АО «Микрон» в Зеленограде. Вроде как на данный момент это единственный микроконтроллер так называемого первого уровня локализации: разрабатывается, производится и корпусируется в России. Кристаллы делаются по техпроцессу 180 нм в Москве, корпусируются в Зеленограде (Москве) и Калининграде.
Сама плата разработана сибирской компанией «Элрон». К сожалению, находится она в Новосибирске, а не в более мемном Челябинске. Было бы весело — суровая челябинская Ардуина.

В линейке ELBEAR несколько плат. Помимо вариаций Uno-подобной ACE-UNO с разным объёмом памяти и наличием-отсутствием фирменного JTAG-программатора в комплекте есть ещё Nano-подобная ACE-NANO. AC VER обозначает версию, заточенную на работу в Arduino IDE.
Микроконтроллер «Амур» использует открытую архитектуру RISC-V, 32 бита, с довольно скромной для контроллеров этой архитектуры тактовой частотой 32 МГц. На кристалле расположен довольно небольшой по нынешним меркам объём ОЗУ, 16 килобайт. Из интересной периферии есть восемь каналов 12-битного АЦП, два канала 12-битного ЦАП, температурный сенсор, часы реального времени, шесть таймеров с поддержкой ШИМ, четыре канала DMA, криптоблок. Также, конечно, все стандартные интерфейсы: SPI, i2c, UART, каждого по две штуки.

Также на чипе есть EEPROM объёмом 8 килобайт. Это не память программ, как некоторые думают по беглому изучению характеристик. С ней всё интереснее: это внешняя Flash-память с интерфейсом QSPI. На платах «Элрона» она представлена объёмом от 8 до 32 мегабайт — больше, чем на базовых ESP32. Выполняется код по аналогичной ESP схеме, с подгрузкой из Flash, только вместо IRAM здесь используется кэш объёмом 1 килобайт. Это, конечно, влияет на производительность системы.
По сравнению с Uno-подобными платами на ATmega и разных других контроллерах на плате ELBEAR значительно больше мелких компонентов. Думаю, это объясняется тем, что это плата двойного назначения: не только Ардуина, но и девборда.

Пины платы, а точнее, соответствие их расположения и функционального назначения, за небольшими отличиями совпадают с классической UNO, что очень удобно. Правда, питание и логические уровни трёхвольтовые, как у ESP и STM32, что нужно учитывать при выборе подключаемой периферии, но в современном мире это даже удобнее, не нужно лишний раз городить преобразователи уровней.
На плате также присутствуют разъём USB Type C для загрузки скетчей, перемычки выбора загрузчика BOOT0/BOOT1, разъём JTAG для перепрошивки контроллера, светодиоды индикации связи, пользовательский светодиод и кнопка.

Плата снабжена стандартным для современных Arduino-совместимых плат чипом преобразователя USB-SERIAL CH340. Это, пожалуй, плюс, потому что это решение, проверенное временем, и у прошаренных ардуинщиков оно заработает из коробки.
▍ Первые шаги
Как известно, если ничего не получается — прочтите, наконец, инструкцию. Я решил действовать превентивно: не дожидаться проблем и сразу же прочесть инструкцию

Вместо бумажки на коробке есть QR код, берегущий сибирский лес, и обещающий получение документации в электронном виде. Учитывая, что прочитать QR код на компьютере затруднительно, первое знакомство с документацией должно произойти на телефоне. Я попытался открыть код и получил ссылку на документацию. Но только в виде текста, а не перехода на сайт. после копирования ссылки документация открылась. Я увидел, как она должна выглядеть, и попытался нагуглить её по увиденному названию страницы. Не удалось, нашлись только разные другие страницы сайта. Пришлось походить туда-сюда по ссылкам на сайте. Страницу документации я так и не нашёл, но нашёл раздел про настройку Arduino IDE — то, что мне и нужно.
Ставил, конечно, в привычной мне IDE версии 1.8, в которой работают все прочие нужные мне платы и библиотеки. Процесс добавления новой платы стандартный: копируем ссылку на установочный пакет в список источников в настройках, потом устанавливаем через Менеджер плат.
https://elron.tech/files/package_elbear_beta_index.json
Пакет весьма увесистый, около 360 мегабайт, установка тоже не быстрая, пришлось подождать.
Далее инструкция говорит: если в плате нет загрузчика, понадобится особый фирменный JTAG-программатор. я брал комплект без него, но так как версия AC VER предназначена именно для работы в роли Ардуины, я понадеялся, что загрузчик там установлен с завода, как на любых нормальных Arduino-совместимых платах. Надежда, впрочем, была какой-то неуверенной, и я даже уже начал вспоминать, где у меня лежат мои, нефирменные, JTAG программаторы, которые не пригождались уже очень давно.

Я подключил плату, и она сразу бодро замигала зелёным светодиодом, что намекало, что туда уже загружен стандартный blink, и это укрепило надежду. Драйвера для моста CH340 уже были установлены. Никаких особых сообщений про установку чего-либо Windows при подключении платы не выдал, соответствующий COM-порт появился. Я выбрал его и попытался загрузить какой-нибудь скетч. Инструкция предлагала загрузить стандартный же blink. Почему бы и нет.
▍ ССЗБ и Windows 7

Первая компиляция прошла успешно, но загрузка не удалась: произошла ошибка при загрузке скетча. Какая? Науке неизвестно, IDE не уточняет. Впрочем, паниковать было рано, опыт возни с десятками других плат говорил, что квест загрузки первого скетча бывает весьма замысловатым, и пока ничего особенного не произошло.
Версия с возможной неработоспособностью платы была сразу отметена: порт появляется, и монитор порта видит, что выводит в порт загруженный скетч. Спасибо разработчикам, что предусмотрели такой вывод! Остались сомнения по наличию правильного загрузчика в плате, но скорее всего он был правильным.

Попробовал погуглить такую проблему, и, конечно, столкнулся с прелестями импортозамещения: такая информация в интернете не ищется. Тогда решил идти традиционным путём, по всем граблям. Включил подробный лог компиляции и загрузки. Это мало что дало:
То есть по какой-то причине просто не работает сама программа-загрузчик скетча в плату, и уточнять она ничего не собирается. Тогда пошёл туда, куда послал меня лог: посмотреть, что за elbear_uploader такой. Запустил его отдельно, и всё стало ясно.
Скетч использует 6608 байт (0%) памяти устройства. Всего доступно 33554432 байт.
Глобальные переменные используют 748 байт (4%) динамической памяти, оставляя 15636 байт для локальных переменных. Максимум: 16384 байт.
C:\Users\User\AppData\Local\Arduino15\packages\Elron\tools\elbear_uploader\0.2.2/elbear_uploader.exe C:\Users\User\AppData\Local\Temp\arduino_build_382412/Blink.ino.hex --com=COM17 --baudrate=230400
Произошла ошибка при загрузке скетча
Я, конечно, понимаю, что трудно ожидать, что в 2025 году у кого-то не будет на компьютере Windows 10 или 11, а будет аж Windows 7. Но в моей практике это первый случай, и какая такая необходимость у загрузчика в свежей версии Windows, мне понять было трудно. Это не случайность, в репозитории можно скачать свежую версию загрузчика, и он называется elbear_uploader_win10_v0_2_2.zip. Также есть загрузчик для Linux, что могло бы спасти ситуацию, но Linux у меня под рукой только в виде виртуалки, а прыгать между системами ради одной платы желания совершенно не было.
К счастью, исходный код загрузчика открыт, и его можно попытаться пересобрать. К сожалению, он написан на Python, и его нужно скомпилировать в исполняемый файл. Для этого мне пришлось обновить давно установленный Python. Тут-то и выяснилось, зачем загрузчику Windows 10: с версии 3.9 сам Python не работает на Windows 7.

Пришлось найти установочный файл для Python 3.8.9 и поставить. Дальше выяснилось, что загрузчику нужен пакет serial. Пакеты в Windows мне ставить ещё не приходилось. Я попробовал установить pip, и выяснил, что он работает исключительно от версии 3.9 и выше, которая не работает на Windows 7. Наметился замкнутый круг.
К счастью, круг оказался не очень прочным. В нём было целых две бреши. Во-первых, оказалось, что не один я такой ретроград: существуют сборки актуальных версий Python для Windows 7.
Во-вторых, нашлось кое-что получше свежих сборок Питона. Популярный 3D-редактор Blender, которым я сам активно пользуюсь, использует Python 3.9, и из-за этого тоже не работает на Windows 7. Его ретроградных пользователей такое положение дел тоже не устроило, и они изобрели необходимую для обратной совместимости DLL-лку, которую нужно просто положить в папку с исполняемым файлом. И она у меня уже была. Я положил, и загрузчик заработал.
Разумеется, все вышеописанные проблемы я создал себе сам применением антикварной версии Windows. Разработчики же вполне себе молодцы, по сути плата заработала из коробки, причём сразу и загрузка, и монитор порта — последним могут похвастаться далеко не все платы. Седых волос этот процесс не прибавил.
В итоге загрузка удалась, первый blink замигал с соответствующей частотой. С настройкой покончено, переходим к проверке платы и её поддержки в Arduino IDE на прочность в более сложных скетчах. И в качестве первого знакомства с особенностями и потенциалом платы я сделаю три маленьких проекта с типовыми для меня задачами.
▍ Светодиоды
Одиночным светодиодом я уже изрядно поморгал в процессе первоначальной настройки, и это было не так интересно. Гораздо интереснее попробовать что-то посерьёзнее, какие-то типовые задачи, имеющие практическую ценность. Например, поморгать 256-ю светодиодами одновременно.

Сказано — сделано. У меня уже давно ожидала внедрения в недоделанный проект светодиодная матрица 16 на 16 диодов. Она-то и послужила подопытным кроликом.
Речь идёт про адресные светодиоды типа WS2812 — главную основу самоделок Алекса Гайвера нескольких прошлых лет. Их особенностью является простейший однопроводный каскадный последовательный интерфейс, позволяющий объединять в цепочку практически произвольное количество светодиодов, насколько позволит физика и здравый смысл.
В этом тесте вместо использования готовых библиотек я решил изобрести велосипед: реализовать его на низком уровне, чтобы познакомиться с новым железом поближе. Точнее, собственную реализацию я сделал уже давно, и нужно было лишь адаптировать её под новую плату.

Реализовать протокол я решил максимально просто, через bit banging. Для начала сделал простейший тест с digitalWrite, переключающий пин с 0 на 1 в глухом цикле. Это дало частоту меандра всего лишь около 53 килогерц, тогда как необходимая адресным светодиодам скорость передачи значительно выше, 800 КГц, да ещё и требует две разных ширины импульса. Стало очевидно, что нужна прямая работа с GPIO.
С помощью DeepSeek, поиска в Интернете, осциллографа и крепкого словца удалось за полчасика без особого поседения разобраться с этим вопросом и получить необходимую скорость. Тайминги подобрал методом тыка, вставляя NOP’ы и контролируя частоту по осциллографу. Это позволило узнать кое-что про устройство GPIO, а также убедиться, что ассемблерные вставки тоже доступны, что наверняка ещё пригодится в будущем.
Дальнейшее было уже рутиной. Сделал простейший текстовый скроллер с радужной палитрой, без особых оптимизаций по скорости и расходу памяти. Работает!
▍ Опять скрипит
Воодушевившись легко достигнутым первым результатом, я решил перейти к более интересному упражнению: портировать на плату мой упрощённый эмулятор звукового чипа AY-3-8910 в комплекте с проигрывателем музыки, о котором я рассказывал в одной из недавних публикаций. Как водится, ничто не предвещало проблем.
Интерес этой затеи в том, что у контроллера есть кое-что, чем не могут похвастаться ни классические Arduino на ATmega, ни даже платы на ESP32: сразу два канала ЦАП, аж 12-битные. Как раз пригодится для качественного стереофонического звука! Завести этот ЦАП с помощью примеров mik32-examples удалось практически без труда, и оба канала действительно заработали.

Неожиданные сложности возникли с таймерами и прерываниями. Чтобы реализовать звуковой поток таким же способом, как я делал на Nano/Uno и ESP8266, нужен таймер, генерирующий прерывания несколько тысяч раз в секунду — это будет частота дискретизации, на которой сгенерированные сэмплы выводятся в ЦАП.
По историческим и техническим причинам таймеры не представлены в базовой экосистеме Arduino (Wiring) и для них не предусмотрена кросс-платформенная прослойка. Для каждой платформы предлагается использовать местные средства, набор и возможности которых очень сильно различаются между разными микроконтроллерами.
Так, на классических 8-битных ATmega есть три таймера с разными возможностями, каждый из которых способен генерировать отдельное прерывание. Эти таймеры задействованы в рабочих интересах системы, но путём прямых манипуляций с регистрами их можно использовать для личных нужд. На чипах семейства ESP тоже всё неплохо, есть разное количество таймеров, в зависимости от конкретного чипа (ESP8266, ESP32, ESP32C3 и так далее), а работа с ними производится функциями из SDK, для каждого чипа функции свои.

На «Амуре», конечно, тоже всё по своему, и довольно неплохо. Есть аж шесть таймеров, три 32-битных и три 16-битных. В реализации платформы Arduino задействованы все 16-битные таймеры: timer16_0 для IRremote, timer16_1 для tone, timer16_2 для Servo. Ничего из этого для проекта мне не нужно, поэтому можно задействовать любой в своих корыстных целях. Однако, как выяснилось, обработать прерывание от таймера не так-то просто. Пришлось покопаться в даташите и в исходниках BSP (пакета поддержки платы), чтобы разобраться.
В отличие от прочих систем, у «Амура» в текущем исполнении реализован всего один-единственный общий обработчик прерываний. В Wiring это функция trap_handler, в которой по приходу прерывания по очереди проверяются флаги всех возможных источников. В том числе предусмотрено и подключение пользовательских прерываний — определяемая пользователем функция ISR, в которой также предлагается по очереди проверять собственные источники прерываний.
Некоторое время пришлось поколдовать, чтобы реализовать систему с прерыванием по таймеру. В итоге и оно, и вывод в ЦАП заработали. Не заработал только сам эмулятор: он начал издавать странные звуки, никак не похожие на музыку. Я было подумал, что что-то сломалось в портабельном коде, и потратил некоторое время на попытки его оживить. Но ничего не помогало, пока я от балды не установил частоту дискретизации в 8 кГц вместо примерно 32 кГц, как было на Nano. И тогда музыка заиграла. Но очень плохо.
В попытках разобраться в этом явлении я сделал профайлинг элементов системы. Профайлер ожидаемо показал возможную скорость работы кода эмулятора выше чем на 8-битной 16-мегагерцовой ATmega — 67 тысяч отсчётов в секунду. Всё-таки и тактовая частота вдвое выше, и ядро 32-битное, а мой код использует некоторое количество 32-битной математики.
void __attribute__((noinline, section(".ram_text"), optimize("O3"))) trap_handler (void)
{
// custom interrupt
ISR();
// gpio interrupt
if (EPIC_CHECK_GPIO_IRQ())
gpio_interrupt_handler();
// IRremote timer interrupt
if (EPIC_CHECK_TIMER16_0())
IRremote_interrupt_handler();
// tone timer interrupt
if (EPIC_CHECK_TIMER16_1())
tone_interrupt_handler();
// servo timer interrupt
if (EPIC_CHECK_TIMER16_2())
servo_interrupt_handler();
// uart0 interrupt
if (EPIC_CHECK_UART_0())
serial_interrupt_handler(0);
// uart1 interrupt
if (EPIC_CHECK_UART_1())
serial_interrupt_handler(1);
// i2c0 interrupt
if (EPIC_CHECK_I2C_0())
wire_interrupt_handler(0);
if (EPIC_CHECK_I2C_1())
wire_interrupt_handler(1);
// reset all interrupts
EPIC_CLEAR_ALL();
}
Однако, когда в фоне было запущено прерывание таймера на 32 килогерцах, выводящее в ЦАП нули, профайлер в том же тесте показал всего 9 тысяч отсчётов. Отдельный тест показал, что запись в ЦАП работает достаточно быстро. Значит дело именно в обработчике прерывания таймера. И это неудивительно, ведь помимо моего пользовательского прерывания в нём каждый раз отрабатывает целая колбаса уже ненужных проверок. И отказаться от них из-за реализации системы в экосистеме Arduino прерываний нельзя: полное переопределение функции trap_handler не предусмотрено.
Я попробовал обойти проблему с помощью другой схемы: кольцевой буфер для сэмплов. Он заполняется новыми сэмплами в основном потоке всё время, пока в нём есть место. Прерывание таймера по быстрому забирает сэмплы из буфера и выводит в ЦАП. Такой подход неплохо показывает себя на контроллерах ESP, где код также исполняется из как-бы кэша (IRAM). Но здесь это не помогло, стало только хуже из-за накладных расходов на организацию буфера.
Таким образом, выяснилось, что таймер — не наш путь. К счастью, «Амур» предлагает другой, способный привести к более качественному решению задачи: DMA, работающее по таймеру. И в примерах даже есть демонстрация его работы как раз в связке ЦАП (mik32-examples/HAL_DMA_Timer32). Но для реализации этой схемы таки придётся лезть в самые дебри, городить очередь из буферов, и всё это становится всё меньше похоже на необременительное легкомысленное ардуинщество.
Да, пока что это фиаско. Сделаю лучше как-нибудь в другой раз. А пока насладимся натужными хрипами варианта с таймером на эпических 6 КГц. Отрицательный результат — тоже результат!
▍ Вижу фигу
Другая типичная задачка — вывести что-нибудь на дисплей. Желательно что-нибудь динамичное, бодро шевелящееся и переливающееся цветами, ведь статичные картинки — это скучно. Например, какую-нибудь длинную анимацию: ведь на приобретённой мной версии платы установлено аж 32 мегабайта Flash-памяти, и за каждый уплачено сполна из собственного кармана, и неплохо было бы найти им применение. Я даже было начал подумывать про версию Bad Apple.
Но для начала нужно подключить какой-нибудь дисплей и оценить скорость его обновления. Дисплеев у меня огромное количество самых разных типов и размеров, и я слегка затруднился с выбором. Впрочем, для пользы дела знакомства с платой как раз стоило попробовать несколько разных вариантов.

Для начала я выудил из коробки довольно необычный вариант, которому в моей практике до сих пор так и не нашлось применения: TFT с закруглёнными углами, диагональю 1.69 дюйма, необычным разрешением 240 на 280 пикселей, контроллером ST7789 и интерфейсом SPI.
На этот раз я решил всё же применить готовую библиотеку. Ведь дисплеев и их контроллеров существует великое множество, и каждый раз писать собственный драйвер под каждый тип дисплея мало кто захочет, а сила экосистемы Arduino всё-таки в готовых простых решениях. К тому же, хороший повод проверить, работают ли на ELBEAR стандартные решения из коробки. Спойлер: на сайте «Элрона» есть список уже проверенных библиотек, и искомая Adafruit ST7735 and ST7789 Library там указана как совместимая.
Экран и библиотека действительно запустились без каких-либо сложностей. Правда, при сборке проекта компилятор ругается на тип boolean, используемый в библиотеке, но хотя бы собирать код не отказывается, и на том спасибо.

Обратите внимание, что дисплей я подключил напрямую к выводам платы, хотя в случае с классической Arduino Uno требуется преобразование уровней, хотя бы с помощью вязанки резисторов: контроллер ST7789 трёхвольтовый, а Uno пятивольтовая. Но ACE-UNO с МК «Амур» имеет трёхвольтовое питание и логические уровни, о чём есть соответствующая надпись сзади платы, поэтому преобразование уровней не требуется.
Далее я попробовал оценить скорость отрисовки. По предыдущим экспериментам я ожидал от платы неплохой производительности, как минимум на уровне LGT8F328P (дважды производительность Nano). Но простейший тест с попеременной очисткой экрана то в один, то в другой цвет, заставил удивиться: очень уж медленно это происходило, пара секунд на одну смену цвета.
Я попытался поднять скорость стандартными трюками, через установку окна и прямую передачу блока сырых данных в SPI. Это работает, но скорость всё равно очень низкая, порядка секунды на полную перерисовку экрана.
Было очевидно, что с такой скоростью никакой анимации не получится. Тогда я решил поумерить аппетиты, и вместо относительно большого цветного экрана с довольно большим объёмом кадра 130 килобайт взять популярный монохромный 1.3-дюймовый OLED на контроллере SH1106. Ведь его объём кадра всего лишь один килобайт, значит обновление экрана должно работать на два порядка быстрее.
Подключить и завести экран снова удалось без каких-либо проблем, на этот раз при помощи библиотеки Adafruit SH110X. Я снова накидал простенький тест для быстрого вывода графики из буфера на экранчик, и снова получил удивительно низкую скорость обновления экрана, несмотря на то, что использовал экран с интерфейсом SPI и подключил его через аппаратный SPI.
Тогда я сделал то, что нужно было бы сделать первым шагом: собрал и загрузил пример от Adafruit. И это снова фиаско: просто какое-то слайд-шоу. Настолько медленно библиотека не работает даже на 8-битной классической Ардуине.
Едва ли я делаю что-то не так, но, возможно, это очередная специфика платы. Например, неизведанная пока особенность местной реализации SPI, которую как-то можно обойти и получить адекватную скорость работы. Вероятно, нужно снова углубиться в дебри и задействовать DMA. Разобраться с этим я планирую в будущем.
А пока, раз уж с динамичной графикой не задалось, я решил вывести наглядный результат всего этого упражнения на самый большой экран из всех, что у меня есть, 4-дюймовый TFT с разрешением 480 на 320 пикселей и контроллером ILI9488. К сожалению, на этот раз возникли проблемки, ни одна библиотека для этого контроллера не заработала.
Пришлось опять урезать осетра и взять экран поменьше, 3.2-дюймовый с разрешением и контроллером ILI9341. С ним заработало. Сначала только через программный SPI, от чего скорость вывода картинки получилась просто умопомрачительная. Потом заработал и аппаратный SPI (нужно было просто подключить RST, а в примере кода этого не было). С ним скорость заметно выросла, но всё равно осталась крайне низкой.
▍ Впечатления
Самое главное: плата действительно работает, и в вопросе интеграции в Arduino IDE и простоты освоения у неё всё довольно неплохо — уже значительно лучше, чем можно найти в прошлогодних отзывах. Правда, поначалу я не нашёл в IDE примеров для конкретной этой платы, идущих с установочным пакетом. Но они есть, и на самом видном месте: в секции основного меню примеров, а не в подменю, как обычно. Там обнаружилось немало полезного. Ещё один плюс — некоторые популярные библиотеки и устройства заработали без проблем.
Потенциал MIK32 «Амур» мне пока оценить не удалось. Он определённо имеет интересные возможности — таймеры, ЦАП. Но я ожидал от платы производительности на уровне Blue Pill на STM32, а из-за особенностей системы прерываний и непонятной ситуации с шиной SPI, либо чем-то ещё, фактическая производительность в моих типовых задачах оказалась удивительно низкой. Думаю, дело в наивном подходе, и при правильном использовании возможностей контроллера эта проблема решится.
Отдельный нюанс — скорость загрузки скетчей. Уж не знаю, почему, но скетчи размером порядка сотни-другой килобайт могут загружаться удивительно долго. Полумегабайтный скетч загружается буквально четыре с половиной минуты. Не очень понимаю, зачем в такой ситуации на плате 32 мегабайта Flash-памяти, ведь они будут прошиваться год. Возможно, что-то не так на моей стороне, и всё работает медленнее, чем задумано.
Что касается краеугольного вопроса импортозамещения, пока, конечно, всё упирается в стоимость платы. Получится ли добавить в словосочетание «русская ардуина» прилагательное «народная» — очень сильно зависит от конкурентоспособной цены. Всё-таки сила Ардуины с точки зрения самодельщика-энтузиаста — в платках по цене шаурмы, которые не жалко пихать куда угодно в неограниченных количествах. В текущих же реалиях плату можно рассматривать как технологический демонстратор и девборду, чем она, по сути и является.
▍ Заключение
Первое знакомство состоялось, и, несмотря на определённые шероховатости, его можно считать вполне успешным. Правда, я толком не прикоснулся к особенностям применяемого на плате микроконтроллера и не смог раскрыть его потенциал. А значит, нужно углубляться.
В следующий подход к снаряду попробую сделать какой-нибудь небольшой максимально импортозамещённый проект на базе этой платы. Будет ли это электронная игрушка, видеоигра, или, может быть, музыкальный синтезатор? Посмотрим!
P.S. Исходники моих собственнных тестов, если они кому-то понадобятся, можно скачать в моём блоге на Бусти. Телеграм-канала по прежнему нет, извините.
© 2025 ООО «МТ ФИНАНС»
Telegram-канал со скидками, розыгрышами призов и новостями IT ?

fututu
Казалось бы, девборд, познакомиться с новой платформой, что бы потом, возможно, на голых МК проектировать/собирать девайсы, если возможности МК зайдут, но цена девборды впечатляет не очень ...
shiru8bit Автор
Цены на голые чипы в рознице тоже не очень. В Чип и Дипе аж 3К за чип, на Озоне (где ж ещё чипы покупать) три штуки за 3К. То есть 1000 за голый чип. Если очень хотеть, то конечно можно, но пока действительно трудно сказать, что это разумный выбор для энтузиаста.