Платы Nucleo на базе STM32G0: чего можно добиться с помощью связки Nucleo и Arduino

7 ноября

системы безопасностиучёт ресурсовавтоматизацияуниверсальное применениеST Microelectronicsстатьяинтегральные микросхемыдатчики

Вячеслав Гавриков (Смоленск)

Платы 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-принтера

Рис. 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

Рис. 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 с пустым проектом

Рис. 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

Рис. 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

Рис. 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

Рис. 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 поддерживает широкий спектр отладочных плат:

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»

Рис. 7. Пункт меню «Preferences»

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

Рис. 8. Настройки окна «Preferences»

Рис. 8. Настройки окна «Preferences»

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

Рис. 9. Пункт меню «Boards Manager»

Рис. 9. Пункт меню «Boards Manager»

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

Рис. 10. Поиск и установка библиотеки STM32 Cores

Рис. 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

Рис. 11. Выбираем тип платы Nucleo-64

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

Рис. 12. Выбираем модель платы Nucleo-G071RB

Рис. 12. Выбираем модель платы Nucleo-G071RB

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

Рис. 13. Выбираем способ загрузки Mass Storage

Рис. 13. Выбираем способ загрузки Mass Storage

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

Рис. 14. Выбираем последовательный порт

Рис. 14. Выбираем последовательный порт

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

Рис. 15. Выбираем пример Blink

Рис. 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. Компилируем и загружаем программу

Рис. 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. Управление библиотеками

Рис. 17. Управление библиотеками

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

Рис. 18. Поиск и установка библиотеки X-NUCLEO-IKS01A2

Рис. 18. Поиск и установка библиотеки X-NUCLEO-IKS01A2

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

Рис. 19. Поиск и установка библиотеки HTS221 (нужная версия для STM32duino расположена внизу)

Рис. 19. Поиск и установка библиотеки HTS221 (нужная версия для STM32duino расположена внизу)

Шаг 4. Аналогичным образом найдите и установите библиотеки LSM6DSL, LSM303AGR и LPS22HB.

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

Рис. 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. Открываем терминал

Рис. 21. Открываем терминал

Далее необходимо настроить скорость передачи 115200 бод, после чего на экране начнут появляться данные (рисунок 22).

Рис. 22. Прием данных по последовательному порту

Рис. 22. Прием данных по последовательному порту

Итак, для того чтобы запустить пример, в котором микроконтроллер STM32G0 считывает содержимое сложных цифровых датчиков и отправляет их по последовательному каналу в ПК, потребовалась всего пара минут, а сам код занял лишь три десятка строк. Именно в этом и состоит вся прелесть Arduino, и эти преимущества уже сейчас могут по достоинству оценить владельцы плат Nucleo.

Заключение

Библиотека STM32duino позволяет интегрировать платы Nucleo в платформу Arduino. Эта же библиотека поддерживает широкий спектр плат расширения STM32 Nucleo Expansion Boards и датчиков производства STMicroelectronics.

Благодаря использованию мощных 32-битных микроконтроллеров STM32 Nucleo существенно превосходят по своим возможностям традиционные платы Arduino Uno V3 благодаря увеличенной рабочей частоте процессора, объемах памяти, меньшем потреблении энергии, разнообразной периферии. В то же время благодаря Arduino работа с платами Nucleo становится максимально простой и доступной широкому кругу любителей электроники.

Связка из плат Nucleo и платформы Arduino станет идеальным инструментом для создания прототипов и конечных приложений в условиях ограниченного времени. Использование многочисленных готовых библиотек дополнительно упрощает и ускоряет создание новых устройств.

Дополнительные материалы

  1. Официальная страница Arduino.
  2. Официальные платы Arduino.
  3. Сравнение плат Arduino.
  4. Схема Arduino Uno.
  5. Красивый плакат с распиловкой Arduino Uno.
  6. Последняя версия Arduino IDE.
  7. Описание языка.
  8. Библиотеки.
  9. Платы STM32 Nucleo-64.
  10. Платы расширения STM32 Nucleo Expansion Boards.
  11. STM32duino.
  12. Установка Arduino_Core_STM32.
  13. Видео по установке Arduino_Core_STM32 в Arduino IDE.
  14. Примеры работы с Arduino с STM32 Nucleo-64.
  15. Информация по библиотеке X-NUCLEO-IKS01A2.
  16. www.st.com.
•••

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее

Товары
Наименование
X-NUCLEO-IKS01A2 (ST)
LSM6DSL (ST)
LSM303AGR (ST)
HTS221 (ST)
NUCLEO-F303K8 (ST)
NUCLEO-L031K6 (ST)
NUCLEO-L432KC (ST)
NUCLEO-F030R8 (ST)
NUCLEO-F091RC (ST)
NUCLEO-F103RB (ST)
NUCLEO-F302R8 (ST)
NUCLEO-F303RE (ST)
NUCLEO-L073RZ (ST)
NUCLEO-L476RG (ST)
NUCLEO-F207ZG (ST)
NUCLEO-F429ZI (ST)
NUCLEO-F767ZI (ST)
STM32VLDISCOVERY (ST)
STM32F407G-DISC1 (ST)
B-L072Z-LRWAN1 (ST)