Skip to content

Forager with diode-free Partial Heawood wiring ("Acid")#20

Open
peterjc wants to merge 23 commits intocarrefinho:mainfrom
peterjc:forager-ph
Open

Forager with diode-free Partial Heawood wiring ("Acid")#20
peterjc wants to merge 23 commits intocarrefinho:mainfrom
peterjc:forager-ph

Conversation

@peterjc
Copy link

@peterjc peterjc commented Oct 10, 2025

Yes, yet another alternative PCB draft pull request. I'm hoping for comments/feedback (even if to say you its too different so you won't merge it and I should give it a different name). Or, you are of course welcome to merge (or squash and merge) now or later - I'll turn it into a non-draft pull request once I've built it.

This is based on my work in #19 designing a diode-free direct wiring reversible PCB using the Xiao NRF52840 plus which has 19 usable GPIO pins. That is nice and simple, but the tiny castellation soldering will be tricky. It will be quicker with no diodes, but argubly harder? I'm not sure I'm ready to try that without help 😉

This PR is an alternative diode-free graph-theory reversible PCB using the original Xiao NRF52840, and the extra pair of NFC pins on the back making 11+2=13 GPIOs. See ZMK setting CONFIG_NFCT_PINS_AS_GPIOS=y for using these. That means it probably won't work with Xiao clones, as they often have alternative extra pads on the back.

Screenshot 2025-10-10 at 09 10 01

Compared to the original Forager PCB, the castellation soldering is the same, but now rather than just one rear pad to solder there are three (battery and the two NFC pads). That's a little more work with through board soldering, but with no diodes I think this will be much easier and quicker overall. The cornermost NFC pad P0.10 is very awkwardly placed (almost below D7/D14). The almost triangular cutout I used is to allow a trace to reach this pad without crossing the radio keepout.

Screenshot 2025-10-10 at 09 23 19 Screenshot 2025-10-10 at 09 56 59 Screenshot 2025-10-10 at 09 57 19

The wiring is essentially a cut down version of https://github.com/triliu/Heawood42 which uses the full Heawood Graph (14 nodes in a 7x7 sparse scanning matrix for 21 edges or keys on each half keyboard). I wrote about using the Heawood Graph for Keyboard wiring in a blog post. Here it is a Partial Heawood Graph (13 nodes in a 6x7 sparse scanning matrix for 18 edges or keys - one spare).

Space is less constrained than with direct wiring, so to try to keep the firmware and wiring simple, I could link like pins on both sides. For example Qwerty Q and P are both on scanning column zero (net CO, NFC pad P0.10) and scanning row zero (net R0, pad D5).

The weakness of this graph wiring is it is only 4-key roll-over per half (you can do better with more GPIOs per switch, eg the Tutte Coxeter Graph for keyboard wiring).

The name "Acid" is from Partial Heawood v1.0.0 --> pH 1.0 --> Acid.

This PR includes the power switch (#14 ), large battery cutout (#18), and Molex PicoBlade battery connector as on #19.

I have started ordering parts including a pair of the original Xiao controllers, batteries, and battery connectors to confirm how they fit together and help me verify the planned placements.

This will be the Forager Partial Heawood or "Acid" PCB, still using
the Seeed XIAO nRF52840 Plus controller but also the two NFC pads
for 11+2 GPIOs for a diode-free reversible Graph Theory wiring.
Set all the right hand switch diode nets to RGND

Used sed to search and replace, and then opened and resaved in
KiCad which renumbered the now much smaller list of nets:

sed -i.bak 's/net .. "Net-(RD.*-A)/net 33 "RGND/g' forager-plus-pcb.kicad_pcb

Set all left hand switch diode nets to LGND. Again, used sed
and then opened & saved in KiCad to renumber:

sed -i.bak 's/net . "Net-(LD.*-A)/net 1 "LGND/g' forager-plus-pcb.kicad_pcb
sed -i.bak 's/net .. "Net-(LD.*-A)/net 1 "LGND/g' forager-plus-pcb.kicad_pcb

Swap switch column nets to zmk-helpers style, did rest manually:

sed -i.bak -e 's#"/RCOL0"#"RM4"#g' -e 's#"/RCOL1"#"RM3"#g' \
    -e 's#"/RCOL2"#"RM2"#g' -e 's#"/RCOL3"#"RM1"#g' \
    -e 's#"/RCOL4"#"RM0"#g' forager-plus-pcb.kicad_pcb

sed -i.bak -e 's#"/LCOL0"#"LM4"#g' -e 's#"/LCOL1"#"LM3"#g' \
    -e 's#"/LCOL2"#"LM2"#g' -e 's#"/LCOL3"#"LM1"#g' \
    -e 's#"/LCOL4"#"LM0"#g' forager-plus-pcb.kicad_pcb

Done manually in KiCad v9.0.2
Double sided using original Xiao BLE (11+2 GPIOs), wiring to follow.

Using ceoloide's ergogen-footprints/switch_choc_v1_v2.js footprint
in v1 only mode (not enough space near controller for v2).

Use 2-pin horizontal SMD PicoBlade MX 1.25mm battery connector.
The inaccurate term JST 1.25mm, or 'Micro JST 1.25mm' is often
used for these. The connector socket is under 4mm so should fit,
and this is commonly offered as the connector with LiPo batteries.

Battery cutout by changing the PCB outline

Move battery connector forward to avoid bottom case rib
These are in the wireless keepout (sigh), and P0.10 is so tight in the
corner it will be tricky.
This will need a tiny case mode, and perhaps a longer than usual button
if this isn't close enough to the edge? Vertical position limited by
bottom case rib.

Wiring required a few more vias for the ground plane.
These should both be up off (towards controller corner), and
down on (away from controller). Ought to be able to solder
bridge the pads if not using the switch?

Hat tip https://github.com/letmegobacktosleep/forager/tree/power-switch/forager-pcb
This is more symetric and more closely matches the original Forager
hotswap footprint. Unclear why the Ceoloide Ergogen hotswaps are
that small on one side - although they work fined fine for me as is
on another board.

A few are still on the small side due to constaints like the battery
cut out, or wiring.
@peterjc
Copy link
Author

peterjc commented Oct 21, 2025

Rebased to main with a simpler git history (no longer a branch off the early work on #19).

Order submitted to JLCPLC with the modified bottom case STL files with the power switch cutout.

I have also tested my ZMK firmware for the Forager Acid with two naked Xiao controllers connected on USB (so no battery use, and not a full bluetooth test) and shorting individual pins (so no combo testing).

@MSmaili
Copy link

MSmaili commented Oct 21, 2025

Looks great, nice work, @peterjc!

Please keep us posted after you’ve tried it out. I’m really curious to see how it performs, and I have to admit, I’m tempted to order one myself just for the bigger battery space

@peterjc
Copy link
Author

peterjc commented Nov 2, 2025

I blogged about this - the PCBs and case have been shipped, and I think I have all the parts now 🤞

@MSmaili
Copy link

MSmaili commented Nov 3, 2025

I blogged about this - the PCBs and case have been shipped, and I think I have all the parts now 🤞

The link you shared does not work!

@peterjc
Copy link
Author

peterjc commented Nov 3, 2025

Whoops - blog link fixed now: https://astrobeano.blogspot.com/2025/10/partial-heawood-forager-keyboard.html (I'd accidentally copied the editor view URL), thanks for letting me know.

@peterjc
Copy link
Author

peterjc commented Nov 7, 2025

The battery fits fine, a little space to spare:

IMG_3595

The soldering isn’t easy. The surface mounted battery connector was a challenge - hopefully the second time will be easier.

Tip: Only solder B+ and just ignore the redundant B- next to it (another ground), too easy to accidentally short the two pads.

@peterjc
Copy link
Author

peterjc commented Nov 7, 2025

Looks like my batteries came with the plug plus/minus reversed compared to the socket design. Sigh. I can direct solder them instead, there is enough cable slack.

This may help if the copper is damaged while soldering, or when the
board is drilled during fabrication.
@peterjc
Copy link
Author

peterjc commented Nov 10, 2025

Mixed news, mostly my inexperience with soldering to blame.

My left "Acid" board (with only with the controller soldered on) seems to work but after a few minutes drops off the USB and stops responding. Some sort of power issue is my guess, and macOS cuts it off? Probably bad soldering somewhere. I will need a spare controller and another PCB...

My right board was looking good (battery not tested yet) aside something odd with the middle index keys that feels like a typo in my firmware matrix. However, after I reflowed a couple of not so pretty pads, soldered on the nuts, and assembled it all, some keys had stopped working (flashed it as the primary right half for solo testing). Time to take it apart again... update: third time lucky, all keys working now.

Top side of right half of Forager Acid keyboard without switches, blue PCB visible through switch holes in white top case

Underside of right half of Forager Acid keyboard with blue PCB visible through clear bottom case

The silkscreen art could be better placed for a transparent bottom case (especially the little Heawood Graph, name and version). They probably would look fine on the top which was my priority, but I order the top case printed in white in error.

The power switch seems not to stick out enough.

The bonus thumb key using a reset button isn't going to be practical unless perhaps pushed via the case itself (shown placed but not soldered in this photo). I think I'll drop that on any revision to the PCB:

Sidefacing reset button does not stick out enough to use it

The outer diameter of my nuts seems to be a fraction small - workable, but harder to get them perfectly vertical and centered. They still worked to assemble it.

Both the left and right bottom cases show a slight warped in the middle of the flat panel above the battery.

P.S. Getting the metal dowels into the tenting legs in a pain - just too tight on this print. And my superglue for the magnets inside the case had dried up, so I have not tried them properly yet.

@peterjc
Copy link
Author

peterjc commented Nov 10, 2025

Half way there - one half working including a brief test with my phone over Bluetooth! 🥳

2025-11-10 12 15 58

I solved the battery porarity issue with brute force by plugging it in upside down 🙃

Flipping the battery connection polarity is an option for any revision to the PCB - but apparently there is no standard orientation 🤷

@peterjc
Copy link
Author

peterjc commented Nov 26, 2025

Good news: Spare controller arrived, and the left half now also done. I am using the "Forager Acid" to type this now, with MagSafe tenting (stick on metal rings and UGreen stands) and 3D printed Chicago Stenographer keycaps!

2025-11-26 11 19 20

The surface mounted battery connector and power switch were much easier to solder this time (second attempt), and I am comfortable doing hotswaps now (having done about 100 in total at this point).

Mixed news: I still found surface mounting the main Xioa pins rather tricky (repeat rounds of soldering, circuit testing, and resoldering). I actually found the through cut-out soldering for the NFC pins and B+ easier, so this is still probably easier that the original Forager PCB with the diodes.

Bad news: The power switch is on straight this time, but still doesn't stick out enough to use without a tool. I can only assume that some versions of this switch have a longer handle.

Also the reset switch on my right half seems to have stopped working, so I am dependent on ZMK working and putting &bootloader on the right half via ZMK Studio when I want to reflash (eg change my combos, although one day ZMK Studio should support that).

--

@carrefinho What do you think? Is this something you'd consider merging?

If yes, what changes would you request or suggest? I am thinking to remove the 5V and 3v3 pads to reduce the chances of getting a short-circuit through amateur soldering (like on my failed PCB), and flip the battery connection polarity (to match my EHAO branded LP501535 batteries). Where should I add any Acid specific build guide?

If no, I will make the Acid branch the default on my fork of the repository and add some notes to the main README about the differences.

--

Edit: Typos

@peterjc peterjc marked this pull request as ready for review November 27, 2025 20:18
@peterjc
Copy link
Author

peterjc commented Jan 1, 2026

Looking at https://docs.beekeeb.com/toucan-keyboard/battery-specs the Forager Acid v1.0.0 PCB seems to use the same orientation as the Toucan (Molex PicoBlade 51021-0200, 1.25 mm pitch), and my battery matched their "No Go" photo:

battery connections for Toucan

Their guide also touches on the possibility of changing battery connection polarity which they do not recommend.

Perhaps putting two Molex PicoBlade footprints on the PCB to cover both polarities isn't a completely crazy idea?

…cancelled out?)

This should give access to the RESET pad for emergency use (eg reset
button broken off).
Also return to original's pads for the fall back battery soldering option.
The through holes seemed very small to me.

And update the version on the silksceen.
@peterjc
Copy link
Author

peterjc commented Jan 30, 2026

Updated to v1.1.0 - this fixes the cutout under the USB for access to the reset pad (wanted that today), duplicates the battery connectors with the other polarity (see above), reverts to pads for direct battery soldering (probably easier), and drops the bonus thumb key (wasn't practical).

Screenshot 2026-01-30 at 15 59 22 Screenshot 2026-01-30 at 15 59 34

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants