<< Back

 

Cesky: , English:

BarePi

Modular Microchip Kit

Last Update: 06/07/2026

(c) 2026 Miroslav Nemecek

https://github.com/Panda381/BarePi

Download sources of the BarePi kit (100 MB)

Note: The schematics and PCBs are in KiCAD version 9 format. The PCBs were originally designed for home production using photolithography and may not be properly prepared for professional production. If you want to have your PCBs professionally produced, I recommend checking the designs carefully, especially the dimensions of the components, which may not be correctly defined. Typically, SMD capacitors may not have the correct dimensions.

Note 2: A WCH-LinkE programmer (available e.g. here) may be required to program CH32xxx processors. Before using it for the first time, it may be necessary to upgrade the firmware of the programmer first - this can be done in the MounRiver Studio development environment.

Contents

Special modules

Processors

Displays

Keyboard

 

Description of the kit

BarePi is a modular microchip kit designed for programming small devices such as game consoles or calculators. The main focus is on the Raspberry Zero 2 module, programmed as bare-metal (i.e. without an operating system) with library PiLibSDK (link www, GitHub). However, other types of processors supporting 3.3V signals can also be used (ATmega, CH32V, ESP32). The modules of the kit are connected via 40-pin connectors, forming a bus with signals defined according to the Raspberry Zero 2 module. The connectors ensure sufficient connection strength, no additional mechanical connections are needed. Most modules are pass-through - they contain both a bus input connector on the top edge of the board and a bus output connector on the bottom edge of the board. The exceptions are the processor modules, which contain only an output connector, and the alphanumeric keyboard module, which has only an input connector.

The connection connector consists of a 2x20-pin female header on the bottom of the module (signal output from the module - e.g. processor module) and a 2x20-pin pin header on the top of the module (signal input to the module - e.g. keyboard). Most modules have a width of 65 millimeters, based on the width of the Raspberry Zero 2 module. Most devices contain a processor module, a "Base" module with power supply and sound output, a display module and a keyboard module. All signals on the bus are at 3.3V levels. The bus also contains a 5V supply voltage, but this voltage is used both to supply power to the device (followed by a 3.3V stabilizer) and as a voltage for a possible signal converter to the 5V level. The 5V level must not be applied to the signal wires themselves, in many cases this could damage the device.

When building modules, you can solder the processor and display modules hard over the pin strip, but I recommend using a socket strip for easy replacement. The kit modules can be used in the simplest form, just the printed circuit board itself, but it is more luxurious to add a top panel. For some modules, such as the keyboard, the top panel is necessary because of the key labels. An additional printed circuit board can be used as the top panel, screwed to the module using spacers. The materials also include graphics for the bottom panel, but it is probably unnecessary - the bottom side of the module can be treated, for example, by gluing foam strips from window insulation so that the bottom side of the printed circuit board does not scratch the table. For the kit prototypes, instead of the top panel, I used only printed cardboard paper, covered with insulating tape against abrasion and with holes punched with a leather punch. For keyboards, I recommend adjusting the height of the keys so that the keycaps protrude 1 mm above the surface of the top panel. If the protrusion is too large, the keys may press into your fingers when pressed, and if the protrusion is too small, more force may be required to press.

Bus connector

Definition of the signals on the bus connector, looking at the header strip on the bottom edge of the module. The corresponding GPIO pin number of the Raspberry Zero 2 module is shown in parentheses.

Display connector

Some modules allow image output to an external display with a VGA or HDMI interface. These modules contain a 2x10-pin female header connector that contains signals for output to both an HDMI display and a VGA display. In addition, the connector contains a signal used to detect whether a DispHDMI, DispVGA module is inserted into the connector or the connector is left free. Accordingly, the interface for an HDMI display, a VGA display or an internal LCD display can be selected.

Definition of the signals on the display connector, looking at the female header strip at the output of the processor module. The corresponding GPIO pin number of the PGA2350 module is shown in parentheses.

ZeroTiny

The game console "ZeroTiny" is not directly part of the BarePi kit. This is a minimalist game console with a Raspberry Zero 2 or Raspberry Zero 1 module. It is an example of creating an end device based on the modules of the kit. Its connection corresponds to the connection of the "Zero", "Base" and "KeyPad" modules. In the construction, I recommend using a female connector strip rather than direct soldering of the Zero module - so that the Zero 1 or Zero 2 modules can be exchanged. The ZeroTiny console in the PiLibSDK library, where you can also find sample applications: www, GitHub.

ZeroTiny console built from BarePi modules:

Special modules

Base

The "Base" module is the basic module of the kit. The module can be used with all devices - it provides power to the device from the USB connector (using a 3.3V stabilizer), audio output, microSD card slot, processor reset button, SD card access LED and user LED. Before manufacturing the PCB, check the definition for the audio connector, SD card slot, speaker and HT7533 stabilizer - the coordinates and meaning of the pins may vary from manufacturer to manufacturer. There is a jumper on the module that determines whether the internal 3.3V stabilizer is used. If the processor module contains its own stabilizer, it may be appropriate to turn off the stabilizer on the "Base" module. When constructing this module, I would like to point out that some components are too close together and are difficult to solder - it might be better to rearrange the board slightly and also choose larger housings for the capacitors. The speaker could also use some improvement - the sound is quiet, so an amplifier might be needed.

The PWM_L and PWM_R audio signals terminate in this module and do not continue beyond it. This is to minimize interference with the audio signal. If possible, connect the "Base" module first, immediately after the processor module. Better routing of the audio wires and more thorough shielding would likely improve the audio signal quality as well.

BusExp

The "BusExp" module is a bus expander. It allows you to connect up to 4 modules together if you prefer to organize the modules "on top of each other" rather than "side by side".

Port

The "Port" module is a module for connecting external peripherals. It contains connectors for SPI, I2C, UART connections, as well as a CH32V002A4M6 processor, which provides 12 digital inputs/outputs and 6 analog ADC inputs.

RTC

The "RTC" module is a module containing a real-time clock and EEPROM memory. The real-time clock is provided by the DS3231 circuit, backed up by a CR2032 battery. It is possible to use either the original MAXIM circuit or a much cheaper Chinese clone, which has lower accuracy, but its accuracy is sufficient for normal use. I personally used a commercially available real-time clock module, from which I soldered out the DS3231 circuit, the AT24C32 memory and the CR2032 battery holder, and used everything in this module. The "RTC" module contains a built-in AT24C32 EEPROM memory, with a capacity of 4KB, at I2C address 0x57. This memory is used to store program configurations. External modules with EEPROM memory with a capacity of up to 64KB can be connected to the module, in 2 different pinout configurations. An EEPROM module with a pinout of VCC-GND-SCL-SDA can be connected to the first slot, J3. The second slot, J4, is used to connect an EEPROM module with the pinout VCC-SCL-SDA-GND. Memory slots can have an I2C address of 0x50 to 0x56. For AT23C256 and AT23C512 memories, the address range can only be selected from 0x50 to 0x53. When using EEPROM memories, it is important to remember that Raspberry Pi modules (Zero, 1, 2, 3) use the I2C0 bus to read the EEPROM ID during startup. If the user EEPROM does not use the same data structure as the EEPROM ID, this should not be a problem.

TestLed

The "TestLed" module is a test module for testing the kit bus. It uses LEDs to indicate the states of the bus signals. Almost all LEDs, except for the LEDs for indicating the 5V and 3.3V supply voltages, are connected between the signal and the 3.3V supply voltage. By lighting up, they indicate the LOW state - because most signals are negative, when the idle state is HIGH and the active state is LOW. The exceptions are some signals, such as USR_LED, PWM_L, PWM_R, LCD_BL, which have a positive meaning and it might be more appropriate to indicate their level HIGH. But due to the possibility of easy detection of a short circuit between the signals, the same connection is left for these special cases of signals. The test LED for the USR_LED signal will therefore be on if the user LED is off, and similarly the LED for the display backlight will be on if the backlight is turned off. Of course, in cases where the signal is not used and is in a high impedance state, the LEDs will not light up even at the LOW level. For easy bus testing, a program can be loaded into some processors that gradually lights up the LEDs for bus signals, so you can visually check for bus interruption or short circuit errors on the bus. You can test the bus (except for the last 6 signals) using the "Zero" processor module and the TESTLED program from the PiLibSDK library, TEST folder: www GitHub.

The module uses SMD LEDs with PLCC-4 package. Different manufacturers use different pin connections - therefore, only 2 contacts out of 4 are used on the printed circuit board, the connection of which is followed by manufacturers.

Processors

MegaTinyJoypad

The "MegaTinyJoypad" module is designed to control the "MEGA Tiny Joypad" game console, designed by (c) Daniel C (Electro L.I.B). The module contains an ESP-07S processor unit, which can either be soldered to the module directly, or use an adapter for ESP-07 and a connector with a female connector strip. The program can be uploaded to the processor via UART pins, after pressing the "A" button during power-on. The "Base", "OLED128x64" and "KeyPad" modules need to be connected to the module.

Mega Tiny Joypad console built from BarePi modules:

Mega Tiny Joypad console wiring diagram:

PGA2350

The "PGA2350" module is used to build the PicoPadPGA game console. It is a variant of the PicoPad console featuring the PGA2350 processor module, which includes an RP2350B processor, 16 MB of Flash memory, and 8 MB of PSRAM. Video output is supported for a 320x240-pixel LCD display, a VGA monitor, or an HDMI monitor. The module requires the connection of the "DispVGA", "DispHDMI", "LCD320x240", "Base" and "KeyPad" modules. The PicoPadPGA console software is based on the PicoLibSDK library (links: www, GitHub), but the software for the PicoPadPGA console is not yet ready.

PicoPadPGA console built from BarePi modules:

PicoPad

The "PicoPad" module is used to assemble the PicoPad game console. I recommend not soldering the Pico module to the module, but using female connectors to allow easy exchange between the Pico 1, Pico 2 (PicoPad 2) and Pimoroni Pico Plus 2 modules. The "Base", "LCD320x240" and "KeyPad" modules need to be connected to the module. The PicoPad console in the PicoLibSDK library, where you can also find sample applications: www, GitHub.

The original PicoPad console uses mono audio on the GPIO14 port. In the "PicoPad" module, the original audio from GPIO14 is routed to PWM_L, so you will hear audio from standard programs in the left channel. The GPIO15 port can be used for the right channel of stereo audio. However, it is necessary to modify the PicoPad programs for this option. To play MP3 music, you can use the MP3_1514 program, which has already been modified to play audio through the GPIO15/GPIO14 ports.

PicoPad console built from BarePi modules:

PicoPad console wiring diagram:

PicoPadHSTX

The "PicoPadHSTX" module is used to assemble the PicoPadHSTX game console, which is equipped with a "Pico 2" or "Pimoroni Pico Plus 2" module. The "DispVGA", "DispHDMI", "Base" and "KeyPad" modules must be connected to this module. There may be noticeable increased noise in the audio due to the increased load on the internal voltage regulator caused by image generation. Modules with a higher-rated regulator (such as the Pimoroni Pico Plus 2) produce less noise. To reduce noise, I recommend leaving the regulator in the "Base" module active, which will boost the internal regulator of the Pico 2 module. Another option is to use an active PWM filter with a filtered supply voltage. The PicoPadHSTX console in the PicoLibSDK library, where you can also find sample applications: www, GitHub.

PicoPadHSTX console built from BarePi modules:

PicoPadHSTX console wiring diagram:

PidiBoy

The "PidiBoy" module is designed to build a PidiBoy game console, with a CH32V006F8P6 processor and output to a 128x64 OLED display. The "Base", "OLED128x64" and "KeyPad" modules need to be connected to the module. The PidiBoy console in the CH32LibSDK library, where you can also find sample applications: www, GitHub.

PidiBoy console built from BarePi modules:

PidiBoy console wiring diagram:

PidiMet

The "PidiMet" module is used to build a universal multimeter PidiMet. The "Base", "OLED128x64" and "KeyPad" modules need to be connected to the module. The "PidiMetAdapter" adapter can be used to connect the measuring leads. When constructing this module, I would like to point out that some components are too close together and are difficult to solder - it might be better to rearrange the board slightly and also choose larger housings for the capacitors. Firmware for the "PidiMet" module can be found in the CH32LibSDK library in the ch32\DEVICE\PidiMet folder www GitHub, or as a standalone project www GitHub.

PidiMet multimeter built from BarePi modules:

PidiMet multimeter wiring diagram:

PidiMetAdapter

The "PidiMetAdapter" module is an adapter for connecting measuring leads to the "PidiMet" module.

PidiPad

The "PidiPad" module is used to build a PidiPad game console, with a CH32V006E8R6 processor and VGA monitor output. The "DispVGA", "Base" and "KeyPad" modules need to be connected to the module. If you do not use a 25 MHz crystal, the processor will choose a lower-precision RC oscillator - the console will still be usable, but the VGA image will slightly waver and shake. For this reason, the crystal is placed in a socket so that it can be removed and tested without the crystal. The PidiPad console in the CH32LibSDK library, where you can also find sample applications: www, GitHub.

Recommendation: Outputting video to a VGA monitor causes large current spikes in the power supply. Consider adding a tantalum capacitor to the processor's power supply; otherwise, the processor may operate at the limit of stability.

PidiPad console built from BarePi modules:

PidiPad console wiring diagram:

SumoPad

The "SumoPad" module is used to build the SumoPad game console. The "DispVGA", "LCD320x240", "Base" and "KeyPad" modules need to be connected to the module. The heart of the module is the CH32V208RBT6 processor. Due to the difficulty of soldering it (and also due to the higher price), the processor does not have to be soldered directly to the module board, but can be soldered on an LQFP-64 adapter, so that the processor can be replaced and used in other modules. Image output is possible either to an external VGA monitor or to an internal LCD320x240 display - depending on whether the "DispVGA" adapter is inserted into the module or not. The processor is controlled by a 24MHz crystal, instead of the recommended 32MHz crystal - due to better crystal availability. The processor can be used in the usual way with a 24MHz crystal, the only difference is that the Ethernet and Bluetooth interfaces cannot be used - but these are not available in this module anyway. The crystal could be changed to the recommended 32MHz, in which case the PLL module settings must be adjusted in the software, or automatic crystal frequency detection must be added to the firmware.

The SumoPad console software is based on the CH32LibSDK library (links: www, GitHub), but the software for the SumoPad console is not yet ready.

TinyJoypad

The "TinyJoypad" module is designed to control the "Tiny Joypad" game console, designed by (c) Daniel C (Electro L.I.B). The module contains an ATtiny85 processor. The program is loaded into the processor in a programmer, so it is advisable to use a DIL socket for the processor. The "Base", "OLED128x64" and "KeyPad" modules need to be connected to the module.

Tiny Joypad console built from BarePi modules:

Tiny Joypad console wiring diagram:

TweetyBoy

The "TweetyBoy" module is designed to build the TweetyBoy game console. The "LCD160x80", "Base" and "KeyPad" modules need to be connected to the module. The module is controlled by the CH32X035G8R6 processor. The TweetyBoy console in the CH32LibSDK library, where you can also find sample applications: www, GitHub.

TweetyBoy console built from BarePi modules:

TweetyBoy console wiring diagram:

Zero

The "Zero" module is the highest type of processor module in the BarePi kit. It contains the Raspberry Zero 1 or Raspberry Zero 2 module. For easy replacement, I recommend fitting the module with a connector with a female strip, instead of hard soldering it over the pin strip. Unlike other modules, this module contains a USB connector for power and a microSD card, so it can be operated separately, without other modules. For PWM sound output, you may need to connect the "Base" module (I recommend disconnecting the internal stabilizer in the "Base" module with a jumper). For game control, you may need to connect the "KeyPad" module. The minimalist version of the game console is ZeroTiny - when using the kit modules, it corresponds to the connection of the "Zero", "Base" and "KeyPad" modules. The software for the "Zero" module uses the PiLibSDK library, which also includes sample applications: www, GitHub.

ZeroTiny console built from BarePi modules:

ZeroTiny console wiring diagram:

Displays

DispHDMI

The "DispHDMI" module is a module for outputting images to a display with an HDMI interface. It is not a separate module with a bus, but an auxiliary module that can be connected to some processors using a connector with a 2x10-pin pin strip. The connector contains signals for output to both an HDMI display and a VGA display. In addition, it also contains a DISP_SEL signal used to detect whether a DispHDMI, DispVGA module is inserted into the connector or the connector is left free. Accordingly, the interface for an HDMI display, VGA display or internal LCD display can be selected.

The module also supplies the HOTPLUG, SCL and SDA signals to the display connector. Currently, no module uses these signals. Be careful when using the SCL and SDA signals - on most monitors, the signals are connected via pull-up resistors to +5V, which can be dangerous for circuits operating with 3.3V levels.

DispVGA

The "DispVGA" module is a module for outputting images to a display with a VGA interface. It is not a separate module with a bus, but an auxiliary module that can be connected to some processors using a connector with a 2x10-pin pin strip. The connector contains signals for output to both an HDMI display and a VGA display. In addition, it also contains a DISP_SEL signal used to detect whether a DispHDMI, DispVGA module is inserted into the connector or the connector is left free. Accordingly, the interface for an HDMI display, VGA display or internal LCD display can be selected.

ExtDisp

The "ExtDisp" module is designed to capture signals for an LCD display with an ST7789 controller and a resolution of 320x240 pixels, and display it on a VGA or HDMI monitor. The choice of monitor is determined by whether a DispVGA adapter or a DispHDMI adapter is inserted into the display connector. Firmware for the "ExtDisp" module can be found in the PicoLibSDK library in the !Pico\Module folder, file ExtDisp0.UF2 (version 0 with the Pico module): www, GitHub.

The ExtDisp module integrated into the PicoPad console:

Wiring diagram for the original ExtDisp adapter version 0 (with the Pico module):

LCD16x2

The "LCD16x2" module is a DM1602A text LCD display with 2 rows of 16 characters and an HD44780 controller. The module contains a CH32V002A4M6 processor, which is used to control the display and communicate with the main processor via the I2C bus. The auxiliary function of the processor is to generate a 5V bias voltage for the LCD display. The V0_DN and V0_UP buttons can be used to control the voltage level for the bias voltage, and thus the contrast of the LCD display. The "Backlight" jumper can be used to turn the display backlight on or off.

LCD160x80

The "LCD160x80" module is a 0.96" graphic color display with SPI interface, 160x80 resolution and ST7735S controller. The module optionally contains a CH32V002J4M6 processor, but it is not necessary to use it, it is only used to identify the module's connection to the bus. For easier identification of the display connection, an optional resistor R1, connected between the LCD_RE and LCD_CS signals, is also used. Using solder jumpers, you can choose whether to use the display backlight signal from the bus or whether it will be generated by the processor in the module. It may happen that some processor module will not be able to generate adjustable backlight brightness, in which case it may be more appropriate to generate the backlight in the display module.

LCD320x240

The "LCD320x240" module is a 2.0" graphic color display with SPI interface, 320x240 resolution and ST7789 controller. The module optionally contains a CH32V002J4M6 processor, but it is not necessary to use it, it is only used to identify the module's connection to the bus. For easier identification of the display connection, an optional resistor R1, connected between the LCD_DC and LCD_CS signals, is also used. Using solder jumpers, you can choose whether to use the signal for the display backlight from the bus or whether it will be generated by the processor in the module. It may happen that some processor module will not be able to generate adjustable backlight brightness, in which case it may be more appropriate to generate the backlight in the display module.

LED12

The "LED12" module contains a 12-digit display of 7-segment LED digits. It is controlled by a CH32V006E8R6 processor, which communicates with the main processor via the I2C bus. When constructing, I recommend placing red plexiglass over the display, which will ensure good contrast of the displayed data even in daylight.

OLED128x64

The "OLED128x64" module is a 0.96" black and white OLED display with an I2C interface, a resolution of 128x64 and an SSD1306 controller. The module can be equipped with two types of OLED displays, with different pin arrangements. You can insert the display into the upper or lower position of the header, depending on the desired pin arrangement. For this reason, there are also two different definitions of the module's front panel. In fact, you can use only one panel, printed on both sides, with the back side printed "upside down". You will then use the side of the panel that matches the position of the display used.

Keyboard

CalcKey

The "CalcKey" module is a keyboard designed for calculators. The layout of the buttons corresponds to the layout of the ET-58 calculator, which is a clone of the TI-58 calculator. If you use a different calculator, you may need different key labels. You can make a mask with different labels, for example, by printing it on hard paper, covering the surface with insulating tape (for better abrasion resistance) and punching the holes for the buttons with a punch on the leather.

KeyPad

The "KeyPad" module is a basic simple keyboard, used primarily for controlling games. It contains 9 buttons - directional arrows, main action button "A", secondary action button "B", auxiliary button "X", end button "Y" and alternative key meaning button "ALT". The buttons are used for direct reading of the state using pull-up resistors, when pressed they connect to the ground GND. The signal for the "ALT" button can also serve as a clock signal source, therefore the button is connected via a 1K0 protective resistor.

MiniKey

The "MiniKey" module is a minimalistic alphanumeric keyboard. It contains a total of 48 buttons, of which 9 buttons correspond to the "KeyPad" keyboard buttons with direct access to the buttons, the remaining 39 buttons are multiplexed by the CH32V002F4P6 processor, in a 6x7 button matrix.

 

Miroslav Nemecek

<< Back