Какой фреймворк используется в среде разработки arduino
Arduino Wiring-based Framework allows writing cross-platform software to control devices attached to a wide range of Arduino boards to create all kinds of creative coding, interactive objects, spaces or physical experiences
Serial.print("Может быть лучше");
Среда разработки
PlatformIO
В каждом проекте PlatformIO есть подпапка lib, в которую можно помещать библиотеки. Это при ручной установке библиотек. Также у PlatformIO есть отдельная команда для установки библиотек platformio lib, к сожалению она по умолчанию устанавливает библиотеки глобально, чтобы библиотеки устанавливались локально в подпапку lib надо в platformio.ini проекта добавить:
На днях мне пришлось в очередной раз рассказывать об Ардуино человеку, хорошо знакомому с электроникой вообще и с микроконтроллерами в частности. Здесь, естественно, нужен совсем другой подход к описанию любимой платформы, ведь говорить о том, «как все просто и как все круто» просто несолидно.
Итак, что же представляет собой Ардуино с точки зрения специалиста?
Пожалуй, самым удачным словом, описывающим платформу, будет «фреймворк». Те, кто знаком с такими проектами, как jQuery, mootools, наверняка отметят сходство идей. Любой фреймворк прежде всего создает удобное для программиста окружение, решая за него множество распространенных, несущественных повседневных задач. То же самое мы видим и в Ардуине – с той лишь особенностью, что фреймворк упрощает жизнь не только на программном, но и на аппаратном уровнях.
Самым главным отличием Ардуины от всех других подобных плат (к слову, так и оставшихся «просто отладочными платами» ) будет ее язык. Почему-то Wiring принято называть языком, хотя на деле это обычный C с некоторым вкраплениями из С++. А столь отличающимися по внешнему виду программы на Wiring’е от их С-собратьев делает тот классный набор библиотек, который и называют ядром Ардуино. Все это добро размещено в папке %Arduino%\hardware\arduino\cores\arduino (где %Arduino% — директория, в которую вы устанавливали среду разработки).
Как устроена любая СИ-программа для микроконтроллера? В большинстве случаев она выглядит так:
Что-то может меняться, но у меня, по крайней мере 95% программ построены именно так. Отдельная функция для конфигурирования МК, отдельная – для цикла и т.п.
Теперь сравните этот код с кодом из файла main.cpp, который на самом деле является главным файлом при компиляции любого скетча:
Много отличий? (Те, кто только начинают изучать платформу, обратите внимание, куда на самом деле вставляется код из функций setup() и loop() ).
«Все это несерьезно» — скажет любой специалист по МК. Бесспорно, это не меняет сути вещей, разве что экономит пару минут времени и пару строк кода. Но обратите внимание на ключевое отличие двух программ – в Ардуино сначала вызывается системная процедура init(), а уже после нее – пользовательская setup().
Все дело в том, что Ардуино, как фреймворк, предоставляет пользователям преконфигурированное окружение. То есть, мы можем сразу же начинать работу с МК – он уже настроен, а именно:
• Таймер 0 сконфигурирован как счетчик времени, в зависимости от типа выбранного МК\платы, уже реализован API для доступа к функциям времени
• Ножки, задействованные bootloader’ом под UART, переключены в обычный режим
• Создан буфер под хранение данных UART, настроены соответствующие прерывания, опять-таки реализован API
• В память загружена небольшая библиотека, включающая в себя функции для работы с символами\строками, измерения длительности импульсов и т.п.
• Компилятору доступно много полезных макросов и констант, например таких как:
(Я не упоминаю о банальных и хорошо известных вещах, вроде
и т.п. – они тоже реализованы в виде макросов.)
Такая (или похожая) библиотечка есть у любого уважающего себя Си-программиста, и она здорово экономит время. Просто в Ардуино это, как и многое другое, упорядочено, стандартизовано.
• Доступны библиотечки математических функций, генератора тона, АЦП, ШИМ. Зачем изобретать велосипед? Тем более, что компилятор включит в готовую прошивку только используемый код.
• И много другого… Кому интересно, проверьте сами папку с ядром платформы=)
К слову – библиотечка ШИМ автоматически выберет и настроит нужный таймер (в зависимости от частоты\модели МК) на всех поддерживаемых выводах. Вам необходимо только указать его (вывода) номер и скважность, все остальное фреймворк сделает за вас. ТО же самое вы вправе ожидать и от других частей платформы.
Конечно, некоторые суровые люди любят все это делать\настраивать сами, и заявлять потом что-то вроде «моя программа работает на 14% быстрее и занимает на 21% меньше места». Но о том, что у них на разработку уходит в разы(!) больше времени, они почему-то молчат. А кому хочется лишний раз заниматься рутиной?
(Справедливости ради – отмечу, что есть сферы, где и размер, и скорость выполнения кода действительно критичны. Но в таких сферах, как правило, существуют свои собственные традиции и стандарты, архитектура таких систем существенно отличается, да и использовать там Arduino никому просто не придет в голову. А в повседневной жизни, согласитесь, несущественно – отработает ваш домофон операцию за 20 или 22 миллисекунды, займет ли его код 3 или 4 Кб – с учетом возможностей и стоимости современных МК. Зато время, сэкономленное разработчиком, стоит намного дороже…)
Кроме того, Ардуино выгодно отличает богатый, продуманный и стандартизованный набор библиотек. «Прямо из коробки» нам доступны «драйверы» для большинства распространённых ЖК-дисплеев (притом с отличным функционалом), SPI, I2C, простого доступа к EEPROM, сервоприводов, шаговых двигателей, (Micro)SD – карт (со встроенной поддержкой FAT) и даже TCP/IP (поддержка как чипов Wiznet, так и реализация классов сервера\клиента). Это тоже очень сильно сокращает время разработки устройства – не надо тратить время на поиск библиотек. Более того, библиотеки максимально согласованы друг с другом, и ориентированы на бесконфликтную работу – насколько это возможно. (Работать по SPI одновременно и с чипом Ethernet, и с SD-карточкой все равно не получится. Придётся переключаться.)
Само собой, дело не ограничивается стандартными библиотеками. Коммьюнити разработало огромное количество библиотек либо просто сниппетов кода, охватывающих многие популярные модели устройств.
Но Ардуино не ограничивается лишь набором программных решений. Сама плата допускает установку на нее так называемых «шилдов» — дополнительных плат расширения, на которых может быть смонтирован набор чипов для Ethernet, обработки датчиков, управления силовой электроникой. Помимо того, все микроконтроллеры в Arduino оснащены bootloader’ом, позволяющим плате программировать саму себя. После перезагрузки платы (которую можно инициировать с компьютера путем подачи сигнала DTR на виртуальный СОМ-порт – среда разработки делает это автоматически) код загрузчика несколько секунд ждет новую прошивку, и при поступлении таковой прошивает микроконтроллер. Это позволяет избавиться от необходимости иметь отдельный программатор, и, кроме этого, дает большую гибкость (например, можно написать свою, фирменную, утилиту обновления прошивки; для обновления firmware достаточно подключить устройство по UART – напрямую или через USB-конвертер, вроде FT232R).
(Более того, загрузив определенный скетч в МК, саму плату можно превратить в программатор).
Также на плате реализован минимум внешней обвязки микроконтроллера: регулятор напряжения, позволяющий питать плату от любого имеющегося в наличии источника напряжения в диапазоне 6-20В, USB-UART преобразователь на базе ATMega16U2, пара светодиодов и кнопка сброса. Доступны линии питания с напряжениями +3,3 и +5 В – для расширения совместимости (многие датчики, например, работают от напряжения +3,3В). Эти мелочи также немного упрощают процесс разработки.
Помимо «обычной» платы, в первую очередь нацеленной на обучение и разработку, выпускаются и модели, предназначенные непосредственно для установки в готовое устройство в качестве его ядра – например, ArduinoBoardEthernet). Отдельно следует скачать о семействе LilyPad , предназначенном для использования в качестве встраиваемой в одежду электроники.
Одним словом, не стоит рассматривать Arduino только как платформу для начинающих. За счет легкости в программировании она (а точнее, ее «фреймворк») может представлять интерес и для достаточно опытных разработчиков электроники – особенно в тех случаях, когда ключевым параметром является время разработки продукта. (Как правило, специалисты используют совершенно другие схемные решения, но вот программная часть при этом остаётся неизменной).
В чем проблема?
Аналоги Arduino IDE
Всем нетерпимо относящимся к кривой официальной IDE могу посоветовать следующие аналоги, работа в которых чем-то лучше, а чем-то хуже официальной IDE:
За последний год я написал довольно много кода для Arduino и попутно сменил несколько инструментов разработки. В статье упоминаются варианты которые пробовал и более подробно о том, на чем остановился. Речь пойдет про набор инструментов для случая когда >10 проектов под разные платы и немного про разработку и установку библиотек.
Что пробовал
Ino — проект от российской компании Амперка, утилита командной строки для прошивки Arduino.
Довольно популярный был проект, >200 форков. Последний коммит в апреле 2014, поэтому не работает со свежими версиями IDE (кажется начиная с 1.5).
Есть живой форк Arturo, немного его использовал, но были проблемы в каких-то экзотических случаях.
Arduino-Makefile
Arduino-Makefile — компиляция и загрузка с помощью make. Не поддерживаются Arduino Due, Zero и другие 32-битные платы. Отличием от стандартной IDE является то, что методы должны быть объявлены до использования, так что при переносе готовых проектов может понадобится редактирование исходников. Если правильно помню, мне не удалось подружить Arduino-Makefile и SparkFun Pro Micro.
Меню вкладок
Система вкладок в Arduino IDE работает крайне необычным образом и очень отличается от понятия вкладок в других программах, подробнее – в отдельном уроке.
Arduino IDE
Редко пользуюсь Arduino IDE, возможно есть способ лучше. Способ такой: устанавливать библиотеки в подпапку вашего проекта и поместить симлинки(ярлыки?) для каждой библиотеки в папку libraries (в папку куда устанавливает библиотеки Arduino IDE).
Кстати, если правильно помню, Arduino IDE компилирует все библиотеки из папки libraries при компиляции любого скетча, так что время компиляции увеличивается если в libraries много библиотек. Еще один повод не использовать Arduino IDE.
Tutorials¶
Вкладка “Инструменты”
MiniCore, MightyCore, MegaCore, MajorCore and MicroCore¶
Please read official documentation how to configure MCUdude’s Cores:
Вкладка “Файл”
- Новый
- Открыть
- Открыть недавние
- Папка со скетчами – список скетчей, которые сохранены туда, куда программа предлагает их сохранять по умолчанию (Документы/Arduino)
- Примеры – список установленных библиотек с подсписком примеров к каждой.
- Закрыть
- Сохранить
- Сохранить как…
- Настройки страницы (для печати)
- Печать
- Настройки
- Выход
В чем проблема?
Стандартный Serial.print() слегка неудобен в случае если нужно напечатать
название и значение переменной, например чтобы вывести "pin_2 = , pin_3 = " приходится делать так:
Доступные модификаторы
wildcard | comment | Example |
---|---|---|
%s | replace with an string (char*) | Log.Info("String %s", myString); |
%c | replace with an character | Log.Info("use %c as input", myChar) |
%d | replace with an integer value | Log.Info("current value %d",myValue); |
%l | replace with an long value | Log.Info("current long %l", myLong); |
%x | replace and convert integer value into hex | Log.Info ("as hex %x), myValue); |
%X | like %x but combine with 0x123AB | Log.Info ("as hex %X), myValue); |
%b | replace and convert integer value into binary | Log.Info ("as bin %b), myValue); |
%B | like %x but combine with 0b10100011 | Log.Info ("as bin %B), myValue); |
%t | replace and convert boolean value into "t" or "f" | Log.Info ("is it true? %t), myBool); |
%T | like %t but convert into "true" or "false" | Log.Info ("is it true? %T), myBool); |
Что использую
PlatformIO
- один проект под несколько плат, т.е. тот же самый код должен компилироваться под разные платы
- много проектов под разные платы, т.е. каждый проект под одну плату, но проектов много и платы разные
- есть необходимость работать через ssh, например если PlatformIO установлен на Raspberry Pi
- острое неприятие графического интерфейса
Использование с Arduino
Пересказывать документацию не буду, тут инструкция по установке, об использовании можно посмотреть в разделе Quick Start
Структура папок проекта для PlatformIO отличается от проекта Arduino IDE, каждый проект содержит файл platformio.ini в котором указано какие платы используются. Таким образом не приходится каждый раз выбирать нужную плату.
Расскажу на примере как использую PlatformIO при разработке библиотеки для Arduino. У библиотеки есть два примера, каждый из них является проектом в формате PlatformIO. В файле настроек проекта platformio.ini перечислены все платы на которых должна работать библиотека:
Скомпилировать пример для всех плат можно командой:
Скомпилировать только для uno можно так:
Загрузить прошивку на uno:
Запустить монитор последовательного порта:
Добавил алиасы в .zshrc чтобы сделать команды короче:
С ними таже последовательность действий:
Так же есть интеграция с Travis CI и другими CI инструментами, подробнее тут.
Вобще-то у Arduino IDE есть интерфейс коммандной строки, но он далек от совершенства.
Нюансы PlatformIO
- компиляция в PlatformIO не всегда равноценна компиляции в Arduino IDE, то что скопмилировалось в PlatformIO может не компилироваться в Arduino IDE и наоборот
- структура папок проекта не совпадает со структурой для Arduino IDE
- не все библиотеки доступны для установки через platformio lib
Вкладка “Скетч”
- Проверить/компилировать – то же, что кнопка “галочка”.
- Загрузка – то же, что кнопка “стрелочка”.
- Загрузить через программатор – загрузить скетч напрямую в МК через программатор.
- Экспорт бинарного файла – компилирует код и сохраняет в бинарник.
- Показать папку скетча
- Подключить библиотеку – подключает в код библиотеку.
- Управлять библиотеками… – открывает менеджер библиотек, из которого можно устанавливать библиотеки.
- Добавить .zip библиотеку – установка библиотеки из zip файла, если вы его откуда-то скачали.
В чем проблема?
- Только в последних версиях появилось какое-то управление библиотеками, пока без подобия Gemfile/requirements.txt/package.json, то есть нельзя для проекта указать какие либы каких версий используются
- нет интеграции с Git или другими VCS
- текстовый редактор не сравнить с моим любимым текстовым редактором
- нет возможности сохранить выбор платы в проекте
- неудобный вывод ошибок компиляции
Platforms¶
ASR Microelectronics ASR650x series is highly intergrated and ultra low power SoC based on the PSoC 4000 series MCU (ARM Cortex M0+ Core) and Semtech SX1262 transceiver.
Atmel | SMART offers Flash- based ARM products based on the ARM Cortex-M0+, Cortex-M3 and Cortex-M4 architectures, ranging from 8KB to 2MB of Flash including a rich peripheral and feature mix.
Espressif Systems is a privately held fabless semiconductor company. They provide wireless communications and Wi-Fi chips which are widely used in mobile devices and the Internet of Things applications.
Espressif Systems is a privately held fabless semiconductor company. They provide wireless communications and Wi-Fi chips which are widely used in mobile devices and the Internet of Things applications.
The GigaDevice GD32V device is a 32-bit general-purpose microcontroller based on the RISC-V core with an impressive balance of processing power, reduced power consumption and peripheral set.
Infineon has designed the XMC microcontrollers for real-time critical applications with an industry-standard core. The XMC microcontrollers can be integrated with the Arduino platform
ARC embedded processors are a family of 32-bit CPUs that are widely used in SoC devices for storage, home, mobile, automotive, and Internet of Things applications.
Kendryte K210 is an AI capable RISCV64 dual core SoC.
Microchip’s 32-bit portfolio with the MIPS microAptiv or M4K core offer high performance microcontrollers, and all the tools needed to develop your embedded projects. PIC32 MCUs gives your application the processing power, memory and peripherals your design needs!
The Nordic nRF51 Series is a family of highly flexible, multi-protocol, system-on-chip (SoC) devices for ultra-low power wireless applications. nRF51 Series devices support a range of protocol stacks including Bluetooth Smart (previously called Bluetooth low energy), ANT and proprietary 2.4GHz protocols such as Gazell.
The nRF52 Series are built for speed to carry out increasingly complex tasks in the shortest possible time and return to sleep, conserving precious battery power. They have a Cortex-M4F processor which makes them quite capable Bluetooth Smart SoCs.
RP2040 is a low-cost, high-performance microcontroller device with a large on-chip memory, symmetric dual-core processor complex, and rich peripheral.
The STM32 family of 32-bit Flash MCUs based on the ARM Cortex-M processor is designed to offer new degrees of freedom to MCU users. It offers a 32-bit product range that combines very high performance, real-time capabilities, digital signal processing, and low-power, low-voltage operation, while maintaining full integration and ease of development.
Teensy is a complete USB-based microcontroller development system, in a very small footprint, capable of implementing many types of projects. All programming is done via the USB port. No special programmer is needed, only a standard USB cable and a PC or Macintosh with a USB port.
MSP430 microcontrollers (MCUs) from Texas Instruments (TI) are 16-bit, RISC-based, mixed-signal processors designed for ultra-low power. These MCUs offer the lowest power consumption and the perfect mix of integrated peripherals for thousands of applications.
Texas Instruments TM4C12x MCUs offer the industrys most popular ARM Cortex-M4 core with scalable memory and package options, unparalleled connectivity peripherals, advanced application functions, industry-leading analog integration, and extensive software solutions.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.Jumangee
Друзья, привет! Прошу прощения за сложное название, попытаюсь объяснить мысль здесь. Итак, я новичок в разработке для ардуины (и, к сожалению, в электротехнике), но, скажем, не очень новичок в программировании. Решил навёрстывать путём сбора интересного для меня проекта, в качестве ориентира выбрал meteoClock от AlexGyver. На текущий момент, у меня даже нет в наличии ни одной ардуины, есть espruin-ка, по-сути "голая". И вот я начал вкуривать в тему, посмотрел исходники meteoClock. Сразу скажу, по опыту - работающая программа - хорошая программа. Но если для Alex это законченный проект, то для меня - будущий, а потому, сразу появились идеи как его переработать, улучшить и сделать по-своему. И вот, главное, что сейчас я хочу обсудить, это "управление состояниями" программы. Сейчас, meteoClock это т.н. "спагетти-код", его сложнее сопровождать и расширять, несмотря на многие очевидные плюсы. И вот у меня появился вопрос к знатокам, который лучше всего поясняется через черновую реализацию: возможно имеется смысл в таких встраиваемых системах реализовывать систему управления состояниями. Т.е. когда, каждый "экран", или "режим работы" представляет собой четкий кусок программы, который удобно поддерживать - потому что он самодостаточен. Конечно же вопрос только в эффективности - "для больших братьев" подобные решения практически обязательны, но в системах, где каждый байт - это серьёзно, наверняка не всё так очевидно. Но у меня нет опыта разработки для ответа на такой вопрос, а мысль есть, поэтому я сделал набросок (который, напомню, не могу протестировать, только скомпилировать ). Наверняка, всё что я сделал - это велосипед, но для изучения особенностей программирования для ардуины всё равно нужно что-то писать, а найденные в списке несколько fsm-библиотек мне, если честно, совсем не понравились.
Итак, главным будет класс "прошивка", в данном случае, это заготовка
Этот класс регистрирует два процесса MainProcess и SensorsProcess, каждый из которых реализует свою логику в методе update:
При компиляции для Nano, получается
Sketch uses 8992 bytes (29%) of program storage space. Maximum is 30720 bytes.
Global variables use 458 bytes (22%) of dynamic memory, leaving 1590 bytes for local variables. Maximum is 2048 bytes.Довольно много, наверное, жрёт LinkedList для динамических списков и наверняка можно многое оптимизировать, но главный вопрос - стоит ли оно того? Мне очень нравится систематизированность кода, каждое состояние (процесс) в отдельном классе, удобно расширять. Минус - память. Очень хочется услышать ваше мнение по вопросу!
Александр Симонов
С первого взгляда похоже на ООП-обертку для FreeRTOS. А есть метод сделать delay неблокирующий внутри таска (процесса)?
Jumangee
Сделал некоторую оптимизацию уменьшив футпринт и добавил немного примеров для ответа на вопрос.
Итак, теперь скетч состоит из одной строки:
Это сделано для того, чтобы нельзя было заплодить несколько объектов прошивки, а это ограничение позволяет немного съэкономить память (вроде бы)
Теперь, по поводу того, как реализован процесс обработки процессов: в прошивке из run вызывается метод run каждого процесса, в котором по каждому процессу проверяется - не на паузе ли он, и если не на паузе - выполняется обработчик update:
sshkalikov
Выглядит солидно на мой вкус. Только из-за того, что TextMessage получился 'stringly typed', в код уже закралась опечатка, которую не отловил компилятор ("UNPAUSE ALL" вместо "UNPAUSE_ALL").
Jumangee
Что касается приведенных примеров - да, несомненно эти движки посерьёзнее, но и размер тоже и сложность в использовании. Быть может, стоит искать нишу где-то между "нет движка" и "монстр под капотом" с поблажкой на относительную простоту использования?
Интересно было бы послушать опытных ардуинокодеров насчет общепринятых архитектурных подходов и библиотек/фреймворков для их реализации.
* Только меня особо опытным в разработки под контроллеры назвать сложно, поскольку чуть иная специализация. Все чем занимаюсь - хобби и развлечение. Но вроде выходит более-менее нормально.
Jumangee
Камрады, нужна ваша помощь! SOS! )))
В общем, продолжил я пилить свой велосипед. Приехала китайская ардуина нано, поправил ошибки и в целом - взлетело. но, наблюдаются какие-то странные глюки и я не понимаю откуда.
Программа нормально собирается и заливается на устройство, запускается, но. я ловлю какие-то странные глюки в буквальном смысле на ровном месте (((
Так вот эти процессы никак не хотят работать, они как будто "убивают" систему и она как будто бы обнуляется, запуская всё по-новой:
(вот здесь new MeteoClockFirmware быть не должно. )
Я не понимаю ЧЯДНТ, памагити!
Jumangee
После долгих ковыряний кажется я понял. что имел в виду Билл Гейтс в 87ом))
Похоже, мне мало памяти и я не понимаю чем я её так засираю
Sketch uses 12956 bytes (42%) of program storage space. Maximum is 30720 bytes.
Global variables use 877 bytes (42%) of dynamic memory, leaving 1171 bytes for local variables. Maximum is 2048 bytes.Проверяйте хранение и передачу строк в первую очередь. Константы должны жить во флеше, а через стек обмен - указатели и ссылки, а не через объекты.
Jumangee
Сначала рассмотрим общий вид программы, т.е. как она выглядит после запуска. В самом центре – блокнот, то самое место, где пишется код. По умолчанию уже написаны два стандартных блока, setup() и loop(). К ним вернёмся в разделе уроков программирования. Всё остальное можно увидеть на скриншоте ниже.
Пробежимся по пунктам меню, которые я считаю первостепенно важными, с остальными можно познакомиться самостоятельно по ходу работы с программой. Версия моей IDE – 1.8.8, в новых что-то может отличаться
Окно настроек
- Размещение папки скетчей – куда по умолчанию сохраняются скетчи
- Показать подробный вывод – показывает подробный лог при компиляции и загрузке, нужно при поиске багов и непонятных глюков/ошибок
- Использовать внешний редактор – запрещает редактирование кода из Arduino IDE, чтобы редактировать его в других редакторах, например Notepad++. Редактируем там, а загружаем через IDE.
- Дополнительные ссылки для менеджера плат – сюда вставляются ссылки на пакеты для работы с другими платами, например такими основанными на ESP8266 или ATtiny85.
Что использую
advancedSerial
Экономия памяти
Если обернуть строку в макрос F(), то она не будет загружена в память (SRAM), так что для экономии памяти используйте F():
Безусловно использование advancedSerial добавляет некоторый оверхед по сравнению со стандартным Serial, я попробовал приблизительно оценить какой. Ниже привожу результаты компиляции для Arduino Uno, так как у нее 2KB памяти и это минимум среди плат которые обычно использую.
Обычный сериал, без каких-либо библиотек:
storage space: 5%
dynamic memory: 9%advancedSerial:
storage space: 5%
dynamic memory: 10%examples/Advanced.ino
storage space: 9%
dynamic memory: 26%examples/Advanced.ino с использованием F() макроса
storage space: 9%
dynamic memory: 10%
Получается что использование памяти увеличивается незначительно. Но advancedSerial не оптимальное решение в плане ресурсов, есть альтернативные реализации, например Debug.Установка библиотек
Configuration¶
Читайте также: