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










