Skip to the content
2 layers34.8 × 59.7 mmCh570sao9v, the printed circuit board in 3D

Ch570sao9v

cnlohr/beanboy5

(Early drafts, not ready yet)

Size
34.8 × 59.7 mm
Copper layers
2
Thickness
1.6 mm
Parts
53
Nets
49
Pads
178
Tracks, vias
607, 168
Pours
6
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
7 Dec 2025
Updated
15 Jan 2026

Overview

Ch570sao9v is an open-source printed circuit board by cnlohr, from the cnlohr/beanboy repository on GitHub, published under the MIT licence. It is a 2-layer board of 34.8 × 59.7 mm with 53 parts on 49 nets, routed with 607 tracks and 168 vias.

It is built around the CH572Q, QMC6309 and LSM6DS3, with the TPS54302 and TS-1187A-B-A-B among its other parts. Its parts include 19 capacitors, 9 resistors, 6 ICs, 4 switches and 2 diodes.

Main components

5

README

README.md

beanboy

The beanboy is a handheld game system with 3 buttons, and an oled display. It has the following specs:

  • Powered by a 9V Battery
  • 128x128 RB150-2828KSWKG01 SPI OLED display from Ronboe ($2.50)
  • 3 Silicone buttons with pressure sensitivity
  • TBD: Runtime
  • CH572 Main Processor
    • 240kB Flash
    • 12kB RAM
    • 60MHz
    • RISC-V rv32imbc processor
    • 2.4GHz iSLER radio comms

(Early drafts, not ready yet)

Installation / getting started

Follow these instructions: https://github.com/cnlohr/ch32fun/wiki

Graphics API

The bean boy uses a monochrome 128x128 display.

Input

You get "pressures" for button 1, button 2, button 3, and the battery level. (For now, just print the values to the screen, we will be changing the levels)

c
	uint32_t pressures[4];
	BeanBoyReadPressures( pressures );

Sprites

Have .png files in sprites/ folder, then on compile, they will turn into the object name itself, when you say make clean firmware.elf

c
void RenderBSprite( const bsprite * spr, int outx, int outy );

For instance if you have sprites/bubble.png, you can call:

c
	RenderBSprite( &bubble, x, y );

You can use purple or actual transparency to indicate transparent, then use white or black.

Basic Drawing

Graphics APIs are from the ch32v003 ssd1306 driver

c
#define SSD1306_W 128
#define SSD1306_H 128


void ssd1306_drawPixel(uint32_t x, uint32_t y, int color);
void ssd1306_xorPixel(uint32_t x, uint32_t y);
void ssd1306_drawImage(uint32_t x, uint32_t y, const unsigned char* input, uint32_t width, uint32_t height, uint32_t color_mode);
void ssd1306_drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color);
void ssd1306_drawFastHLine(uint32_t x, uint32_t y, uint32_t w, uint32_t color);
void ssd1306_drawLine(int x0, int y0, int x1, int y1, uint32_t color);
void ssd1306_drawCircle(int x, int y, int radius, int color);
void ssd1306_fillCircle(int x, int y, int radius, int color);
void ssd1306_drawRect(int32_t x, int32_t y, uint32_t w, uint32_t h, uint32_t color);
void ssd1306_fillRect(uint32_t x, uint32_t y, uint8_t w, uint32_t h, uint32_t color);
void ssd1306_xorrect(uint8_t x, uint8_t y, uint8_t w, uint8_t h);
void ssd1306_drawchar(uint8_t x, uint8_t y, uint8_t chr, uint8_t color);
void ssd1306_drawstr(uint8_t x, uint8_t y, char *str, uint8_t color);
void ssd1306_drawchar_sz(uint8_t x, uint8_t y, uint8_t chr, uint8_t color, font_size_t font_size);
void ssd1306_drawstr_sz(uint8_t x, uint8_t y, char *str, uint8_t color, font_size_t font_size);

Wireless API

c
// call these
void ISLERSetup( int channel ); 
void ISLERSend( uint8_t message, int messageLength );

struct MyGameStruct
{
	uint32_t id;
	uint8_t something;
} __attribute__((packed));

void ISLERCallback( uint8_t * txmac, uint8_t * message, int messageLength, int rssi )
{
	struct MyGameStruct * st = (struct MyGameStruct*)message;

	if( messageLength < sizeof( struct MyGameStruct ) )
		return;

	printf( "%d\n", st->something );
}

void main()
{
	ISLERSetup( 9 );

TODO

TODO:

  1. Build up two beanboys
  2. Check to see if the radio code works.
  3. Make sprite import code.
  4. Add transparency code.
  5. Add API for comms
  6. Add networking to emu
  7. Add button debouncing
  8. Add compression to sprites
  9. Add sprite rotation maybe?
  10. Add sprite scaling maybe?
  11. "Pass the puffer" "Hot Potato with puffer fish" a. Choose between 2 and 6 players b. Randomly assign X amount of passes. c. number of passes remaining is unknown.
  12. Shut the box. a. Rules too complicated for me to write here.

Parts

53
QtyValueFootprintReferences
104.7uCapacitor_SMD:C_1206_3216MetricC2, C5, C6, C7, C8, C9, C10, C11, C12, C19
5100nResistor_SMD:R_0402_1005MetricC1, C3, C13, C17, C18
433kcnhardware:R_0402_1005Metric_COMPACTR1, R6, R7, R9
31uResistor_SMD:R_0402_1005MetricC4, C15, C16
3TS-1187A-B-A-Bcnhardware:BTC007_Button_SiliconeSW1, SW2, SW3
210uHInductor_SMD:L_1008_2520MetricL1, L2
21Mcnhardware:R_0402_1005Metric_COMPACTR3, R8
21N4148Diode_SMD:D_SOD-323D1, D2
2GNDTestPoint:TestPoint_Pad_D1.0mmTP8, TP9
110cnhardware:R_0402_1005Metric_COMPACTR4
1100kcnhardware:R_0402_1005Metric_COMPACTR5
110nResistor_SMD:R_0402_1005MetricC14
132MHzCrystal:Crystal_SMD_2016-4Pin_2.0x1.6mmY1
151kcnhardware:R_0402_1005Metric_COMPACTR2
1CH572QPackage_DFN_QFN:QFN-20-1EP_3x3mm_P0.4mm_EP1.65x1.65mmU3
1DCTestPoint:TestPoint_Pad_D1.0mmTP4
1HX3608_BOOSTPackage_TO_SOT_SMD:SOT-23-6U4
1LSM6DS3cnhardware:LGA-14_3x2.5mm_P0.5mm_LayoutBorder3x4y_EVEN_PADSU5
1MOSITestPoint:TestPoint_Pad_D1.0mmTP1
1QMC6309Package_BGA:WLP-4_0.83x0.83mm_P0.4mmU6
1RESTestPoint:TestPoint_Pad_D1.0mmTP6
1SAOConnector_PinHeader_2.54mm:PinHeader_2x03_P2.54mm_Vertical_SMDJ1
1SCKTestPoint:TestPoint_Pad_D1.0mmTP3
1SCSTestPoint:TestPoint_Pad_D1.0mmTP5
1SW_SPDTswadgeparts:SW_SPDT_PCM12SW4
1TPS54302Package_TO_SOT_SMD:SOT-23-6U2
1V5TPTestPoint:TestPoint_Pad_D1.0mmTP2
1VBATTestPoint:TestPoint_Pad_D1.0mmTP7
1~cnhardware:RB150-2828KSWKG01U1

Similar boards

  • 2 layers34.8 × 59.7 mmCh570sao9v, the printed circuit board in 3D

    Ch570sao9v

    cnlohr/cnhardware

    My dumping grounds for all my kicad projects and random hardware bringup.

    44 parts114
  • 2 layers22 × 31 mmUnderglow slave, the printed circuit board in 3D

    Underglow slave

    lukmatuska/Underglow

    Cheap wireless lighting system for small local applications (cars, bikes, etc...)

    15 parts
  • 4 layers76 × 76.9 mmDsp amplifier x4, the printed circuit board in 3D

    Dsp amplifier x4

    blus-audio/hardware

    Audio hardware

    179 parts1CERN-OHL-S-2.0
  • 4 layers455.2 × 254.8 mmRDAT, the printed circuit board in 3D

    RDAT

    Astrid-Delestine/Remote-Access-Desktop-Terminal

    All project requirements are listed in ./projreq.md

    520 partsMIT
  • 2 layers63.8 × 70.9 mmDelSolClock, the printed circuit board in 3D

    DelSolClock

    Marcus10110/DelSolClock

    This is a project to replace the clock in my car with an ESP32 and a small display.

    94 parts3
  • 2 layers44.7 × 93.6 mmUltisense, the printed circuit board in 3D

    Ultisense

    darshg321/Ultisense

    an esp32-s3 devboard made to sense as many things as possible

    94 parts3
  • 2 layers40 × 43 mmSlimeVR pcb, the printed circuit board in 3D

    SlimeVR pcb

    H3wastooshort/slimeinator

    71 parts2AGPL-3.0
  • 4 layers24 × 17.5 mmSlimevr nugget, the printed circuit board in 3D

    Slimevr nugget

    infopcgood/slimevr-nugget

    SlimeVR nRF52840 PCB (QFN48 package version)

    55 partsCERN-OHL-S-2.0

Questions

How big is the Ch570sao9v PCB?

It measures 34.8 × 59.7 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Ch570sao9v use?

53 parts, built around the CH572Q, QMC6309, LSM6DS3 and TPS54302. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Ch570sao9v KiCad files?

From the cnlohr/beanboy repository on GitHub, at the commit this page was made from: the board is hardware/ch570sao9v.kicad_pcb and its schematic hardware/ch570sao9v.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ch570sao9v design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).