habrahabr

Все мои Ардуинки: часть вторая, ATtiny и STM

  • пятница, 22 ноября 2024 г. в 00:00:11
https://habr.com/ru/companies/ruvds/articles/858820/

Продолжаю перебирать все мои Ардуинки и делиться опытом работы с ними.

В прошлый раз я выдал базу про платы, начавшие свою жизнь как официальные продукты Arduino. Но время показывает, что истинная сила платформы скрывалась не в конкретных Uno и Nano, а в открытости и расширяемости. В этой и следующей части речь пойдёт уже о сторонних решениях, разработанных и поддержанных в Arduino IDE творческими усилиями множества энтузиастов.

Сегодня это будут довольно редкоземельные элементы — платы, не так часто встречающиеся в самоделках. Но возможно, это именно то, что вы искали для решения какой-то особенно нестандартной задачи. А я расскажу о некоторых связанных с ними граблях, по которым уже сплясал лично, чтобы вам не пришлось повторять этого дома.

▍ Расширяемость


Хотя внешне Arduino IDE выглядит крайне аскетично, а интерфейс неудобен и откровенно устарел, её внутренний мир скрывает одну сильную сторону: расширяемость. Правда, появилась она не сразу.

Ассортимент оригинальных плат Arduino на микроконтроллерах ATmega постоянно рос, и как вы знаете из предыдущей части, в итоге их набралось буквально десятки. После заключения соглашения с Arm его пополнили новые платы на соответствующих 32-битных микроконтроллерах, для которых, разумеется, потребовался совершенно другой набор инструментов разработки, включая компилятор C++ и прошиваемый в микроконтроллер загрузчик скетчей.

Это расширение было реализовано полностью прозрачным для пользователя образом. Для пользователей внешне ничего не поменялось — та же самая IDE и редактор, та же архитектура Wiring с её основными функциями, те же самые библиотеки. Переход на другую архитектуру сводится к простому выбору платы из списка. На практике, конечно, были нюансы, но всё же, это значительно проще, чем полная смена средств разработки ради перехода на микроконтроллеры другой архитектуры — процесс, который являлся нормой раньше.

Выбор платы в Arduino IDE

Внутри Arduino IDE предусмотрен так называемый Менеджер плат, хотя можно сказать, что это скорее менеджер платформ. Поддержка новых плат добавляется из пакетов, скачиваемых из Интернета. Часть из них встроена в IDE из коробки (в виде предустановленных ссылок в настройках), а также можно добавлять ссылки на сторонние пакеты. В одном пакете может быть поддержано целое семейство плат на каком-либо микроконтроллере. В нём содержатся не только все необходимые инструменты, одинаково скрытые от пользователя за кнопкой компиляции и загрузки скетча, но и набор примеров использования плат из пакета.

Это открыло возможность добавления в IDE не только официально поддерживаемых компанией Arduino плат, но и решения сторонних разработчиков, с другими микроконтроллерными архитектурами и своими компиляторами. Для добавления поддержки разработчику платы достаточно подготовить соответствующий пакет и выложить его в Интернет, а пользователю нужно только добавить ссылку на него в настройки IDE и установить пакет из Менеджера плат.

После установки пакета нужная плата выбирается из списка, после чего в IDE появляются соответствующие настройки, которые могут отличаться у разных плат — опции загрузчика, выбор способа и скорости загрузки, включение и выключение средств отладки, варианты распределения памяти, скорости работы и так далее.

▍ Arduino на ATtiny


Как вы могли понять по табличке в предыдущей части статьи, все оригинальные платы Arduino построены на контроллерах серии ATmega. Действительно, официальных плат на других 8-битных контроллерах не было, и далее оригинальные Arduino развивались в направлении 32-разрядных контроллеров с ядром ARM от Atmel и других производителей.

Однако сторонние разработчики не растерялись и создали ряд Arduino-совместимых плат на младшем, более слабом семействе микроконтроллеров от той же Atmel — ATtiny.

Табличка из Интернета со сравнением ATmega и ATtiny и указанием цены чипов (2013 год)

В своё время, в начале 2000-х годов, существование двух разных схожих линеек микроконтроллеров — ATmega и ATtiny — имело вполне определённый смысл. Их заметно меньший объём памяти, более простая периферия, и особенно корпуса с малым количеством выводов обеспечивали заметную разницу в стоимости, и в устройствах с большими тиражами это могло сыграть свою роль.

Если честно, ума не приложу, зачем это может быть нужно сейчас, спустя 20 лет, когда те и другие микроконтроллеры устарели и стоят плюс-минус одинаково, а им на смену пришли более мощные и при этом менее дорогие альтернативы. И тем не менее, платы на ATtiny существуют и с ними можно работать в экосистеме Arduino.

Из-за меньших тиражей платы на ATtiny в рознице стоят ненамного дешевле, сколько самая популярная Nano, но заметно уступают ей в возможностях. К тому же, есть более дешёвые совместимые аналоги Nano и даже Pro Mini на китайских чипах-клонах. Поэтому повод применять их в проектах найти не так-то просто. Вероятно, эти платы можно использовать для отладки проектов, которые впоследствии тиражируются уже на голом ATtiny внутри устройства, что действительно всё ещё может снизить себестоимость.

Разные и одинаковые платки на микроконтроллерах ATtiny

Загрузка скетчей из Arduino IDE в такие платы осуществляется по-человечески, через разъём USB. Но технически это реализовано иначе, чем в оригинальных Arduino: без микросхемы USB-UART моста, с помощью загрузчика под названием Micronucleus, работающего на самом ATtiny. Для коммуникации с ПК в нём используется программная реализация V-USB, которая занимает довольно много места, и для пользовательского кода остаётся около 6 килобайт Flash-памяти. Зато ОЗУ почти полностью свободно.

За счёт реализации V-USB платы также способны работать в режиме USB HID устройства, на них теоретически можно сделать низкоскоростные USB-устройства. Например, джойстик или клавиатуру — если, конечно, для этих целей хватит линий ввода-вывода.

Приобретённые платы могут быть с уже прошитым Micronucleus правильной версии, но могут быть и с такой, которую не понимает загрузчик в Arduino IDE, и тогда надо предпринимать ряд действий, чтобы прошить загрузчик, и это будет целая отдельная история. К счастью, мне такие платы не попадались, все они сразу работали из коробки.

Загрузка скетча в платы с Micronucleus происходит несколько иначе, чем обычно. Нужно отключить плату от компьютера и нажать кнопку загрузки в IDE. Когда код скомпилируется, появится предложение подключить плату к USB в течение 60 секунд. После подключения загрузка происходит автоматически, и надо заметить, практически моментально, чего не скажешь о многих других платах.

Есть два основных вида плат на ATtiny, и у меня в коллекции есть по одному представителю каждого из них.

Плата MH-ET Live Tiny88

Первый — плата MH-ET Live Tiny88 на микроконтроллере ATtiny88. По размеру она как Nano, имеет довольно много пинов. Контроллер пятивольтовый, 16 мегагерц, 8 килобайт Flash-памяти, 512 байт ОЗУ, 64 байта EEPROM. Из заметных отличий в периферии — отсутствует USART, то есть нет вывода в Serial.

Микроконтроллер ATtiny88 на плате Tiny88

В сети есть подробные инструкции, как настроить работу с подобными платами в Arduino IDE, например, у Алекса Гайвера. Я же кратко резюмирую основные моменты. Важно: ссылки в инструкциях устаревают и их приходится искать через поисковик по названию плат, здесь я привожу актуальные на момент написания статьи.

Установленный пакет для работы с платами MH-ET Live

Для начала, конечно, необходимо установить драйвер, без него ничего не получится. Далее добавляем в настройках Arduino IDE в источники для Менеджера плат ссылку на пакет. После этого в Менеджере плат выбираем единственную плату во вновь появившемся разделе MH-ET Live Boards. После установки пакета также появляются примеры работы с платой в разделе примеров MHEtLive.

https://raw.githubusercontent.com/MHEtLive/arduino-boards-index/master/package_mhetlive_index.json

Второй распространённый вид Arduino-совместимых плат на микроконтроллере ATtiny — семейство Digispark от Digistump, а также его китайские клоны. Все платы этого вида представляют собой вариацию одной и той же платы, немного отличающиеся форм-фактором и типом USB-разъёма.

Платы Digispark двух видов на ATtiny85

Построены эти платы на пятивольтовом микроконтроллере ATtiny85. Основные характеристики совпадают с ATtiny88 — 16 мегагерц, 8 килобайт Flash, 512 байт ОЗУ. Отличается объём EEPROM, которого у этой версии значительно больше — 512 байт, а также некоторая периферия.

Микроконтроллер ATtiny 85 на плате Digispark

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

Установленный пакет для работы с платами на ATtiny, включая Digispark

Версию платы с контактными площадками USB прямо на плате довольно удобно использовать с USB-хабом, но весьма неудобно заливать скетч, если плата уже вмонтирована в конструкцию. Этот момент нужно продумывать заранее.

https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json

Для работы с этими платами также нужно добавить в настройках IDE ссылку на пакет и потом в Менеджере плат установить Digistump AVR Boards. Также есть более свежий альтернативный пакет ATTinyCore, но в настоящий момент ссылка на него работает.

▍ Arduino на STM8


Семейство 8-разрядных микроконтроллеров STM8 от STMicroelectronics появилось в конце 2000-х годов, и предлагалось как недорогая альтернатива популярным контроллерам от Atmel и Microchip. Они действительно очень быстро заполонили нишу встраиваемой электроники, сильно потеснив AVR, но сравнимого успеха среди энтузиастов не получили — вероятно, из-за появления доступных 32-битных контроллеров.

Семейство STM8 включает множество моделей. В среднем они похожи на контроллеры ATmega, со своими плюсами и минусами: примерно такая же производительность, ОЗУ и Flash-память, более гибко конфигурируемая периферия. Главным же плюсом была цена: STM8 значительно дешевле. Собственно, эти контроллеры и вытеснили более дорогостоящие PIC, ATtiny и ATmega.

Через некоторое время появились и максимально дешёвые «ознакомительные» платы на STM8. Поначалу их можно было использовать только с собственной экосистемой от STM, но позже энтузиасты реализовали их поддержку в рамках Arduino IDE, создав таким образом решение, которое иногда называют «Arduino для бедных».

Плата stm8blue

У меня есть парочка одинаковых плат, так называемых stm8blue. Другие платы тоже существуют, в том числе вариация в форм-факторе Arduino Uno, но в дикой природе они мне не встречались. В целом это не очень частый зверь в мире Arduino, и судя по Интернету, энтузиасты их не очень жалуют, вероятно, из-за довольно ограниченной и сырой поддержки. Возможно, поэтому я не встречал их применений в реальных проектах.

Характеристики используемого в stm8blue микроконтроллера STM8S103F3P6 находятся примерно посередине между ATmega и ATtiny: 16 мегагерц, 8 килобайт Flash-памяти, 1 килобайт ОЗУ, 640 байт EEPROM (в три раза более живучего, чем у AVR). Периферия более-менее похожа, в ней есть свои интересные моменты. Например, 96-битный UID для всех чипов.

Микроконтроллер STM8S103F3P6 на плате stm8blue

Раньше я заострял внимание на пятивольтовости контроллеров, и для этого была причина. Вот мы и добрались до неё: с STM8 мы вступаем на трёхвольтовую территорию. STM8S поддерживает напряжения питания от 2.95 до 5.5 вольт, и если он питается от пяти вольт, его логические уровни также будут пятивольтовыми. Но на плате стоит 3.3-вольтовый стабилизатор, и при питании через него уровни должны быть трёхвольтовыми. Я уделю этому вопросу отдельное внимание в следующей части статьи, в которой все контроллеры будут уже исключительно трёхвольтовыми. А пока нужно отметить, что с переходом на 3.3 вольта начинаются проблемы совместимости с существующими модулями расширения.

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

Пожалуй, главным сомнительным решением, связанным с этими платами, является расположенный на них разъём Micro USB. Он наводит на мысль о том, что скетчи загружаются так же легко, как в Arduino Nano, а может быть даже доступна коммуникация по USB, как у плат на ATtiny. Но всё это обман и морок: разъём предназначен исключительно для питания, а линии данных на нём даже не разведены.

Парочка китайских ST-Link v2 и USB-UART адаптеров

Программируется stm8blue подобно Arduino Pro Mini, внешним адаптером. Но и тут всё не так просто: это делается только устройством ST-Link, предназначенным специально для контроллеров STM8 и STM32. Минимальная китайская копия ST-Link v2 сейчас стоит копейки и продаётся на всех маркетплейсах, но в своё время, когда STM8 только пошли в массы, программатор был значительно дороже и не так доступен, и это было не очень приятным препятствием на пути к освоению этой архитектуры.

Подключение stm8blue к ST-Link v2 для загрузки скетча

Для начала работы с ST-Link нужно установить его бесплатный драйвер, который больше нельзя скачать с официального сайта, потому что санкции. Но разумеется, Яндекс (Гугл) — найдётся всё. Как и в случае с USB-UART, полностью готовых кабелей в комплекте нет, но есть провод с отдельными пинами, которыми нужно соединить соответствующие выводы платы и программатора.

Внимание: в разных версиях порядок пинов на программаторе может отличаться от оригинального и идти не по порядку! Во избежание ошибок и для удобства использования лучше спаять провод с нормальными целиковыми разъёмами, подходящими к имеющимся платам и программатору.

Схема подключения ST-Link к плате stm8blue для загрузки скетчей

Поддержка STM8S в Arduino IDE называется Sduino. Как обычно, добавляем в настройках ссылку на пакет для Менеджера плат. Далее в Менеджере плат устанавливаем пакет Sduino.

https://raw.githubusercontent.com/tenbaht/sduino/master/package_sduino_stm8_index.json

Здесь вы сразу обнаружите существенную проблему, связанную с stm8blue: в Arduino IDE для STM8 доступен только компилятор классического С, без плюсов. Это сразу ограничивает выбор доступных библиотек. К тому же компиляция даже пустого проекта неприлично долгая. Используемый здесь компилятор — SDCC, которому я не очень доверяю, так как в прошлом имел богатый опыт его использования на других 8-битных архитектурах, и нередко встречал ситуации, когда заведомо рабочий код не работал.

Установленный пакет Sduino для работы с платами на STM8

Загрузка скетча выполняется без выбора COM-порта (в настройках он есть, можно выбрать любой), простым нажатием кнопки загрузки при подключённой через ST-Link к ПК плате. По крайней мере, в теории. На практике при первых попытках у меня возникла проблема, выглядящая как сообщение «1829 bytes at 0x8000… Tries exceeded», и я потратил немало времени, прежде чем выяснил, что нужно сделать две не самые очевидные вещи.

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

Экран байта конфигурации STM8 в ST Visual Programmer

Во-вторых, плата почему-то приходит с защищённым от записи микроконтроллером, и это мешает Arduino IDE залить скетч. Нужно снять защиту вручную через программу ST Visual Programmer, перезаписав байт конфигурации. В Интернете пишут, что можно также нажать прошивку загрузчика из IDE, и это тоже снимет защиту, но я не пробовал, потому что не ищу лёгких путей.

При использовании дешёвой копии ST-Link в системе не будет виртуального COM-порта и вывода в консоль. Чтобы он появился, нужно использовать оригинальный полноценный программатор или приспособить внешний USB-UART, но я этим не занимался за отсутствием такой необходимости.

▍ Arduino на STM32


Если предыдущие платы на основе самых недорогих микроконтроллеров шли в сторону уменьшения возможностей и были не очень интересны с практической точки зрения, так как подходили для решения более узкого круга задач, платы на 32-битных контроллерах STM32, также известные как Maple и Blue Pill, выглядят значительно интереснее.

STM32 — это уже совсем другой уровень: 32-битная архитектура ARM, увеличенная производительность и объём памяти. На момент своего появления эти контроллеры предлагали выдающиеся характеристики при весьма скромной цене, и за счёт этого быстро вытеснили 8-битные решения от Atmel из значительного объёма встраиваемой электроники. У Atmel тоже были сопоставимые 32-битные решения, сначала собственная архитектура AVR32, потом контроллеры с ядром ARM, но, как я понимаю, они проиграли конкуренцию именно из-за цены.

Изначально поддержка STM32 в Arduino IDE осуществлялась посредством разработанных энтузиастами отладочных плат под названием Maple. Они не смогли завоевать большую популярность, но начало было положено. После открытия исходников Maple сообщество стало развивать программную поддержку, а в Китае начали производить очень недорогую вариацию Maple Mini, которая в народе стала известна как Blue Pill.

Парочка версий Blue Pill из моей коллекции

Мне попадалась платы Blue Pill только одного форм-фактора, в двух вариациях. Обе представляют собой версию Arduino Nano-подобной платы, чуть покрупнее, с немного разной разводкой, но одинаковым функционалом. Существуют и другие платы, но их я в продаже не встречал.

Версия, приобретённая на Али довольно давно: вместо джамперов кнопки, STM32F103CBT6 (128 КБ Flash-памяти)

По сравнению с классическими 8-битными Ардуинами, преимущества Blue Pill заключаются в большом количестве пинов, гибко конфигурируемой периферии, высокой тактовой частоте, большом количестве памяти. В общем, всё в них замечательно, и если бы не контроллеры от Espressif, вероятно, это решение имело бы куда более высокую популярность. Сейчас же это скорее умеренная экзотика.

Версия, доступная в настоящий момент на маркетплейсах: джамперы вместо кнопок, STM32F103C8T6 (64 КБ Flash-памяти)

Платы Blue Pill построены на контроллерах STM32F103C6, STM32F103C8 и STM32F103CB — это ядро ARM Cortex M3, развитая периферия, разный объём Flash-памяти и ОЗУ: 32+10, 64+20 и 128+20 килобайт соответственно.

Тактовая частота составляет 72 мегагерца, что даёт производительность около 90 MIPS (заявляется примерно 1.25 DMIPS на мегагерц) — в пять раз быстрее классических Arduino. Но есть подвох, который присутствует и во многих других микроконтроллерах высокой производительности: это частота ядра, а не всей системы.

Микроконтроллер STM32F103C8T6 на одной плате

Периферия STM32 использует сложную коммутацию и мультиплексирование внутренних шин, что с одной стороны даёт ей очень высокую гибкость, но с другой стороны, она работает на более низкой частоте. Это касается и пинов GPIO: если контроллер ATmega (и Arduino на его основе) может изменять состояние пинов хоть каждый такт работы ядра, у STM32F1 шина работает на частоте 50 МГц или ниже (для снижения потребления, настраивается программой), что ограничивает скорость реакции на внешние события. Впрочем, она всё равно выше, чем у ATmega.

Микроконтроллер STM32F103CBT6 на другой плате

Как и STM8, STM32 трёхвольтовый, что создаёт определённые сложности при переходе с классического Arduino. К счастью, у STM32 есть и так называемые 5V tolerant выводы, то есть некоторые входы способны воспринимать 5-вольтовые логические уровни, и даже если они превышают 3.3 вольта питания, это не повредит контроллер. Выходные уровни всегда трёхвольтовые. Это является одной из полезных особенностей Blue Pill: такие платы можно применять в задачах, где по каким-то причинам требуется осуществлять сопряжение пятивольтовых и трёхвольтовых компонентов.

Установленный пакет для работы с платами на STM32

Программная поддержка STM32 в Arduino IDE называется STM32duino. Она реализована в виде пакета поддержки и загрузчика, прошиваемого в плату. В среду она добавляется как обычно: сначала указывается ссылка в настройках, потом устанавливается пакет из Менеджера плат.

https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json

или

http://dan.drown.org/stm32duino/package_STM32duino_index.json


К сожалению, из коробки платы Blue Pill идут без загрузчика STM32duino, и это, конечно, значительный недостаток в формате использования в экосистеме Arduino, достаточно существенное препятствие для новичков.

Чтобы начать загружать в Blue Pill скетчи по-человечески, через USB-разъём, нужно сначала прошить соответствующий загрузчик (однократно).

Подключение ST-Link к плате Blue Pill для прошивки загрузчика

К счастью, в отличие от STM8, где это делается только специальным программатором, у STM32 доступны опции: можно использовать тот же ST-Link, а можно любой USB-UART, такой же, каким загружаются скетчи в Arduino Pro Mini. Я не буду подробно описывать этот процесс, так как в Интернете хватает инструкций, например, прямо здесь, на Хабре.

Сам я прошиваю загрузчик через USB-UART, временно припаивая четыре проводка, потому что делал так до приобретения ST-Link, и это работает. Прошивка загружается через Flash Loader Demonstrator от STM, как и в голые контроллеры. В процессе нужно переставлять джамперы или удерживать кнопку, в зависимости от вариации платы.

Подключение USB-UART к плате Blue Pill для прошивки загрузчика

Как я слышал, бывают вариации Blue Pill не на оригинальных контроллерах ST, а на их китайских аналогах с другой маркировкой, и это создаёт какие-то трудности при работе с STM32duino. Ещё упоминаются перемаркированные чипы младших версий (меньше памяти, чем должно быть) и неправильные номиналы резисторов на платах, мешающие процессу прошивки. Но мне проблемные экземпляры пока не попадались.

▍ Продолжение следует


Существуют и более экзотические платы на других микроконтроллерных архитектурах с поддержкой в Arduino IDE. Например, MSP430 от Texas Instruments. Но у меня таких в арсенале пока нет, да и не очень-то они нужны. Как можно понять по сегодняшним примерам, применения их весьма специфичны, а сила Arduino всё же в универсальности.

Почти все мои Ардуинки

Поэтому в следующий раз речь пойдёт о куда более популярном и универсальном семействе, просто-таки открывшем второе дыхание у строителей разнообразных поделок на Arduino — платах на микроконтроллерах ESP8266 и ESP32 от Espressif. Их есть у меня!

© 2024 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻