Modular Macro Keyboard System — Ocreeb MK2
by salimbenbouz in Circuits > Gadgets
41073 Views, 489 Favorites, 0 Comments
Modular Macro Keyboard System — Ocreeb MK2
The Ocreeb MK2 is the second iteration of the original 12-key macropad. After collecting feedback over the past few months, I decided to design a new version and explore some additional new features.
The inspiration for the first one was sparked by using the Creativity Console by Monogram. One aspect that particularly intrigued me was the ability to rearrange various modules and compose different layouts using a magnetic connector system. Although my skills at the time weren't quite up to attempting anything close to it, my interest in the idea was reignited after watching a video by Zack Freedman, where he added several modules to his Mirage Keyboard.
With newfound determination, I decided to give it a go and structure the project in a modular way, allowing you to build parts that interest you.
⚠️ DISCLAIMER ⚠️
Please be aware that as of the current version, there is a significant issue when using several modules together, primarily due to the way the interrupt is implemented. For more detailed information, please refer to the end of the video. I've received some insightful feedback and suggestions from the community regarding potential fixes, and I will be exploring these options.
If you plan to use many modules, I advise waiting to build this until improvements or a fix are implemented. I will update the project with any enhancements as soon as they are available. Additionally, if you have a solution or suggestion to contribute, feel free to message me or open an issue on GitHub.
Supplies
Custom PCBs from PCB Way - (Get $5 New User Credit)
- Macropad → Gerbers
- Combo Module → Gerbers
- Faders Module → Gerbers
- Dials Module → Gerbers
- Custom Connectors → Gerbers
Note: When planning the number of modules you intend to build, ensure you order an adequate number of landing pads and connector PCBs. Each module requires one upstream connector, with the remaining sides utilizing landing pads. checkout the BOMs for the number of small connector PCB needed.
Bill of materials
Hardware
Tools
- Resin Printing System Heygears
- FDM 3D Printer Amazon
- Soldering Station/Iron. Amazon
- Helping hands Amazon
- Precision Screwdriver Set Amazon
- Wire stripper Amazon
- Flux, Solder, Solder paste
- Flush cutters
- Tweezers and pliers
- Super Glue
- Sandpaper Assortment
Affiliate links may be included in the parts list. I may receive a small commission at no additional cost to you.
Watch the Build
Watching the design and build video is highly recommended for an overview of the entire process. It will also give you a clear understanding of the current issues and limitations to consider before building anything.
3D Printing
The project is broken down into three main sections: the core macropad, the connector, and the external modules. You can get the enclosure files for the parts you need in the project’s GitHub repo.
If you’re starting with just the macropad and don’t plan to add modules yet, you can alter the Ocreeb_core_middle.stl to close off the connector holes. You might even consider combining it with the Ocreeb_core_top.stl.
All the top enclosure parts were printed using UltraPrint-Design CMYK PAM10 resin from HeyGears, but FDM is definitely an option if you do some post processing. The most crucial part is the middle section around the connectors. It has thin walls in a few places to bring the magnets and connectors as close as possible, and you might need to sand the exterior flush and the connector opening to get the right fit and tolerances.
For the bottom parts of both the core macropad and the external modules, I used UltraPrint-Modeling PAT10 transparent resin. However, clear PETG can also be used in FDM to achieve a similar translucent effect. The core macropad's bottom part is distinct, featuring two offset screws and a USB-C clearance to differentiate it from the others. For the modules, the bottom and middle parts are the same for all of them, as long as they correspond size wise (half, full or mini).
Keycaps
I printed the keycaps I made based on the GRID SET by Rama Works®, but you're free to use any MX-compatible keycaps as long as they fit within the switch openings in the top part of the enclosure. The files for the keycaps I designed are available in the project's GitHub repo.
Soldering _SMD Components
On the main macropad PCB, depending on which features you decide to keep, you'll start by soldering all the SMD parts. I've marked these in the core macropad BOM – just check the 'type' column. I personally used a stencil and a hot plate for this, but doing it by hand is completely fine.
A heads-up: I made a mistake with the shift register footprint; it ended up being too tight. Some hand rework was needed to get it connected. I might update the board to fix this in the future.
For the modules, I went with a solder paste syringe for applying the paste on the pads and then placed all the SMD components. Just like the core macropad, I used the hot plate for reflowing them.
Preparing the Custom Connectors
As you might have noticed in the video, the milling on some corners of the connectors and main boards came out rounded. So, a bit of tweaking was needed to get them to fit just right. I used a file to gently sharpen the corners until they friction fit.
Now, onto preparing the upstream connectors. For these, I used through-hole pogo pins and the little shroud we printed earlier. I just glued them in place on the receiving PCB temporarily – this will make them manageable until we're ready to solder them to the main boards.
Soldering _Connectors
Once the connectors are ready, it's time to solder them onto the main boards of both the core macropad and the modules. You can locate the upstream connectors easily; they're marked with arrows on the silk screen, and there's one per module. The rest are all landing pads. Don't worry about any orientation – all connectors are reversible and symmetrical, simply extending the castellated pads from the edge.
I used the printed middle part as a jig to keep everything aligned while soldering, both for the macropad and the modules. I used a good amount of solder on both sides, making sure to keep them as straight as possible.
The solder should flow through the castellated pads, creating joints on both sides for the landing pads. For the upstream connector, it's the same, but make sure it also makes good contact with the pogo pins.
Now it's time to whip out the multimeter and check for continuity across all the pads and pins. You really want to avoid any connectivity headaches later on. Speaking from experience here :) - I got a bit carried away with the glue earlier, and some of the pogo pins didn't connect properly at first. Ended up having to reflow a few of them more than once.
Soldering _TH Components
This step is the same as Step 3, but for the through-hole components, which are labeled as 'TH' in the 'type' column of the BOMs. This includes parts like encoders, module switches, and potentiometers. For the Combo modules I skipped the hotswap sockets for the switches. So, you'll need to use the mini plates to align the switches before soldering them in place.
For the OLED connection on the macropad, I used a trimmed 90 deg header and some crimp connectors without the plastic sleeves. However, you can also go for a direct wire-to-board if you want. Just a heads up – it can get a bit tight in that space with the wires.
Gluing the Connector’s Magnets
For this step I 3D printed a simple jig and glued 4 magnets arranged in an alternating pattern. This is important because the magnets need to be in a specific order to ensure that all modules attract and connect correctly in all the possible orientations.
I placed the middle parts printed previously in the jig, ensuring they all faced the same direction each time (see locating features in the jig). I rolled them on their sides one at a time. A dab of super glue was applied in the round slots, and then I gently released the magnets near the opening. The jig underneath helped pull each magnet into the correct orientation automatically.
For sides with only two magnets, aligning them to the left or right works just fine. I took my time with each side, allowing the glue to set a bit before moving on to the next.
Downloads
Assembly _1
Macropad
Start by securing the switch plate to the main macropad PCB with 4 x (M2 x 6mm) self-tapping screws. Next, fit the OLED screen into its opening and secure it from the back with some hot glue. Depending on whether you used a connector or soldered directly to the board, this is the time to connect the OLED screen.
Afterward, insert the main macropad PCB into the middle section, where the magnets are, and fasten it to the top part using 3 x (M2 x 12mm) self-tapping screws.
Finally, complete the assembly by attaching the translucent bottom part with 4 x (M2 x 16mm) self-tapping screws, enclosing the macropad.
Modules
The assembly process for the modules is similar to that of the macropad. Fit each module PCB into its middle section, and then attach it to the top enclosure part using either 2 or 4 x (M2 x 12mm) self-tapping screws, depending on the module’s size. However, do not fully close the modules at this stage, as we still need to upload the Seesaw firmware to the ATtiny chips in the next step.
Module Firmware
To upload the Adafruit Seesaw firmware onto each module, you'll need a UPDI programmer.
You can use a standalone module or create one yourself with a USB to Serial adapter and a 1K resistor.
Refer to the Adafruit Guide for detailed instructions.
Following the guide, install the megaTinyCore and Adafruit_seesawPeripheral Library. This will allow you to compile and upload the Arduino sketches located in the firmware folder for each module in the project's GitHub repository.
Each module PCB had a 3-pin header footprint, for 5V, UPDI, and GND, which is used for programming. To upload the firmware, I simply press a Dupont connector against these TH pads without soldering anything.
If you wish to assign different I2C addresses to each module, this is the step to do so. You can easily set the desired addresses by modifying the relevant variable in the Arduino sketches. Additionally, if you have several identical modules, you have the option to bridge the address pads on the PCB. This method allows you to increment the address without the need to reprogram the firmware.
Assembly _2
Just like the main macropad, we close off each module using the translucent bottom part corresponding to its size, securing them with 4 x (M2 x 16mm) self-tapping screws.
To complete the assembly, I affixed rubber feet to the bottom of both the macropad and the modules. Then, I mounted all the switches, keycaps, and dials, finalizing the build.
Macropad Firmware
The macropad still runs KMK, so I just wrote a custom module to support the new features.
To start, you'll need to have Circuit Python installed; Adafruit provides a helpful guide to get this set up.
Once Circuit Python is running, simply drag and drop the entire contents of the macropad's firmware folder into the Circuit Python drive.
For customizing the macropad’s functionality and creating specific combos, refer to the KMK documentation.
In the example code provided, the modules are initialized with the OcreebModule class, which assigns I2C addresses, pins, and configures the hardware for specific scenarios of the modules.
They are then assigned keymaps in the same way as any standard keyboard in KMK. The exception lies with analog devices: they are assigned a list of MIDI notes to send control signals for. As an example, I linked these signals to actions in Lightroom using the MIDI2LR app.
Done
Despite its issues, I decided to share the project, hoping you might find value in some aspects of the build. The community has already contributed fantastic feedback, and I'm confident we'll iron out all the kinks in a few weeks.
Thanks for sticking with me to the end.
Be sure to follow for more projects and builds like this one.