M5Stack Atom Lite Vorstellung
Der ESP32 ist ein Mikrocontroller-Chip des chinesischen Herstellers Espressif, der momentan State of the Art im Hobby-Bereich für Mikrocontroller ist. Er bringt WLAN, Bluetooth, genügend Speicher und Rechenpower auch für anspruchsvollere Projekte mit und er ist günstig.Ich benutze ESP32-Boards schon eine ganze Weile und habe die verschiedenen ESP32-Boards hier auch schon mal vorgestellt und verglichen. Die Boards bzw. Geräte (Boards mit Gehäuse) von M5Stack hatte ich allerdings bisher ausgelassen, weil mir diese zu teuer waren.
Das hat sich jetzt geändert. Ein M5Stack Atom Lite ist schon ab 7.50 Euro (Stand Februar 2022) aus Deutschland zu bekommen und da steckt auch ein vollwertiger ESP32 drin.
Wer noch keine Ahnung von ESP32-Boards hat, sollte sich oben erwähnten Boardvergleich und auch meinen Artikel über die ESP 32 Erst-Einrichtung zu Gemüte führen. Das Wissen daraus setze ich für diesen Artikel voraus.
Der M5Stack Atom Lite
M5Stack hat seinen Namen eigentlich daher, dass die Gehäuse der M5Stack-Module, die man zusammenstecken kann (darum "Stack") Abmessungen von 5 mal 5 cm hatten. Außerdem sind die Module "Lego®-kompatibel". Man kann die Module also mit Lego® (oder anderen Klemm)-Bausteinen irgendwo festmachen oder integrieren.Die originale M5Stacks Serie in 50x50 mm kann zwar eine Menge und sieht nett aus, kostet aber auch zig Euro. Mit der neuen Atom-Serie gehen zum einen die Abmessungen runter (24 x 24 mm) und zum anderen auch der Preis - (eben ab 7,50 Euro für das Atom Lite Core Modul.
Dafür bekommt man ein fertiges kleines Gehäuse in den Abmessungen von nur 24 x 24 x 9.5 mm, was wirklich sehr klein ist. Was natürlich ein Vorteil ist, denn so hat man die Power eines ESP32 auf kleinstem Raum.
In dem kleinen Atom-Lite Gehäuse steckt:
- ESP32 Pico Chip
- Ein User-Taster an der Oberseite
- Eine RGB-Vielfarb-LED in der Mitte des User-Tasters
- Ein Reset-Taster an der Seite
- Einen modernen USB-C Port an der Vorderseite
- Einen 4-poligen I2C-Port zum Anschluss weiterer Module an der Vorderseite
- Einen 9-poligen SPI/I2C-Port zum Anschluss weiterer Module an der Unterseite
- Eine IR-LED, die zur Rückseite herausgeht
Das Pinout des M5Stack Atom Lite
Der 4-polige I2C-Port ist ein Grove-Stecker mit Pinabstand 2mm (PH2.0, 4pol. male) und hat folgende Belegung (Draufsicht LED):
Pin I2C-Port Pin ESP32 Bezeichnung Kabelfarbe Anmerkung
1 GND GND schwarz
2 5V 5V rot VORSICHT! 5V!
3 G26 I2C SDA (Data) gelb
3 G32 I2C SCL (Clock) weiß
An dem I2C-Port kann man M5Stack-Module anstecken, die man fertig in einem Gehäuse zu kaufen bekommt. Rechts im Bild als Beispiel ein ID-Modul. Das passende I2C-Kabel wird auch gleich mitgeliefert, inklusive einer kleinen Plastikbox zum Schutz. Natürlich macht das die Module ein wenig teurer, aber sie sind noch erschwinglich.Vorsicht! Will man am I2C-Port eigene Geräte anschließen, dann muss man beachten, dass hier 5 Volt und nicht die ESP32-üblichen 3.3 Volt anliegen! Die Sensoren, Displays etc. müssen dann natürlich auch 5V abkönnen oder man muss einen Logic Level Converter vorschalten oder die 3.3V Spanung von den Pins an der Unterseite abnehmen.
Auch muss man beachten, dass I2C-Port und USB-C-Port recht dicht aneinander liegen. Weder das I2C-Kabel noch das USB-C-Kabel darf deshalb zu breite Stecker benutzen, sonst kommen sich die beiden in die Quere, sollten beide belegt sein.
Der 9-polige SPI/I2C-Port ist ein Standard-Pin-Header mit Pinabstand 2.54mm female und hat folgende Belegung (Draufsicht Unterseite):
Pin Port Pin ESP32 Bezeichnung Anmerkung
1 (links oben) 3.3V 3.3V
2 G22 G22
3 G19 MOSI (SPI)
4 G23 CLK (SPI)
5 (links unten) G33 MISO / ADC
6 (rechts oben) G21 SCL (I2C)
7 G25 SDA (I2C) / DAC
8 5V 5V
9 (rechts unten) GND GND
Auch für den Unterteil gibt es Module. Dann wird der Atom Lite dann einfach in ein größeres Modul gesteckt.
Rechts im Bild ein Atom Lite (links) neben einem TF-Card Basis-Modul. Das TF-Card-Modul gibt es allerdings nicht wie den Atom Lite einzeln nachzukaufen, sondern man kauft das TF-Card-Modul und da ist der Atom Lite dann gleich aufgesteckt dabei. Das Paket aus TF-Card-Reader-Modul und Atom Lite kostet dann 11.50 Euro (Stand Februar 2022), also nur 4 Euro mehr als der Atom Lite alleine.
So schön das Modulsystem mit seinen eigenen Gehäusen, die man dann ein- oder per Kabel anstecken kann ist, so ist mir doch ein großes Manko aufgefallen: die Anschlüsse sind nicht durchgeschleift. Man kann in ein Modul also kein weiteres Modul stecken.
Was ist, will man mehrere Module benutzen? Zum Beispiel einen I2C-Sensor zur Messung und ein I2C-LCD zur Anzeige? Beide anzusprechen ist wegen der I2C-Adressen ja architektonisch kein Problem. Aber ich habe nur einen I2C-Port und kann nur ein Modul anstecken.
Mit ist unverständlich, warum es nicht noch in jedem I2C-Modul einen ausgehenden neben dem eingehende I2C-Port gibt. Grober Design-Fehler würde ich sagen, dass macht doch das ganze schöne Plug and Play Konzept kaputt.
Ich werde mir dann wohl für mein Projekt eine kleine Lochrasterplatine hernehmen und dort mehrere Grove-Stecker parallel anlöten, dann kann ich auch mehrere Geräte benutzen.
Nichts desto trotz bleibt der Atom Lite ein wunderhübsch kleines Paket mit mächtig Power. Man könnte ihn zum Beispiel als mobilen WLAN-Switch benutzen. WLAN kann er schon. Muss nur noch Strom eingestöpselt werden und schon funktioniert der Mini-Switch. Okay, die nötige Powerbank oder Akku macht den Formfaktor dann wahrscheinlich wieder kaputt.
Einen Nachteil (so man es denn braucht) sehe ich darin, dass die Anzahl der brauchbaren, nach außen geführten Pins doch sehr begrenzt sind. Allein wegen Pin-Mangels wird man nicht jedes Projekt mit dem Atom Lite machen können. Aber mit viel Peripherie kann man sowieso einen anderen Formfaktor als Board wählen. Der Atom Lite besticht durch seine Winzigkeit.
Der ESP32-Pico Chip
Im Atom ist der kleinste ESP32-Chip von espressif verbaut, der ESP32 Pico. Der ESP32-PICO-D4 ist ein System-in-Package (SiP) Modul, das auf dem ESP32 basiert und die komplette WiFi und Bluetooth Functionalität abdeckt. Der Chip ist lediglich 7 x 7 0.94 mm groß. Vier Megabytes an SPI-Flash, den nötigen Oszillator, Hall Sensor und vieles weitere mehr ist bereits in diesem winzigen Chip verbaut.Die Spezifikationen des ESP32-Pico-D4 lesen sich wie die des normalen ESP32:
Wi-Fi 2.4 GHz 802.11 b/g/n (802.11n up to 150 Mbps)
Bluetooth Bluetooth V4.2 BR/EDR and BLE specification
NZIF receiver with –97 dBm sensitivity
AFH; CVSD and SBC (Audio)
Connections ADC, DAC, touch sensor, SD/SDIO/MMC Host Controller,
SPI, SDIO/SPI Slave Controller, EMAC, motor PWM, LED
PWM, UART, I 2 C, I 2 S, infrared remote controller,
GPIO, pulse counter, Hall sensor
40 MHz crystal
SPI flash 4 MB
Op. voltage 3.0 V ~ 3.6 V
Op. current Average: 80 mA
Size (7.000±0.100) mm×(7.000±0.100) mm×(0.940±0.100) mm
Das Pinout kann man in der Grafik rechts erkennen (draufklicken zum zoomen). Welche GPIO-Ports genau an den Pins des ESP32-Pico-D4 liegen, kann dessen Data Sheet entnommen werden.Im Grunde ist der ESP32-Pico-D4 ein besonders platzsparender ESP32 in nur einem Chip-Gehäuse wie vorher der Wroom-32 in Modulbauweise mit mehr Einzelkomponenten daherkam, die sich unter der charakteristischen Blechhaube verstecken.
Den Atom Lite zum Laufen bringen - Versuch mit UIFlow von M5Stack
Wenn ich ehrlich sein soll, finde ich die Dokumentation zum M5Stack Atom Lite eher unschön. Man findet an vielen Stellen oberflächliche Informationen, aber nirgends so richtig vollständige Code-Beispiele, mit denen man echt etwas anfangen könnte. Irgendwie sind die Informationen auch sehr verteilt und ich habe viel Zeit mit Suchen im Internet verbracht, um das Teil anständig zum Laufen zu bringen.Mein erster Versuch war flow.m5stack.com. Das ist die Web-Oberfläche von Flow, einer Entwicklungsumgebung für M5Stack, bei der man sich alles zusammenklicken können soll.
Die Website knallt mir gleich mal den nebenstehenden Dialog vor den Latz. Ich brauche also einen "Api key" (richtig heißt das "API", Leute). Nur woher soll ich den kriegen? Da steht nichts auf dem Gehäuse des Atom Lite, kein beiliegender Zettel nichts. Was soll das überhaupt sein? Ich denke mir, dass wird eine ID sein, mit der sich mein Atom Lite über das Internet mit der UIFlow-Web-App verbinden kann, um dann das dann irgendwann fertige Programm auf den Atom-Lite zu laden.
Tja, nur wie soll der Atom Lite meine WLAN-Konfiguration wissen? Und überhaupt wie komme ich an den API-Key? Wie man so etwas richtig macht, machen die Hersteller von WLAN-Steckdosen vor: einen Access Point aufmachen, der alles erklärt und einen Zettel beilegen, wie der Name des Access Points ist, damit man sich damit verbinden kann. Beim Atom Lite diesbezüglich aber Fehlanzeige.
Ausgesperrt klicke ich verzweifelt den "Get Started Videos" Link an. Dort erfahre ich in einem Video, dass es auch eine recht gut versteckte Downloadseite für eine Desktop-Version von UIFlow für Windows gibt. Die ist laut Angaben für Win10 x64, läuft aber auch auf meinem Windows 7 x64.
Ich bekomme einen ähnlichen Screen wie vorher bei der Web-Version aus, kann jetzt aber einen USB-Port zu Verbinden angeben. Ich nehme COM41, der mit dem Atom Lite verbunden ist und wähle die Grafik für meinen Atom Lite aus und klicke auf OK.
Kurze Zeit später rasselt es Fehlermeldungen:
Na toll. Der COM-Port ist definitiv richtig. Warum kann sich UIFlow nicht damit verbinden?
Um die Sache zu überprüfen verbinde ich mich über ein Terminalprogramm selbst mit COM41. Nach einem Druck auf den Reset-Taste meldet sich der Atom Lite über die serielle Schnittstelle:
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
M5Atom initializing...Card Mount Failed
ets Jun 8 2016 00:22:57
Da scheint irgendein Demo-Code für das TF-Card-Reader-Modul drauf zu sein. Wenn ich eine Micro-SD-Karte einstecken ändert sich auch die Ausgabe:
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
M5Atom initializing...SD Card Type: SDHC
Als ich wieder zu UIFlow wechseln will, stürzt das Ding auch noch ab. Na, muss ja super programmiert sein. Erkennt die Hardware nicht, für die es programmiert wurde, kommt als unsignierte Exe ohne Herstellerangabe daher und stürzt gleich mal ab, bevor es überhaupt irgendwas geleistet hat.
UIFlow ist für mich deshalb erst einmal gestorben. Versuchen wir es doch lieber mal mit einer Entwicklungsumgebung, mit der wir schon so viele gute Erfahrungen gemacht haben...
Die Arduino IDE zum Programmieren des Atom Lite benutzen
Im M5Stack Atom Lite steckt ja ein ESP32-Mikrocontroller. Also muss man zuerst einmal die Boards vom ESP32 installieren. Das habe ich natürlich schon vor langer Zeit gemacht, denn ich arbeite ja schon länger mit ESP32ern.
Falls "esp32" noch nicht in der Auflistung bes Boardverwalters steht, dann muss man zuerst die entsprechende URL in den Einstellungen eingeben und noch ein paar Kleinigkeiten erledigen. Das habe ich aber schon alles in meinem Artikel ESP32 Erst-Einrichtung erklärt. Gegengebenenfalls den zuerst lesen und befolgen.
Dann müssen wir die Version vom esp32 Boardmodul checken. Ich hatte die 1.0.4 installiert und die war zu alt, als dass sie schon die neuen M5Stack Atoms kennen würde. Falls der M5Stack Atom also nicht in der Boardliste vorhanden ist, dann muss hier geupdatet werden.
Dann wechseln wir unter Werkzeuge in der Arduino IDE das Board zu M5Stack-ATOM. Das findet sich irgendwo unter "ESP32" in einer bei mir doch inzwischen sehr langen Liste.
Ist das M5Stack-ATOM-Board erstmal ausgewählt, ändern wir auch die übrigen Einstellungen im Werkzeuge-Menü:
- Board: "M5Stack-ATOM"
- Upload Speed: "1500000"
- Partition Scheme: "Standard"
- Core Debug Level: "Keine"
- Port: "C0M41"
Jetzt sollte der Atom Lite startklar sein. Wir stöpseln ihn ein und schreiben einen kurzen Code in der Arduino IDE:
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println("Serielle Verbindung steht!");
delay(1000);
}
Der Upload nach STRG+U sollte so aussehen:
esptool.py v3.0-dev
Serial port COM41
Connecting.....
Chip is ESP32-PICO-D4 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, Embedded Flash, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: ...
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 1500000
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 4096.0 kbit/s)...
Hash of data verified.
Compressed 17120 bytes to 11164...
Writing at 0x00001000... (100 %)
Wrote 17120 bytes (11164 compressed) at 0x00001000 in 0.1 seconds (effective 1070.0 kbit/s)...
Hash of data verified.
Compressed 204608 bytes to 106245...
Writing at 0x00010000... (14 %)
Writing at 0x00014000... (28 %)
Writing at 0x00018000... (42 %)
Writing at 0x0001c000... (57 %)
Writing at 0x00020000... (71 %)
Writing at 0x00024000... (85 %)
Writing at 0x00028000... (100 %)
Wrote 204608 bytes (106245 compressed) at 0x00010000 in 1.7 seconds (effective 947.3 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 1445.7 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Nach öffnen der seriellen Konsole in der Arduino-IDE sollte sich die dann so zeigen:Komisch. Mit der Arduino IDE gibt es keine Probleme. Upload funktioniert, serielle Verbindung funktioniert. Wer braucht das noch dieses Kinder-Tool UIFlow?
Um an die Beispiele zu kommen, suchen wir im Bibliotheksverwalter "M5Atom" vom M5Stack und installieren diese Bibliothek.
Es folgt eine Abfrage, um wir einen Haufen abhängige Bibliotheken mitinstallieren wollen.
Ich habe mal "install all" gewählt und damit alle Abhängigkeiten gleich mit installiert. Wenn auch nicht speichersparend sicher der bequemere Weg, auch wenn ich viele der Sensoren gar nicht brauche.
Auf meiner Festplatte machen die paar unbenötigten Bibliotheken nichts aus. In den Binärcode werden die sowieso nicht kompiliert bzw. gelinkt und fressen so nicht den kostbaren Flash-Speicher des ESP32. Darum sollte das okay sein.
Unter Datei / Beispiele finden sich dann entsprechende Beispiele, an denen man sich orientieren kann. Und das reichlich. Zum Glück ist das Untermenü hier hierarchisch gegliedert.
Um die Grundfunktionalität zu testen, habe ich mir mal die Beispiele und die API-Dokumentation zu Knopf und RGB-LED angeschaut und ein Programm geschrieben, dass jedesmal bei Knopfdruck die Farbe der LED zufällig verändert.
Die RGB-LED ist übrigens eine normale Neopixel / WS2812 - LED. Man könnte dafür also auch eine andere Library hernehmen. Und die Button-Abfrage geht natürlich genauso gut über eine Abfrage, ob der entsprechende Pin, an dem er angeschlossen ist, high oder low ist.
Aber wenn M5Stack das schon kapselt und mitliefert, dann können wir das auch benutzen. Schön wäre es, wenn es dann wenigstens funktionieren würde; sonst müssten wir auf alternative Libraries ausweichen. Aber ich schätze mal, wenigstens das haben die getestet. Okay, vielleicht bin ich wegen dem schlechten UIFlow ein wenig voreingenommen. Schauen wir mal.
////////////////////////////////////////////////////////
// (C) 2022 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: https://cool-web.de/esp8266-esp32/ //
////////////////////////////////////////////////////////
// API-Dokumentationen:
// https://docs.m5stack.com/en/api/atom/system
// https://docs.m5stack.com/en/api/atom/led_display
#include "M5Atom.h"
void setup()
{
// Serial.begin(115200); // erledigt M5.begin
M5.begin(true, false, true); // void begin(bool LCDEnable=true, bool SDEnable=true,
// bool SerialEnable=true,bool I2CEnable=false);
delay(100);
Serial.println("Serielle Verbindung steht!");
M5.dis.drawpix(0, 0x000000); // Der Atom Lite hat nur eine LED (Nr. 0);
// es folgen die Farbwerte in Hex für RGB (rot, grün, blau)
}
uint32_t color;
void loop()
{
M5.update(); // Auslesen des Knopf-Status
if (M5.Btn.wasPressed()){ // wenn Knopf gedrückt wurde
color=random(pow(2,24)); // Zufallsfarbwert holen
M5.dis.drawpix(0, color); // und die LED in dieser Farbe leuchten lassen
while (M5.Btn.wasPressed()){ // warten, bis Knopf wieder losgelassen
M5.update();
delay(10);
}
}
delay(10);
}