Наверное, практически каждому, кто имеет отношение к 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.

Внешний вид программы M5Burner
Внешний вид программы M5Burner

Скачиваем необходимую нам сборку и устанавливаем её. В процессе установки возможно указать данные для подключения к WiFi сети. Зачем? Потому что для программирования с помощью UiFlow не обязательно быть подключенным к устройству с помощью провода, а достаточно указать данные для подключения к интернету, а затем в UiFlow указать API ключ для подключению к девайсу.

Все настройки можно так же посмотреть в M5Burner, после успешной установки у вас появится кнопка Configure, нажав на которую можно просмотреть и, при необходимости, изменить настройки.

Вид конфигуратора UIFlow
Вид конфигуратора UIFlow

Некоторые данные, такие как MAC‑адрес, или APIKEY — изменить нельзя. Start Mode — это указание, в каком режиме будет запускаться устройство:

  • Internet Mode — будет пытаться подключиться к сети, а затем получать информацию с сервера flow.m5stack.com;

  • USB Mode — будет подключаться и пытаться получать команды через USB кабель;

  • App Mode — будет пытаться запустить программу, которая уже сохранена в памяти.

Я указал данные для подключения к своей сети, моё устройство перезагрузилось и RGB светодиод начал мигать зелёным. Подключимся к UIFlow и попробуем написать нашу первую программу.

Внешний вид UIFlow
Внешний вид 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 *, то разобраться довольно сложно.

В целом девайс интересный и ему можно найти массу применений, как и в хобби‑проектах, так и для обучения.

Комментарии (0)