Разработка и тестирование микроконтроллеров на Python

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Рынок интернета вещей растет значительными темпами и разработка кода для микроконтроллеров важна для любых проектов, где подразумевается наличие какого-либо вспомогательного оборудования или носимого устройства. Для разработки программного обеспечения под встраиваемые микроконтроллеры сейчас (кроме C/C++) можно использовать многие другие технологии (например, TinyGo, Dart/Flutter, Rust), так же как и Python в наборе библиотек MicroPython, который работает как со своей платой (pyboard), так и с другими микроконтроллерами (например платами на процессорах ESP8266 или STM32). В этой статье мы рассмотрим общие подходы к разработке и тестированию прошивок для микроконтроллеров с использованием Python.

MicroPython предоставляет упрощенную реализацию стандартной библиотеки python и несколько дополнительных модулей для взаимодействия с оборудованием. При использовании pyboard основная функциональность будет доступна через модуль pyb, но в целом может использоваться следующий набор модулей:

  • machine - подключение к оборудованию (например, может использоваться для получения или изменения тактовой частоты)

    • Pin - доступ к цифровому пину (например, переключение управляемого устройства)

    • ADC - доступ к аналоговому пину (например, получение с внешнего датчика температуры или освещенности)

    • I2C - доступ к устройствам шины (часто используется для подключения внешних датчиков, каждое устройство имеет уникальный идентификатор)

    • SPI - высокоскоростная шина (например, может использоваться для подключения к Card reader или к LCD-экранам)

    • PWM - использование ШИМ (широтно-импульсной модуляции) на цифровом пине (например, для управления яркостью подключенного индикатора)

    • RTC - встроенные часы (если есть)

    • WDT - таймер для перезапуска устройства при зависании (Watch-Dog Timer)

    • UART - доступ к последовательному порту (консоли), часто используется для отладки, поскольку микроконтроллер на компьютере разработки определяется как COM-порт и через него можно считывать сообщения от устройства и отправлять команды на устройства

  • bluetooth - доступ к управлению устройствами

  • btree - простая база данных

  • cryptolib - поддержка криптографии (шифрование, хэши, подпись)

  • framebuf - работа с экранным буфером

  • neopixel - поддержка светодиодных панелей (WS2812)

  • network - настройка сети (в том числе WiFi на поддерживаемых устройствах)

  • значительная часть модулей из стандартной библиотеки Python (и поддержка синтаксиса с async/await и большинства возможностей Python 3.6)

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

Для поддержки запуска кода micropython нужна поддержка со стороны прошивки на устройстве, которая может быть установлена на плату через esptool (для ESP8266/ESP32) или dfu-util, при этом на pyboard прошивка изначально поддерживает запуск байт-кода micropython. Для редактирования приложения можно использовать как расширения для IDE Jetbrains лии VSCode, так и специализированные MuEditor, uPyCraft, Thonny IDE, microIDE.

Рассмотрим на примере простого приложения, которое будет управлять включением лампы в зависимости от уровня освещенности. Внешний датчик освещенности будет подключен к аналоговому входу Y4 (или A0 для плат Arduino), управляющее устройство (реле) - к цифровому выходу Y12 (или GPIO12 для ESP8266).

Создадим простую реализацию и попробуем ее протестировать:

import machine
import pyb
import time

turned_on = False
y4 = machine.Pin('Y4')
y12 = machine.Pin('Y12')

while True:
  adc=pyb.ADC(y4)
  if adc>128:
    if not turned_on:
        turned_on = True
        y12(1)
  else:
    if turned_on:
        turned_on = False
        y12(0)
  time.sleep(1)

Для установки на аппаратное устройство установим дополнительно mpremote:

pip install mpremote
mpremote exec control.py

Mpremote также позволяет получить доступ к repl-консоли (mpremote repl), управлять файловой системой (cat, ls, cp, rm, mkdir, rmdir, touch). По умолчанию mpremote автоматически находит подключенное по usb-serial устройство.

При компиляции под STM32 требуется дополнительно установить кросскомпиляторы ARM GCC Toolchain (apt install arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib для Debian/Ubuntu). Micropython включает возможность компиляции python-кода в байт-код для запуска на микроконтроллере, для этого используется инструмент mpy-cross, а также позволяет устанавливать дополнительные пакеты с github через инструмент mip.

Для запуска тестов на устройстве можно использовать run-tests.py из каталога tests в micropython. Тесты располагаются в подкаталогах tests/ и каждый тест пропускается через компилятор mpy-cross и запускается на устройстве. Собственные тесты также могут быть добавлены к существующим тестам библиотеки, а также тесты могут быть реализованы как обычные приложения, которые могут быть запущены через mpremote.

Основная сложность в тестировании на реальных устройствах будет в вопроизведении сценариев управления, которые зависят от внешних условий. Один из вариантов - создание обратной связи на устройстве (например, соединение выходных и входных пинов для контроля переключения, или PWM-выходов с аналоговыми входа для симуляции изменения состояния датчиков). Второй вариант - использование симуляторов (например для ESP32 можно использовать wokwi), здесь также можно объединить пины и выполнять контроль через чтение состояния контрольных пинов (подключенных к выходным). Также можно установить Open Source симулятор ESP32 и взаимодействовать непосредственно с ним, в этом случае можно изменять значения входных пинов и проверять значения выходных (через подключение виртуального устройства wokwi-logic-analyzer, которая может сохранять историю изменения значений на 8 каналах в формате .VCD-файла, который может быть проанализирован программно или визуализирован через GTKWave). Для описания схемы соединения устройств симулятор получает json-файл и он может быть разработан в соответствии с реализацией тестируемого устройства.

Таким образом можно создавать и тестировать приложения для микроконтроллеров с использованием Python. К сожалению, ценой удобства является некоторая потеря производительности (см. сравнение C++, TinyGo, Rust и MicroPython), но для большинства задач автоматизации с использованием микроконтроллеров производительность не имеет решающего значения, а удобство разработки и использование привычного языка программирования значительно упрощает создание прошивок для микроконтроллеров.

В конце этой статьи хочу порекомендовать вам интересный урок от моих коллег из OTUS по теме: "Основы работы с PostgreSQL в Python". Зарегистрироваться на урок можно по этой ссылке.

Источник: https://habr.com/ru/company/otus/blog/717652/


Интересные статьи

Интересные статьи

Ранее я уже рассказывал о сужении типов с помощью isinstance(), assert и Literal. В сегодняшней заметке мы рассмотрим TypeGuard, новый специальный тип, который позволяет нам создавать кастомные функци...
Прошел почти год с тех пор, как мы опубликовали на GitHub библиотеку для машинного обучения NeoML. О чем, конечно же, была статья на Хабре. Мы обещали поддерживать и развивать ее. Сво...
В этой статье, переводом которой мы решили поделиться специально к старту курса о Data Science, автор представляет новый пакет Python для генерации кластерограмм из решен...
13 лет назад начался эксперимент по использованию Python в больших сервисах Яндекса. Эксперимент получился удачным (кто бы сомневался!) и Python начал свое победное поползновение по с...
В прошлой статье рассмотрено как можно получить информацию по финансовым инструментам. Дальше будет опубликовано несколько статей о том, что первоначально можно делать с полученными данными, как ...