Skip to main content

Raspberry Pi Card Keyboard

A script for using the M5Stack CardKB with Raspberry Pi

Setting your pi to us layout

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/keyboard

and changing XKBLAYOUT to us:

# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

BACKSPACE="guess"

Enable I²C

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 CardKB to Raspberry Pi

Connect the wires on the CardKB JST connector to the appropriate pin on the Raspberry Pi.

CardKB/Raspberry Pi I²C connection

You may need to improvise a connection solution with breadboard wires like so:

Assembled a raspberry pi and hyperpixel

Load the uinput module

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 uinput

If nothing is displayed, then the module is not loaded. To load the module, run:

modprobe uinput

To load the module automatically on startup, run:

sudo nano /etc/modules

add uinput at the bottom of the file. Save and then reboot.

Install CardKB via PyPI

sudo apt update
sudo apt install python3-smbus python3-uinput python3-pip
sudo pip install --break-system-packages cardkb

Test CardKB

sudo 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 &

Running CardKB when Raspberry Pi starts

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.service

[!IMPORTANT]
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 reboot

When your Pi restarts, your cardkb should be working, allowing you to log in.

Metadata

Release files for cardkb 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cardkb 1.0.0
File Size Uploaded
cardkb-1.0.0.tar.gz 4.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cardkb 1.0.0
File Interpreter ABI Platform
cardkb-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 9.7 kB

Release files / cardkb-1.0.0.tar.gz

Download URL cardkb-1.0.0.tar.gz
Size 4.5 kB
Tags Source
SHA-256 checksum
How to use checksums
e21e5779e8f7d018541363f7aa6078f244aebdb748515f6878fe9b83af269323
BLAKE2b-256 checksum
How to use checksums
6e81310ab88d12ab3b61e0c4289c6c120ea5787da3c0e2e72b6b2519c7768386
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2025.

Transparency log

Release files / cardkb-1.0.0-py3-none-any.whl

Download URL cardkb-1.0.0-py3-none-any.whl
Size 5.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
64ba4d0b39c5044749aa39e72f28eb7063fe99bbf1b3378c71fb66a1cdc5ab90
BLAKE2b-256 checksum
How to use checksums
445f89b44f180286dc819045f4f5efb3dd8c20885046239bfb60b2e142bd443f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 15, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

0.1.2

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page