M5Stack CardKB2 Review: Kleine Tastatur, große Möglichkeiten
Mit dem Unit CardKB2 bringt M5Stack eine spannende Weiterentwicklung seiner kompakten Mini-Tastatur auf den Markt. Während die Vorgängerversion noch als einfache I2C-Tastatur diente, steckt im neuen Modell nun ein vollwertiger ESP32-C61 Mikrocontroller.
Die typische Bauform im Checkkartenformat ist dabei erhalten geblieben – doch unter der Haube hat sich einiges getan. Das CardKB2 verspricht erstmals einen echten Standalone-Betrieb und eröffnet damit völlig neue Einsatzmöglichkeiten – von einfachen Eingabegeräten bis hin zu kleinen IoT-Projekten.
Dank integrierter Shortcuts lässt sich das Modul zudem direkt „out of the box“ als Bluetooth-Keyboard nutzen. Alles, was du dafür benötigst, ist eine passende Stromquelle.
Doch wie viel Potenzial steckt wirklich in dieser kleinen Tastatur – und wie sieht es in der Praxis mit der Programmierung aus?
Genau das zeige ich dir in diesem Beitrag.
https://youtu.be/n_-So8hmG9E
Transparenzhinweis: Das M5Stack Unit CardKB2 habe ich selbst gekauft. Es besteht keine Kooperation mit dem Hersteller.
Was ist neu – und warum ist das spannend?
Was auf den ersten Blick wie eine einfache Weiterentwicklung wirkt, ist in Wirklichkeit ein ziemlich großer Schritt.
Beim ursprünglichen CardKB handelte es sich um eine reine I2C-Tastatur. Die Eingaben wurden an einen Mikrocontroller weitergereicht – das Modul selbst war dabei eher „dumm“ und hatte keine eigene Logik.
M5Stack Unit CardKB2 - kleines QWERTY Keyboard mit ESP32-C61 Chip
M5Stack Unit CardKB2 - Rückseite mit Pinout und Layout
M5Stack Unit CardKB2 - Verpackt
Beim CardKB2 sieht das komplett anders aus.
Hier sitzt nun ein vollwertiger ESP32-C61 direkt auf dem Board. Damit kann das Modul nicht nur Eingaben erfassen, sondern diese auch selbst verarbeiten, speichern oder über verschiedene Schnittstellen weiterleiten.
Aus einer einfachen Tastatur wird damit ein eigenständiges System.
Genau das macht das CardKB2 so spannend: Es ist nicht mehr nur ein Zubehör für ein Projekt, sondern kann selbst zum zentralen Bestandteil werden.
Ob als Eingabegerät für ein IoT-System, als kleines Steuer-Interface oder sogar als eigenständiges Bluetooth-Keyboard – die Einsatzmöglichkeiten sind deutlich vielseitiger als beim Vorgänger.
Erster Eindruck & Verarbeitung
Auf den ersten Blick bleibt sich M5Stack treu: Das CardKB2 kommt weiterhin im kompakten Checkkartenformat daher und wirkt insgesamt sauber verarbeitet.
Auffällig ist jedoch direkt die überarbeitete Tastatur. Im Vergleich zum Vorgänger sind die Tasten etwas größer ausgefallen, was die Bedienung deutlich angenehmer macht – gerade wenn man das Modul tatsächlich zum Tippen nutzt und nicht nur einzelne Eingaben ausführt.
Abmasse neue CardKB2 Unit von M5Stack
Abmasse alte CardKB I2C Unit von M5Stack
Das Layout entspricht einem klassischen QWERTY-Keyboard, also der amerikanischen Variante. Für viele Anwendungen ist das kein Problem, im Alltag muss man sich jedoch unter Umständen kurz umgewöhnen.
Eine Änderung fällt allerdings eher negativ auf: Die Navigationstasten sind nicht mehr separat vorhanden, sondern nur noch über die FN-Taste erreichbar. Das spart zwar Platz, macht die Bedienung in bestimmten Situationen aber etwas umständlicher.
Insgesamt hinterlässt das CardKB2 dennoch einen soliden ersten Eindruck – vor allem durch die verbesserten Tasten, die im direkten Vergleich zum Vorgänger ein echtes Upgrade darstellen.
Betriebsmodi des CardKB2
Bevor wir uns die Programmierung anschauen, lohnt sich ein Blick auf die verschiedenen Betriebsmodi des CardKB2. Denn im Gegensatz zur Vorgängerversion ist das Modul nicht mehr nur auf eine einzige Funktion beschränkt.
Die Umschaltung zwischen den Modi erfolgt direkt über Tastenkombinationen auf dem Gerät – ein erneutes Flashen ist dafür nicht notwendig.
Verfügbare Modi
Wichtig: Für die Nutzung dieser Modi muss das CardKB2 selbst nicht neu programmiert werden. Die Funktionen sind bereits in der vorhandenen Firmware enthalten. Du wählst lediglich den gewünschten Modus über die entsprechende Tastenkombination aus.
ModusTastenkombinationEinsatzI2CFn + Sym + 1Klassische Mikrocontroller-AnbindungUARTFn + Sym + 2Serielle Tastenevents über GroveESP-NOWFn + Sym + 3Drahtlose Verbindung zu ESP32-GerätenBluetooth HIDFn + Sym + 4Nutzung als Bluetooth-Tastatur
Die eigentliche Verarbeitung der Daten erfolgt anschließend auf dem verbundenen Gerät – also zum Beispiel auf dem Smartphone, einem Arduino oder einem ESP32.
Bluetooth-Keyboard Modus
Der wohl coolste Modus ist die Nutzung als Bluetooth-Tastatur. Dafür benötigt man unterwegs lediglich eine Powerbank – und idealerweise noch ein kleines Gehäuse, das das Board vor Stößen schützt.
- Das CardKB2 verhält sich wie ein klassisches Bluetooth-Keyboard - Verbindung mit: - Smartphone - Tablet - PC - keine zusätzliche Hardware notwendig - Stromversorgung über USB-C reicht aus
👉 Einstellung:
- über definierte Tastenkombination > Fn + Sym + 4 - anschließend Gerät per Bluetooth koppeln
M5Stack CardKB2 als Bluetooth Tastatur am Android Gerät I2C-Keyboard Modus
Den I2C-Modus habe ich in diesem Beitrag bewusst nur kurz eingeordnet, da er am ehesten dem Verhalten des ursprünglichen CardKB entspricht. Der Fokus liegt hier auf den neuen Möglichkeiten durch Bluetooth, UART und ESP-NOW.
- klassischer Modus wie beim alten CardKB - Tastenanschläge werden per I2C an einen Mikrocontroller gesendet - ideal für: - Arduino - ESP32 Projekte
👉 Einstellung:
- per Tastenkombination aktivieren > Fn + Sym + 1 - anschließend über I2C ansprechen Serial / UART Modus - Ausgabe der Tasteneingaben über serielle Schnittstelle - ideal für: - Debugging - einfache Terminal-Anwendungen
👉 Einstellung:
- per Tastenkombination wechseln > Fn + Sym + 2 - Daten über UART auslesen
M5Stack CardKB2 via serial mit dem Arduino verbunden - UART Modus ESP-NOW Modus - drahtlose Kommunikation ohne WLAN-Router - direkte Verbindung zu einem anderen ESP32-Gerät - sehr geringe Latenz - ideal für: - Fernsteuerungen - einfache Eingabesysteme - IoT-Projekte ohne Netzwerk
👉 Einstellung:
- per Tastenkombination aktivieren > Fn + Sym + 3 - Gegenstelle (z. B. ESP32) muss entsprechend vorbereitet sein
M5Stack CardKB2 und ESP32-C3 mit OLED Display - ESP-NOW Modus
Praxisbeispiel: CardKB2 per ESP-NOW mit einem ESP32-C3 verbinden
Nachdem die Betriebsmodi geklärt sind, wird es nun praktisch. Für mein erstes Beispiel nutze ich den ESP-NOW Modus des CardKB2. Dabei wird das Keyboard nicht per Kabel mit dem Empfänger verbunden, sondern sendet die Tasteneingaben drahtlos an einen anderen ESP32.
Programm: M5Stack Unit CardKB2 sendet Daten via ESP-NOW an ESP32-C3 Super MiniHerunterladen
In meinem Aufbau kommt ein ESP32-C3 Super Mini mit einem kleinen OLED-Display zum Einsatz. Das CardKB2 dient dabei als drahtlose Eingabeeinheit, während der ESP32-C3 die empfangenen Daten auswertet und auf dem Display darstellt.
Aufbau - M5Stack CardKB2 via ESP-NOW am ESP32-C3 Super Mini mit OLED Display
Das Spannende daran: Auf dem CardKB2 selbst muss dafür nichts programmiert werden. Es reicht aus, den passenden Modus über die Tastatur zu aktivieren.
Fn + Sym + 3
Danach sendet das CardKB2 seine Tastenevents automatisch per ESP-NOW als Broadcast. Der Empfänger muss lediglich so programmiert werden, dass er diese Pakete empfängt und auswertet.
Aufbau des Praxisbeispiels
Für dieses Beispiel verwende ich folgende Komponenten:
- M5Stack Unit CardKB2 - ESP32-C3 Super Mini - OLED-Display via I2C - USB-Kabel zur Stromversorgung und Programmierung des ESP32-C3
Das CardKB2 benötigt lediglich eine Stromversorgung über USB-C. Eine direkte Verbindung zwischen CardKB2 und ESP32-C3 ist nicht notwendig.
Schaltung - ESP32-C3 mit OLED Display
Für die Schaltung ESP32-C3 mit OLED Display benötigst du:
- 1x ESP32-C3 Super Mini*, - 1x 1,3" OLED Display* (I2C), - 1x 400 Pin Breadboard*, - 4x Breadboardkabel*, 10cm, männlich-männlich
Schaltung - ESP32 mit OLED Display via I2C
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Was wird übertragen?
Im ESP-NOW Modus werden keine fertigen Buchstaben übertragen. Stattdessen sendet das CardKB2 strukturierte Datenpakete. Das Format entspricht dabei dem UART-Modus:
AA
Die einzelnen Werte bedeuten:
WertBedeutungAAStartbyte des DatenpaketsDATA_LENDatenlänge, fest auf 0x03KEY_IDID der gedrückten TasteKEY_STATEZustand der Taste: gedrückt oder losgelassenCHECKSUMPrüfsumme zur Kontrolle des Pakets
Gerade dieser Punkt ist wichtig: Das CardKB2 sendet im ESP-NOW Modus also nicht einfach ein a, b oder c, sondern die Position der gedrückten Taste auf der Tastaturmatrix.
Die eigentliche Übersetzung von KEY_ID zu einem lesbaren Zeichen erfolgt daher im Code des Empfängers.
Warum ein eigenes Key-Mapping notwendig ist
Damit aus einer empfangenen KEY_ID wieder ein echter Buchstabe wird, habe ich mir eine eigene Keymap erstellt. Diese ordnet jeder Taste den passenden Wert zu.
Zusätzlich müssen Sonderfunktionen wie Aa für Großbuchstaben oder Sym für Sonderzeichen im Code behandelt werden. Das CardKB2 übernimmt diese Logik im ESP-NOW Modus nicht automatisch.
Das klingt zunächst etwas aufwendiger, hat aber auch einen Vorteil: Man kann selbst bestimmen, was bei welcher Taste passieren soll. Dadurch eignet sich das CardKB2 nicht nur als Tastatur, sondern auch als frei definierbare Fernbedienung für eigene Projekte.
Wichtig: Die KEY_ID entspricht nicht automatisch dem sichtbaren Zeichen auf der Taste. Sie basiert auf der Position in der Tastaturmatrix. Da nicht jede Position belegt ist, ist in meiner Keymap auch ein leerer Platzhalter enthalten. Ohne diesen Platzhalter wären die folgenden Tasten verschoben.
struct KeyDef { const char* normal; const char* sym; }; // Mapping Array (KEY_ID -> Zeichen) const KeyDef keyMap = { {"1","!"}, {"2","@"}, {"3","#"}, {"4","$"}, {"5","%"},{"6","^"}, {"7","&"}, {"8","*"}, {"9","("}, {"0",")"},{"",""}, {"q","~"}, {"w","`"}, {"e","?"}, {"r",""}, {"t","/"},{"y","|"}, {"u","-"}, {"i","_"}, {"o","+"}, {"p","="},{"",""}, {"Aa","Aa"}, {"a","{"}, {"s","}"}, {"d",""}, {"f",""}, {"h","""}, {"j","'"}, {"k",";"}, {"l",":"},{"",""}, {"fn","fn"}, {"sym","sym"}, {"z",""}, {"x",""}, {"c",""},{"v",""}, {"n",","}, {"m","°"}, {"",""} }; bool symMode = false; bool upperCase = false; String getKey(uint8_t id) { if (id >= 45) return "?"; String normal = String(keyMap.normal); String sym = String(keyMap.sym); // SYM Taste (ID anpassen!) if (normal == "sym") { symMode = !symMode; return ""; } // SHIFT / Aa Taste if (normal == "Aa") { upperCase = !upperCase; return ""; } // FN ignorieren (optional) if (normal == "fn") { return ""; } // Symbol-Modus hat Priorität if (symMode) { return sym; } // Groß/Kleinschreibung nur bei einzelnen Buchstaben if (upperCase && normal.length() == 1) { char c = normal; if (c >= 'a' && c














