June 17, 2025
Since 0.8mm board with multicolor silkscreen adds 32 dollars, I remade the traces to work with 1.6mm (USB traces)
also changed the crystal to not have to be hand-soldered (cheaper to manufacture)
I started to add images to the back of the board, and one thing that was a challenge was how imported images always were bottom-most compared to patterns made natively in easyeda which was a pain to fix and move the shapes/reshape them.
image
Eventually I was able to get it looking pretty good after quite a bit of time
image
Also turns out that multicolor silkscreen requires a white board, and at 0.8mm board thickness it requires a special surcharge of 32 dollars, so I changed it to 1.6 and redid the USB traces, as board thickness impacts impedence.
image
time: ~2h
CHECK JOURNAL.MD IN GITHUB FOR MORE PICTURES
This was a really big session especially due to today being the final day for the YSWS.
To start, I completely finished routing the board, which was really easy due to it pretty much being only straight lines.
After, I proceeded to check over everything in the schematic and the documentation, to make sure that everything would work
Unfortunately, the crystal that I was using for the RTC wouldn't work due to having too much of a load capacitance. This means that I must go with an extended component (which adds 3 dollars to the cost) and also reroute a small amount of the board.
image
I also had to end up swapping RX and PB6 here, and the reason for that was that I thought RX (receive) would be sending the signals (I wasn't really thinking about it)
image
Now, the only thing left is the art, and I was able to completely finish the top side, which in my opinion, looks really good, but took me a lot of time due to me being pretty bad at art.
image (8)
time: ~5h
I then spent quite a bit of time on routing, trying to make sure that it was neat, and when I got to the part where I had to route a second UART to communicate with the ESP32, I realized that Instead of using two GPIOs, I could use one and have a switch that switches between the REPL UART pins to the UART pins one would use for communicating with custom code.
image
During this time, I was able to successfully route 50% of the GPIO headers (and there were a few moment where I pretty much boxed myself in really badly)
image
This is quite tightly spaced (CHECK JOURNAL.MD IN REPO FOR IMAGE):
image
time: 2h45m
Did a lot of the routing for the traces, and GPIO pins, especially the ones at the top of the STM32.
image
However, after doing this I noticed that most of the ADC pins (convert Analog signals to binary) would be used for communication with the SD card and the wifi chip, which would be a waste, so I started to restart and better plan this layout, trying to make sure that I would keep in mind which signals aare more important than others (like communication between components > GPIO)
image
time: 2h 30m
Did some research about a buck regulator, but turns out they would require way too many extended components, so although it would be less efficient, it would drive up the costs
image
Changed up the layout a bit to make it neater as well as finished it, and added headers for debugging (SWDIO), and then started some of the start of routing, especially for important traces like USB and some of the power traces
image
time: 2 hours
Started laying out everything and sourced other parts, such as the WIFI module and microSD reader, and then learned about how LDOs (the dropout voltage regulator I chose) would be ineficient, so now I'm trying to find a buck regulator instead
image image
time: 2 hours
Finished circuits for USB + ESD protection
image
Did a lot of research on what type of converter I should use, since I would like for it to be compatable with different types of batteries, but this wasn't the easiest due to trying to make the board as cheap as possible. I was able to find a convertor that would allow for a stable conversion from 4.5 volts to 16 volts, which would be pretty good for things like 9V battery
image
time: 1 hour
Ported over everything to easyEDA (without importing, just remade everything)
After, I added a 32.768 KHZ crystal for the RTC of the chip to be more accurate, especially since time tracking is something that can be fundamental for a board based on collecting data.
Finally, I started implementing USBC and esd protection with the USBLC6, but then I learned about how I could use TVS diodes for protection, which would be cheaper, and something I implement during the next session.
image
Also, towards the end, I learned about how the specific MCU I'm using requires 1.5k Ohm pull up resistor on USB DP, and after doing some research I decided that the next session I would include an P channel mosfet to control it
image
time: 2.5 hours
MORE PICTURES IN THE GITHUB JOURNAL.MD
Started by creating some ideas of what I generally wanted this project to be, and thanks to a few people, I came up with a basic idea.
image
After coming up with the basic idea, I started to look at documentation for the STM32 chip I was going to be using, and started creating the schematic, which was pretty easy, but just a bit challenging since I've only been used to the Raspberry Pi documentation for their chips, which were very detailed and easy to follo whwne compared to STM
image image image
Towards the end, I knew that a crystal that works with this chip would be hard to find. I looked at the only basic JLCPCB part (which would avoid a 3 dollar fee for assembly) that resonates at 16 MHZ, and it took about an hour of calculating to determine that it was probably fine. The only thing I wasn't able to calculate was how good the crystal would be over periods of time since I would need to measure how current flows through the crystal, which would be impossible without specific tools (oscilloscope) and the crystal itself.
image
Also, I decided that I would be starting over and creating the PCB in easyEDA instead of Kicad since the Twist You Ship We Ship of Hackclub has two possible routes of funding for the PCB. One of them is to use any EDA but track your time, which doesn't include looking at documentation for 5 dollars an hour, or using easyEDA and receiving a grant from JLCPCB instead, with any amount of time
Using easyEDA would mean that I wouldn't have to worry about the PCB budget, especially since most of it isn't even tracked due to how documentation heavy hardware design can be
time: 3 hours
MORE PICTURES IN THE GITHUB JOURNAL.MD
Custom devboard with support for WIFI and an SD card to record data
Changed up looks for the website, so now it looks more like a finished product (I wish this took a lot less time than it did, but I'm pretty new to bootstrap and havent done web development for a long time
time: ~2h
i've decided that my current wants for this project exceeds my current skill level, and i've been going about it the wrong way since the beginning (especially with the differences between how my code compiles and how a more professional language would compile its code)
Instead, I am tweaking my goal to only include variable references, some built in functions, and printing
Adding numbers wouldn't work with a + sign, but instead through an inbuilt function for ease of implementation
Also the code will be a bit messy due to how i've coded the program, and I don't see another way to make it better other than to restart (which is something i really don't want to do, especially as my motivation falls from struggling so much)
added functions for int() and str()!
added addition and the ability to chain functions!
added subtraction, just note that negatives must be defined as sub(0,n) instead of -n due to normal operators (5+5) being not implemented
added division and multiplication, which supports string multiplication
fixed \n so it'd actually work while printing
error handling!
Took a long while to determine the correct way to handle variables, but now finally have the framework and now I can support variable referencing and \ within strings!
What I struggled with for this part was overthinking about how I would implement inbuilt functions, such as String(), which led to a lot of time spent wasted. Additionally, the order of the if statements was pretty important in regards to function
I'm excited to later be able to add support to basic functions, and then be able to use different operations, such as a*50
The bug was indeed not fixed, and doing a string with operators next to eachother would raise an error
Decided to scrap all my current code after trying to fix it and start out with variables and a new token system
added variables!!
update styling a bit
researched and found out about a way to make the code truly run async
added print function and operations with strings, and +,-,*,/
image
The most difficult part for sure was getting the order I should check for each operation to ensure that arithmetic errors don't happen
TIME: ~3h 30m
Added javascript code that runs after hitting the button with a good basis for expansion later on
found out that a for loop thats really long could cause the page to freeze, so I'll be trying to fix that next session.
TIME: 45m
Just started making everything look 100x better, which took a LOT of time looking at documentation to figure out how to get a certain look, especially with how long its been since I've done web development
Ended up adding a header navbar and started adding boxes to input code and for the output, however, I will be focusing on the functionality next rather than looks
Realized I don't even need to use flask (and could instead just use JS), but this will be restructured during the next session!
TIME: ~1h45m
Started by brainstorming ideas
Then, I started with doing quite a bit of research on how I would be able to bring my idea to a website, especially since downloading code and running it yourself is pretty annoying, so including a way to run custom code online would drastically improve QoL
I eventually settled on using Flask and React, and through the documentation, I was able to successfully install these two frameworks and get the website working
In order to use API with the backend, I created a page at the address /api/test, which when went to returned:
image
image
Initally when trying to then push this code onto Github, I ran into an issue
After restructuring the repo to have a frontend and backend folder, the node_modules folder was no longer correctly referenced in .gitignore, causing there to be a problem with file sizes being too big
Since I didn't know much about react, I didn't originally know that node_modules was supposed to be in .gitignore, but after asking, I determined that it would be the best possible thing I could try (and it worked)
time: ~2h
What if France was the country who invented coding? How would this change coding languages today? Embark on a journey of linguistic challenges to become French (trust) by using this totally certified coding language that includes (mostly?) everything you need!
made case better in terms of 3d printing (no filets on the top, changed with chamfers)
Turns out I used the wrong footprint for the pin headers, so I had to restart routing them and make the board bigger, which wasn't much of a challenge since the routing was pretty similar, but still a bit time consuming.
image
Anyways here is the (hopefully) final version
image image
TIME: 1h
Just drafted up some code for flashing the secondary WIFI MCU by forwarding USB signals through UART
Also created a BOM and added it to the readme
I finished up routing everything which was surprisingly easy due to the amount of excess space I had. It was just a bit time consuming to figure out the best way to route everything to minimize crossovers
I was a bit worried about the crystal being close to GPIO traces, but somebody also part of Hackclub told me that it's most likely fine due to the grounding vias, but I did also move it closer to the XTAL pins on the MCU
Added some art on the front and back C:
image
image
image
image
All that's really left for me would be to draft up some code and maybe (?) create a case (probably not since single-color PLA wouldn't really look that great for it)
time: 1h45m
rerouted the differential pair so that it actually has a 90 ohm differential impedance which is called for by USB protocol, and this took a long while because I didn't really know how to get the DRC to stop screaming at me for having too small clearances, but this was fixed by just assigning different netclasses.
image
routed the secondary MCU completely, although i am worried a bit about the TX and RX traces for it interfering, so if I have space in the future after routing GPIO, I'll try to separate them.
image
moved some components in order to have a much slimmer layout, and then proceeded to route the GPIO pins, which for now was pretty easy (except for deciding which GPIO pin should be where), but I have a feeling that the last few GPIOs might be a lot more difficult
image
TIME: 2h 15m
found a new, better ESD protection that would be easier to route and even cheaper too
restarted routing because I didn't plan for the ESD protection to be this big
image
placed everything except the connectors, which could go almost anywhere on the board (this took a while to get everything seemingly spaced out well enough but I feel that it's pretty good)
image
finished routing everything for the main part of the board (meaning excluding WIFI and GPIO), which took around an hour due to slight repositioning and trying to space out signals when possible, which was mostly a new-ish concept for me, which I only slight skimmed over for a keyboard I made prior.
image
TIME:2h
Using another MCU (the wroom c3) as a way to add wifi connectivity at the cost of 1 UART interface when being used
decided to start routing the board so that I can know which pins are ideal to use for what purpose, so i assigned all the footprints
image
I had trouble routing because the pins were too close together, so I changed the main MCU to the RP2040 and double checked that everything was according to the different hardware guide
image
i had to replace a few of the parts of the schematics to fit with the RP2040, and then I reselected all the footprints and started routing
image
here is the routing I have so far, and I tried my best to make sure that sensitive components would be out of the way from traces that would disrupt them, but what I did realize is that I need to find a new ESD protection IC since the current one would pretty much make it impossible to route
It was pretty time consuming due to the numerous decoupling capacitors needed in many locations, and I might have to compromise on a few of them
Time: 2h
did some research about the PI235x chips with the hardware guide
downloaded footprint for RP2350B
created schematic part for the VREG
image
made custom footprint for the inductor, which recommended a specific part to ensure correct coiling for minimal interferance
image
sourced components needed for the VREG
Made schematic for and sourced all parts needed for the USB connection, including parts like an LDO, which was pretty easy since this is the second time doing it for me
image
made the schematic for and sourced parts required for decoupling capacitors for the power pins
image
in the hardware guide for the rp235x series chips, it includes a resistor with value 0 ohms for the QSPI_SS pin, so I researched why there wasn't a direct connection and learned that it can be used as a jumper wire on a pcb
image
finished schematic for the flash memory for the chip
image
finished schematic for the crystal
image
And here is the running component list (most of which are either basic or extended preferred parts, which took a bit of time to find, but nothing too serious)!
image
overall this part of the schematic was pretty easy and didn't require too much challenge, and I believe that the main part of the challenge will come when actually routing the board
TIME: 2h30m (most of it wasn't tracked sob)
found a cherry MX plate hole to EC11 rotary encoder by @Coloneljesus_13723 on printables.com, which would allow me to glue a rotary encoder to it and attach it securely to the plate without a PCB (pretty fire)
finished redesigning the plate to be thicker to allow for more security and smaller bed size required for printing (I wish fusion ran faster)
image
made bom and added it to readme
Created a readme and added almost everything that I need to
time: 2h30m
created a bom for the over-budget build
created a draft of code to use on the keyboard
image
sourced parts that would be needed for hand-wired keyboard
edited case to support a USBC breakout board instead of the over-priced PCB (lowered the hole)
editing plate to support thicker printing and better support so I can use printing legion instead
editing the plate is taking way too long due to fusion taking like 30 seconds to render a single constraint and up to two minutes if I misclick
image
TIME: 2 HOURS
sourced some gorilla superglue gel I would use for the standoffs in the plastic after doing some research about which glue works well with PLA
started splitting all the prints so they could be printed with printing legion
image
decided not to split the plate because splitting it would make it pretty difficult to print secure during shipping, so i'll probably use JLC3DP for this one part
discovered that JLC3DP PLA print has to have a minimum of 1cm height and their capabilities don't support 1.5mm height, but after some research I discovered that many people use FR4 as material for their plates, so I did a big brain move and exported the plate sketch as a DXF and imported it into kicad and just exported as gerber!
image
turns out that JLCPCB is pretty expensive for getting plates, so instead I decided to just get it via a resin print, which can support 1.5mm thick prints
replacing 1k ohm with C11702, since it's a basic part
turns out that no matter what I do the weight will be over 1.5 KG for the board alone, so I have to pay about 40 dollars shipping to the US, which means that the rest of the board is unfeasable to design
i will finish a draft of the code and create a BOM, but that's about it since I don't have the means to pay the exorbitant amount of money required
time: 30m
turns out all the files i found before were just mesh-based too, which wasn't really helpful
learned that all STL files are meshed based, so I will download the STEP file from the github repo instead
Used the step file instead and it worked so much better, and i was able to get a lot of keys placed down, and the keyboard is starting to look really good
image
time: 45m
redoing all the keycaps because it is the only way for me to unlink all of them so i can apply the custom colors
found different keycaps for all the u sizes after some searching
the new models for the keycaps were all scaled up and meshes, so i decided to find other ones since i couldn't convert them prismatically (fusion free version sob)
image
after doing some more digging i found different keycap models (we love reddit) which had everything for each row with the link and this included keycaps for different rows, so I decided to restart again for the next session
time:1h45m (mainly because I spent so much time restarting and searching online)
I'll add that part after finishing up with the assembly
full assembly before keycaps, stabilizers, colouring, and polishing
couldn't find a stabilizer model i could use, so i'm going without it
added all keycaps, but this took way too long since i was initially moving and copying them one by one before I learned I could use rectangular patterns
polished up the top part of the case so that the gaps are filled
(couldn't find keycap sizes for other than 1u)
time ~3h15m
finished the bottom part of the case with holes for screws
added bigger holes at the bottom for the head, with the following sourced M3 screws: screws
will be adding the hole for the usbc connector last, so i can align everything in the assembly and put the cutout accurately
Setup wakatime for the project in fusion (3d modeling) and kicad (pcb editing) as well as adding mounting holes for M3 screws into the pcb
This was widely regarded as a great move by everyone.