Наверное, практически каждому, кто имеет отношение к DIY, знаком контроллер ESP32. На нём создаются системы умного дома, роботы, квадрокоптеры и многое другое. Отдельным плюсом этого контроллера является невообразимое количество плат и модулей на его основе. Достаточно зайти на tindie.com и можно увидеть всю палитру идей. Но сегодня, я хотел бы провести небольшой обзор устройства на базе ESP32 от компании M5Stack — M5Stack ATOM Lite.
Технические характеристики
Рассмотрим технические характеристики, приведённые на официальном сайте, на странице устройства
Resources | Parameter |
---|---|
ESP32 | 240MHz dual core, 600 DMIPS, 520KB SRAM, Wi-Fi |
Flash | 4MB |
Power Input | 5V @ 500mA |
Port | TypeC x 1, GROVE(I2C+I/0+UART) x 1 |
PIN Port | G19, G21, G22, G23, G25, G33, G26, G32 |
RGB LED | SK6812 3535 x 1 |
IR | Infrared transmission |
Button | Custom button x 1 |
Antenna | 2.4G 3D Antenna |
Operating Temperature | 0°C to 60°C |
Net weight | 3g |
Gross weight | 12g |
Product Size | 24x24x10mm |
Package Size | 43x43x13mm |
Case Material | Plastic ( PC ) |
Итак, у нас в наличии:
ESP32 с 4 мегабайтами памяти;
Порт USB TypeC для питания и передачи информации — в отличии от большинства моделей M5Stack, аккумулятор отсутствует;
8 свободных портов ввода‑вывода, так же для подключения доступны пины 5V, 3.3V и GND — в общем с одной стороны немного, а с другой для большинства простых проектов — за глаза;
RGB светодиод, подключенный к пину G27;
Кнопка, подключенная к пину G39;
Инфракрасный светодиод, подключенный к пину G12;
Отдельно выведенная кнопка RESET.
И всё это упаковано в миниатюрный корпус 24×24×10mm. Визуально смотрится неплохо, пластик приятный.
Программирование
Но мы собрались здесь не для того, что бы смотреть на устройство, а для того, что бы его программировать. Согласно официальной документации, программирование возможно с помощью трёх систем:
Официального инструмента для блочного программирования от M5Stack — UI Flow
Arduino IDE
Micropython
На самом деле, UiFlow транслирует визуальные блоки в код Micropython, поэтому с точки зрения языков программирования — их всего два — Arduino C и Micropython. Но мы рассмотрим все варианты.
UiFlow
Перед тем, как начать программировать с помощью UiFlow, на наше устройство необходимо установить сборку Micropython, от компании M5Stack. Для этого существует утилита M5Burner, в которой хранятся ссылки на все официальные и некоторые неофициальные сборки для всех устройств M5Stack.
Скачиваем необходимую нам сборку и устанавливаем её. В процессе установки возможно указать данные для подключения к WiFi сети. Зачем? Потому что для программирования с помощью UiFlow не обязательно быть подключенным к устройству с помощью провода, а достаточно указать данные для подключения к интернету, а затем в UiFlow указать API ключ для подключению к девайсу.
Все настройки можно так же посмотреть в M5Burner, после успешной установки у вас появится кнопка Configure, нажав на которую можно просмотреть и, при необходимости, изменить настройки.
Некоторые данные, такие как MAC‑адрес, или APIKEY — изменить нельзя. Start Mode — это указание, в каком режиме будет запускаться устройство:
Internet Mode — будет пытаться подключиться к сети, а затем получать информацию с сервера flow.m5stack.com;
USB Mode — будет подключаться и пытаться получать команды через USB кабель;
App Mode — будет пытаться запустить программу, которая уже сохранена в памяти.
Я указал данные для подключения к своей сети, моё устройство перезагрузилось и RGB светодиод начал мигать зелёным. Подключимся к UIFlow и попробуем написать нашу первую программу.
В настройках(они довольно неплохо спрятаны, что бы открыть их — необходимо нажать на надпись Api в левом нижнем углу) необходимо выбрать устройство и ввести APIKEY, который мы посмотрели в M5Burner‑e. Если всё сделано правильно, то вы увидите зелёную надпись — Connected. UiFlow позволяет как запустить программу разово — используя кнопку Run, так и загрузить её на устройство, что позволит пользоваться ей, при переходе в App Mode.
Подключим светодиод к одному из доступных нам пинов и напишем простейшую программу — будем зажигать и гасить светодиод по нажатию кнопки.
Вроде бы всё просто и понятно:
Блок Setup — отвечает за то, что происходит при запуске программы — инициализировали пин, к которому подключен светодиод и установили на нём значение равное 0.
Блок обработки нажатия на кнопку — инвертирует значение на пине.
Но давайте посмотрим, как выглядит программа на Micropython — которая была сгенерирована:
from m5stack import *
from m5ui import *
from uiflow import *
import machine
import math
def buttonA_wasPressed():
global pin0, pin1
pin1.value(math.fabs(1 - (pin1.value())))
pass
btnA.wasPressed(buttonA_wasPressed)
pin1 = machine.Pin(25, mode=machine.Pin.OUT, pull=machine.Pin.PULL_UP)
pin1.value(0)
Программа была скопирована из редактора ASIS, давайте посмотрим, что сразу бросается в глаза:
Большое количество пустых строк.
Импорты с использованием оператора
*
, что для такой минималистичной программы — излишне.Использование глобальных переменных.
Непонятно откуда взявшаяся переменная pin0, и использование ключевого слова pass после кода функции.
В общем, в использовании блоков есть своя простота и удобство, особенно для проведения занятий с детьми или мастер‑классов, но конвертация из блоков в код немного хромает. Попробуем исправить это и напишем программу на Micropython, без использования UIFlow. Для этого можно просто переключиться в USB режим используя M5Burner, но я для «чистоты эксперимента» установлю стандартную сборку Micropython.
Micropython
Для разработки с использованием Micropython я буду использовать недавно обнаруженную мной на просторах сети IDE — ESP32 MPY‑Jama.
Напишем программу, которая по нажатию кнопки включает случайный цвет на встроенном светодиоде.
from machine import Pin
from time import sleep
import neopixel
from random import randrange
button = Pin(39, Pin.IN, Pin.PULL_UP)
neo_strip = neopixel.NeoPixel(Pin(27), 1)
def set_random_color(strip):
strip[0] = (randrange(255), randrange(255), randrange(255))
strip.write()
while True:
first = button.value()
sleep(0.01)
second = button.value()
if not first and second:
set_random_color(neo_strip)
Выглядит получше, но тут свои недостатки, например, всё ещё нет встроенного механизма для обработки кнопок, приходится использовать проверку состояний кнопки с задержкой. На самом деле — существует реализация кнопок, с красивым назначением функций, на основе библиотеки uasyncio
, которая позволяет имитировать ассинхроность, но я с ней ещё не разобрался.
Arduino IDE
Напоследок, я оставил работу в Arduino IDE. Для работы с M5Stack можно использовать стандартные библиотеки и платы на основе ESP32 — работать будет, контроллер‑то один и тот же, но компания‑разработчик предлагает добавить в менеджер плат свои наработки.
Для этого, в дополнительных платах, в настройках, необходимо добавить следующую ссылку:
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
А затем установить набор в менеджере плат.
Кроме этого, существует отдельная библиотека M5Atom, установим и её. Важно, что в этой библиотеке находятся функции и методы не только для нашего модуля, но и для его старшего брата — M5Stack ATOM Matrix.
Из всего богатства доступных на борту модулей мы ещё не использовали инфракрасный светодиод. Его можно использовать только для отправки команд — так что управлять устройством с пульта не получится, зато этот самый пульт мы можем проэмулировать.
Напишем программу для эмуляции нажатия на кнопку вкл/выкл пульта от телевизора.
Для начала необходимо получить NEC код кнопки нашего пульта, для этих целей я воспользовался Flipper Zero и вот что увидел на экране:
A — это адрес, C — это команда.
#include "M5Atom.h"
#include "TinyIRSender.hpp"
void setup() {
M5.begin();
}
void loop() {
if (M5.Btn.wasPressed()) {
// Указываем необходимые параметры
// 12 - пин, к которому подключен IR
// 4 - адрес
// 8 - команда
// 1 - сколько раз отправить команду
sendNECMinimal(12, 4, 8, 1);
}
M5.update();
}
Подключаем необходимые библиотеки — M5Atom
для обработки нажатия на кнопку и TinyIRSender
(это часть библиотеки Arduino‑IRremote) — для отправки команды. Теперь только докупить внешний аккумулятор и пульт с одной кнопкой — готов!
Заключение
В данной статье я постарался пробежаться по основным достоинствам M5Stack ATOM Lite. Мне кажется, что это неплохое устройство с большими возможностями, которые можно расширить за счёт дополнительных модулей, как и от компании производителя, так и кастомных.
Что касается использования ПО, такого как UiFlow и M5Burner, к нему нужно подходить аккуратно, используя по необходимости, потому что они не всегда предоставляют красивый и оптимальный код или прошивку.
К сожалению, найти полную документацию по M5Stack библиотекам для Micropython у меня не получилось, то есть ясно, что в них много чего интересного, но документацию приходится вытаскивать по частям из разных примеров, а так как часто используются импорты вида from m5stack import *
, то разобраться довольно сложно.
В целом девайс интересный и ему можно найти массу применений, как и в хобби‑проектах, так и для обучения.