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.2.2-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.
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.2.2-rp2040.uf2 (~590 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.0.0-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.
Four white LEDs light up in the centre of the board. See the user manual for what each one does. TL;DR: AI mode is the second LED (E5 square in chess notation).
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.).
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.2.0-rp2040 (first stable) |
| 3 upstream PRs filed | β #9, #10, #11 |
| 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 for debug output
- Sketch size: 150 799 bytes (β 1 % of 16 MB flash)
- RAM: 44 640 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 (Easy / Medium / Hard / Expert). Bot move validated locally before applying.
- Sensor Test β LEDs light up where a magnet is detected; useful for hardware verification.
Mode selection: power on β 4 white LEDs in the centre β place any chess piece on one to select. Full layout in the manual.
| Source | Platform | Status (May 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.0.0-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).