MicroPython – это облегченная версия языка программирования Python, специально разработанная для программирования микроконтроллеров, систем-на-чипе (SOCs) и других встраиваемых систем. MicroPython – это, по сути, упрощенный вариант Python 3, и он совместим с ним по синтаксису.
В настоящее время Python является одним из самых популярных языков программирования, изучаемых в школах и других учебных заведениях. Поэтому для тех, кто знаком с программированием в Python, переход на MicroPython для программирования микроконтроллеров будет представляться значительно более легким делом, чем изучение такого достаточно сложного языка как C++.
Хотя MicroPython пока еще отстает по популярности от C и C++ при программировании микроконтроллеров и встраиваемых систем, его популярность растет с каждым годом и все большее число платформ заявляю о его поддержке.
В данной статье мы рассмотрим основы программирования модуля ESP32 на языке MicroPython с помощью программного обеспечения Thonny IDE. Мы рассмотрим почему MicroPython перспективен для программирования модулей ESP32 и загрузим в него программу для мигания светодиодом, написанную на MicroPython.
Ранее на нашем сайте мы также рассматривали программирование модуля ESP8266 на MicroPython.
MicroPython против Arduino C – что лучше
Как мы ранее уже выяснили, использование Arduino IDE является достаточно простым способом программирования модуля ESP32. В данном случае мы используем Arduino версию языков C или C++. Эти два языка в предыдущие два десятилетия были самыми популярными инструментами для программирования микроконтроллеров и встраиваемых систем, а использование Arduino позволило упростить их изучение для многих пользователей. Вдобавок к этому Arduino сейчас является одним из самых больших сообществ в мире в данной тематике со множеством библиотек, регулярно выпускаемыми обновлениями, постоянным добавлением поддержки новых плат и т.д. Все это делает ее чрезвычайно удобной для программирования микроконтроллеров и встраиваемых систем. Пожалуй, недостатком данной системы является лишь то, что Arduino C работает только с Arduino IDE. Поскольку любая IDE (интегрированная среда разработки) имеет определенные ограничения, то Arduino IDE не является оптимальным решением для определенных случаев разработки программного кода.
MicroPython, с другой стороны, является достаточно новым языком программирования. Конечно, сейчас его популярность значительно уступает Arduino, но она растет быстрыми темпами с каждым годом. К тому же MicroPython является упрощенной версией языка Python, который в настоящее время является одним из самых популярных языков программирования, поэтому если вам какие то проблемы не удается решить в сообществе MicroPython, то их можно попробовать решить в сообществе Python, которое уже сравнимо по величине с сообществом Arduino.
Также MicroPython имеет ряд свойств, которыми не обладает Arduino. Одним из таких свойств является REPL (Read-Evaluate-Print). Данное свойство позволяет вам подключаться к плате и исполнять код (часть кода) на ней быстро, без необходимости его компиляции. Таким образом вы можете протестировать работу в плате отдельных частей кода.
По мнению многих экспертов MicroPython является более простым в изучении и работе чем язык Arduino C, но должно пройти некоторое время прежде чем он раскроет свой потенциал, а пока что программирование встраиваемых систем на C и C++ более распространено. Но учитывая современные тренды развития информационных технологий, такие как машинное обучение, компьютерное зрение и т.д., вполне ожидаемо, что MicroPython может стать будущим разработки для микроконтроллеров и встраиваемых систем.
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Резистор 100 Ом (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Схема проекта
Схема проекта мигания светодиодом на ESP32 с помощью MicroPython представлена на следующем рисунке.
Вместо внешнего светодиода вы также можете использовать встроенный в модуль ESP32 светодиод.
Загрузка прошивки MicroPython в модуль ESP32
Выполните следующую последовательность шагов.
Шаг 1. Скачайте бинарный файл (bin file) последней версии прошивки (firmware) MicroPython с его официальной страницы скачиваний. На этом этапе вам необходимо будет выбрать одну из 3-х опций в зависимости от того, с чем вы хотите в дальнейшем работать:
- стабильная версия прошивки (Stable firmware);
- ежедневная версия прошивки (Daily firmware);
- ежедневная версия прошивки с поддержкой SPIRAM.
Если вы только начинаете работу с MicroPython, то вам лучше всего выбрать стабильную версию прошивки (Stable firmware). Если вы уже продвинутый пользователь в использовании MicroPython ESP32, вы можете выбрать ежедневную версию прошивки. Если ваша плата (модуль) поддерживает SPIRAM, то вы можете выбрать версию прошивки с поддержкой этой опции – это позволит вам адресовать больший объем оперативной памяти (RAM).
Со страницы закачек прошивки MicroPython выберите прошивку для имеющейся у вас платы (модуля) ESP32.
Шаг 2. Далее вам необходимо загрузить скачанную прошивку в модуль ESP32. Для этого вам необходимо перевести вашу плату (модуль) в режим загрузки (bootloader mode) и затем с помощью специального программного обеспечения скопировать прошивку с вашего компьютера в плату (модуль).
Способ перевода вашей платы (модуля) в режим загрузки во многом зависит от того какая у вас плата (модуль) ESP32. Необходимо смотреть даташит на ваш модуль (плату) чтобы выяснить это. Но, к счастью, большинство плат ESP32 содержат USB коннектор, преобразователь USB в последовательный порт и контакты DTR и RTS – все это позволяет достаточно просто загружать прошивку в модуль (плату).
К примеру, для платы DOIT DevKit и многих типов плат (модулей) ESP32 для их перевода в режим загрузки достаточно всего лишь нажать кнопку загрузки (boot button), находящуюся на них.
Для загрузки прошивки MicroPython в модуль ESP32 мы будем использовать инструмент (программу) под названием esptool.py.
Для работы esptool.py необходимо чтобы на вашем компьютер был установлен Python 2.7, Python 3.4 или более новая версия Python. Мы рекомендуем версию Python 3.7.X, которую можно загрузить с ее официального сайта.
Когда Python 3 будет установлен на ваш компьютер, с официального репозитория ESP скачайте последнюю стабильную версию esptool.py или откройте окно термина чтобы установить ее с помощью установщика pip.
При ее установке с помощью pip в окне терминала выполните команду:
1 |
pip install esptool |
Если эта команда не работает, то попробуйте одну из следующих команд:
1 2 |
pip3 install esptool python -m pip install esptool |
Во время установки esptool.py ваше окно терминала будет выглядеть примерно следующим образом:
После установки esptool вы можете запустить ее на исполнение с помощью команды:
1 |
esptool.py |
Если установка прошла успешно, то вы в окне терминала должны увидеть ряд сообщений, подтверждающих это:
Шаг 3. Перед тем как загружать прошивку в модуль ESP32 желательно сначала полностью очистить его флэш память. Для этого держите нажатой кнопку загрузки (boot/flash button) на вашем модуле и выполните команду:
1 |
esptool.py --chip esp32 erase_flash |
Как только процесс очистки памяти начнется вы можете убрать палец с кнопки загрузки. Программа esptool автоматически определит порт, к которому подключен порт ESP32. Когда процесс очистки памяти закончится вы должны увидеть примерно следующий экран:
Если появилось сообщение об ошибке это будет означать что ваша плата (модуль) находились не в режиме загрузки (boot/flash mode) и вам необходимо попробовать снова.
Шаг 4. Когда стирание памяти будет закончено вы сможете начать загрузку новой прошивки (firmware) в модуль с помощью команды:
1 |
esptool.py --chip esp32 --port <enter_the_serial_port_to_which_your_board_is_connected> write_flash -z 0x1000 <location_of_the_bin_file> |
Это общий вид команды. В данной команде вам необходимо указать номер COM порта, к которому подключен модуль и местоположение bin файла с прошивкой, который вы скачали ранее. Чтобы упростить вид команды вы можете сменить каталог на тот, в котором расположен bin файл, поэтому в команде в качестве пути к файлу необходимо будет ввести только имя этого файла. В данном случае, к примеру, данная команда может выглядеть следующим образом:
1 |
esptool.py --chip esp8266 --port COM4 write_flash --flash_mode dio --flash_size detect 0x0 esp32-ppp-fix.bin |
После успешного выполнения данной команды вы должны увидеть сообщение, свидетельствующее о том, что в ваш модуль (плату) успешно загружена прошивка MicroPython. После этого вы сможете писать программы для модуля в интегрированной среде разработки (IDE), поддерживающей Python.
Установка Thonny IDE
После того как прошивка загружена в модуль ESP32 нам необходимо установить какую-нибудь интегрированную среду разработки, поддерживающую язык Python (Python IDE).
Существует несколько Python IDEs, поддерживающих язык MicroPython, например, Mu, Thonny, UPyCraft и т.д. В данном проекте мы будем использовать среду Thonny, основанную на Raspberry Pi OS. Скачать Thonny IDE можно с ее официального сайта.
Чтобы программировать встраиваемые системы с помощью Thonny IDE необходимо чтобы интерпретатор в ней был сконфигурирован для работы с MicroPython. Для этого в ней выберите пункт меню Tools > Options и затем перейдите на вкладку interpreter. Вы должны увидеть окно, показанное на рисунке ниже. На ней в выпадающем списке выберите MicroPython и выберите порт, к которому подключена плата (модуль).
После этого вы сможете программировать ваш модуль ESP32 с помощью Thonny IDE.
Объяснение программы для модуля ESP32 на MicroPython
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В нашем проекте мы будем с определенной периодичностью включать и выключать светодиод, подключенный к модулю ESP32. Фактически, программа мигания светодиодом для микроконтроллеров играет такую же роль, как и программа выводящая на экран "hello world" для обычных компьютеров.
Поскольку язык MicroPython не поставляется с полным набором библиотек, характерных для обычного Python, он поставляется с дополнительным набором библиотек, которые помогают управлять контактами ввода/вывода (GPIO) и взаимодействовать по коммуникационным интерфейсам. Одним из этих библиотек является модуль machine. Функции в этом модуле позволяют предоставлять непосредственный и неограниченный доступ к таким аппаратным блокам как CPU, таймеры, шины и т.д. Данный модуль вы наиболее часто будете использовать в своих проектах на MicroPython.
Для написания кода программы создайте новый файл и сохраните его под именем main.py. Этот файл будет загружаться каждый раз когда на модуль ESP32 будет подаваться питание. Этот файл можно сохранять и под другим именем, это допустимо, но когда вы будете загружать код этого файла в модуль ESP32, то IDE автоматически переименует его в main.py.
В начале программы мы подключим (импортируем) используемые нами модули. Модуль Pin позволяет нам обращаться к конкретным контактам ввода/вывода, а модуль sleep позволяет нам использовать функции задержки в программе (аналог функции delay() для плат Arduino).
1 2 |
from machine import Pin from time import sleep |
Далее установим режим работы используемого контакта на вывод данных – аналог функции pinMode() для Arduino.
1 |
led = Pin(2, Pin.OUT) |
Затем сформируем цикл while. На языке MicroPython цикл while очень похож на цикл void loop() для Arduino. В нашем цикле while мы будем включать светодиод на полсекунды, а затем выключать его на другие полсекунды.
1 2 3 4 5 |
while True: led.high() sleep(0.5) led.low() sleep(0.5) |
Соответственно, полный код нашей программы мигания светодиодом выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 |
from machine import Pin from time import sleep led = Pin(2, Pin.OUT) while True: led.high() sleep(0.5) led.low() sleep(0.5) |
Загрузите код этой программы в ваш модуль используя пункт меню “device” в Thonny IDE и затем выбрав в нем пункт “upload current script as main.py script”.
После загрузки программы в модуль вы должны увидеть как светодиод начнет мигать с интервалом в 0,5 секунды.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 |
from machine import Pin from time import sleep led = Pin(2, Pin.OUT) while True: led.high() sleep(0.5) led.low() sleep(0.5) |