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