Arduino как фреймворк


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

Итак, что же представляет собой Ардуино с точки зрения специалиста?

Пожалуй, самым удачным словом, описывающим платформу, будет «фреймворк». Те, кто знаком с такими проектами, как jQuery, mootools, наверняка отметят сходство идей. Любой фреймворк прежде всего создает удобное для программиста окружение, решая за него множество распространенных, несущественных повседневных задач. То же самое мы видим и в Ардуине – с той лишь особенностью, что фреймворк упрощает жизнь не только на программном, но и на аппаратном уровнях.

Самым главным отличием Ардуины от всех других подобных плат (к слову, так и оставшихся «просто отладочными платами» ) будет ее язык. Почему-то Wiring принято называть языком, хотя на деле это обычный C с некоторым вкраплениями из С++. А столь отличающимися по внешнему виду программы на Wiring’е от их С-собратьев делает тот классный набор библиотек, который и называют ядром Ардуино. Все это добро размещено в папке %Arduino%\hardware\arduino\cores\arduino (где %Arduino% — директория, в которую вы устанавливали среду разработки).

Как устроена любая СИ-программа для микроконтроллера? В большинстве случаев она выглядит так:

#inlude <…> // куча инклудов
var a,b,c  // все переменные
int main(void) {
  configure();  //настройка МК
  while(true) mainLoop(); // основной цикл
  return;
}
functions… // функции и обработчики прерываний

Что-то может меняться, но у меня, по крайней мере 95% программ построены именно так. Отдельная функция для конфигурирования МК, отдельная – для цикла и т.п.
Теперь сравните этот код с кодом из файла main.cpp, который на самом деле является главным файлом при компиляции любого скетча:

#include <WProgram.h>
int main(void)
{
	init();
	setup();
              for (;;)
		loop();
	return 0;
}

Много отличий? (Те, кто только начинают изучать платформу, обратите внимание, куда на самом деле вставляется код из функций setup() и loop() ).
«Все это несерьезно» — скажет любой специалист по МК. Бесспорно, это не меняет сути вещей, разве что экономит пару минут времени и пару строк кода. Но обратите внимание на ключевое отличие двух программ – в Ардуино сначала вызывается системная процедура init(), а уже после нее – пользовательская setup().

Все дело в том, что Ардуино, как фреймворк, предоставляет пользователям преконфигурированное окружение. То есть, мы можем сразу же начинать работу с МК – он уже настроен, а именно:

• Таймер 0 сконфигурирован как счетчик времени, в зависимости от типа выбранного МК\платы, уже реализован API для доступа к функциям времени
• Ножки, задействованные bootloader’ом под UART, переключены в обычный режим
• Создан буфер под хранение данных UART, настроены соответствующие прерывания, опять-таки реализован API
• В память загружена небольшая библиотека, включающая в себя функции для работы с символами\строками, измерения длительности импульсов и т.п.
• Компилятору доступно много полезных макросов и констант, например таких как:

#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
#define TWO_PI 6.283185307179586476925286766559
#define DEG_TO_RAD 0.017453292519943295769236907684886
#define RAD_TO_DEG 57.295779513082320876798154814105

или таких, как:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
#define lowByte(w) ((uint8_t) ((w) & 0xff))
#define highByte(w) ((uint8_t) ((w) >> 8))

(Я не упоминаю о банальных и хорошо известных вещах, вроде

abs(), min(), max()

и т.п. – они тоже реализованы в виде макросов.)

Такая (или похожая) библиотечка есть у любого уважающего себя Си-программиста, и она здорово экономит время. Просто в Ардуино это, как и многое другое, упорядочено, стандартизовано.

• Доступны библиотечки математических функций, генератора тона, АЦП, ШИМ. Зачем изобретать велосипед? Тем более, что компилятор включит в готовую прошивку только используемый код.
• И много другого… Кому интересно, проверьте сами папку с ядром платформы=)

К слову – библиотечка ШИМ автоматически выберет и настроит нужный таймер (в зависимости от частоты\модели МК) на всех поддерживаемых выводах. Вам необходимо только указать его (вывода) номер и скважность, все остальное фреймворк сделает за вас. ТО же самое вы вправе ожидать и от других частей платформы.

Конечно, некоторые суровые люди любят все это делать\настраивать сами, и заявлять потом что-то вроде «моя программа работает на 14% быстрее и занимает на 21% меньше места». Но о том, что у них на разработку уходит в разы(!) больше времени, они почему-то молчат. А кому хочется лишний раз заниматься рутиной?

(Справедливости ради – отмечу, что есть сферы, где и размер, и скорость выполнения кода действительно критичны. Но в таких сферах, как правило, существуют свои собственные традиции и стандарты, архитектура таких систем существенно отличается, да и использовать там Arduino никому просто не придет в голову. А в повседневной жизни, согласитесь, несущественно – отработает ваш домофон операцию за 20 или 22 миллисекунды, займет ли его код 3 или 4 Кб – с учетом возможностей и стоимости современных МК. Зато время, сэкономленное разработчиком, стоит намного дороже…)

Хороший программист – ленивый программист (С). http://translated.by/you/what-makes-a-great-developer/

Кроме того, Ардуино выгодно отличает богатый, продуманный и стандартизованный набор библиотек. «Прямо из коробки» нам доступны «драйверы» для большинства распространённых ЖК-дисплеев (притом с отличным функционалом), 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 только как платформу для начинающих. За счет легкости в программировании она (а точнее, ее «фреймворк») может представлять интерес и для достаточно опытных разработчиков электроники – особенно в тех случаях, когда ключевым параметром является время разработки продукта. (Как правило, специалисты используют совершенно другие схемные решения, но вот программная часть при этом остаётся неизменной).


P.S. Интересно отметить, что Ардуино стала фактически стандартом де-факто в любительской электронике. Достаточно часто я встречаю «оправдания», вроде «наша плата не совместима с Ардуино, потому что…» – например, на http://beagleboard.org/bone )


0 комментариев на «“Arduino как фреймворк”»

  1. Отличная статья, место ей где-нибудь в верхушке сайта, рядом с «Что такое ардуино»!
    Сам на днях подумал о том, что ардуино по сути фреймворк. Да, я разрабатываю электронные устройства на своей разведенной плате, с необходимой мне обвязкой и и отсутствием многого того, что есть на плате ардуино. Но несмотря на все это, мне удобно использовать ардуино как среду программирования.

  2. Мужики, помогите… Решил я стать обладателем arduin’ы, купил в китаймаге (buyincons) за 14 долларов, Arduino UNO. Подключаю к компу через USB, прошивка заливается все ок, но стабилизатор на плате кипяток — хоть яйца жарь… при подключении внешнего источника питания — ничего не греется.

    • За 14$ вряд ли это оригинал, а китайцы могли поставить на плату что угодно, в том числе и не рассчитанное на такой режим. Есть маркировка стабилизатора? И неплохо б фотку той части…

    • Там стоит AMS1117 — 5.0. придумал простое решение — у усб кабеля вырезал +5в, подключаю от внешнего источника. Кстати у китайского кабеля, красный это земля, черный — +5в… из за китайцев приходится постоянно таскать блок питания на 9в. тут общая фотка платы ( http://www.buyincoins.com/details/high-quality-arduino-uno-atmega328p-pu-module-atmega8u2-avr-usb-cable-board-product-10252.html )

    • По виду Ардуина похожа на оригинал, стабилизатор правильный…
      А не могли братья-китайцы заставить его стабилизировать питание от юсб?
      В таком случае может греться, т.к. ему элементарно не хватает напряжения.
      Если запитать от юсб и посмотреть напряжение в юсб и на «5в» Ардуины?

    • на юсб — 5.06, на дуине — 4.48. печально…

    • я даже дорожку нашел от юсб к стабилизатору.

    • Найдите даташит на стабилизатор и посмотрите, где вход, где выход, не у всех одинаково.

    • я уже нашел даташит под него, но толку от этого мало. во общем скупой платит дважды. отправить плату назад, будет дороже чем купить плату… буду пользоваться подрезанным усб кабелем и таскать с собой блок питания от роутера…

    • Зачем так?
      А не проще перекинуть питание от юсб со входа на выход стабилизатора?
      Или причина всёж не в том?

    • перепробовал все. но если в обход стабилизатора, он становится кипяток, хоть яйца вари.
      придется выпаять его и поставить что нибудь типа LM2940CT-5.0.
      блин, покупал готовый модуль, а тут столько возни с ним =(

    • Китайцы всегда поражают своими «неожиданностями» =). я у них еще телефон заказал, посмотрим чем обрадуют))

    • Чтобы стабилизатор работал нормально, ему нужно минимум 7в,
      т.е. он не может выдавать 5в, имея 5в на входе.
      А питание от юсб стабилизировать надобности нет, поэтому оно подключается после стабилизатора.

  3. На счёт точки входжения в Arduinо. Какой ещё контроллер позволит ребёнку в 9 лет получить осязаемый результат?? Я знаю только один — Ардуино. Вот пример того как девятилетняя школьница из Севастополя настраивает на ардуино светодиодную матрицу 8х8 на драйвере MAX7219 https://youtu.be/BssRFlF3emg
    Повторюсь, 9 (!!!) лет. Всё объясняет, всё понимает, о чём говорит. По-детски, конечно, однако результат. 🙂
    Пусть кто-то считает, что Ардуино для детей, но драйвер MAX7219 и матрица-то абсолютно взрослые.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение