M5Stack to platforma programistyczna dla systemów wbudowanych, która świetnie sprawdza się w prototypowaniu aplikacji IoT. Można ją wykorzystać również w edukacji. Platforma oferuje możliwość programowania w tradycyjny sposób – przez Arduino oraz język MicroPython, a także przez oprogramowanie graficzne Blockly.

Seria M5Stack składa się z kilku rodzajów produktów. Moduły Core to duże zestawy główne zawierające układ ESP32, bogaty zestaw peryferiów – czujników, elementy audio itd. – oraz wyświetlacz LCD. W sprzedaży dostępne są także moduły Atom – również korzystające z ESP32, ale o mniejszym wyposażeniu oraz bez wyświetlacza LCD. W to miejsce model ATOM Matrix oferuje matrycę diod LED RGB, natomiast ATOM Lite nie posiada wyświetlacza. Moduły mają także znacznie korzystniejszą cenę.

Rys. 1. Moduł M5Stack ATOM Matrix

Ostatnim modułem głównym w ofercie M5Stack jest M5StickC. Jest to moduł w formacie Stick, a więc o mniejszym i bardziej prostokątnym formacie. Moduł jest wyposażony w wyświetlacz LCD, mikrofon, zegar RTC, mikrofon, moduł IMU. Zawiera także akumulator o pojemności 120 mAh.

Rys. 2. Moduł M5Stack M5StickC PLUS

Oczywiście M5Stack oferuje również dużą liczbę modułów rozszerzeniowych do płytek głównych. Dzielą się one na dwie kategorie. Pierwsza to moduły podłączane za pomocą interfejsu I2C do złącza Grove. Takie złącze jest montowane w każdej płytce głównej M5Stack. Umożliwia także podłączenie modułów Grove z interfejsem I2C produkowanych przez inne firmy, głównie Seeed Studio. Przykładami tego typu modułów są czytnik RFID M5Stack RFID Unit, a także moduł z czujnikiem linii papilarnych M5Stack Finger Unit.

Drugim typem modułów są tzw. nakładki, albo raczej podkładki. Można je zamontować do złącza goldpin dostępnego na spodzie płytki. Moduły tego typu można łączyć w stos nakładając jeden na drugi, a na samą górę moduł główny. Dodatkowo złącza goldpin można używać do podłączenia standardowych układów na płytkach breakout. Wyprowadzono na nie piny GPIO, interfejsy UART, I2C, SPI oraz wejścia przetwornika analogowo-cyfrowego. Przykładami nakładek wykorzystujących tą metodę są M5Stack Battery z akumulatorem oraz M5Stack SERVO2 z 16-kanałowym sterownikiem serwomechanizmów.

Rys. 3. M5Stack Core2 wraz z dwoma modułami rozszerzeniowymi ułożone w stos

W dalszej części artykułu przedstawię moduł główny M5Stack Core2. Jest to najlepiej wyposażony zestaw w ofercie M5Stack.

M5Stack Core2

Sercem modułu jest układ ESP32-D0WD-V3. Układ zawiera dwa rdzenie Xtensa LX6 o taktowaniu 240 MHz. Dysponuje również szerokim zakresem interfejsów komunikacyjnych, od tradycyjnych wyprowadzeń GPIO i PWM, przez standardowe interfejsy takie jak I2C, SPI i UART, po bardziej zaawansowaną komunikację, taką jak interfejsy SDIO, a także I2S. Mikrokontroler zawiera także czujnik Halla oraz czujniki pojemnościowe umożliwiające podłączenie np. przycisku dotykowego. Podobnie jak cała reszta rodziny ESP32 dysponują również komunikacją Wi-Fi oraz Bluetooth.

Rys. 4. Moduł M5Stack Core2

Moduł zawiera także zewnętrzne (względem mikrokontrolera) pamięci Flash o pojemności 16 MB oraz PSRAM o pojemności 8 MB. Komunikację z komputerem i zasilanie zapewnia złącze USB typu C. Jak wspomniano moduł oferuje także złącze GPIO na rozszerzenia oraz złącze Grove I2C.

Kolejnym ważnym elementem zestawu jest wyświetlacz LCD. Ma on przekątną 2,0” rozdzielczość 320 x 240 px i jest sterowany z układu ILI9342C. Ekran ma także panel dotykowy obsługiwany przez układ FT6336U. Jeśli chodzi o audio, to moduł zawiera głośnik, a także kodek I2S ze wzmacniaczem NS4168 umożliwiający wygenerowanie mocy 2,5 W. Na płytce dodatkowej umieszczono także mikrofon MEMS SPM1423 oraz 6-osiowy moduł IMU MPU6886.

Rys. 5. Płytka dodatkowa do modułu Core2

M5Stack Core2 zawiera także slot na karty microSD, zegar RTC BM8563, a także silnik wibracyjny. Nad prawidłowym zasilaniem całego systemu czuwa układ zarządzania zasilaniem AXP192 oraz przetwornica Boost SY7088. Całość ma wymiary 54 x 54 x 16 mm i wagę 52 g.

W zestawie z Core2 otrzymujemy także przewód USB-C o długości 20 cm.

Przykład z czujnikiem MCP9808

W dalszej części artykułu przybliżę programowanie M2Stack Core2. W tym celu posłużę się modułem Grove z czujnikiem temperatury MCP9808. Podłączę go do złącza Grove I2C na module głównym.

Rys. 6. Moduł Grove I2C High Accuracy Temperature Sensor z czujnikiem MCP9808

Moduł M5Stack można programować z poziomu Arduino dzięki pakietowi obsługi płytki, który jest dostępny w zestawie wraz z innymi płytkami z układem ESP32. Aby zainstalować te płytki należy w Preferencjach wkleić link

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

Następnie w Menedżerze płytek trzeba wyszukać pakiet M5Stack i zainstalować. Płytka jest do wybrania jako M5Stack Arduino > M5Stack-Core2.

Dostępna jest również biblioteka do obsługi modułu M5Core. Aby ją zainstalować należy w menu Szkic > Dołącz bibliotekę > Zarządzaj bibliotekami odnaleźć pakiet M5Core2 i zainstalować.

Z kolei do obsługi czujnika MC9808 bibliotekę dostarcza producent modułu, firma Seeed Studio. Biblioteka jest dostępna pod adresem:

https://github.com/SeeedDocument/Grove-I2C_High_Accuracy_Temperature_Sensor-MCP9808/raw/master/res/Grove_Temperature_sensor_MCP9808-master.zip

Należy ją zainstalować z menu Szkic > Dołącz bibliotekę > Dodaj bibliotekę .ZIP.

Kod przykładu

Przykład ma za zadanie pobrać dane z czujnika temperatury, a następnie wyświetlić je na wyświetlaczu LCD na module Core2.

Na początku należy dołączyć niezbędne biblioteki. W tym przypadku są to omawiane M5Core2.h oraz Seeed_MCP9808.h.

Następnie inicjalizujemy obiekt klasy MCP9808.

Funkcję setup rozpoczynamy od funkcji inicjalizujących moduł Core2 oraz czujnik temperatury:

Następnie ustalamy parametry wyświetlania danych na ekranie – kolor tła, kolor czcionki i tła za znakami, a także rozmiar czcionki.

Funkcję loop rozpoczynamy od inicjalizacji zmiennej temp, w której przechowywana jest temperatura z czujnika. Następnie funkcja get_temp pobiera dane i zapisuje je w zmiennej.

Następnie na ekran wypisywane jest słowo „Temperatura” oraz wartość temperatury. Funkcja setCursor zapewnia, że każdy element znajdzie się na odpowiednim miejscu wyświetlacza. Ostatnie polecenie delay oznacza, że każdy obrót pętli rozpocznie się 200 ms po zakończeniu poprzedniego.

Pełen kod jest dostępny w sekcji Do pobrania.

Rys. 7. Działanie kodu na module M5Stack Core2

Moduł M5Stack Core2 oraz wszystkie moduły z rodziny M5Stack są dostępne w ofercie sklepu Kamami.pl