Установка Micropython на esp8266 и утилита mpfshell

Зайчатки разума

Записная книжка айтишника

Установка Micropython на esp8266 и утилита mpfshell

2019-01-24 00:55:33 — Evgeniy Shumilov

  Я давно и прочно люблю Python. Это уникальный язык, позволяющий говнокодить заниматься прототипированием с очень высокой скоростью и уровнем комфорта. Мне нравится его синтаксис, его простота, его универсальность и гибкость. Так же мне интересны микроконтроллеры, поэтому за проектом под названием MicroPython я слежу уже давно. Вообще, создание реализации интерпретатора Python3, пусть даже и в очень обрезанном виде для микроконтроллеров - это нечто на мой взгляд удивительное. Но куда полезнее от восторгов перейти к практике. Заодно расскажу про одну интересную утилиту, которая существенно облегчает жизнь.


Установка прошивки

  Сначала ставим необходимые пакеты:

apt-get install python-pip python-setuptools
pip install esptool mpfshell

  Затем нужно подключить esp8266. Это можно сделать либо при помощи usb2uart переходника (внимание, питание на esp должно быть 3.3 вольта, так же как и уровень TX), либо напрямую, если у вас есть плата NodeMcu, Wemos D1 или какой-нибудь аналог. Проверяем, что появилось устройство. В моём случае на работу с ним были права у рута и группы dialout:

ls -lah /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 янв 15 17:34 /dev/ttyUSB0

  Добавляем нашего пользователя в группу dialout:

sudo adduser user dialout

  Проверяем текущий список групп.

id 
uid=1001(user) gid=1001(user) группы=10001(user),27(sudo),101(systemd-journal),103(systemd-network),105(systemd-bus-proxy),108(netdev),109(messagebus),999(docker)

  Как видим, для того, чтобы получить права необходимой нам группы, мало добавить пользователя в группу, нужно ещё и перезапустить терминал, либо на этот случай есть следующий чит:

su -u user

  Вводим пароль своего пользователя и вот, можно убедиться, что нужная нам группа в списке есть:

id
uid=1001(user) gid=1001(user) группы=1001(user),20(dialout),27(sudo),101(systemd-journal),103(systemd-network),105(systemd-bus-proxy),108(netdev),109(messagebus),999(docker)

  Теперь скачиваем прошивку тут: http://micropython.org/download#esp8266 На текущий момент актуальная прошивка имеет версию 1.9.4.

wget http://micropython.org/resources/firmware/esp8266-20180511-v1.9.4.bin

  Далее заливаем прошивку в контроллер с помощью esptool (здесь и далее будем считать, что устройство подключено как /dev/ttyUSB0):

esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 esp8266-20180511-v1.9.4.bin

Что же это такое - mpfshell

  До того, как я обнаружил эту утилиту, я страдал и пользовался esplorer, который в отношении юзабилити при работе с python оставляет желать лучшего. Мне необходимо было некое средство, которое позволяло бы нормально загружать python файлы на контроллер и запускать repl. Как раз такой утилитой и оказался mpfshell. Очень странно, что она так слабо распространена и долгое время я о её существовании даже не подозревал. Итак, сначала нужно открыть устройство через файл порта:

mpfshell ttyUSB0
Connected to esp8266

** Micropython File Shell v0.8.1, sw@kaltpost.de ** 
-- Running on Python 2.7 using PySerial 3.4 -- mpfs [/]>

  Либо можно просто запустить mpfshell, а затем написать open ttyUSB0. Если набрать help, то можно увидеть, что синтаксис команд очень похож на консольные команды ftp:

mpfs [/]> help

Documented commands (type help <topic>):
========================================
EOF cd exec get lcd lpwd md mput mrm put repl
cat close exit help lls ls mget mpyc open pwd rm

  То есть, ls покажет нам содержимое флеш памяти, а lls - покажет содержимое той директории, в которой вы открыли mpfshell. Дополнительная буква l в начале команды показывает, что команда будет выполнена локально, не на контроллере. Если в нашей локальной директории лежит файл mymodule.py, который мы хотим загрузить на контроллер, достаточно набрать put mymodule.py, а если мы хотим скачать файл test.py с контроллера на нашу систему, то выполняем get test.py. Для mput и mget работают регулярные выражения в именах файлов. По каждой команде можно получить дополнительную информацию, если вы наберёте help и имя интересующей вас команды. Приятной неожиданностью оказалось наличие команды cat, которая сразу позволяет посмотреть на содержимое нужных нам файлов. Из этого же шелла можно запустить repl (внутренний интерпретатор micropython, в котором можно сразу сделать import нужного и поэкспериментировать), выход из repl обратно - Ctrl + ]. Так же mpfshell умеет соединяться с ESP через websocket, но я пока не разобрался как, поэтому обычно удаляю с контроллера webrepl, который к тому же занимает много места. 

  И, в качестве вишенки на торте, mpfshell умеет пакетное выполнение команд. То есть, мы пишем в файле, какой порт открыть, какие директории создать, какие файлы в них положить и передаём имя файла в качестве параметра следующим образом: 

echo 'open ttyUSB0
put boot.py
mkdir mymodules
cd mymodules
lcd mymodules
mput *\.py' > mpfcommands.list
mpfshell -s mpfcommands.list

  Вышеобозначенный пример загрузит новый boot.py поверх старого (поосторожнее с этим), а затем создаст папку mymodules, в которую поместит все файлы с расширением *.py из локальной папки mymodules. Удобно. Можно сделать два локальных скрипта put и get, которые будут обновлять содержимое флеш на esp8266 без множества лишних телодвижений и редактировать эти файлы локально, используя ту среду, к которой вы привыкли. Скажем, sublime, pycharm или, как в моём случае, vim.

  За дополнительной информацией и примерами использования данной утилиты можно сходить на GitHUB.

Теги: esp8266, micropython

comments powered by Disqus