Microsoft IoT стек и не только... Часть 1. Популярные платы прототипирования без ОС
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Давно порывался написать статью об IoT, вот наконец дошли руки.
Из опыта предыдущих статей я понял, что рассказывать про инструмент не самая лучшая идея, посему буду рассказывать про технологии.
Собственно, я начинаю цикл статей, посвященных IoT. Статьи буду публиковать я и ребята из Azure Community, за что им огромное спасибо.
Начну я, пожалуй, с обзора платформ для программирования устройств. Их преимуществах и недостатках.
В этой статье мы поговорим о популярных платформах без ОС.
До появления платформы прототипирования Arduino, порог вхождения в разработку Hardware был достаточно высок. Разработчик должен был обладать знаниями языка Assembler или C. Позже появился и C++, но это не исправило ситуацию. К слову сказать, я до сиг пор пишу прошивки для микроконтроллеров на C, но при этом пробовал и другие языки, потому кое какой опыт имеется.
Ситуация в значительной степени изменилась, когда появилась платформа прототипирования Arduino с собственным языком программирования и набором стандартной периферии. Если кто еще не видел Arduino, то выглядит она вот так:
Сердцем этой платформы является микроконтроллер ATMega328. Микроконтроллер отличается от микропроцессора тем, что первый является самодостаточной единицей для выполнения кода. Т.е. в нем, в отличии от процессора, есть микропроцессор, оперативная память, память программ, энергонезависимая память, таймеры, генераторы и прочая периферия + набор портов для взаимодействия с внешним миром. Все это в одной микросхеме, эдакий маленький компьютер.
Конечно, если посмотреть на характеристики этого «компьютера», окажется, что он очень слабенький:
Flash: 32 Kbytes
RAM: 2 Kbytes
Pin Count : 28
Max. Operating Frequency: 20 MHz
CPU:
# of Touch Channels: 16
Max I/O Pins: 26
Ext Interrupts: 24
USB Interface: No
USB Speed: No
Казалось бы, ну что там в него можно впихнуть? Но тут не стоит забывать, что в микроконтроллере нет ОС, а код, который вы пишете, компилится в набор байт, без использования каких либо промежуточных фреймворков и прочего. У меня ни разу не получалось написать программу под этот микроконтроллер по объему превышающую память программ. Ну, естественно, если Вы поставите себе такую цель и займетесь Copy Paste Driven Development-ом, у Вас это быстро получится :)
Микроконтроллер обладает набором портов, которые могут иметь разное назначение:
Есть Digital порты, которые могут работать как на вход, так и на выход. Управляем мы этим программно. Если порт работает на вход, то мы можем считать состояние этого порта (получить логическую 1 или 0). Если порт работает на выход — мы можем записать значение 1 или 0 в этот порт.
1 или 0 — это эквивалент напряжения на портах (выводах микросхемы): 1 — это 5 вольт, 0 — это 0 вольт. Т.е. мы программно можем управлять напряжениями на портах (выводах микросхемы).
Есть аналоговые порты, которые так же могут работать как на вход, так и на выход. Но в отличии от цифровых портов, в которых есть только два устойчивых состояния, аналоговый порт может измерять напряжение в диапазоне от 0 до 5 воль. Измеренное напряжение мы в нашем приложении получаем в оцифрованном виде в диапазоне от 0 до 1024. Исходя из этого несложно посчитать, что минимальное изменение напряжение на входящем порте, которое мы можем отловить является 5/1024 = 0.00488 Вольт или 4.88 Миливольт.
В последующих статьях мы обязательно раскроем все возможности этого микроконтроллера, но сейчас давайте поговорим о коде.
Для примера я написал 2 куска кода, который делает одно и тоже: измеряет напряжение на одном из аналоговых портов (к нему прицеплен термодатчик), в случае превышения определенного порога (в коде этот порог 300, что соответствует напряжению 300 * 4.88 = 1.24 Вольт) на цифровом порте появляется логическая 1, соответственно напряжение на пине становится 5 вольт. К этому пину подключено реле, которое включает ГБО. Я это для автомобиля своего делал (правда для этой статьи код я упростил).
Итак, этот код на C выглядит вот так:
А для Arduino, на языке Arduino Wire выглядит вот так:
Думаю, вы почувствовали разницу.
Достоинства этой платформы:
• Дешевизна и доступность микроконтроллеров, что значительно удешевляет конечное устройство (примерно $1\шт при покупке у китайцев партии в 10шт). На радиорынке их полно, правда цена 80-100грн.
• Большое количество готовых библиотек для работы с разной периферией (Датчики, реле, GSM, GPS, Bluetooth, WiFi и прочие)
• Широкий спектр плат прототипирования (На картинке показана одна, но есть уже больше 20 вариаций плат, с разными микроконтроллерами, размерами и т.п.)
• Возможность заливать прошивку по USB много раз.
Недостатки:
• Убогая IDE. Как только Ваш проект на базе Arduino становится более-менее комплексным (несколько тысяч строчек кода), его тяжело поддерживать ввиду отсутствия Debug, авто заполнения и прочих прелестей взрослых IDE. По сути, Arduino IDE — Это текстовый редактор с компилятором и минимальной подсветкой.
• Не безопасно. Платформа слишком слабенькая, чтоб поддерживать протоколы HTTPS и другие защищенные протоколы.
• Нет эмуляции.
• Многопоточноть? Есть попытки реализации сообществом, но реально этого нет :)
• Проблема с обновлением по воздуху.
Более подробно о платформе тут.
Разработку более комплексных решений, которые содержат сложную логику работы одновременно с GSM, GPS, акселерометрами, гироскопами и т.д. проще осуществлять, используя более высокоуровневые языки программирования. Естественно, они дороже (имею ввиду чипы), но оно того стоит. Такой код легче поддерживать, используется более взрослая IDE с поддержкой In Chip Debug, эмуляцией, обновлением по воздуху и прочих вкусностей.
По-моему, самыми популярными чипами для подобного рода задач являются чипы серии STM32F4 от ST Microelectronics.
И тут у Вас есть выбор: Либо Java\Eclipse либо C#\Visual Studio
Я буду рассказывать о втором варианте.
Есть такая штука, как .Net Micro Framework. Это Open Source реализация некого маленького .Net, который не требует наличия операционной системы и становится на относительно слабенькие ARM чипы.
Параметры чипа STM32F417:
• 2x USB OTG (one with HS support)
• Audio: dedicated audio PLL and 2 full duplex I²S
• Up to 15 communication interfaces (including 6x USARTs running at up to 11.25 Mbit/s, 3x SPI running at up to 45 Mbit/s, 3x I²C, 2x CAN, SDIO)
• Analog: two
• Up to 17 timers: 16- and
• Easily extendable memory range using the flexible static memory controller supporting Compact Flash, SRAM, PSRAM, NOR and NAND memories
• Analog true random number generator
• The STM32F417 also integrates a crypto/hash processor providing hardware acceleration for AES 128, 192, 256, Triple DES, and hash (MD5, SHA-1)
А плата прототипирования выглядит вот так:
Плата Arduino совместимая и большинство периферии от Arduino можно использовать и тут.
Прошивка, как и прежде, заливается по USB, но уже напрямую из Visual Studio, для использования которой необходимо поставить SDK.
В случае с Netduino, код в Visual Studio, описанный выше, будет выглядеть вот так:
Данные чипы уже в другом ценовом сегменте: $15\шт при покупке партии 10шт, но в целом, можно взять и по дешевле. Например, на STM32F405 спокойно станет .Net Micro framework и его цена $5\шт при покупке партии в 10шт.
Достоинства:
• Относительная дешевизна и доступность микроконтроллеров, правда Atmega328 для Arduino все же дешевле
• Большое количество готовых библиотек для работы с разной периферией (Датчики, реле, GSM, GPS, Bluetooth, WiFi и прочие)
• Широкий спектр плат прототипирования и готовых встраиваемых модулей
• Возможность заливать прошивку по USB много раз.
• Богатая IDE, с режимом Debug и эмуляцией
• Поддержка многопоточности.
• Аппаратная поддержка шифрования
• Высокоуровневый язык программирования
Недостатки:
• Не обнаружил :). Нет, ну серьезно, меня реально все устраивает. Но на Java писать под эти чипы я не пробовал. Если кто пробовал — опишите впечатления. Было дело я не нашел готовой библиотеки под мой GSM модуль, так я ее на C# за день склепал. Все ж таки не на чистом C или Assembler ее писать.
Собственно, обе этих платы прототипирования крутят команды из IoT Лаборатории, которая с недавнего времени начала функционировать у нас в офисе, и есть первые выводы о целесообразности использования той или иной платформы:
Arduino хороша для простых задач, не требующих высокой степени защиты и скорости работы. Netduino применяется там, где проекты нацелены на B2B, т.к. там есть повышенные требования к безопастности.
Ну а какой язык программирования выбирать, решает каждая команда сама, исходя из своих знаний и опыта.
В следующей статье я расскажу о более взрослых платах на базе многоядерных ARM чипов с операционной системой (Windows и Linux) и об использовании облачного бэкенда для IoT.
118 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів