Обзор M5Stack ATOM Lite — маленького, но очень гордого устройства

от автора

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

И всё это упаковано в миниатюрный корпус 24x24x10mm. Визуально смотрится неплохо, пластик приятный.

Программирование

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

  • Официального инструмента для блочного программирования от 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 *, то разобраться довольно сложно.

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


ссылка на оригинал статьи https://habr.com/ru/post/717226/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *