По мере того, как Интернет вещей становится все более популярным, возникает потребность в вычислительных решениях, которые работают в сети из небольших устройств, а не только с централизованными серверами обработки.

С этой целью разработчики всегда сталкиваются с требованиями к оборудованию, однако более современные решения, такие как периферийные вычисления, увеличивают наш спрос на такие компоненты.

Однако часто ошибочно полагают, что программирование граничных вычислений на этих контроллерах - нелегкое дело, поскольку они опираются на старые языки и имеют ограниченный потенциал. Тем не менее, это далеко от истины. Как заядлый программист на Python - недавнем, но очень популярном дополнении к сфере программирования - я хотел продемонстрировать, что мы действительно можем использовать современные технологии для получения желаемых результатов.

Аппаратная проблема

Так в чем проблема? Проблема в том, что многие разработчики приходят в отрасль, используя более новые языки, которые им нравятся. Думая об оборудовании, очень легко начать думать о старых решениях, и это означает, что мы до сих пор пытались избегать - мы не хотим опираться на старые подходы.

Хотя Python набирает популярность и, благодаря множеству различных фреймворков и библиотек, может укрепить свои позиции в качестве эффективного инструмента для решения широкого спектра программных проблем, есть части электронного мира, которые все еще заняты старой гвардией языки программирования. Я говорю об электронном оборудовании в виде микроконтроллеров (MCU), которые уже много лет, практически без исключения, программируются с использованием C или C ++, как правило, с очень специфичными для оборудования библиотеками.

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

Это проблема, которая мало чем отличается от устаревших систем: если новые решения по-прежнему не будут использоваться, то зависимость от более старых, менее популярных вариантов будет только расти. Наши устройства IoT могут быть динамичными и дальновидными, но если базовые микроконтроллеры по-прежнему привязаны к ограниченному набору опций, это ограничивает конечный потенциал, который наши решения могут извлечь из них.

И снова мы видим, что происходит новый большой скачок, когда такие языки, как JavaScript (JS) и Python, вступают в стадию программирования языков для оборудования. Этим постом я хотел бы призвать всех, кто не решается проверить эти новые возможности, просто попробовать их с MicroPython.

Что такое MicroPython?

MicroPython - это реализация небольшого подмножества интерпретаторов Python 3.5. Он частично зависит от платформы, что означает, что у него есть часть, которая будет отличаться в зависимости от оборудования, на котором он работает. Он был портирован на различные аппаратные платформы, которые содержат как промышленные микроконтроллеры, так и микроконтроллеры для любителей. По своей сути, он имеет уровень Python API (интерфейс прикладного программирования), построенный на основе библиотек C, предоставляемых производителем оборудования. Это ядро ​​затем используется библиотеками, написанными на чистом Python.

Зачем это нужно?

MicroPython дает вам возможности Python на микроконтроллере. Вместо того, чтобы писать код на C или C ++, а затем компилировать и загружать его на устройство, вы можете просто написать код на Python и запустить свою программу, как обычно на своем компьютере. Хотя я использовал MicroPython во многих проектах, он все равно впечатляет меня, особенно из-за репутации Python как ресурсоемкого и медленного.

Говоря о ресурсах - при написании кода обычно нужно больше помнить об аппаратных ограничениях, таких как количество ядер или размер памяти. В конце концов, 64 КБ для некоторых случаев недостаточно. MCU обычно менее снисходительны к распределению ресурсов, поэтому MicroPython включает другой механизм для смягчения этих связанных трудностей.

Возможность запускать Python и связанные с ним инструменты на MCU делает программную электронику доступной не только для любого программиста Python, но и для каждого начинающего программиста. Почему? Потому что Python - очень удобный язык, популярность которого растет, часто в качестве первого выбора для новичков по сравнению с JS или C ++.

Как это работает?

Секрет успеха MicroPython заключается в умном наборе преобразований, которые, хотя и не очень красивы или элегантны, позволяют коду, специфичному для платформы, стать API Python. MicroPython, как и CPython, написан на C и должен быть скомпилирован для конкретной машины. Такая версия MicroPython называется портом.

Как упоминалось ранее, в основе каждого порта лежит машинно-зависимый C API. Он должен быть упакован разными способами примерно 5 раз, становясь одной структурой данных за другой, чтобы окончательно преобразоваться в Python API, который можно использовать для выполнения машинно-зависимых операций. Помимо этой базы, можно использовать практически любую библиотеку, реализованную исключительно на Python.

Лучшие черты

MicroPython имеет некоторые функции, которые действительно меняют правила игры, когда дело доходит до программирования микроконтроллеров. Здесь я хочу показать вам, что, если вы знаете Python, аппаратное обеспечение для программирования абсолютно вам доступно.

Прежде всего, это интерпретатор Python, что означает, что он имеет полностью работающий REPL (read-eval-print-loop), поэтому вы можете писать свой код в реальном времени, импортировать библиотеки и делать все остальное, что вы обычно делаете в Python REPL.

Еще одна замечательная функция - это встроенная файловая система, которая позволяет загружать файлы в микроконтроллер, а затем читать и записывать в них. Я использовал эту функцию несколько раз, чтобы загрузить некоторый файл конфигурации в микроконтроллер, а затем запустить:

>>> import json
>>> with open('config.json', 'r') as f:
... config = json.loads(f)

Теперь у меня есть переменная config, которая представляет собой dict с загруженными в нее данными JSON (JavaScript Object Notation). По умолчанию MicroPython ищет файлы в своем корневом каталоге.

В большинстве случаев вы не захотите использовать REPL, а лучше напишете свою собственную программу, загрузите ее на устройство и заставите ее запускаться при запуске. К счастью, нет ничего проще - сразу после включения MicroPython запускает файл «boot.py», который обычно содержит настройки оборудования, а затем «main.py», который обычно должен содержать код вашего приложения. Конечно, вы можете загрузить свой код в несколько файлов, а затем импортировать из этих файлов, как если бы вы использовали обычный Python REPL.

Следующей важной функцией будет установка пакетов PyPI прямо на ваше устройство. Если у вас есть устройство с доступом в Интернет и вы настроили подключение к Интернету, вам просто нужно запустить:

>>> import upip
>>> upip.install('micropython-requests')

Теперь у вас установлен пакет urequests. Обычно пакеты устанавливаются внутри каталога «/ libs», из которого их можно импортировать так же, как если бы они находились в корневом каталоге, вызывая:

>>> import urequests

Специфические для машины операции выполняются так же легко, как уже описанные выше, но могут различаться между платформами. Вот пример настройки выходного контакта (например, контакта, подключенного к светодиоду) для микрочипа ESP8266:

>>> import machine
>>> pin = machine.Pin(15, machine.Pin.OUT)
>>> pin.value()
>>> pin.value(1)

Приведенный выше код создает новый объект Pin (который связан с контактом 15 платы) из машинной библиотеки, а затем использует значение свойства для чтения, а затем меняет его состояние на высокое. Если вы хотите создать входной контакт, вам нужно изменить machine.Pin.OUT на machine.Pin.IN. Это практически все, что вам нужно для программирования цифровых входов и выходов с помощью MicroPython.

Некоторые из лучших приемов, которые можно выполнить с помощью MicroPython, связаны с тем, что функции в Python являются первоклассными объектами. Это означает, что вы можете передать их в качестве параметров другой функции, что упрощает программирование обратных вызовов. При программировании цифровых входов часто требуется выполнить какое-либо действие при изменении состояния вывода. Вы можете написать свой простой цикл while, но он блокирует, поэтому мы не хотим его использовать. При программировании микроконтроллера вы обычно используете прерывания для реализации этой функции. Проще говоря, когда вы устанавливаете прерывание, оно отслеживает изменение состояния на данном выводе и запускает программу, когда это происходит. Добавьте к этому тот факт, что функции можно передавать как параметры, и вы получите следующее:

>>> import machine
>>> def irq_func(interrupt_pin):
... print("Interrupt happened on pin: {pin}".format(pin=interrupt_pin.id)
>>> input_pin = machine.Pin(15, machine.Pin.IN)
>>> machine.irq(trigger=machine.Pin.IRQ_FALLING, handler=irq_func)

И все - irq_func будет выполняться с выводом, на котором произошло прерывание, в качестве параметра.

Граничные вычисления - это один из двух основных типов приложений Интернета вещей, второй - облачные вычисления. В последнем случае вся вычислительная фаза обработки данных, полученных с устройств системы IoT, выполняется на центральном сервере, обычно в облаке, отсюда и название. Однако при пограничных вычислениях некоторая часть обработки или фильтрации данных выполняется на устройствах, которые собирают данные и являются частью сети - это так называемые граничные устройства.

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

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

Учитывая признанную пригодность Python для обработки данных, кажется, что MicroPython станет идеальным инструментом для программирования систем Edge Computing IoT. И действительно, это так! В качестве примера рассмотрим платформу IoT Amazon Web Services (AWS), которая предоставляет пакет разработки программного обеспечения (SDK) для Python. Его можно установить на MCU с помощью upip, о котором мы говорили ранее. Подключение к AWS IoT с помощью MicroPython не требует усилий, и, более того, большие части кода могут быть независимыми от платформы, что означает, что логику обработки данных можно легко экспортировать в другие приложения, написанные на Python, или из них.

Чтобы создать систему, способную выполнять пограничные вычисления, необходимы микроконтроллеры, обеспечивающие значительную вычислительную мощность (для микроконтроллера) и некоторые сетевые возможности. Самыми популярными микроконтроллерами на данный момент являются ESP8266 и ESP32. Это, вероятно, самые популярные микроконтроллеры, используемые в IoT. Оба они оснащены модулем WiFi и имеют довольно мощный микропроцессор. К тому же они очень дешевые. Учитывая их популярность, неудивительно, что MicroPython был перенесен для поддержки этих устройств.

Альтернативы

Альтернатив MicroPython не так много, и, похоже, есть только одна, которая не является прямым наследником MicroPython. Что касается последнего, есть два, которые стоит обсудить как жизнеспособные альтернативы.

CircuitPython - это форк MicroPython, предназначенный для использования с оборудованием Adafruit. Его основная цель - научить программированию с помощью микроконтроллеров. Между ним и MicroPython есть небольшие отличия, но код в основном тот же.

Pycom - это платформа Интернета вещей, которая предоставляет клиентам оборудование, программное обеспечение и сетевые решения. Прошивка для его микроконтроллеров имеет открытый исходный код и основана на MicroPython. Pycom прекрасно переработал AWS IoT Python SDK, что позволяет легко установить его на микроконтроллеры ESP32, работающие под управлением MicroPython.

Единственная альтернатива MicroPython с собственной кодовой базой - Zerynth. Это началось как Viper и представляет собой гибрид языка Python и C. Он типизирован и пытается объединить простоту разработки Python с контролем C. Zerynth также является платформой IoT и обеспечивает интеграцию со многими службами Cloud IoT. Некоторая часть языковой структуры Zerynth доступна для использования внутри MicroPython для оптимизации производительности кода.

Резюме

Системы и приложения Интернета вещей все чаще появляются в мире вокруг нас. Они несут ответственность за управление парком устройств во множестве сред. Тенденция оказывается стабильной, и широко признано, что Интернет вещей завоевывает мир. До сих пор, чтобы стать частью этого явления, нужно было изучать такие языки, как C или C ++. MicroPython позволяет каждому разработчику Python попробовать свои навыки программирования в мире микроконтроллеров.

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

Деловая перспектива

Если вы хотите максимально использовать возможности Интернета вещей, периферийные вычисления могут обеспечить быстрые и эффективные результаты, при этом экономя деньги. Однако, хотя облачные и бессерверные технологии могут помочь, для полного достижения этой цели вам необходимо оптимизировать микроконтроллеры (MCU) под этими устройствами. Использование более современных решений для программирования, таких как Python, может помочь обновить ваши микроконтроллеры и предоставить более доступное решение.

Первоначально опубликовано на https://www.pgs-soft.com.