A script for using the M5Stack CardKB with Raspberry Pi
In order for buttons to return the correct symbols, the keyboard layout will need to be set to us on your Pi. You can do this by running:
sudo nano /etc/default/keyboardand changing XKBLAYOUT to us:
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"The cardKB communicates over I²C, make sure this is enabled on your raspberry pi. You can find a tutorial on how to do so here.
Connect the wires on the CardKB JST connector to the appropriate pin on the Raspberry Pi.
You may need to improvise a connection solution with breadboard wires like so:
You will need to load the uinput module to allow python-uinput to input key presses. You can check if it is loaded with:
lsmod | grep uinputIf nothing is displayed, then the module is not loaded. To load the module, run:
modprobe uinputTo load the module automatically on startup, run:
sudo nano /etc/modulesadd uinput at the bottom of the file. Save and then reboot.
sudo apt update
sudo apt install python3-smbus python3-uinput python3-pip
sudo pip install --break-system-packages cardkbsudo cardkb &Important
By default, the python script listens to /dev/i2c-1. Some displays (like the Pimoroni Hyperpixel) expose a different interface. You can specify which interface to use by adding an argument to the start command.
sudo cardkb 11 &
We can use systemd to run the CardKB script as a service. To do so, you can use the cardkb.service from source code:
sudo curl -L -o /etc/systemd/system/cardkb.service https://raw.githubusercontent.com/ian-antking/cardkb/main/cardkb.serviceImportant
If you are running cardkb on a i2c bus other than 1, then you will need to edit the cardkb.service file to add the bus number to the end of the ExecStart line like so:
ExecStart=/usr/local/bin/cardkb 11
sudo systemctl daemon-reload
sudo systemctl enable cardkb.service
sudo rebootWhen your Pi restarts, your cardkb should be working, allowing you to log in.

