MicroPython:Введение/MicroPython
MicroPython[1]
MicroPython – это минимизированная и эффективная реализация языка программирования Python 3, включающая в себя небольшую часть стандартной библиотеки Python и оптимизированная для работы на микроконтроллерах и в ограниченных условиях.
MicroPython PyBoard – это компактная электронная печатная плата, позволяющая запустить MicroPython на «голом железе», что дает вам низкоуровневую ОС на Python, которую можно использовать для управления самых разных электронных проектов.
В MicroPython имеется широкое разнообразие продвинутых функций: интерактивная командная строка, поддержка целых чисел произвольной точности, замыкания, списковое включение, генераторы, обработка исключений и многое другое. Но при этом он достаточно компактен, чтобы уместиться в пределах 256 Кб кодового пространства и 16 Кб памяти RAM.
MicroPython нацелен на максимальную совместимость с обычным Python, чтобы вы могли без труда перенести код с ПК на микроконтроллер или встраиваемую систему.
Полноценный Python с аппаратно-зависимыми модулями
MicroPython – это полноценный компилятор и среда выполнения Python, который можно запустить на «голом железе» (т.е. на устройстве, на котором не установлено никакого ПО). Установив MicroPython, вы сразу же получаете интерактивную командную строку (REPL), с помощью которой можно выполнять различные команды, а также возможность запускать и импортировать скрипты из встроенной файловой системы. REPL оснащена такими функциями как история, заполнение с помощью клавиши Tab ⇆ , автоматический отступ и режим вставки.
MicroPython пытается быть максимально совместимым с обычным Python (известным как CPython), так что если вы знаете Python, то точно знаете и MicroPython. С другой стороны, чем больше вы узнаете о MicroPython, тем лучше ваш навык в Python.
Вдобавок к реализации нескольких ключевых библиотек Python в MicroPython есть модули вроде machine для доступа к низкоуровневым аппаратным компонентам.
Пример 1
import pyb
# включаем светодиод:
pyb.LED(1).on()
# печатаем текст в последовательную консоль:
print('Привет, MicroPython!')
Пример 2
from machine import Pin
# создаем I/O-контакт в режиме вывода данных:
p = Pin('X1', Pin.OUT)
# переключаем контакт:
p.high()
p.low()
Пример 3
from machine import Pin, I2C
# создаем I2C-шину:
i2c = I2C(scl=Pin('X1'), sda=Pin('X2'))
# сканируем подключенные устройства
# (они будут возвращены в виде списка):
dev_list = i2c.scan()
# записываем и считываем данные с устройства:
i2c.writeto(0x42, b'4')
data = i2c.readfrom(0x42, 4)
# групповые операции обращения к памяти:
i2c.writeto_mem(0x42, 0x12, b'')
data = i2c.readfrom_mem(0x42, 0x12, 2)
Пример 4
# весь спектр типов числовых значений
# малые целые числа (помещаются в машинное слово):
>>> 123
123
# большие целые числа:
>>> 1 << 160
1461501637330902918203684832716283019655932542976
# числа с плавающей точкой:
>>> 1.23e6
1230000.0
# сложные числа:
>>> (1 + 2j) * 4j
(-8+4j)
Пример 5
# В MicroPython есть ассемблерная вставка
import micropython
# функция, созданная с помощью ассемблерной вставки MicroPython,
# для архитектуры Thumb:
@micropython.asm_thumb
def asm_add(r0, r1):
add(r0, r0, r1)
# используем ее как обычную Python-функцию:
total = asm_add(1, 2)
Пример 6
# печатаем список с содержимым корневой директории:
print(os.listdir('/'))
# распечатываем содержимое текущей директории:
print(os.getcwd())
# открываем и считываем файл с SD-карты:
with open('/sd/readme.txt') as f:
print(f.read())
Пример 7
import machine
# задаем частоту процессора на 84 МГц:
machine.freq(84000000)
Плата PyBoard
PyBoard – это официальная микроконтроллерная плата проекта MicroPython с полной поддержкой его программных функций. Вот компоненты, которыми она оснащена:
- Микроконтроллер STM32F405RG.
- Flash-память ROM (1024 Кб) и память RAM (192 Кб)
- Коннектор Micro-USB для питания и последовательной коммуникации
- Слот для карты Micro SD, поддерживающий стандартные SD-карты и SD-карты большой вместимости
- 3-осевой акселерометр MMA7660
- Часы реального времени с опциональной резервной батарейкой
- Двадцать четыре GPIO-контакта на левом и правом краях и пять GPIO-контактов в нижнем ряду плюс GPIO-контакты для светодиода и кнопки-переключателя в нижнем ряду
- Три 12-битных аналогово-цифровых преобразователя (АЦП), доступные на 16 контактах, 4 из которых защищены от заземления
- Два 12-битных цифро-аналоговых преобразователя (ЦАП), доступные на контактах X5 и X6
- Четыре светодиода (красный, зеленый, желтый и синий)
- Одна кнопка сброса и одна пользовательская кнопка-переключатель
- Встроенный 3.3-вольтовой LDO-регулятор напряжения, способный давать 250 мА; входное напряжение варьируется между 3.6 и 16 вольтами
- DFU-загрузчик в ROM, облегчающий обновление прошивки
MicroPython в действии
https://www.youtube.com/watch?v=5LbgyDmRu9s
Полностью бесплатное ПО с открытым кодом
MicroPython написан в C99, и все ядро MicroPython полностью распространяется по очень свободной лицензии Массачусетского технологического университета (MIT) и доступно для общего пользования. Большинство библиотек и модулей расширения (некоторые из которых созданы сторонними разработчиками) тоже распространяются по лицензии MIT или похожим лицензиям.
Вы можете свободно использовать и адаптировать MicroPython для личных нужд, в образовательных целях и для коммерческих продуктов.
MicroPython разрабатывается открыто на GitHub, а его исходный код доступен на этой GitHub-странице и на странице загрузок. К разработке проекта приглашаются все желающие.
Передовой и крайне надежный код
В MicroPython реализовано много продвинутых техник программирования плюс ряд приемов, позволяющих обеспечить компактность кода и наличие большого количества функций.
Вот некоторые из наиболее примечательных функций MicroPython:
- Высокая адаптивность, обеспечиваемая множеством параметров конфигурации на стадии компиляции.
- Поддержка многих архитектур (x86, x86-64, ARM, ARM Thumb, Xtensa).
- Широкий набор тестов (более 590) и более 18500 тестовых сценариев.
- Покрытие кода для ядра составляет 98.4%, а для ядра плюс модули расширения – 96.3%.
- Короткое время запуска с момента старта до загрузки первого скрипта (150 микросекунд, чтобы дойти до «boot.py» на PyBoard v1.1, работающей на 168 МГц).
- Простой, быстрый и надежный сборщик мусора для кучи.
- При нехватке места в куче будет возбуждено исключение MemoryError.
- При достижении предела стека будет возбуждено исключение RuntimeError.
- Минимальная задержка работы Python-кода во время аппаратных прерываний.
- Ошибки оснащены обратной трассировкой и умеют сообщать номер проблемной строчки исходного кода.
- Свертка констант в парсере/компиляторе.
- Тегированные указатели, позволяющие уместить малые целые числа, строки и объекты в машинное слово.
- Прозрачный переход от малых целых чисел к большим целым числам.
- Поддержка 64-битной NaN-упаковки (боксинга).
- Поддержка 30-битного «втискивания» чисел с плавающей точкой в машинные слова, позволяющая не использовать память в куче.
- Генерирование кросс-компиляторного и замороженного байт-кодов, что позволяет получить заранее скомпилированные скрипты, не занимающие память RAM (кроме создаваемых ими динамических объектов).
- Многопоточность при помощи модуля _thread с глобальной блокировкой интерпретатора («global-interpreter-lock» или GIL). Разработка этой функции пока не завершена – в данный момент она доступна лишь на некоторых портах.
- Эмиттер нативного кода напрямую генерирует машинный код, а не код для байт-кодной виртуальной машины.
- Ассемблерная вставка (в данный момент есть команды только для Thumb и Xtensa).
Онлайн-материалы
Ниже – ссылки на несколько ресурсов, на которых можно более подробно узнать о MicroPython и следить за его разработкой:
- Подписка на новостную рассылку
- Документация
- Форум, где общается сообщество MicroPython
- GitHub-репозиторий, где можно сообщить о баге и следить за разработкой проекта или даже присоединиться к ней.