Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino
7 ноября
Вячеслав Гавриков (г. Смоленск)
Платы Nucleo и платы расширения X-NUCLEO от STMicroelectronics можно интегрировать в платформу Arduino с помощью библиотеки STM32duino. Статья содержит пошаговые инструкции по установке библиотек и запуску примеров для Nucleo.
Отношения пользователей к платформе Arduino противоречивы. Завоевав настоящую любовь у непрофессиональных любителей электроники, у многих профессионалов она вызывает отторжение по целому ряду причин. Одной из таких причин является ограниченность и ориентированность именно на любителей. Компания STMicroelectronics, видя перспективу Arduino-приложений, предлагает устранить хотя бы часть противоречий с помощью семейства плат Nucleo.
Платы Nucleo совместимы с сокетами Arduino. Например, Nucleo-64 и Nucleo-144 поддерживают сокет Arduino UNO V3, а Nucleo-32 – сокет Arduino Nano. Однако по сравнению с традиционными платами Arduino платы Nucleo используют высокопроизводительные 32-битные микроконтроллеры STM32 с большим объемом встроенной памяти и богатым набором периферии. Кроме того, для расширения возможностей Nucleo могут применяться платы расширения Nucleo Expansion Boards. Комбинация «Arduino + Nucleo» является очень перспективной и может вызвать интерес к Arduino даже у профессиональных разработчиков.
В статье мы ответим на ряд важных вопросов: что такое Arduino, Nucleo и STM32duino? Каковы основные особенности плат Arduino, Arduino Shield, Nucleo и X-NUCLEO? Как интегрировать Nucleo в Arduino с помощью STM32duino? Кроме того, мы рассмотрим три несложных примера совместного использования Arduino и Nucleo-G071RB, а также платы расширения X-NUCLEO-IKS01A2 с МЭМС-датчиками.
Что такое Arduino?
Если говорить профессиональным языком, то Arduino – это открытая аппаратно-программная платформа, в состав которой входят платы Arduino, платы расширения Arduino Shield, программная среда Arduino IDE, широкий спектр библиотек и программных примеров. Однако мне кажется, что более наглядным будет рисунок 1, на котором работа Arduino поясняется на примере 3D-принтера.

Рис. 1. Использование Arduino в составе 3D-принтера
В 3D-принтере одновременно работает множество различных блоков: шаговых двигателей, нагревательных элементов, датчиков, дисплеев и прочего. Всеми этими блоками необходимо управлять. Именно этим и занимаются платы Arduino. Если собственных возможностей базовых плат Arduino не хватает, например, когда требуется коммутировать большую нагрузку и принимать высоковольтные сигналы, то для расширения функционала применяются платы Arduino Shield. Arduino Shield устанавливаются в штыревые колодки базовой платы. Платы Arduino содержат микроконтроллер, который управляет всеми блоками устройства, согласно пользовательской программе. Для написания и компиляции программы используется бесплатная среда Arduino IDE. Кроме того, для работы с платами и датчиками необходимы соответствующие программные библиотеки.
Разумеется, предложенная схема является упрощенной и скрывает множество сложных процессов: архитектуру микроконтроллера, регистры управления цифровых датчиков и так далее. Однако с точки зрения рядовых пользователей работа с Arduino именно так и выглядит. Не нужно думать о настройке микроконтроллера, выделении стека, конфигурации регистров цифровых датчиков и прочего. Вместо этого пользователь может приобрести дешевую плату Arduino, скачать бесплатную среду Arduino IDE и библиотеки, и… просто начать работу.
Малая стоимость, простота и доступность привели к тому, что в настоящий момент число пользователей Arduino исчисляется сотнями тысяч, и, по некоторым подсчетам, в день продается более 1000 плат (без учета клонов). Использование Arduino-совместимых плат Nucleo и плат расширения X-NUCLEO производства STMicroelectronics может вывести Arduino-проекты на новый уровень производительности, которого так не хватает профессиональным разработчикам, и в то же время сохранить простоту и скорость разработки.
Подробнее о платформе Arduino можно узнать на официальном сайте [1]. Рассмотрим отдельные элементы Arduino подробнее.
Платы: Arduino и Arduino Shield
Платы Arduino и Arduino Shield – аппаратная основа системы Arduino [2]. Обычно базовые платы Arduino (их называют платформами) содержат минимальный набор компонентов: микроконтроллер с обвязкой, систему питания, штыревые разъемы для подключения плат расширения [3]. Назначение выводов штыревых разъемов жестко закреплено. Колодки и распиновка выводов образуют сокет. Название сокета совпадает с названием базовой платы: Arduino Uno, Arduino Nano, Arduino Micro и другие. Если пользователю требуется расширенный функционал, например, для управления шаговыми двигателями, то на базовую плату Arduino устанавливаются платы расширения. Одновременно можно использовать несколько плат расширения.
Платформа Arduino UNO с сокетом Arduino UNO V3 уже давно стала своего рода стандартом. Скорее всего, именно по этой причине компания STMicroelectronics использует поддержку Arduino UNO V3 в своих платах Nucleo (Nucleo-64 и Nucleo-144). Благодаря поддержке Arduino UNO V3 платы Nucleo могут использовать как официальные платы расширения Arduino Shield, так и Arduino-совместимые платы от других производителей.
На рисунке 2 представлен внешний вид Arduino UNO V3. Данная плата построена на базе достаточно слабого 8-битного микроконтроллера ATmega328 с максимальной рабочей частотой 16 МГц и относительно небольшим объемом памяти 32 кбайт Flash и 2 кбайт ОЗУ. Для сравнения, бюджетные 32-битные микроконтроллеры STM32G071RB могут работать на частоте до 64 МГц и имеют на борту 128 кбайт Flash и 32 кбайт ОЗУ. Схему Arduino Uno и распиновку можно найти на официальном сайте [4].

Рис. 2. Внешний вид Arduino UNO
Чтобы обеспечить совместимость плат расширения разных производителей, назначение контактов в сокете Arduino Uno V3 жестко закреплено. Распиновку Arduino Uno V3 можно найти в схеме Arduino, доступной на официальном сайте [4]. Точно такое же назначение и расположение выводов имеют разъемы на платах Nucleo-64 и Nucleo-144:
- IOREF – референсный выход, который сообщает платам расширения об используемом уровне напряжения входов-выходов платы Arduino;
- Reset – вход сброса микроконтроллера. Для сброса необходимо подать низкий сигнал. Обычно этот вход используется для подключения внешней кнопки сброса;
- 3V3 – выход напряжения 3,3 В. Напряжение формируется из напряжения 5 В с помощью стабилизатора LP2985-33DBVR. Максимальный нагрузочный ток 50 мА;
- 5V – выход напряжения 5 В. Данное напряжение может формироваться несколькими альтернативными способами. Первый вариант – с помощью стабилизатора NCP1117ST50T3G, преобразующего напряжение питания платы 7…12 В (поступает от внешнего источника питания, подключаемого к разъему jack). Второй вариант – также с помощью стабилизатора NCP1117ST50T3G, но преобразующего напряжение со входа VIN. Третий вариант – от ПК через USB-разъем;
- GND – земля (общий);
- VIN – альтернативный способ подачи напряжения питания для Arduino Uno. Такой вариант подходит для тех случаев, когда источник питания реализован на плате расширения;
- AREF – референсное напряжение для аналоговых входов;
- A..A5 – аналоговые входы. Разрядность 10 бит, рабочее напряжение 0…5 В, верхняя граница может задаваться с помощью AREF;
- 0…13 – цифровые входы-выходы 20 мА (40 мА макс.), многие из которых поддерживают альтернативные функции.
Некоторые цифровые и аналоговые входы могут выполнять альтернативные функции:
- 0 (RX) и 1 (TX) – интерфейс UART (TTL). Эти же линии подключены на плате к микросхеме ATmega8U2 (мост USB-TTL);
- 2 и 3 – внешние прерывания;
- 3, 5, 6, 9, 10 и 11 – выходы 8-битного ШИМ;
- 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) – интерфейсSPI;
- 13 – управление штатным светодиодом, расположенным на базовой плате Arduino;
- A4 (SDA) иA5 (SCL) – интерфейс
Работать с Arduino гораздо удобнее, если перед глазами находится подсказка с расположением выводов. Красивые и удобные плакаты с распиновкой Arduino UNO можно без проблем найти в сети. Например, бесплатно скачать здесь [5].
Теперь кратко рассмотрим особенности программного обеспечения Arduino.
Программное обеспечение для работы с Arduino: Arduino IDE, библиотеки и примеры
Для написания программ для Arduino используется бесплатная среда Arduino IDE, которую можно скачать на официальном сайте [6]. Кроме того, у пользователей есть возможность работы с онлайн-версией среды. Arduino IDE легко устанавливается, имеет простой и удобный интерфейс (рисунок 3).

Рис. 3. Стартовое окно Arduino IDE с пустым проектом
Перечислим основные плюсы программной части платформы Arduino.
Первый большой плюс Arduino заключается в том, что после установки Arduino IDE пользователь получает доступ к огромному количеству разнообразных примеров (скетчей), и для запуска первого приложения не требуется написать ни строчки кода.
Второй большой плюс Arduino IDE – использование для написания программ упрощенного варианта С++. Описание языка содержит всего три раздела: функции (Functions), переменные и константы (Variables and Constants) и структуры (Structure) [7]. Каждая новая подключаемая библиотека добавляет новые специализированные функции и примеры [8].
Третий плюс – максимально простая структура программ. При создании нового проекта пользователю предлагается стандартный шаблон, который содержит функцию инициализации void setup() и основную функцию void loop(). Функция void setup() выполняется один раз при запуске программы, и в ней прописывается конфигурация выводов, настройка компонентов и интерфейсов. Функция void loop() циклически вызывается в ходе выполнения программы и содержит логику работы устройства.
Настройку периферии, конфигурацию системы тактирования микроконтроллера, формирование стека и прочее делать не нужно – все уже сделано на уровне библиотек! Пользователю не нужно писать полотна кода с функциями инициализации, копаться в документации, изучать архитектуру и т.д. Вместо этого создание простейшего приложения займет всего пару минут и несколько строк кода (см. п. 8).
Очень удобной особенностью Arduino IDE является возможность скачивания библиотек. Пользователь может добавлять только то, что ему нужно. Кроме того, программа при компиляции автоматически сообщает, какой библиотеки не хватает. Процесс написания программ будет рассмотрен позднее на примере работы с Nucleo 64.
К сожалению, за все в этом мире приходится платить. Чтобы обеспечить простоту и наглядность Arduino-программам, приходится жертвовать эффективностью и размером кода. Иногда это становится критичным из-за маломощных микроконтроллеров, используемых в платах Arduino, однако ситуацию могут исправить платы Nucleo с высокопроизводительными МК STM32 производства компании STMicroelectronics.
Платы Nucleo-64: 32-бита по минимальной цене
Платы Arduino недороги и просты в освоении. Именно это позволило Arduino достичь такой популярности в первую очередь среди людей, далеких от электроники. Однако простота Arduino может привлекать и профессиональных электронщиков. Дело в том, что для решения многих задач возможностей Arduino вполне достаточно. Кроме того, бюджетная стоимость и высокая скорость разработки являются дополнительным стимулом начать работу с Arduino.
С другой стороны, что делать, если производительности Arduino оказалось недостаточно или приложение требует большого объема памяти? Ответ прост – использовать альтернативные Arduino-совместимые платы. Таким примером являются платы Nucleo производства STMicroelectronics [9].
Сейчас компания предлагает три типа плат Nucleo: Nucleo-32, Nucleo-64, Nucleo-144. Платы Nucleo-32 совместимы с сокетом Arduino Nano V3. Платы Nucleo-64 и Nucleo-144 имеют поддержку Arduino Uno V3. По сравнению с Nucleo-144, платы Nucleo-64 отличаются минимальным набором периферии и являются более бюджетным вариантом. По этой причине для знакомства STM32 с Arduino мы будем использовать именно их (рисунок 4).

Рис. 4. Внешний вид плат Nucleo-64 от STMicroelectronics
В настоящий момент компания STMicroelectronics предлагает 2 вида плат Nucleo-64 для семейства STM32G0 (таблица 1).
Таблица 1. Платы Nucleo-64 от STMicroelectronics
Наименование | Тип | Микроконтроллер | Поддержка стеков |
Число клавиш | Свето- диодов |
ST-LINK | Питание, В |
---|---|---|---|---|---|---|---|
NUCLEO-F070RB | Nucleo-64 | STM32F070RB | Arduino Uno, ST Morpho |
1 | 1 | ST-LINK V2-1, USB Micro-B | Внешнее 3,3/5, USB 5 |
NUCLEO-G070RB | Nucleo-64 | STM32G070RB | Arduino Uno, ST Morpho |
1 | 1 | ST-LINK V2-A, USB Mini-B | Внешнее 3,3/5, USB 5 |
NUCLEO-G071RB | Nucleo-64 | STM32G071RB | Arduino Uno, ST Morpho |
1 | 1 | ST-LINK V2-1, USB Micro-B | Внешнее 3,3/5, USB 5 |
Платы Nucleo-64 имеют следующие характеристики:
- 32-битный микроконтроллер STM32 в корпусном исполнении LQFP64;
- 1 пользовательский светодиод (черный колпачок);
- 1 пользовательская клавиша (синий колпачок);
- 1 кнопка сброса;
- кварцевый резонатор 32,768 кГц;
- сокет Arduino™ Uno V3;
- сокет ST morpho;
- питание 3,3/5 В от внешнего источника, 5 В от USB, 7…12 В от сокета Arduino;
- встроенный программатор ST-LINK V2.
Между собой платы Nucleo-64 различаются микроконтроллерами, типом разъема USB (Micro-AB или Mini-AB USB), наличием дополнительных микросхем питания. Вполне очевидно, что возможности самих микроконтроллеров отличаются очень сильно. В то же время для взаимодействия с платами расширения используются всего три интерфейса и стандартные порты ввода-вывода. В результате любой микроконтроллер сможет работать с любыми платами расширения Arduino (различие будет только в производительности). Другими словами, для демонстрации совместной работы с Arduino будет достаточно самых скромных и бюджетных моделей Nucleo. Далее в статье будут использоваться бюджетные отладочные платы NUCLEO-G070RB и NUCLEO-G071RB на базе новых бюджетных микроконтроллеров STM32G070RB и STM32G071RB соответственно.
Семейство микроконтроллеров STM32G0, использующее 32-битное процессорное ядро ARM Cortex-M0+, разрабатывалось специально для обеспечения высокой производительности и низкого потребления. Максимальная рабочая частота STM32G0 достигает 64 МГц, объем встроенной Flash – до 128 кбайт и ОЗУ – до 36 кбайт (обещают выпуск моделей с Flash до 512 кбайт и ОЗУ до 128 кбайт). Сейчас семейство STM32G0 объединяет две линейки: линейку начального уровня STM32G0x0 и линейку STM32G0x1 с расширенным набором периферии. В качестве примера в таблице 2 сравниваются параметры STM32G070RB и STM32G071R.
Таблица 2. Сравнение возможностей микроконтроллеров STM32G070RB и STM32G071R
Особенность | STM32G070RB | STM32G071RB |
---|---|---|
Процессор | ARM Cortex-M0+ | ARM Cortex-M0+ |
Частота процессора, МГц | До 64 | До 64 |
Flash, кбайт | 128 | 128 |
SRAM, кбайт | 36 | 36 |
Частота внешнего резонатора, МГц | 4…48 | 4…48 |
DMA | 7-канальный | 7-канальный |
АЦП | 12-битный, 16 каналов, 2,5 MSPS | 12-битный, 16 каналов, 2,5 MSPS |
ЦАП | – | 2 x 12 бит |
Аналоговые компараторы | – | 2 |
Число таймеров | 11 | 14 |
RTC | + | + |
I2C | 2 | 2 |
USART | 4 | 4 |
SPI | 2 | 2 |
LPUART | – | 1 |
LPTIM | – | 2 |
Напряжение питания, В | 2,0…3,6 | 1,7…3,6 |
Контроль питания | POR/PDR | POR/PDR/BOR/PVD |
Платы Nucleo-64, в частности NUCLEO-G070RB и NUCLEO-G071RB, аппаратно совместимы со стеком Arduino Uno V3. Кроме того, они обеспечивают существенный прирост производительности за счет более мощного процессора, а также обладают большим объемом памяти (таблица 3).
Таблица 3. Сравнение характеристик Arduino Uno V3 и NUCLEO-G071RB
Параметр | Arduino Uno V3 | NUCLEO-G071RB |
---|---|---|
Микроконтроллер | ATmega328P | STM32G071RB |
Рабочее напряжение, В | 5 | 5 (USB) |
Входное напряжение (рекомендуется), В | 7…12 | 7…12 (через сокет Arduino или ST Morpho) |
Цифровые входы-выходы | 14 | 14 (Arduino), все порты микроконтроллера доступны через ST Morpho |
ШИМ-выходы | 6 | 6 (Arduino) |
Аналоговые входы | 6 | (Arduino) |
Выходной ток, мА | 20 | 20 |
Flash, кбайт | 32, из них 0,5 занимает загрузчик | 128 |
SRAM, кбайт | 2 | 36 |
EEPROM, кбайт | 1 | – |
Частота процессора, МГц | 16 | 64 |
Светодиод | 1 | 1 |
Пользовательская кнопка | – | 1 |
Кнопка сброса | 1 | 1 |
Длина, мм | 68,6 | 82,5 |
Ширина, мм | 53,4 | 70 |
Платы Nucleo имеют ограниченный функционал. Исправить ситуацию помогают платы расширения, например, фирменные платы X-NUCLEO от STMicroelectronics. Рассмотрим их подробнее.
Платы расширения X-NUCLEO
Платы Nucleo могут работать совместно с платами расширения Arduino Shield, подключаемыми с помощью сокета Arduino Uno V3. Кроме того, к Nucleo могут быть подключены фирменные платы расширения X-NUCLEO производства STMicroelectronics (рисунок 5).

Рис. 5. Пример организации стека на базе Nucleo-64
В настоящий момент на сайте STMicroelectronics присутствует информация о полусотне плат X-NUCLEO [10]. В рамках данной статьи подробно рассказать обо всех платах не представляется возможным. Приведем лишь некоторые конкретные примеры:
- X-NUCLEO-GNSS1A1 – плата расширения с навигационным модулем Teseo-LIV3F, который поддерживает все существующие глобальные системы: ГЛОНАСС, GPS, Galileo, BeiDou, QZSS. Для взаимодействия с Teseo-LIV3F используются интерфейсы I2C и UART;
- X-NUCLEO-6180XA1 – плата расширения с датчиком приближения и освещения VL6180x и семисегментными индикаторами. Для взаимодействия с VL6180X используется I2C. К плате можно подключать до трех дополнительных модулей с датчиками VL6180x;
- X-NUCLEO-CCA01M1 – плата расширения с аудио-микросхемой STA350BW, которая имеет два аудиовыхода мощностью 25 Вт каждый. Для настройки STA350BW используется I2C, а для передачи аудиоданных – интерфейс I2S. Питание выходного усилителя осуществляет внешний источник питания, подключаемый с помощью дополнительного разъема;
- X-NUCLEO-IDB05A1 – плата расширения с BLE-модулемSPBTLE-RF. Плата позволяет взаимодействовать с другими устройствами по BLE. Настройка и обмен данными между SPBTLE-RF и микроконтроллером выполняется по SPI;
- X-NUCLEO-NFC05A1 – плата расширения с функционалом NFC-ридера на базе ST25R3911B. На плате, помимо ST25R3911B, также можно найти печатную антенну (47×34 мм, четыре витка, 13,56 МГц), кварцевый резонатор и шесть светодиодов. Взаимодействие между ST25R3911B и микроконтроллером осуществляется с помощью SPI;
- X-NUCLEO-LPM01A – плата расширения с функционалом программируемого источника питания, имеющая диапазон выходных напряжений 1,8…3,3 В и возможность измерения потребляемого тока. Данная плата по внешнему виду сильно отличается от других плат расширения. У нее на борту можно найти микроконтроллер STM32L496VGT6 с богатым набором встроенной периферии, ЖК-дисплей, усилители, регуляторы напряжения;
- X-NUCLEO-PLM01A1 – плата расширения с SOC-модемом ST7580, обеспечивающим передачу данных по линиям DC-питания. При совместном использовании с изолирующей платой STEVAL-XPLM01CPL передача данных может вестись и по AC-линиям. Взаимодействие между ST7580 и микроконтроллером осуществляется с помощью UART;
- X-NUCLEO-STMODA1 – переходная плата, позволяющая подключать модули с новым интерфейсом STMod+ к платам NUCLEO;
- X-NUCLEO-IKS01A2 – плата расширения для работы с МЭМС-сенсорами. Именно эту плату мы будем использовать в Arduino-проекте, поэтому рассмотрим ее подробнее.
Плата расширения X-NUCLEO-IKS01A2 имеет на борту сразу несколько датчиков (рисунок 6).
- комбинированный инерционный модуль LSM6DSL: трехосевой МЭМС-акселерометр (±2/±4/±8/±16 g) и трехосевой МЭМС-гироскоп (±125/±245/±500/±1000/±2000 dps);
- комбинированный инерционный модуль LSM303AGR: трехосевой МЭМС-акселерометр (±2/±4/±8/±16 g) и трехосевой МЭМС-магнитометр (±50 Гс);
- цифровой барометр LPS22HB с диапазоном измерений 260…1260 кПа;
- емкостной датчик относительной влажности и температуры HTS221;
- кроме того, к плате могут быть подключены другие датчики с помощью сокета DIL24.

Рис. 6. Плата расширения X-NUCLEO-IKS01A2
Взаимодействие между датчиками, расположенными на X-NUCLEO-IKS01A2, и микроконтроллером платы Nucleo осуществляется с помощью I2C.
Платы Nucleo и X-NUCLEO аппаратно совместимы с сокетом Arduino Uno V3. Теперь рассмотрим вопросы программной совместимости с Arduino.
STM32duino – интеграция STM32 в Arduino
Штатные библиотеки Arduino предназначены для работы со стандартными палатами Arduino. Чтобы привязать Nucleo-64 к Arduino, необходима программная библиотека, которая будет реализовывать стандартные операции Arduino. Именно с этой целью на GitHub был запущен проект STM32duino [11].
STM32duino – набор библиотек, выполняющих интеграцию процессоров STM32 в Arduino. В настоящий момент в состав STM32duino входят библиотеки и утилиты, которые можно условно разделить на три группы: ядро, библиотеки плат расширения X-NUCLEO и библиотеки датчиков от STMicroelectronics. Главная библиотека Arduino_Core_STM32 обеспечивает поддержку отладочных плат с микроконтроллерами STM32.
На настоящий момент Arduino_Core_STM32 поддерживает широкий спектр отладочных плат:
- NUCLEO-32: Nucleo-F303K8, Nucleo-G431KB, Nucleo-L031K6, Nucleo-L412KB, Nucleo-L432KC;
- NUCLEO-64: Nucleo-F030R8, Nucleo-F091RC, Nucleo-F103RB, Nucleo-F302R8, Nucleo-F303RE, Nucleo-F401RE, Nucleo-F411RE, Nucleo-F446RE, Nucleo-G071RB, Nucleo-G431RB, Nucleo-G474RE, Nucleo-L053R80, Nucleo-L073RZ, Nucleo-L152RE, Nucleo-L452RE, Nucleo-L476RG, P-Nucleo-WB55RG;
- NUCLEO-144: Nucleo-F207ZG, Nucleo-F429ZI, Nucleo-F767ZI, Nucleo-L496ZG, Nucleo-L496ZG-P, Nucleo-L4R5ZI, P-Nucleo-H743ZI, Nucleo-H743ZI2;
- Discovery: 32F0308DISCOVERY, 32F072BDISCOVERY, STM32VLDISCOVERY, STM32F407G-DISC1, STM32F746G-DISCOVERY, B-L072Z-LRWAN1, B-L475E-IOT01A и другие.
STM32duino содержит большую группу специализированных библиотек, обеспечивающих поддержку плат расширения (таблица 4). Эти библиотеки необходимо устанавливать отдельно. Подробнее этот вопрос рассмотрим ниже.
Таблица 4. Библиотеки плат расширения STM32duino
Библиотека | Описание |
---|---|
FP_Examples | Примеры совместной работы нескольких плат расширения X-NUCLEO |
X-NUCLEO-IHM12A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IHM12A1, необходимая для управления DC-моторами с помощью микросхемы STSPIN240. |
X-NUCLEO-53L1A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-53L1A1 с датчиком приближения VL53L1x |
I-NUCLEO-LRWAN1 | Arduino-библиотека для поддержки платы расширения I-NUCLEO-LRWAN1 LoRa® с модулем USI® LoRaWAN |
X-NUCLEO-GNSS1A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-GNSS1A1 с модулем навигации Teseo-LIV3F |
X-NUCLEO-53L0A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-53L0A1 с датчиком приближения VL53L0x |
X-NUCLEO-6180XA1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-6180XA1 с датчиком приближения VL6180x |
X-NUCLEO-IKS01A3 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IKS01A3 с инерционными МЭМС-датчиками |
X-NUCLEO-IHM02A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IHM02A1 |
X-NUCLEO-NFC03A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-NFC03A1 с NFC-микросхемой CR95HF |
X-NUCLEO-NFC04A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-NFC04A1 с NFC/RFID-микросхемой ST25DV04K |
X-NUCLEO-NFC01A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-NFC01A1 с NFC/RFID-микросхемой M24SR64-Y |
X-NUCLEO-IDB05A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IDB05A1 с Bluetooth-модулем SPBTLE-RF |
X-NUCLEO-IKS01A2 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IKS01A2 с МЭМС-датчиками |
X-NUCLEO-IKS01A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IKS01A1 с МЭМС-датчиками |
X-NUCLEO-LED61A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-LED61A1 с DC-DC LED-драйвером LED6001 |
X-NUCLEO-IKA01A1 | Arduino-библиотека для поддержки платы расширения X-NUCLEO-IKA01A1 с операционными усилителями |
Библиотеки плат расширения дополнительно используют библиотеки датчиков (таблица 6). Например, библиотека X-NUCLEO-IKS01A2 использует библиотеки LSM6DSL, LSM303AGR, HTS221, LPS22HB. Вопрос добавления библиотек в проект Arduino рассматривается далее.
Таблица 5. Библиотеки датчиков STM32duino
Библиотека/Утилита | Описание |
---|---|
FP_Examples | Примеры совместной работы нескольких плат расширения X-NUCLEO |
Proximity_Gesture | Библиотека распознавания жестов для датчиков приближения |
USBMicrophone | Arduino-библиотека для поддержки USB Audio class отладочными платами с STM32 |
STM32SD | Arduino-библиотека для поддержки SDcard отладочными платами с STM32 |
STM32RTC | Arduino-библиотека для RTC микроконтроллеров STM32 |
LIS3DHH | Arduino-библиотека для трехосевого акселерометра LIS3DHH |
LSM6DSOX | Arduino-библиотека для трехосевого гироскопа LSM6DSOX |
HTS221 | Arduino-библиотека для датчика влажности и температуры HTS221 |
LSM6DSO | Arduino-библиотека для комбинированного инерционного МЭМС-датчика LSM6DSO (трехосевой акселерометр + трехосевой гироскоп) |
Teseo-LIV3F-Flash-Updater | Java-приложение для обновления прошивки модулей Teseo-LIV3F |
LSM303AGR | Arduino-библиотека для комбинированного инерционного МЭМС-датчика LSM303AGR (трехосевой акселерометр + трехосевой магнитометр) |
VL53L1X | Arduino-библиотека для поддержки датчика приближения VL53L1X |
STTS751 | Arduino-библиотека для поддержки цифрового датчика температуры STTS751 |
SPBTLE-RF | Arduino-библиотека для поддержки Bluetooth-модуля SPBTLE-RF |
VL53L0X | Arduino-библиотека для поддержки датчика приближения VL53L0X |
VL6180X . | Arduino-библиотека для поддержки датчика приближения VL6180X |
LIS2DW12 | Arduino-библиотека для поддержки трехосевого акселерометра LIS2DW12 |
LPS22HH | Arduino-библиотека для поддержки цифрового барометра LPS22HH |
LIS2MDL | Arduino-библиотека для поддержки трехосевого магнитометра LIS2MDL |
WiFi-ISM43362-M3G-L44 | Arduino-библиотека для поддержки Wi-Fi-модуля Inventek ISM43362-M3G-L44 (802.11 b/g/n) |
LIS3MDL | Arduino-библиотека для поддержки трехосевого магнитометра LIS3MDL |
LSM6DSL | Arduino-библиотека для поддержки инерционного сенсора LSM6DSL (трехосевой гироскоп + трехосевой акселерометр) |
LSM6DS3 | Arduino-библиотека для поддержки инерционного сенсора LSM6DS3 (трехосевой гироскоп + трехосевой акселерометр) |
LSM6DS0 | Arduino-библиотека для поддержки инерционного сенсора LSM6DS0 (трехосевой гироскоп + трехосевой акселерометр) |
M24SR64-Y | Arduino-библиотека для поддержки беспроводной NFC/RFID-памяти M24SR64-Y |
LPS25HB | Arduino-библиотека для поддержки цифрового барометра LPS25HB |
LPS22HB | Arduino-библиотека для поддержки цифрового барометра LPS22HB |
MX25R6435F | Arduino-библиотека для поддержки Quad-SPI NOR Flash-памяти MX25R6435F |
ST-SPSGRF | Arduino-библиотека для поддержки субгигагерцевых ВЧ-модулей SPSGRF-868 и SPSGRF-915 |
MP34DT01 | Arduino-библиотека для поддержки цифровых микрофонов MP32DT01 |
Пошаговая инструкция по добавлению поддержки STM32 в Arduino
Итак, мы убедились в аппаратной совместимости плат Nucleo и Arduino. Кроме того, у нас есть подходящая библиотека. Осталось установить эту библиотеку в Arduino IDE. Подробная инструкция по установке Arduino_Core_STM32 есть на GitHub [12]. Кроме того, на Youtube можно найти видеоролики [13], в которых этот же процесс показан весьма наглядно.
Рассмотрим процесс установки по шагам.
Шаг 1. Установите среду Arduino IDE, если она еще не установлена. Последнюю версию программы можно бесплатно скачать с сайта Arduino [6].
Шаг 2. Запустите Arduino IDE. Появится стартовое окно (рисунок 3).
Шаг 3. Войдите в меню «File». Выберите пункт «Preferences» (рисунок 7).

Рис. 7. Пункт меню «Preferences»
Шаг 4. В новом окне в поле Additional Boards Managers URLs введите адрес: (рисунок 8). Нажмите «OK».

Рис. 8. Настройки окна «Preferences»
Шаг 5. Войдите в меню «Tools». Выберете пункт «Boards» → «Boards Manager» (рисунок 9).

Рис. 9. Пункт меню «Boards Manager»
Шаг 6. В открывшемся окне представлены библиотеки плат. В поле поиска введите «STM32 Cores». Программа найдет требуемую библиотеку (рисунок 10). Нажмите кнопку «Install».

Рис. 10. Поиск и установка библиотеки STM32 Cores
Шаг 7. После установки библиотеки появится метка «INSTALLED». Закройте окно «Boards Manager».
Теперь вы сможете найти платы Nucleo в меню «Tools» → «Board». В следующем разделе мы рассмотрим процесс настройки нового проекта и запустим простейший пример.
Пример №1 («классика»): моргаем светодиодом
Запустим классический Arduino-пример с мигающим светодиодом Blink на плате Nucleo-G071RB.
Шаг 1. Подключаем плату Nucleo-G071RB к ПК с помощью USB-кабеля и создаем новый проект.
Шаг 2. В пункте меню «Tools» → «Board» выбираем тип платы Nucleo-64 (рисунок 11).

Рис. 11. Выбираем тип платы Nucleo-64
Шаг 3. В пункте меню «Tools» → «Board part number» выбираем модель платы Nucleo-G071RB (рисунок 12).

Рис. 12. Выбираем модель платы Nucleo-G071RB
Шаг 4. Выбираем способ записи программы (рисунок 13). По умолчанию платы Nucleo используют режим «Mass Storage». При желании пользователь может изменить положение джамперов и загружать программу с помощью ST-Link.

Рис. 13. Выбираем способ загрузки Mass Storage
Шаг 5. Выбираем последовательный порт (рисунок 14). Номер порта будет разным для разных ПК. При необходимости нужный номер порта можно узнать из диспетчера устройств Windows.

Рис. 14. Выбираем последовательный порт
Шаг 6. Выбираем стандартный пример «Blink» (рисунок 15). Он находится в пункте меню «File» → «Examples» → «Basic».

Рис. 15. Выбираем пример Blink
Шаг 7. Android IDE открывает листинг программы (листинг 1). Программа традиционно состоит из функции инициализации void setup() и основной функции void loop(). Инициализация порта, управляющего светодиодом, производится функцией pinMode(). Включение и выключение светодиода выполняется функцией digitalWrite(). Временная задержка задается в миллисекундах с помощью функции delay().
Листинг 1. Простейший пример Blink
// Функция инициализации запускается один раз после сброса или включения питания
void setup() {
// Настраиваем вывод LED_BUILTIN на выход.
pinMode(LED_BUILTIN, OUTPUT);
}
// Основная функция программы вызывается в цикле
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // Включить светодиод
delay(1000); // Задержка 1 секунда (1000 мс)
digitalWrite(LED_BUILTIN, LOW); // Выключить светодиод
delay(1000); // Задержка 1 секунда (1000 мс)
}
Шаг 8. Компилируем и загружаем программу (рисунок 16). Для этого можно нажать кнопку в виде стрелки.

Рис. 16. Компилируем и загружаем программу
После выполнения этих простых шагов мы будем наблюдать мигание светодиода. Таким образом, не написав и не изменив ни единой строчки кода, мы смогли запустить штатный проект на плате Nucleo.
Для закрепления материала можно слегка модернизировать пример, задействовав пользовательскую кнопку, расположенную на плате Nucleo-G071RB.
Пример №2: управляем светодиодом с помощью кнопки
На плате Nucleo-G071RB есть одна пользовательская кнопка, которая поможет нам слегка изменить рассмотренный выше пример: при ненажатой кнопке светодиод мигает с той же частотой, что и раньше, а при нажатой кнопке частота увеличивается в два раза. Листинг программы представлен ниже (листинг 2). В данном случае вместо мнемоники LED_BUILTIN будем использовать определение PA5 – это именно тот вывод микроконтроллера STM32G071, который отвечает за управление светодиодом. Пользовательская кнопка подключена к выводу PC13. Этот вывод настраивается на вход.
Листинг 2. Управляем светодиодом с помощью кнопки
// Функция инициализации запускается один раз после сброса или включения питания
void setup() {
// Настраиваем вывод, управляющий светодиодом. На этот раз укажем его явно как PA5
pinMode(PA5, OUTPUT);
// Настраиваем вход контролирующий кнопку
pinMode(PC13, INPUT);
}
// Основная функция программы вызывается в цикле
void loop() {
if(digitalRead(PC13)) // Проверяем состояние кнопки
{
// Если кнопка нажата - частота увеличивается в два раза
digitalWrite(PA5, HIGH); // Включить светодиод
delay(500); // Задержка 0,5 с (500 мс)
digitalWrite(PA5, LOW); // Выключить светодиод
delay(500); // Задержка 0,5 с (500 мс)
}
// Если кнопка не нажата - частота остается без изменений
else
{
digitalWrite(PA5, HIGH); // Включить светодиод
delay(1000); // Задержка 1 секунда (1000 мс)
digitalWrite(PA5, LOW); // Выключить светодиод
delay(1000); // Задержка 1 секунда (1000 мс)
}
}
Рассмотренные примеры просты и понятны. Очень много разнообразных примеров можно найти в сети [14].
Как уже неоднократно говорилось, возможности плат Nucleo ограничены. Для получения дополнительного функционала компания STMicroelectronics предлагает использовать либо платы расширения Arduino, либо платы расширения X-NUCLEO. Рассмотрим подробнее процесс подключения и работы с платами X-NUCLEO на примере X-NUCLEO-IKS01A2.
Пошаговая инструкция по добавлению библиотек для плат расширения
Сразу стоит отметить, что для работы с платой X-NUCLEO-IKS01A2 потребуется не только соответствующая библиотека [15], но и библиотеки используемых датчиков:
Процесс установки библиотек прост и интуитивно понятен.
Шаг 1. Выберете пункт меню «Sketch» → «Include Library» → «Manage Libraries» (рисунок 17).

Рис. 17. Управление библиотеками
Шаг 2. В строке поиска введите название X-NUCLEO-IKS01A2. Программа автоматически найдет нужную библиотеку (рисунок 18). Нажмите кнопку «Install».

Рис. 18. Поиск и установка библиотеки X-NUCLEO-IKS01A2
Шаг 3. Аналогичным образом найдите библиотеку HTS221 (рисунок 19). При наличии нескольких вариантов рекомендуется выбирать версию для STM32duino. Установите библиотеку, нажав кнопку «Install».

Рис. 19. Поиск и установка библиотеки HTS221 (нужная версия для STM32duino расположена внизу)
Шаг 4. Аналогичным образом найдите и установите библиотеки LSM6DSL, LSM303AGR и LPS22HB.
Шаг 5. После установки библиотек список примеров существенно расширяется. Для открытия готового примера следует использовать меню «File» → «Examples» → STM32duino X-NUCLEO-IKS01A2 (рисунок 20). Самый простой и наглядный пример называется «X_NUCLEO_IKS01A2_HelloWorld». Рассмотрим его подробнее.

Рис. 20. Запуск примера X_NUCLEO_IKS01A2_HelloWorld
Пример №3: считываем показания MEMS-датчиков и передаем в ПК по последовательному порту
Прежде чем двигаться дальше, стоит еще раз отметить, что библиотека X-NUCLEO-IKS01A2 использует библиотеки датчиков. Описание API-функций библиотек есть на GitHub. Коротко рассмотрим API библиотеки HTS221.
Для создания экземпляра датчика понадобится всего две строки кода:
HumTemp = new HTS221Sensor (dev_i2c); // Создание экземпляра
HumTemp->Enable(); запуск работы датчика
Для считывания показаний используется всего две команды:
HumTemp->GetHumidity(&humidity); // Считываем значение влажности
HumTemp->GetTemperature(&temperature); // Считываем температуру
Также стоит отметить, что обмен с HTS221 ведется с помощью I2C-интерфейса. Для его активации понадобится добавить в программе всего пару строк кода:
dev_i2c = new TwoWire(I2C2_SDA, I2C2_SCL);
dev_i2c->begin();
Рассмотрим работу с платой расширения на примере X_NUCLEO_IKS01A2_HelloWorld. В данном примере микроконтроллер считывает показания всех датчиков и передает их в ПК по последовательному интерфейсу. Запуск примера описан в предыдущем пункте статьи (листинг 3).
Листинг 3. Пример X_NUCLEO_IKS01A2_HelloWorld
// Подключаем заголовочные файлы
#include <HTS221Sensor.h>
#include <LPS22HBSensor.h>
#include <LSM303AGR_ACC_Sensor.h>
#include <LSM303AGR_MAG_Sensor.h>
#include <LSM6DSLSensor.h>
// Определения для последовательного интерфейса и I2C
#define DEV_I2C Wire
#define SerialPort Serial
// Определение экземпляров для датчиков
HTS221Sensor *HumTemp;
LPS22HBSensor *PressTemp;
LSM6DSLSensor *AccGyr;
LSM303AGR_ACC_Sensor *Acc2;
LSM303AGR_MAG_Sensor *Mag;
// Функция инициализации
void setup() {
// Настройка вывода для светодиода
pinMode(LED_BUILTIN, OUTPUT);
// Инициализация последовательного порта. Скорость 115200 кбит/с
SerialPort.begin(115200);
// Инициализация I2C
DEV_I2C.begin();
// Инициализация экземпляров
HumTemp = new HTS221Sensor (&DEV_I2C);
HumTemp->Enable();
PressTemp = new LPS22HBSensor (&DEV_I2C);
PressTemp->Enable();
AccGyr = new LSM6DSLSensor(&DEV_I2C);
AccGyr->Enable_X();
AccGyr->Enable_G();
Acc2 = new LSM303AGR_ACC_Sensor(&DEV_I2C);
Acc2->Enable();
Mag = new LSM303AGR_MAG_Sensor(&DEV_I2C);
Mag->Enable();
}
// Основная функция
void loop() {
// Мигаем светодиодом (пример 1)
digitalWrite(LED_BUILTIN, HIGH); // Включаем светодиод
delay(250); // Задержка 250 мс
digitalWrite(LED_BUILTIN, LOW); // Выключаем светодиод
delay(250); // Задержка 250 мс
// Считываем влажность и температуру из датчика HTS221
float humidity, temperature;
HumTemp->GetHumidity(&humidity);
HumTemp->GetTemperature(&temperature);
// Считываем давление и температуру из датчика LPS22HB
float pressure, temperature2;
PressTemp->GetPressure(&pressure);
PressTemp->GetTemperature(&temperature2);
// Считываем показания акселерометра и гироскопа из датчика LSM6DSL
int32_t accelerometer[3];
int32_t gyroscope[3];
AccGyr->Get_X_Axes(accelerometer);
AccGyr->Get_G_Axes(gyroscope);
// Считываем показания акселерометра из комбинированного модуля LSM303AGR.
int32_t accelerometer2[3];
Acc2->GetAxes(accelerometer2);
// Считываем показания магнитометра из комбинированного модуля LSM303AGR.
int32_t magnetometer[3];
Mag->GetAxes(magnetometer);
// Выводим данные через последовательный порт в ПК
SerialPort.print("| Hum[%]: ");
SerialPort.print(humidity, 2);
SerialPort.print(" | Temp[C]: ");
SerialPort.print(temperature, 2);
SerialPort.print(" | Pres[hPa]: ");
SerialPort.print(pressure, 2);
SerialPort.print(" | Temp2[C]: ");
SerialPort.print(temperature2, 2);
SerialPort.print(" | Acc[mg]: ");
SerialPort.print(accelerometer[0]);
SerialPort.print(" ");
SerialPort.print(accelerometer[1]);
SerialPort.print(" ");
SerialPort.print(accelerometer[2]);
SerialPort.print(" | Gyr[mdps]: ");
SerialPort.print(gyroscope[0]);
SerialPort.print(" ");
SerialPort.print(gyroscope[1]);
SerialPort.print(" ");
SerialPort.print(gyroscope[2]);
SerialPort.print(" | Acc2[mg]: ");
SerialPort.print(accelerometer2[0]);
SerialPort.print(" ");
SerialPort.print(accelerometer2[1]);
SerialPort.print(" ");
SerialPort.print(accelerometer2[2]);
SerialPort.print(" | Mag[mGauss]: ");
SerialPort.print(magnetometer[0]);
SerialPort.print(" ");
SerialPort.print(magnetometer[1]);
SerialPort.print(" ");
SerialPort.print(magnetometer[2]);
SerialPort.println(" |");
}
После загрузки примера необходимо открыть терминал (рисунок 21).

Рис. 21. Открываем терминал
Далее необходимо настроить скорость передачи 115200 бод, после чего на экране начнут появляться данные (рисунок 22).
Итак, для того чтобы запустить пример, в котором микроконтроллер STM32G0 считывает содержимое сложных цифровых датчиков и отправляет их по последовательному каналу в ПК, потребовалась всего пара минут, а сам код занял лишь три десятка строк. Именно в этом и состоит вся прелесть Arduino, и эти преимущества уже сейчас могут по достоинству оценить владельцы плат Nucleo.
Заключение
Библиотека STM32duino позволяет интегрировать платы Nucleo в платформу Arduino. Эта же библиотека поддерживает широкий спектр плат расширения STM32 Nucleo Expansion Boards и датчиков производства STMicroelectronics.
Благодаря использованию мощных 32-битных микроконтроллеров STM32 Nucleo существенно превосходят по своим возможностям традиционные платы Arduino Uno V3 благодаря увеличенной рабочей частоте процессора, объемах памяти, меньшем потреблении энергии, разнообразной периферии. В то же время благодаря Arduino работа с платами Nucleo становится максимально простой и доступной широкому кругу любителей электроники.
Связка из плат Nucleo и платформы Arduino станет идеальным инструментом для создания прототипов и конечных приложений в условиях ограниченного времени. Использование многочисленных готовых библиотек дополнительно упрощает и ускоряет создание новых устройств.
Дополнительные материалы
- Официальная страница Arduino.
- Официальные платы Arduino.
- Сравнение плат Arduino.
- Схема Arduino Uno.
- Красивый плакат с распиловкой Arduino Uno.
- Последняя версия Arduino IDE.
- Описание языка.
- Библиотеки.
- Платы STM32 Nucleo-64.
- Платы расширения STM32 Nucleo Expansion Boards.
- STM32duino.
- Установка Arduino_Core_STM32.
- Видео по установке Arduino_Core_STM32 в Arduino IDE.
- Примеры работы с Arduino с STM32 Nucleo-64.
- Информация по библиотеке X-NUCLEO-IKS01A2.
- www.st.com.
Наши информационные каналы