Рынок интернета вещей растет значительными темпами и разработка кода для микроконтроллеров важна для любых проектов, где подразумевается наличие какого‑либо вспомогательного оборудования или носимого устройства. Для разработки программного обеспечения под встраиваемые микроконтроллеры сейчас (кроме 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». Зарегистрироваться на урок можно по этой ссылке.
Комментарии (3)
BobovorTheCommentBeast
00.00.0000 00:00Некоторая, это в 100 раз, причем на всяких задачах, где тяжесть языка не вылезает (вычисления crc и sha). Я не прочь питона на мк, просто не нравится, как углы срезают такими оговорками.
DarkTiger
Разумеется, как назвать статью - Ваше личное дело, но "Разработка и тестирование микроконтроллеров на Python" все же выглядит несколько амбициозно. Сразу на ум приходит Jazelle и все вот это вот. Или, с презрением отбросив Verilog, написали свой микроконтроллер для FPGA на Питоне.