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

08102859c7d9a718a98ab8142e88f7cb.png

Рынок интернета вещей растет значительными темпами и разработка кода для микроконтроллеров важна для любых проектов, где подразумевается наличие какого-либо вспомогательного оборудования или носимого устройства. Для разработки программного обеспечения под встраиваемые микроконтроллеры сейчас (кроме 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». Зарегистрироваться на урок можно по этой ссылке.

© Habrahabr.ru