Привет, читатель!
Сегодня существуют десятки вариантов платы Arduino. Их популярность обусловлена, по моему мнению, фреймворком Wiring для микроконтроллеров, распространением «шилдов» (нет необходимости паять компоненты) и, что самое удобное, загрузкой программ по USB. В рамках этой статьи расскажу, как я создал небольшую оценочную плату для микроконтроллера и добавил в нее загрузочную запись.
По своей сути, большинство «ардуинок» (оценочных плат) — это печатные платы с минимально необходимыми для микросхемы деталями. Такие прототипы позволяют сделать работу с чипами удобнее, проще и приятнее. Однако бывает, что под контроллер либо нет подобных решений, либо они универсальные и имеют некоторые неточности. С этим можно бороться, но возникают различные костыли, поэтому я решил разработать оценочную плату для отечественного чипа. Самому чипу посвящена отдельная статья на Хабре, его я использую в паре пет-проектов. Приступим к разработке!
Используйте навигацию, если не хотите читать текст полностью:
→ Референсы и исходные варианты
→ Схема
→ Плата
→ Загрузочная запись
→ Заключение
Референсы и исходные варианты
Можно при помощи ЛУТ собрать свою одностороннюю плату Arduino с DB9-интерфейсом. Подробности описаны в официальной документации.
Существуют уже две отечественных версии Arduino: Elbear Ace-Uno и Vostok UNO-VN035. Давайте реализуем свою?
Basic Stamp
Одной из первых плат для макетирования и прототипирования были Basic Stamp. О них я узнал из старой, но хорошей книги «Радиоэлектроника для чайников». Данная плата имеет цепь подготовки питания, конвертор интерфейсов usb-uart (раньше был просто разъем DB9), сокет для микросхемы или впаянный контроллер, а также небольшую макетную плату (breadboard) и PLC-разъемы. Есть подобная занимательная плата на базе ESP8266 от PINLAB.
Классические Arduino
Большее распространение получили платы Arduino. Одна из причин — так называемые «шилды». Это платы расширения, монтируемые на разъемы сверху. Сами платы зачастую реализуют одну-две функции и занимают действительно много места. Но они при этом используются для образовательных целей, а также имеют удобные платы для проверки схем, гипотез и отображения информации. Одной из первых плат была Arduino Uno.
Забавный факт: первая Arduino была сделана как конкурент Basic Stamp и подключалась к ПК через порт DB25 COM. Сегодня COM-порт стал виртуальным, но загрузка ПО по-прежнему осуществляется через него.
Nano, ESP
Позже вышла более удобная, на мой взгляд, плата — Aarduino Nano. Мне нравится ее форм-фактор — он отлично встает на макетную плату, тем самым позволяет сделать красивую и наглядную разводку. Аналогичным образом можно смонтировать появившиеся позже ESP8266 или ESP32.
Next.module
Отмечу проект Руслана Надыршина на базе esp32, который он описал в своей статье на Хабре. Довольно интересный конструктив в виде небольших квадратных плат, который позволяет собрать несколько необходимых блоков в стойку. Объединение модулей происходит через разъемы BLD с длинными штырями.
В этом видео автор проекта описывает идеи и прототипы плат next.module:
STEMTera
Еще один классный и удобный вариант для отладки и обучения — плата STEMTera. Это макетная плата, в которую встроили atmega32 и вывели порты наружу. Пины микроконтроллера соответствуют расположению и функционалу на отладочной плате Uno и дополнительно продублированы.
Обзор и пример работы с платой STEMTera:
Я решил остановиться на варианте Nano, немного его изменив под используемый контроллер. Для себя поставил следующие технические требования:
- использование контроллера К1946 или совместимых AVR,
- наличие конвертора интерфейсов USB-UART с сигналом сброса (DTR);
- форм-фактор — печатная плата шириной до 30 мм и длиной до 50 мм;
- два ряда штырьевых разъемов с шагом 2,54, micro-USB для обновления.
Вы можете спросить, почему планируется устаревший micro-USB? Исключительно из соображений практичности. Это плата для отладки и прототипирования. Если на ней будет случайно отломлен интерфейс или сломан «язычок» внутри, micro-USB проще перепаять. В этом бою пять широких ножек выглядят более привлекательно, чем 13 тонких контактов type-С. К тому же, провода с таким разъемом сейчас можно найти во многих магазинах.
В качестве основного микроконтроллера рассматриваю К1946. Почему? Отечественные контроллеры — отличное решение для экспериментов, если у вас есть возможность их оперативно достать. По сути, это близкие аналоги существующих на рынке образцов, для которых уже есть разработанные среды, библиотеки кода, общие методы и подходы к применению.
Схема
Больших секретов здесь нет. Исходные коды, схемы и платы лежат в свободном доступе как в документации от вендоров, так и в статьях от любителей. Китайцы вообще поставили на поток создание клонов любых цветов и их продажу на маркетплейсах.
Основное отличие от других аналогичных схем в том, что у каждого входа микроконтроллера установлены конденсаторы. Когда работал с китайской отладочной платой, очень пожалел об их отсутствии во время отладки программы.
Другая отличительная черта — использование регулятора LP2985 вместо классического 78L05. Он имеет больший ток нагрузки и меньшее падение напряжения. Еще один его плюс — наличие вывода выключения, который отрубает источник. Использовал этот функционал для одновременного подключения платы к USB без извлечения внешнего источника.
Плата
Изначальным планом было сделать печатную плату, максимально совместимую с Arduino Nano. На схеме было три разъема для порта С-микроконтроллера, чтобы использовать все ножки чипа. Эти восемь ножек вывел на отдельную «отламываемую» часть платы. Перфорация позволяла в таком варианте попросту отломать дополнительный порт, если не нужно установить плату в «шилды» для Nano. Сама идея таких плат не нова и позаимствована у STM8-Discovery от STMicroelectronics.
Один из вариантов. Было много переходных отверстий. Половина схемы — с другой стороны платы, включая все фильтры.
Эксперементируя с форм-факторам отошел от повторения в габаритах Nano. Вместо длинной платы удачнее оказалось сделать ее шире: в таком варианте отладочное устройство удобно встает на большую макетную плату. Идею с портом на одном из торцов решил оставить, обогатив этот разъем двумя аналоговыми линиями и интерфейсом UART.
После всех изысканий и экспериментов заказал партию зеленых плат.
Полученные изделия по габаритам помещаются на большую макетку, оставляя достаточно места для подключения компонентов. Провод с micro-USB предпочитаю использовать угловой: в такой компоновке он достаточно удобен и не мешается.
Загрузочная запись
Зачем на чипе загрузочная запись, если есть программатор? Да, они просты в использовании (все вызывается одной командой), дешевы и довольно надежны. Однако для отладки удобно выводить информацию в последовательный интерфейс. Через него же можно настроить связь с ПО верхнего уровня на ПК. А в готовый проект (уже в виде прибора, а не оценочной платы) можно загружать обновление ПО по USB без дополнительных инструментов и открытия корпуса устройства. Для этого вообще не требуется никаких специальных знаний.
Забавный факт: контроллер можно запрограммировать всего двумя кнопками. На эту тему на Хабре есть замечательная статья.
В качестве загрузочной записи выбрал optiboot. Он имеет достаточную функциональность, активно поддерживается сообществом в официальном репозитории на GitHub и мало весит. На базе этого проекта изначально также были построены загрузчики для других оценочных плат. Кстати, на optiboot работает более эффективное ядро GyverCore.
Итак, сначала необходимо подготовить ОС для сборки файлов. Понадобится avr-gcc, желательно последней версии.
Установка на Ubuntu самая простая и описана в туториале.
Для macOS понадобится brew и установить пакет (можно найти на GitHub).
Установка на Winows чуть сложнее, чем на Linux, но вам поможет пошаговая инструкция.
Альтернативный вариант для Windows — avr-gcc в составе ide arduino.
Для сборки достаточно скачать репозиторий и по инструкции из вики проекта на GitHub собрать исходные файлы и загрузить бинарный код. Для скачивания потребуется git на ПК. Либо можно скачать архивом:
git clone https://github.com/Optiboot/optiboot.git
cd optiboot/optiboot/bootloaders/optiboot
Далее выполняем сборку. Необходимо указать используемую ОС, чтобы скрипт донастроил некоторые переменные, а также исправил символы пути (на Windows).
make OS=macos \
UART=0 BAUD_RATE=115200 \
LED=B7 LED_DATA_FLASH=1 \
AVR_FREQ=16000000L atmega8535
Дополнительно можно указать опцию BOOT_ON_POR=1. В таком случае бутлоадер будет ожидать сигнал от ПК в течении секунды (настраивается опцией TIMEOUT) после включения, прежде чем начнет проводить загрузку. Это полезно в ситуациях, когда необходимо подключаться по USB, не выполняя перезагрузку контроллера. Также с этой опцией можно выполнять загрузку ПО через RS-485, по беспроводной связи через стандартные Bluetooth, Wi-Fi модули или даже по радио (при очень большом желании).
Во время сборки make выдаст строки с предупреждением:
Погрешность в 2% не страшна, но вас предупредили. Чтобы этого избежать, можно изменить частоту резонатора или скорость интерфейса.
Последней командой загрузим сформированный бутлоадер в плату. Для этого использую avrdude:
avrdude -P usb -c usbasp -p ATmega8535 -s -B 16kHz -U flash:w:optiboot_atmega8535_UART0_115200_16000000L.hex
Для дальнейшего использования из консоли берем эту строку и заменяем поля на собственные:
avrdude -p m8535 -c arduino -P /dev/tty.usbserial-0001 -b 115200 -U flash:w:build/k1946vm014.hex
Я же добавил в makefile, описанный ранее на Хабре, пару строк:
pusb: $(TARGET).hex
avrdude -p $(DUDE_MCU) -c arduino -P $(PORT) -B $(PORTSPEED) -U flash:w:$(BUILD_DIR)/$(TARGET).hex
На этом этапе основная задача завершена. Плата определяется и обновляется по USB из VSCode:
Заключение
Полученные платы успешно используются для отладки некоторых решений. Опытным путем я понял, что не хватает некоторых элементов, которые делают работу удобнее. Например, стоило добавить:
- стабилизатор 3,3 В — некоторые микросхемы или индикаторы работают от этого напряжения;
- источник опорного напряжения (тот же tl431);
- размыкание сигнала «перезагрузки» контроллера от ch340 (этот вопрос временно решил, изменив загрузчик и разрезанием дорожки).
Однако основная функциональность в виде «бутлоадер + микроконтроллер + конвертор интерфейсов» используется по максимуму. Когда плата установлена в макете и работает, разработчик может подключиться, снять логи, изменить режимы работы или обновить прошивку. Попробовал кейс с обновлением прошивки не специалистом: работа выполнена успешно за счет использования созданного bat-скрипта и hex-файла прошивки.