Macropad With Digital Stereo Audio Using Pimoroni Keybow 2040 and MAX98357A Audio Board (HID + MIDI Capable)
by kevinjwalters in Circuits > Gadgets
77 Views, 2 Favorites, 0 Comments
Macropad With Digital Stereo Audio Using Pimoroni Keybow 2040 and MAX98357A Audio Board (HID + MIDI Capable)
This article takes a second look at adding audio to the Pimoroni Keybow 2040, a 4x4 keypad featuring Kailh (Cherry MX-compatible) keys with clear keycaps and per-key RGB LED illumination. In the previous article, Colourful Macropad With Audio Using Pimoroni Keybow 2040 and Adafruit STEMMA Speaker (HID + MIDI Capable), a STEMMA Speaker board was added to amplify analogue audio from the microcontroller created from a filtered PWM signal. An alternative approach is to use digital audio - CircuitPython conveniently supports the I2S protocol for audio output. The addition of a pair of small speakers driven by a stereo amplifier board with an I2S input is shown in this article.
In CircuitPython it's very easy to use different output protocols/signals for audio. The software was modified to switch from PWM to I2S output. Some unrelated features were also added: optional backgrounds per layer and volume control, variable rate playback and stereo positioning for audio samples. Unlike CircuitPython's PWMAudioOut, I2SOut can be used with a MAX98357A-based board to play samples at various rates without any pops/clicks.
This article also includes a brief comparison of the specifications for four macropad kits and four i2s audio amplifier boards.
The addition of this audio board involves soldering.
Supplies
- Pimoroni Keybow 2040: Pimoroni | Micro Center (clicky key version)
- Amplifier board with i2s input
- MKJDZ/Module Maker Space MAX98357A I2S Stereo Audio Amplifier Module ("welded" is the translation used for soldered): AliExpress
- Thin speaker(s) (ones with leads > 7cm (3in) are useful)
- Pimoroni Adhesive Backed Mini Speaker 8Ω (1W) (connectors will need to be cut off): Pimoroni
- Same Sky (previously CUI) make a large range of miniature speakers.
- 4x M2 threaded 12mm spacers (standoffs) - these replace the 4mm ones supplied with the Keybow 2040
- Wurth Elektronik Standoff M2, 12 mm Body, Brass (plated): Radio Spares
- Unbranded Aluminium Alloy coloured 12mm standoffs: AliExpress - these are colourful but sadly these do not have full-length threads. These can be used if you also purchase some longer bolts, i.e. 8x ultra thin head (low profile) M2 6mm bolts, black will match colour of case.
- A small Phillips screwdriver - required for Keybow 2040 assembly.
- 5x short stranded wires, ideally red, black and three other colours. Avoid ultra thin cables for the black and red as these will be carrying the current to power the amplifier/speaker, however 28AWG is okay for ~5cm (2in) lengths (conversative DC resistance is 13milliohms for stranded copper.)
- Optional: for other audio boards, one extra wire if you wish to experiment with the shutdown feature.
- A pair of wire cutters.
- Solder, soldering iron. Something to hold components in place.
- Something non-conductive to securely attach the audio board to the base of the Keybow 2040. Epoxy resin was used. Note: the board may not be perfectly flat due to protruding wire/solder in/on through holes after soldering.
- Two small pieces of insulating tape to cover the (conductive) backs of the speakers' magnets.
Specification Comparison of Four Macropad Kits Using CircuitPython
The Pimoroni Keybow 2040 kit was used for this and the prior article. Here's a quick review of this and some related and similar products.
This is based on just reading the specifications, hands-on use is likely to reveal more nuances and detail. One thing suggested by videos about these products is the Pico RGB Keypad Base has even illumination across the rubbery key and may be the brightest. The clear Kailh keycaps are only directly illuminated through the top section and aren't particularly bright on the Keybow 2040 when viewed from an angle. The RGB LEDs using APA102 and WS2812B protocol (NeoPixel) can probably be updated with arbitrary values far faster than the Lumissil IS31FL3731 driven RGB LEDs.
Anavi Macro Pad 12
One from a large range of macropads.
- 3x4 Gateron keys with single colour RGB LED for illumination, small blue/yellow 128x64 OLED screen.
- Reset and Bootsel buttons on Seeed XIAO RP2040.
- USB-C connector.
- 2MB external flash, CIRCUITPY is 1MB.
- Uses matrix for keyboard with diodes.
- Six RGB LEDs provide underboard lighting.
- RGB LEDs use WS2812B (Adafruit name: Neopixel) protocol.
- The screen plugs into a socket offering some possibilities for adding i2c devices on this connector.
- QMK firmware or KMK configuration.
Pimoroni Keybow 2040
This is the macropad featured in this article.
- 4x4 Kailh keys with per-key RGB LED illumination, BOOTSEL and RESET buttons.
- Some pins accessible on pads, some with external pull-up resistors, other GPIO inaccessible.
- USB-C connector.
- 2MB external flash, CIRCUITPY is 1MB.
- RGB LEDs are driven by a Lumissil IS31FL3731.
- Uses (slightly less common) M2 spacers**.
- CircuitPython examples using Pimoroni's pmk library.
Pimoroni Pico RGB Keypad Base
- 4x4 silicone translucent keys which rest on buttons with per-key RGB LED illumination.
- Needs a Pi Pico with headers attached, this also allows the RP2350-based Pi Pico 2 to be used.
- All Pi Pico pins accessible using through hole soldering.
- BOOTSEL button on Pi Pico. No reset button.
- Micro-USB connector (on Pi Pico).
- 2MB or 4 MB external flash (on Pi Pico/Pi Pico 2), CIRCUITPY is 0.5MB (Pi Pico W), 1MB (Pi Pico), 2.5MB (Pi Pico 2W).
- RGB LEDs use APA102 (Adafruit name: DotStar) protocol.
- Custom MicroPython image or CircuitPython examples using Pimoroni's pmk library.
Adafruit MacroPad RP2040 Starter Kit
- 3x4 Kailh keys with RGB LED illumination, rotary encoder, small 128x64 monochrome OLED screen and tiny speaker, BOOTSEL and RESET buttons.
- STEMMA QT connector for i2c, other unused RP2040 GPIO inaccessible.
- USB-C connector.
- 8MB external flash, CIRCUITPY is 7MB.
- RGB LEDs are NeoPixels.
- Uses M3 spacers.
- CircuitPython examples using the efficient built-in keypad CircuitPython library for the keys.
Pimoroni Keybow Kit (12-key) with Pi Zero WH (not shown)
This is the non-CircuitPython predecessor to the Keybow, a 3x4 macropad with APA102 RGB LEDs which used a Pi Zero running a customised o/s image. This product is no longer sold.
** Only relevant if you wish to replace them with taller ones.
I2S Protocol for Digital Audio
The Inter-Integrated circuit Sound (I2S) protocol is a simple unidirectional serial protocol for two channels of digital audio encoded as MSB first pulse-code modulation (PCM) data. The acronym sounds similar to the Inter-Integrated Circuit (I2C) protocol but the only link is Philips**, the original designer of both protocols. The four signals are described below.
- Serial data (SD) sometimes labelled with in/out.
- Serial clock (SCK) or bit clock (BCLK).
- Word select (WS) or left-right clock (LRCLK) or frame sync (FS).
- Master clock (MCLK) - optional higher-rate clock used to synchronise ADC/DAC internals.
The three non-data signals can be provided by the device transmitting the data or by the receiver.
The limitation of two channels derives from the word select. This value alternates between low for left and high for right. As this is also used to indicate the start and end of the data it means two channels are always sent even if only one is required. More than two channels can be supported using longer words and time-division multiplexing (TDM).
For samples with 16 bit length, sent at 32k samples per second, the data rate is 2*16*32000 = 1.024Mbit/sec. The SCK will be the highest frequency signal, the SD may change with each clock pulse depending on the data so the maximum frequency will be half of the clock's. The WS typically only changes every 16 bits making it the lowest frequency signal.
** Co-inventor of the Compact Disc which brought digital audio to homes in the 1980s.
I2S Amplifier Board Selection
The image above is a composite of manufacturer/vendor photographs, the relative sizes are not exact.
For this project the ideal audio board has the following characteristics.
- Works well when powered by 5V from USB on a desktop/laptop.
- Has an i2s input using three signals at 3.3V levels without the need for the extra master clock (MCLK) signal.
- Supports at least 32 thousand samples a second and ideally lower and higher rates.
- Can drive an 8 ohm speaker at approximately 2 watts.
- Offers control over how the digital codes convert to output, in the analogue world this would be called gain, or in human-friendly terminology, volume.
- Has a low profile to allow it to easily fit inside the Keybow 2040.
- Stereo output would be fun.
There are quite a few i2s boards available but some of them only provide outputs intended for line inputs or headphones. These could be used with a second amplifier board but this isn't necessarily the neatest solution, is likely to be more expensive and might need care to avoid introducing undesirable levels of noise.
The Analog Devices MAX98357A chip is a common solution to these requirements. It works at 2.5 to 5.5V, provides 3.2W power into a 4 ohm speaker when powered at 5V, supports 8-96kHz rates with 3.3V or 5.5V level signals and can select either or both of the two channels from i2s. While it receives 16bit samples it's unclear if it actually uses all of these but for this project high fidelity is not a big issue.
Adafruit I2S 3W Class D Amplifier Breakout
The blue board positioned at the top left in the image above.
- Features the MAX98357A.
- Large terminal block has been soldered on since 2024, this would need to be desoldered to reduce the height.
- Shutdown pin.
- Gain input pin.
- ENIG solder pads.
- Mono only but a pair could be used for two channel audio.
Unbranded MAX98357 I2S 3W CLASS D AMPLIFIER BREAKOUT
The purple board positioned top right.
These are common, many appear to be copies of the Adafruit board, some use different layouts, some use the remarkably small** WLP packaged chip.
MKJDZ/Module Maker Space MAX98357A I2S Stereo Audio Amplifier Module
The red board positioned bottom left.
- Features two MAX98357A and two outputs.
- Conveniently available both with and without pre-soldered terminal blocks on outputs.
- Solder pads for per-channel gain setting via bridging - there's no documentation on how to use these.
- No pin exposing the shutdown input on the MAX98357A chips.
- Stereophonic!
Soldered Stereo I2S Audio Amplifier MAX98357 board
The larger purple board with grey terminal blocks positioned bottom right.
- Features two MAX98357A and two outputs.
- No pin exposing the shutdown input on the MAX98357A chips.
- Solder pads for gain setting via bridging, intuitive and documented.
- The terminal blocks would need to be desoldered to reduce the height. There's a large capacitor stabilising the power supply which is good but the height could be problematic.
- The board may be too large to fit with two reasonable size speakers.
- Stereophonic!
The MKJDZ/Module Maker Space MAX98357A I2S Stereo Audio Amplifier Module was selected based on features and size.
** This suggests these devices are intended for use in highly miniaturised applications, e.g. smartphones.
I2S Output Using CircuitPython on RP2040 Microcontroller
I2S Output
CircuitPython's audiobusio library provides support for I2S output. Microcontrollers often have complex rules about which pins (GPIO) offer particular functionality. The RP2040 is very flexible but still has some limitations. The KeyBow 2040 unfortunately only exposes some of the GPIO on pads and some of these (GP3, GP4, GP5 AKA INT, SDA, SCL) have (external) 10k pull-up resistors making them less desirable for high frequency signals. As can be seen from the testing below, it's always worth trying** the pin configuration!
The first choice of pins tried to use the INT pin with the pull up resistor for the lowest data rate signal***. Another attempt yielded a valid combination on CircuitPython/RP2040 and INT ended up being used for the data.
The commands on REPL below show how easy it is to play a sample with i2s output in CircuitPython. A very low-resolution representation of a sawtooth wave was used to inspect the output. A sample rate of 64k was used to ensure high data rates worked okay. Samples made at 32k and lower are more appropriate for the Keybow 2040, however, faster sample rate playback might be needed for simple pitch shifting functionality.
The output captured using a logic analyzer connected to the Keybow 2040 without anything else on the i2s pins is shown above. The decoding shows the twos complement MSB first 16 bit data words. They are repeated twice for each sample due to the two channel nature of i2s and CircuitPython sending the mono sample to both left and right channels. The software reported the frequency of the word select as 63.962kHz across a decent number of samples.
The wide spread for min and max values is likely to be due to logic analyzer's sample rate of 25Msps (40ns time steps).
The samples chosen fortunately include some alternating bits in the data which (briefly) produces the highest frequency output that can occur. This portion is shown in the photograph of the oscilloscope trace (using a 10x passive probe) above which confirms the pull-up resistor doesn't have any significant effect on this high frequency square wave. CircuitPython's PWMOut could also be used without i2s to check this, an example is shown below.
I2S Input
A third party library supports i2s input (and output) using PIO on the RP2040. This is not used here but it's mentioned to avoid any confusion between this and the classes from the built-in audiobusio library.
** Making a working prototype is also very worthwhile. This would be very important if the library did not indicate invalid pin combinations and silently failed.
*** This is a reasonable quick guess at the best use for the pin with pull-up but a bit more thought about the protocol and how the timing is specified would yield the best choice.
Step 4: Keybow 2040 Assembly
Pimoroni have assembly instructions for the Keybow 2040. A small Phillips screwdriver is needed. These instructions can be followed with the following differences/postponed steps.
- Use 12mm rather than the supplied 4mm standoffs.
- Do not screw the base layer to the middle layer.
- Do not press the top layer with keys onto the middle layer.
Adding the I2S Board - Part I
The connectivity from the i2s audio board to the Keybow 2040 are listed below. The colours will vary based on your chosen wires.
- GND to - (brown substituting for black).
- DIN to INT (green).
- BCLK to TX (yellow)
- LRC to RX (orange)
- VCC to 5 (red)
Brown was used for black because it's next to red on typical multi-coloured ribbon cable. The consecutive colours black, brown, red, orange and yellow could have been used instead.
These are the steps to attach the i2s audio board to the Keybow 2040. It's important to remember that boards may be upside down compared to their final orientation in the macropad. For example. the middle layer has the microcontroller facing downwards when assembled.
- Estimate the distance for the signal and power wires taking into account routing** and cut the wires a little longer to allow for errors. Solder these onto the audio board taking account of which way the wires will run. The ground will require a bit more heating time due to the ground plane on the PCB absorbing heat.
- Cut off the connectors from the speaker wires leaving the appropriate amount of wire for the speaker positions. Leaving a very short wire on the connector makes it easier to reuse these for other projects in the future.
- Solder the speaker wires to the audio board taking care to match the polarity. On the underside the board has large + (for red) and - (for black) markings. For multiple speakers polarity can be important to avoid anti-phase issues.
- Cover any metallic surfaces of the speaker with insulation tape as a precaution in case they become loose. In this case two squares with the corners trimmed (to make an octogon) were used to cover the magnets on the back of the speakers - this avoids blocking any airflow/sound.
- Double check the connectivity is correct for the signal and power wires then carefully trim them to length for each pad and solder them. Inspect soldering to ensure the connections are good and do not bridge or get close to any other pads.
** The magnetic field from the speaker might create interference so it's best just to route wires around this if possible.
Adding the I2S Board - Part II
Testing the audio before completing the assembly of the Keybow 2040 is a good idea. The REPL example below shows how to setup the mixer which is useful for testing each channel.
The sample can then be played producing a 1kHz square wave on both channels, then left only, then right only. This frequency is easy to hear and will typically be loud on this type of small speaker.
At full volume it will be safer to feel the vibrations on the speaker's case with your finger than put your ear up against the speaker to check the selected one is producing the sound.
Setting Gain in Hardware Vs Software
An easy way to get a reasonable idea of the power used is to measure the Keybow 2040's input current. For a 1kHz square wave going to both channels a USB power meter showed the current increased by 0.64A when the tone was played. This equates to 3.2W at 5V, 1.6W per speaker or 1.44W per speaker at 90% efficiency. Pimoroni describe these speakers as 1W, the datasheet has a higher number.
4.6 RATED POWER: 2.0W. MAX. POWER:2.5W
There was no obvious audio distortion so the undocumented gain setting feature on this MAX98357A board via solder pad bridging wasn't investigated.
CircuitPython's Mixer class offers a level property for controlling the volume on sample playback which could be used if there were issues with audible distortion. Software limiting will cause a loss of resolution, i.e. a level setting of 0.25 will shrink the output range for 16 bit data to 14 bits, values between +8191 and -8192. The associated slight loss of fidelity through the introduction of more quantisation noise wouldn't be a problem for this application.
Left and Right (Horn) - a Brief Detour
The top of this audio board has some very small markings near the channels with LSP on the left and RSP on the right. Once the board is turned over it's Chinese/Kanji markings only on the underside! The curious etymology for the characters representing left and right is shown above courtesy of ChatGPT's (GPT-5.5) guesswork.
The +/- polarity markings are better indicated on the underside.
Adding the I2S Board - Part III
The final steps finish the physical assembly.
- Fix the audio board and speaker(s) to the keybow base layer.
- Screw the 12mm spacers into place.
- Push the keys onto the middle layer.
The audio board was attached using a blob of epoxy resin. This (slow-setting) resin was left for 30 minutes after mixing to thicken up a little. The wood from a large matchstick was originally going to be used as a spacer to be removed after the glue set but as it's harmless to leave it in place it was used to limit the glue spreading. It was left overnight on a flat surface to set. The photograph shows a side view confirming the set resin is touching both boards.
The speakers were then fixed in place by bending the stiff wires and using their adhesive oval rings to glue them to the base layer. The positioning needs to take into account where the metal spacers holding the layers together will be.
These blue 12mm spacers from a vendor on AliExpress do not have threads that are well made at the ends meaning the supplied, short M2 bolts do not reach the thread or reach the thread but strip a tiny part of it as they are tightened. Longer 6mm M2 bolts were used instead with similar low profile heads.
Installing Software
The software installation is identical to the previous article, see Step 8 in Colourful Macropad With Audio Using Pimoroni Keybow 2040 and Adafruit STEMMA Speaker (HID + MIDI Capable).
Undesirable Pops/Clicks
Undesirable and often loud pops/clicks** can occur on the output with audio equipment when devices are powered on or off. For digital audio extra care is required as naive or careless audio generation, reproduction or real-time processing can cause these with abrupt changes in the stream of digital values which drive the output.
PWM audio output on a microcontroller presents some simple challenges for avoiding clicks. The representation of silence, a continuous stream of midpoint values, will be a high frequency square wave, i.e. the inaudible carrier frequency at 50% duty cycle. When this is filtered it becomes a constant 3.3V/2 = 1.65V voltage, i.e. the audio signal has a DC offset. Any abrupt transition from or to a low (0V) or high (3.3V) output state including very brief ones is therefore likely to create a click. CircuitPython's audio PWM output is a decent implementation but it currently appears impossible to initialise it without creating one click when it "plays" the Mixer object for the first time. The shutdown feature of the Diodes Incorporated PAM8302 amplifier on the Adafruit STEMMA Speaker could probably be used to suppress this but the pin is not exposed on that board.
Playing samples at different rates requires changing the frequency of the audio mixer in CircuitPython to match the playback rate - this requires re-initialisation which unfortunately causes a click with PWM output. The bit length of samples also has to match which is another source of clicks when transitioning back and forth between 8 bit and 16 bit samples.
The Analog Devices MAX98357A appears to be remarkably well behaved and doesn't click when it's powered up making I2S a better choice for click-free audio. The digital I2s signal has other benefits too, it will be unaffected by noise and probably less affected by power supply noise*** than the PAM8302.
Digital audio samples need to be carefully constructed for click free playback including looping. They should start and finish at the midpoint (zero-crossing point).
** Some audio equipment will quietly click due to the use of relays that disconnect the outputs until the device is fully powered, stable and ready for operation. This sound will not be on the output.
*** USB power from a desktop computer is notoriously noisy.
Demonstration
The software and modified Keybow 2040 are demonstrated in the video above, the content is described below.
- 00:00 Pimoroni Keybow 2040 on a terminal window with green text.
- 00:04 Pressing reset button on the side of Keybow 2040.
- 00:09 Introductory scrolling text.
- 00:17 Default layer 1.
- 00:21 Keypad output with sound (IBM Model F keyboard click) and visual effects - the click sound is panned left to right to match the key column.
- 00:27 Attempt at showing far left and far right stereo key clicks!
- 00:33 Long press: effects off.
- 00:40 Short press: select layer 3 (magenta).
- 00:47 MIDI output to Surge XT in Cakewalk Sonar.
- 01:07 Short press: select layer 8 (blue).
- 01:13 Long press: visual effects only.
- 01:17 Long press: audio effects only.
- 01:24 Sample playback at variable rates.
New Features Added to Software
Since the last article these features have been added to the software.
- Support for i2s audio output enabled from the configuration file.
- Play samples which aren't recorded at 32k. For PWM audio output, like the modification shown in the previous article, this will cause one click whenever the sample rate changes
- Vary the playback rate on a sample as a simple way to change the pitch - it's not obvious but these are used in the video above at 03:29 to play the last four 32k samples at 64k.
- Layers can now have optional background colours. This could be useful as a reminder of the layer in use or for indicating the purpose of different groups of keys.
New Configuration File Settings
The configuration file can now be used to specify** the audio hardware. If the AUDIO_OUTPUT variable is absent then its default value is PWM:TX.
The pins can optionally be specified after a colon without spaces, e.g. "I2S:TX,TX,INT". The pins are in the order of the CircuitPython class constructor, for the I2SOut class these will be bit_clock,word_select,data.
The audio samples can now be represented by just the filename or a tuple containing (filename, volume, playback_rate, stereo_position). The tuple representation is used here to position the clicks on the stereo speakers to match the key column. The value None here is interpreted as "use the default value".
A background colour for the keys can be specified with an optional background variable. Here's an example which provides a dimmer version of the key colour for the subset of keys which are in use on the second layer.
** This cannot be detected electronically/programmatically as both analogue audio (using PWM) and I2S are unidirectional and do not offer a way to detect the receiving device.
Going Further
Some ideas to explore:
- Software
- Seek inspiration from Pimoroni's collection of example programs.
- Investigate CircuitPython's implementation of asyncio to see if it can be used to reduce the effect that large or complex animations have on key reading.
- Add a feature to support timed sequences.
- Add a software volume control.
- Make your own sound samples or find some.
- Mono 32k 16bit work well, lower bit rates or 8bit samples may be used if space is tight.
- Freesound is an interesting site to rummage through, for example the keyboard click sound was made from Fractal_'s IBM Model F keyboard typing.
- Add your own animated visual effects on the RGB LEDs.
- Try CircuitPython's mp3 capabilities.
- Pimoroni Library
- Make the i2c bus configurable to allow it to run at 400kilobaud.
- Look at CircuitPython's built-in keypad library to see if this is more efficient or an improvement over the current Pimoroni key scanning and debouncing implementation. This is described in Adafruit Learn: Keypad and Matrix Scanning in CircuitPython.
- Hardware
- Evaluate
- Other i2s boards like the Adafruit TLV320DAC3100 - I2S DAC with Headphone and Speaker Out board - this requires i2c connectivity too.
- Audio player boards for offloading the playback to a separate device (from a suggestion in a forum post) - this could be useful if the RP2040 is busy with sending updates to the RGB LEDs for a complex/lengthy animation.
- DFRobot: DFPlayer - Mini MP3 Player
- Adafruit Audio FX Sound Board + 2x2W Amp - WAV/OGG Trigger - 2MB
- Look for phase difference on the stereo outputs for two very high frequency phase-aligned sine waves to see how the audio board reproduces these multiplexed signals.
Similar products/kits:
- Adafruit Learn: Adafruit MacroPad RP2040 (kit) - a 3x4 RGB LED illuminated mechanical keypad with a small monochrome OLED screen, rotary encoder, a tiny speaker and a STEMMA QT connector.
- Pimoroni: Pico RGB Keypad Base (kit) - a 4x4 keypad with silicone keys illuminated by RGB LEDs powered by a Pi Pico.
- Anavi ANAVI Macro Pad 12 (kit) - a 3x4 RGB LED illuminated mechanical keypad with a small OLED screen and RGB underlighting powered by a Seeed Studio XIAO RP2040.
Further reading
- Adafruit Industries
- John Park's CircuitPython Parsec: I2S Audio Pins (YouTube)
- Desk of Ladyada - Toy Hacking Fun! … and a Mono I2S Audio Amplifier (YouTube) - discussion on children's toys with sound and searching for alternatives to the popular Analog Devices MAX98357 digital amplifier.
- BBC: The Surprising Science Behind Noise Cancelling Headphones | The Secret Genius of Modern Life - BBC - Hannah Fry demonstrates and explains anti-phase issues with speakers.
- Pimoroni: Introducing Keybow 2040 - 16 key mini mechanical keyboard powered by RP2040 (YouTube)
- Tom's Hardware: Les Pounder: How to Build an RP2040 Powered Shortcut Keyboard
- NerdCave
- Transform an old broken Keyboard to a Macro Keyboard (YouTube) - using Pi Pico and CircuitPython
- DIY Macro Keyboard - Custom PCB and Mechanical Switches - Raspberry Pi Pico (YouTube) - a follow-up to first project with screen and rotary encoder
- Tom's Hardware: The Pi Cast: Adafruit Talks KB2040 Board for Custom Keyboards (YouTube)
- Jan Lunge: Pi Pico + KMK = the perfect combo for Custom Keyboards (YouTube) - shows another CircuitPython library, KMK, (with limited support) for keyboards/macropads.
- Instructables: Modular Macro Keyboard System — Ocreeb MK2 - a 3D-printed modular keypad system with magnetic connectors similar to littleBits/ROLI Blocks using CircuitPython and KMK.
- Paul Cutler's curated list of applications, macros, 3D printed cases, guides, and more for the Adafruit MacroPad RP2040.
- Non-CircuitPython corner
- QMK (Quantum Mechanical Keyboard) Firmware - open-source firmware for custom macropads and keyboards.
- Instructables: DIY Bluetooth Macro Keypad - an inexpensive Bluetooth Low Energy (BLE) HID keypad using a membrane keyboard, an ESP32 microcontroller board and Arduino C/C++ - an Unexpected Maker TinyPICO is used but most other ESP32 boards will also work.
- Instructables: How to Reverse-Engineer Almost Any Keyboard Matrix With Raspberry Pi Pico - an interesting approach to scanning the connector of an unknown keyboard to automatically determine the wiring layout of the matrix using a Pi Pico.
- Andreas Spiess: (487) Remote control of PC and Smartphones with DIY HID devices (incl. Rubber Ducky / Bad USB) (YouTube)
- DigiKey: Custom Macropad - The Byte Sized Engineer | DigiKey (YouTube) - Warning: includes gratuitous dancing.