My build of the OpenChess smart chess board by Concept Bytes, with bug-fix patches for the Arduino Nano RP2040 Connect firmware.
AI mode hangs? Sensors flicker? Stockfish API failed? Pieces appear/disappear when you slide them?
Use my patched firmware β it fixes those issues. The original Concept-Bytes repo has been unmaintained since Aug/2025 (0 PRs ever merged, 7 open issues including the AI mode hang).
π₯ Download v1.4.1-rp2040 firmware (.uf2 drag-and-drop) β AI mode finally reliable
v1.2.2 routes the Stockfish API through a Cloudflare Worker proxy so the board talks plain HTTP instead of HTTPS β works around a fundamental TLS bug in the NINA-W102 firmware that was causing 100% Stockfish failure rates with Cloudflare-fronted endpoints. Verified: 8 consecutive API calls succeeded on first attempt at ~2s end-to-end.
New in v1.3.0: runtime AI difficulty (pick Easy/Medium/Hard/Expert on 4 centre squares), a "whose turn" breathing indicator, a blue Human-vs-AI menu LED, working castling in AI mode, a fix for the "Invalid FEN" turn-stall after castling, and a clean serial monitor by default.
New in v1.4.0: persistent games β the board saves after every move and silently resumes after a power-off (play, switch off, come back days later and continue), until you reset by re-placing all 32 pieces.
New in v1.4.1: checkmate/draw detection in AI mode (it used to never end the game against the bot) and endless checkmate fireworks until you lift a piece.
Also includes: column-mirror coordinate fix, full FIDE chess rules, breathing-pulse-while-thinking, castling visual hint in HvsH, 5-attempt retry with NINA reset and amber retry pulse as belt-and-braces.
Backed the OpenChess Kickstarter? Same hardware β these fixes apply to your board too.
- What this repo is
- Quick start (flash patched firmware in 60 seconds)
- User manual β game modes, moves, troubleshooting
- Comparison with other forks β what we have, what we don't
- Hardware & build status
- Firmware sources
- Build documentation β chronological log of the build
- Bill of materials
- Contributing
- License
This repository has two parts:
- Build documentation for my personal OpenChess assembly (this repo,
semichcsc-byte/openchess) β BOM, photos, lessons learned. - Patched firmware for the Concept-Bytes PCB + Arduino Nano RP2040 Connect (
semichcsc-byte/Open-Chess) β fixes the broken AI mode, sensor flicker, missing chess rules, and packs everything into a one-file.uf2drop-in.
If you just want a working board, scroll to Quick start. If you want to understand the build, see BUILD_LOG.md.
Goal: get the patched firmware running on your board in under 60 seconds, without installing the Arduino IDE.
Grab OpenChess-v1.4.1-rp2040.uf2 (~325 KB).
Double-tap the white reset button on the Arduino Nano RP2040 Connect within ~500 ms. The board mounts as a USB drive named RPI-RP2.
Drag the .uf2 file onto the RPI-RP2 drive. The board reboots automatically into the new firmware.
At 9600 baud. You should see:
================================================
OpenChess Starting Up
Firmware: v1.4.1-rp2040
Fork: semichcsc-byte/Open-Chess
================================================
=== ChessEngine self-tests ===
PASS T1..T10
=== Self-tests complete: 10/10 passed ===
If you see fewer than 10 passes, the board flashes red 5 times β the firmware is broken, don't use it for a game.
Place all 32 pieces in their starting squares (the board guides you: your side glows white, the far side red, and each square goes dark as you fill it). When the board is complete a rainbow burst plays and two menu LEDs light up in the centre:
- D5 (left) β white LED β Human vs Human
- E4 (right) β blue LED β Human vs AI (Stockfish)
Lift any piece and place it on a lit square to choose. AI mode then asks for difficulty on 4 lit centre squares (c4 Easy/green, d4 Medium/blue, e4 Hard/amber, f4 Expert/red). Full layout in the user manual.
The pre-built .uf2 does not include WiFi credentials. To use AI mode, clone the source, edit arduino_secrets.h, and recompile. Full instructions in the manual.
| Bug / missing feature in upstream | Fixed in v1.0.0-rp2040 |
|---|---|
| π΄ AI mode hangs at "Connecting to WiFiβ¦" | β
APβSTA tear-down before WiFi.begin() (PR #9) |
| π΄ "Stockfish API failed" on success | β Parser splits HTTP body from headers (PR #10) |
| π΄ Easy and Medium AI are identical | β
medium() now sends depth=10 (PR #10) |
| π΄ No check / checkmate / stalemate | β Full detection + on-board animation (PR #11) |
| π΄ Pinned pieces could move (expose own king) | β Legal-move filtering |
| π΄ No castling | β Kingside + queenside, FIDE legal |
| π΄ No en-passant | β Pink LED hint, correct capture |
| π΄ No 50-move rule / insufficient material | β Auto-detected, draw animation |
| π΄ Pawn always auto-promoted to Queen | β Q/R/B/N choice via 4 LEDs (Human-vs-Human) |
| π‘ Sensor flicker when sliding pieces | β Debounce: 3 consecutive scans required |
π‘ OpenChessBoard AP stays up forever (~100 mA) |
β Shut down when not needed |
| π‘ No way to know if firmware is broken | β 10 self-tests at every boot |
Plus assorted code-quality fixes (buffer sizes, off-by-one, MODE_GAME_3 spam loop, etc.).
| Improvement | Detail |
|---|---|
| π Runtime AI difficulty | Pick Easy/Medium/Hard/Expert on 4 centre squares β no recompiling |
| π "Whose turn" indicator | Side-to-move's back rank gently breathes (white = you, red = opponent) |
| π Blue AI menu LED | Human-vs-AI selector is blue, Human-vs-Human white |
| π Castling in AI mode | Was impossible before; now works for player + bot with a rook hint |
| π Valid FEN after castling | Fixes the "Invalid FEN" turn-stall (rights/EP/clock from live state) |
| π Clean serial by default | Verbose debug gated behind DEBUG_VERBOSE / WIFI_VERBOSE |
| π Persistent games (v1.4.0) | Auto-saves to flash after every move; resumes after power-off with no menu, until you reset by re-placing all 32 pieces |
See docs/COMPARISON.md for an honest comparison with the more advanced joojoooo/OpenChess ESP32 fork.
| Component | Status |
|---|---|
| OpenChess PCB v1 | β Have |
| Arduino Nano RP2040 Connect | β Soldered to PCB |
| 3D printed board (bottom) | β Printed |
| 3D printed board (top/tiles) | β¬ TODO |
| 3D printed chess pieces (32) | β¬ TODO |
| Neodymium magnets 10Γ2 mm (36+) | β Have |
| Steel discs 10Γ1 mm (64+) | β Have |
| Soldering (Arduino β PCB) | β Done |
| Software step | Status |
|---|---|
Sensor_Test firmware |
β Sensors validated |
OpenChess.ino (full game) |
β Compiled & uploaded |
| WiFi + Stockfish AI | β Working |
| 10 engine self-tests | β 10/10 passing |
| Patched firmware released | β v1.3.0-rp2040 (latest) |
| 4 upstream PRs filed | β #9, #10, #11, #12 |
| Column-mirror coordinate bug | β Fixed in v1.1 β driver layer |
- PCB: 64Γ Hall effect sensors (A3144) + 64Γ RGB LEDs (NeoPixel GRBW)
- MCU: Arduino Nano RP2040 Connect (WiFi + BLE built-in via WiFiNINA)
- Shift register: 74HC594 (
β οΈ NOT 74HC595 β different pinout) - Pin mapping: NeoPixel = D17, ShiftReg SER = D2 SRCLK = D3 RCLK = D4, Sensor cols = D6βD13
- Board size: < 250Γ250 mm
- Magnets: 10Γ2 mm neodymium in each chess piece (south pole down for A3144)
- Steel discs: 10Γ1 mm ferromagnetic under each square
- Serial: 9600 baud; quiet by default (verbose debug behind
DEBUG_VERBOSE/WIFI_VERBOSE) - Sketch size: ~152 KB (β 1 % of 16 MB flash)
- RAM: 44 624 bytes (16 % of 270 KB)
- Human vs Human β pick up piece (red LED) β valid moves shown (white) β place (green flash). Includes castling, en passant, promotion choice.
- Human vs AI β Stockfish via WiFi, with runtime difficulty (Easy / Medium / Hard / Expert picked on 4 centre squares). Bot move validated locally before applying.
- Sensor Test β LEDs light up where a magnet is detected; useful for hardware verification.
Mode selection: set up the 32 pieces β 2 menu LEDs appear (D5 white = Human-vs-Human, E4 blue = Human-vs-AI) β place a piece on one to select. A breathing back-rank shows whose turn it is during play. Full layout in the manual.
| Source | Platform | Status (June 2026) | Notes |
|---|---|---|---|
| Concept-Bytes/Open-Chess (official) | Nano RP2040 | π΄ Abandoned β last commit Aug 2025, 0 PRs merged | Original. Several known bugs unfixed for 9+ months. |
| semichcsc-byte/Open-Chess (this fork) | Nano RP2040 | π’ Active β v1.4.1-rp2040 released | What you want if you have the Concept-Bytes PCB + Nano RP2040. |
| joojoooo/OpenChess | ESP32 (different MCU!) | π’ Active β 16β , last commit May 2026 | More features (Lichess online, Web UI, OTA, calibration), but requires re-soldering with jumper wires. |
| joojoooo build guide | β | π’ Maintained | Best schematic + wiring documentation for both platforms. |
β Detailed comparison: docs/COMPARISON.md
openchess/
βββ README.md β you are here
βββ LICENSE β MIT
βββ CONTRIBUTING.md β how to file issues / PRs
βββ docs/
β βββ MANUAL.md β full user manual
β βββ COMPARISON.md β honest gap analysis vs other forks
β βββ BUILD_LOG.md β chronological build journal
β βββ BOM.md β bill of materials with prices & links
βββ firmware/ β README pointing at the fork
βββ stl/ β 3D-print sources & notes
βββ images/ β build photos (TODO)
βββ upstream-firmware/ β gitignored local clone, do not commit
- π OpenChess PCB (Concept Bytes)
- π Kickstarter campaign β the original crowdfunding source for the PCB + Arduino kit
- π MakerWorld STLs β official 3D-printable parts (board, tiles, pieces) by Concept_Bytes
- π Official firmware (GitHub) β abandoned, see fork below
- π My patched firmware fork β Nano RP2040 fixes
- π
joojoooobuild guide & schematics β best wiring docs - π
joojooooESP32 fork β alternative if you want Lichess + Web UI
Build documentation in this repo: MIT.
OpenChess design files (PCB, STLs): CC BY 4.0 by Concept Bytes.
Firmware fork: MIT (inherited from upstream Concept-Bytes/Open-Chess).