Total time spent thus far: 70h
January: Research
- Started looking at how to make my keyboard (looking at YouTube videos, etc)
- Created a plan
- Make the keyboard a 100% layout
- Add an OLED screen to display extra info
- Started thinking about what components to use (what type of switches,e.g., red, brown, blue, etc.)
- Started looking at the pinout of the Pi Pico (my microcontroller)
Total time spent: 5h
May 17-20: PCB making
- started creating the PCB
- Found out that the PI Pico doesn't have enough pins for my matrix for the keys
- Thought about using Japanese matrices, but instead I opted to use the MCP23017_SO since I want to learn how to solder SMD components
- After creating the schematic, I posted it on Slack to get some feedback
- Then I started creating the PCB itself
- Routing was hard, so for the first time, I used Vias
Total time spent: 15h
May 20-22: Making the chassis
- started creating the chassis
- Since I'm using somewhat custom spacing, it took a long time to make the top part of my keyboard
- Once done, I started making the bottom part
- After that, I started seeing how I was going to print out the chassis
- JLC charges 100$ for the chassis
- So instead, I made the chassis printable by splitting it into 3 parts and joining them via these standoffs that I made
Total time spent: 8h
May 22-23: Creating BOM
- BOM done, please check the read me Total time spent: 4h
May 23: Updating Readme and other things
- Readme updated Total time spent: 2h
May 23 - 24: Firmware
- Started making firmware
- took too long setting up QMK (like 5 hours in one day)
- Found out the MCP23017_SO is way too slow since it's using the I2C connection protocol
- Instead im using the SN74HC165N, which uses the spi protocal which is 100x faster
- replaced it in the PCB
- made the keyboard layout for my keyboard in QMK May 24th:
- Took almost 5 hours to make the keyboard work, not even including the custom matrix
- Not good with command-based apps, so I need to work on this in the future
- made a custom matrix to read from the SN74HC165N
- TOOK A LONG TIME JUST TO LEARN HOW TO DO IT
- made the OLED work
- Here are some code issues that I had today:
- setPinOutput(MATRIXCOLPINS[c]) failed because the macro received 21 arguments instead of 1, likely because MATRIXCOLPINS[c] expands improperly.
- writePinHigh(MATRIXCOLPINS[c]) and writePinLow(MATRIXCOLPINS[col]) also failed due to the same macro argument issue.
- Macros like gpiosetpinoutputpushpull, gpiowritepinhigh, and gpiowritepin_low were not recognized as functions; they're macros and not meant to handle complex input.
- matrixscanchange is used without declaration, leading to an implicit function declaration error.
- All warnings were treated as errors (-Werror flag), causing the build to fail on these issues. Total time spent: 15h
May 28: Created Palm Rest:
- Created a palm rest on the keyboard
- Added the 3mf file for the print
Total time spent: 2h
July 1–18: OLED Debugging & Firmware Migration (QMK → Arduino)
Total time spent: ~20h
Matrix Ghosting & Pull-Down Resistor Fix
- Began debugging ghosting issues in the keyboard matrix — noticed that random key presses were being registered without input.
- Discovered I had forgotten to add 10k pull-down resistors to the inputs of the SN74HC165N shift registers.
- This caused the lines to float, resulting in unpredictable input states.
- Therefore, I had to add a delay in code, resulting in a ~700ms delay (around 70x slower than a normal keyboard)
SoftI2C and RP2040 Pin Constraints
- Realized that the OLED was connected to non-native I2C pins (e.g., GPIO 22, 28) on the RP2040.
- Switched to using SoftI2C to bit-bang I2C over any pins.
- With SoftI2C, successfully scanned and detected the OLED at address 0x3C.
OLED Font Rendering
- Created a simple text rendering function to write characters pixel-by-pixel on the OLED.
- Initially, embedded all font bitmaps directly in the .ino file.
- Later refactored by moving font data into a dedicated .h file for clarity and reuse.
Migrating from QMK to Arduino IDE
- QMK was becoming too complex to support:
- SPI reads from SN74HC165N
- SoftI2C for OLED
- Custom wiring constraints
- Fully migrated to Arduino IDE, which provided:
- Lower-level hardware access
- Simplified debugging with Serial.print()
- Better development velocity for custom hardware
Hardware Rework: 3.3V Connection Fix
- Final keyboard assembly showed no power to the RP2040 MCU.
- Diagnosed the issue and found that the 3.3V line wasn’t connected to the MCU.
- Board was already fully soldered — had to use jumper wires to connect 3.3V to the correct pin on the MCU manually.
- After rework, the SN74HC165N and OLED powered up correctly.