Установка Micropython на esp8266 и утилита mpfshell
Я давно и прочно люблю 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