Building high-tech catears for fun and definitely not profit
What started as simple 3D-printed catears I got at the CCC turned into multiple years of headaches. This is the story of four versions of my catears, and what I learned (the hard way) along the way.

I guess this story begins at my first Chaos Communication Congress in 2023 (37C3 ).
For those who have never been, the Congress is Europe's biggest hacker party, conference, and platform for technology, society, and civil liberties. It's held yearly between Christmas and New Year. Each year, thousands of hackers, makers, artists, and volunteers take over a convention center for a few days to give talks, run workshops, build things together, and generally nerd out. Blinking lights, soldering irons, and DIY contraptions are everywhere!
It was the first time I went to an event of this sort, and it was astonishing! Between the talks, the assemblies and the sheer amount of creativity on display... there was so much to see! As I'm particularly shy, my first congress was spent mostly alone; I roamed around discovering the event. Since I'm a night owl and the congress is open 24/4, when things calmed down late at night/early morning, I met a few people, and it was quite nice!
I came back with a lot more ideas than I had left with. One of them, which I didn't see coming at all, was about catears.
Fair warning: this article is a long story about a project that was supposed to be simple. It involves four versions, countless tiny LEDs, and more PCB respins than I'd like to admit.
Version 1 & 2 - The original and "Light-Up" version
As the congress went on, I started seeing more and more people wearing 3D-printed catears, which I thought was pretty cool! After searching a bit, I found that the appropriately named C3CAT assembly was distributing them.
This is from their website:
The camp got some more people interested in the topic of printing cat ears and two of them pre-printed a lot before the 37c3. But even 1500 cat ears were sold-out in the first two days.
They also had a small stock of LED strips for the "Light-Up" version. This version uses a 3mm 5V COB single-color LED strip, which made them even more awesome. Unfortunately, I was too late to the party: I managed to get a plain plastic pair, but when I asked how I could get my hands on a pair with LEDs, I was told they didn't have enough stock remaining.
I told myself right then and there that I would have a light-up version ready for 38C3 .
Version 3 - RGB!!!!
Still at the congress, I searched a bit online and found something even better: 5mm 5V COB strips with addressable LEDs!!!
I initially wanted to keep the 3mm COB strip, but after spending far too much time browsing AliExpress listings, the only thing I could find was 4mm single-color. And so I bought a 5m roll of the 5mm COB addressable kind π
When I got home, I started designing my own version. I didn't like the way the strip was held on the C3CAT version:
- The LEDs didn't span the full band
- The connection to the strip was too "loose" for me
- I wanted a detachable connector
After a bit of time I had something I liked:
After waiting for the 3D print to finish, I attached the LED strip. Because the strip detached when the frame flexed, I ended up using CA glue to hold it in place.
For the controller I initially wanted something small, but between scope creep and a lack of time before 38C3, I instead built a fully integrated box with a battery. For the ESP32 I settled on the TinyPICO V3 from Unexpected Maker and used a PowerBoost 1000 from Adafruit to handle battery charging and the DC-DC for the LEDs.
This worked quite well, but it was very bulky:
Nevertheless, it was very cool, and when 38C3 came, I got stopped quite a few times to talk about it. I think I was (one of) the first to have full RGB catears.
It turned out that the JST connector was quite fragile, and I ended up needing to go to the soldering corner to repair the cable! For the second build of this version, I put some glue on the wires so that they wouldn't break.
Note that while writing the article I noticed that C3CAT now has build instructions for RGB catears similar to mine. This would explain why I saw so many of them last year at 39C3. That said, their version only has the strip on the ears, not the full band.
Version 4 - Moar RGB!!!!
Not to be outdone, I decided I needed more RGB and thought it would be very cool to have a 2D matrix on both ears and on each side of the catears to display animations/text. This turned out to be quite the challenge and took more than a year and a half of working on it on and off to get it how I wanted.
The idea was "simple":
- Keep the band as-is
- Custom PCB for the matrices
- Since there is a PCB already there, put the ESP32 directly inside the ear
Revision 1
The first revision was a simple ear-shaped matrix so that I could test the LEDs and figure out power requirements and WLED integration.
For the LEDs I chose the XL-1010RGBC-WS2812B . Those little critters are a traditional WS2812B LED squeezed into a 1mm * 1mm * 0.8mm package, and they are just as bright (if not more).
This raised two concerns:
- Heat. The board is rather small and has a bunch of LEDs. Even when they are off, the driver IC inside every LED still pulls 0.35mA. Across a ~300 LED panel, that's roughly 0.5W of heat for doing absolutely nothing. When the LEDs are on, it's even worse: I have seen this board reach 70/80Β°C, which is technically in spec but definitely not ideal.
- Power. According to the datasheet, each LED pulls 5mA. Multiply that by 300, and it's 1.5 amps per panel. For the final product, that's roughly 6.5 amps once you factor in the controller and headband.
But I ordered a test board anyway to see if it was even possible to do π€.
It also proved that they are bright enough that there isn't really a need to push the brightness past 20%; otherwise, you get blinded pretty fast. You can see in the video above that the first test panel is overloading the camera!
But it also showed a viable concept. π
Revision 2
For this revision, I took the issues I saw before and did mostly nothing to solve them π€‘. I instead focused on integrating the ESP32 and power on the other side.
My original worry was that I might be pushing too many amps over a USB cable and that voltage would drop to unacceptable levels. To solve this, I thought that USB-PD would be a good fit. The idea was to request 12V from a battery pack and regulate it down to 5V on each panel. I selected the following ICs:
- The HUSB238
, a
highly integrated USB Power Delivery (PD) controller as sink role for up to 100W power rating. It was also the easiest/fastest IC I could get my hands on. - The TPS65320D
, a
3.6V to 36V, 3.2A buck converter with auto-sourced 280mA LDO regulator
The cool thing about the TPS65320D is that it integrates the DC-DC and the LDO in a single chip, which is pretty nice considering the space constraints. It was supposed to provide around 3 amps on the main output and 200mA for the 3.3V with over-current and over-temperature protection.
For the controller I used an ESP32-S3 running WLED. I chose it mainly because it integrates USB directly, which removes the need for a secondary USB-UART chip. When I started this project, WLED's support for the S3 variant was just coming out, but it worked just fine in the end.
The first board used a 2-layer PCB to reduce cost; in hindsight, this was a rookie mistake that cost me a revision. π€¦
It worked, but being a 2-layer board, it came with a few issues:
- Routing was a nightmare: no proper ground return path and thin traces
- No heat dissipation, which amplified the heat issue
- WiFi sucked because it was not tuned properly and was using a very small antenna
- I messed up the microphone footprint, so I had to use some bodge wires
Revision 2.1
I then decided to redo it as a 4-layer PCB with mostly the same components. Since I didn't have to route everything on the top layer, I got a bit more room to play with and added pads for mounting it to the frame using the 74663025R from WΓΌrth (my plan was to sand them down to make it fit).
As you can see, even with 4 layers, it's very crowded; routing was better but still complicated.
But it powered up just fine:
Unfortunately, as I already semi-expected, things didn't improve a lot:
- It still overheated
- WiFi still sucked, but this time it was my fault for not using the proper values for the tuning network
- I broke the mic while soldering (I think some flux or IPA got into its hole), so no sound-reactive animations
- It sometimes locked up due to what I presume was the ESP32 rebooting
And that's when I figured out that I over-built the damn thing.
Realistically, the USB-PD and a buck converter on each panel caused more issues than they solved:
- They take up a bunch of space on the PCB
- They produce a bunch of heat
Revision 2.2
Every USB-C cable should be rated for at least 3A, even at 5V (5A for e-marked cables). The max current is only drawn at full brightness, which I can't use anyway because it either overheats or blinds people. At the brightness I actually use, the whole thing stays well within what a plain 5V USB-C connection can deliver, so there wasn't really a need for USB-PD and higher voltages.
So I decided to de-solder the DC-DC converter, add an LDO for the 3.3V, add a 5.1k resistor for the CC line, and solder the cable directly to 5V.
The version that made it to 39C3 was the same PCB but with power regulation bypassed. This improved stuff quite a bit; at least the ESP32 didn't lock up randomly, though WiFi was still terrible.
39C3 was awesome, and it was also my first congress as an Angel.
Angels are the volunteers who keep the whole event running. I signed up to help with the video side of things, and ended up doing a bit of everything there, including simpler stuff like line control or evacuation. It meant I saw a lot more of the congress from behind the scenes, and I loved it.
Being an Angel also made it much easier to meet people. I got to know a bunch of very cool new folks while working shifts together, and I also got to catch up with a few people I had met at 37C3 and 38C3.
Revision 3 - Taking things out
Lessons learned: for revision 3 I removed and replaced things:
- The USB-PD and DC-DC are gone. It's now powered directly by 5V, and the 3.3V needed for the ESP32 is derived by an MPM3805 (a small step-down converter with integrated inductor).
- WiFi works wonders. I replaced the ceramic antenna with an IRD-C013 and the proper tuning CLC network for the 4-layer PCB.
- The mic survived soldering this time, so audio-reactive animations finally work πΆ
- The mounting pads from revision 2.1 are gone too. The boards now live in an MJF-printed PA12 frame, held in place with CA glue and silicone. Silicone doesn't stick well to FR4 and solder mask, which is precisely what I want: it's held in place, but the board can still be removed and repaired.
Since everything now runs straight off the USB 5V, make sure the WLED boot preset uses a low brightness. If it boots straight to full brightness, the current spike can trip the power bank's protection: it cuts out, the ESP32 resets, and you end up boot-looping your power supply.
Because no design ever works the first time around, I still ran into an issue. The WS2812 LEDs are 5V, and typically you would use a 5V signal or a level shifter, but because it always worked before, I didn't π€¦.
The MPM3805 that powers the ESP32 is wonderful, but it gives 3.3V exactly (as it should). The previous regulators were sitting slightly above that, which had been hiding the problem all along. For some reason, it turns out that the drive strength of GPIO38 (the output that drives the main panel) is somehow weaker, which led to data corruption and, in turn, visual glitches. Every other GPIO worked just fine, but I wasn't about to reorder expensive PCBs just to change a pin!
I did a bunch of testing, and it turns out that slightly raising the 3.3V line resolved all issues. To make sure it won't happen randomly on another output, I chose to increase the supply voltage instead of changing the pin. It was actually straightforward to do; the MPM3805 has an OUT_S pin that the datasheet tells you to connect to OUT. This pin is the supply for the resistor divider used for the DC-DC feedback loop. There isn't any formula in the datasheet that tells you how it works, but I found that using a 3.3k resistor raised the supply to 3.47V, just enough to stay in the ESP32 spec and avoid glitches. π₯³
That said, it's undocumented and might be different from chip to chip π€, so use this at your own risk.
Because the LED matrix is designed to be horizontal when the ears are worn, the PCB itself is angled by a few degrees. Since that tilt is mirrored between the left and right ears, the same board can't be used on both sides, so I needed two PCB designs. It's actually pretty convenient because the second PCB can act as a "cable organizer/router" so that there isn't a mess of cables.
The 3D-printed band also got a small redesign to remove unwanted features meant to hold the previous version and to add hidden cable passes inside the band.
You can also see below that for the first time the LEDs are somewhat aligned to a grid; previously, I just crammed in as many as possible. This version has slightly fewer LEDs (290 per panel), which reduces cost, power, and heat, but it's just as bright and makes routing easier. I also scripted part of the layout in KiCad 9's Python console (mirroring footprints, routing the LED data chain) instead of clicking through each pad by hand.
Assembly
This was by far the trickiest bit; there's a lot of stuff that needs to interconnect and work perfectly!
USB Cable
The first step was finding a USB-C cable that I liked. I chose a 2m cable with a flexible silicone outer sheath, bought from Amazon .
It ended up fitting perfectly; the 3 data wires are pretty thin, and the grounding isn't insulated. With some fiddling, it was possible to pass everything through the tiny cable passes.
Left side front PCB
As explained before, the left PCB acts as an organizer to make routing easier.
You can see how it works in the images below: 5 conductors of very thin multi-strand wire go from the right side to the left side in the middle cable pass. The signal gets distributed, and another 3-conductor cable leaves for the outer band.
Right side front PCB
The "main" right PCB is basically the same; the wire comes in, this time from USB-C, and the left-right link goes out.
This step was also the first power-up test with a fully integrated PCB in the frame. π€©
Backside PCBs
For the back PCBs, instead of making another two variants, I simply reused the front ones and added some Kapton tape to make sure nothing shorts out.
This actually fits pretty well because with JLCPCB the minimum order quantity for an assembled PCB is two, and since I only assembled the LED side, it was a nice way to save some money πΈ.
They connect using a small 3-wire cable (5V, ground, and data) to spare pads put there for this purpose.
Band
After I confirmed that the panels themselves worked fully while inside the frame for multiple hours, I decided that I was confident enough to glue the cables and the outer band.
I unfortunately needed to glue the cables because there's just not enough space to put a cover. The outer band also needs to be glued because the included adhesive strip doesn't stick very well to PA12. The center between the ears is especially prone to bulging upwards when putting them on and wearing them for a long time.
All revisions up to this point have the outer band glued, and I haven't seen it fail at all.
After this was done, I could run the first fully assembled test π₯³. The video above doesn't show it, but this is running an audio-reactive animation, and it's reacting to me snapping my fingers.
I can't tell you how happy I was at that moment; it looks spectacular π€©!
Silicone
The last step is silicone. Since the mounting pads are gone, I need some way of holding the panels in place. The front panels are held with a tiny bit of CA glue, just enough to hold them but not enough to be permanent.
The idea with silicone is to hold the PCBs in place while staying compliant enough when the frame flexes, and to protect the stupidly small and fragile XL1010s. And so I chose a platinum-cure casting silicone (Shore 12A, in other words very flexible) with some white pigment.
To put it mildly, this was a pain in the ass, it seeped everywhere it could. Fortunately, my plan worked and the silicone was more than enough to hold the panels in place while still being able to be removed completely without leaving residue.
While doing my test pours, I got better and better, and for the final one, I nailed the process:
- Hold the band in tension (as if someone were wearing it; in the photo above, you can see I was using an SDI matrix π )
- Mix a small batch
- Wait until it starts to cure (about 30 min for me)
- Coat the edges of the PCB
- Put it in the slot
- Add extra where there is a hole bigger than 0.5mm
- Wipe excess
- Wait for it to cure
- Mix a bigger batch using more pigment than you think you need π¨
- Don't forget to plug the mic hole
- Flood the LEDs
- Wait until it starts to cure
- Touch up with some very small drips where the LEDs look too close to the surface
- Wait 3h
- Flip it carefully
- Pop out the panels on the other side, cutting away any excess silicone that still seeped through
- Pour some more silicone inside to secure the connections
- Repeat steps 1 to 3
And after waiting (sleeping π΄) a further 8h for the silicone to be completely cured, I was greeted by this:
The silicone I used is very flexible, and I poured it very flat, so it's a bit sticky if I lay them down on a flat surface. Otherwise, it's just perfect, and it looks awesome!
Conclusion
Here are some videos of the final result. It's running WLED, so of course all its animations work:
It has been a stupidly long road that started three years ago at 37C3, spanned four versions, and took more than a year and a half of working on it on and off. As always, I learned a few things along the way, mostly the hard way π .
As for the "definitely not profit" part, here's roughly what the final version costs:
- PCBs: ~12β¬ (4-layer, 6β¬ per 5 boards, two designs)
- LED assembly: ~118β¬ (59β¬ per 2 boards, two designs)
- Controller components (ESP32-S3, microphone, flash, passives): ~10β¬
- Frame: ~7β¬ (PA12-HP, MJF printed)
- Silicone and dye: ~40β¬ (though I have plenty left over)
- USB-C cable: ~10β¬
That's close to 200β¬ for one pair of catears, and that doesn't count the previous revisions. Revisions 1, 2.0, and 2.1 each cost roughly the same in PCBs and LED assembly, so all in, this project is probably somewhere around 500β¬, not counting V3 and the countless test prints πΈ.
I'm happy with where they are: they're bright, they're small, they're comfortable to wear, and people keep asking about them. There's still room for improvement:
- It still runs hot: roughly 50β70Β°C depending on conditions, position, and whether I'm walking around (airflow helps a lot). Better than before, but still hotter than I would like
- If I win the lottery one day I'll make a version with more layers and a real matrix instead of addressable LEDs
- Maybe one day battery tech will be good enough that I could put one in the other ear and it would last a few hours
But for the first time since starting they work, feel, and look like what I imagined ππ₯Ή.
Everything (schematics, PCB, 3D models, firmware, and the WLED configuration) is available on GitHub below, in case you want to build your own or improve on mine. If you do, I'd love to see it!
I will, of course, be wearing them at 40C3 ; see you there!
CommentsShortcut to: Comments
Want to chat about this article? Just post a message down here. Chat is powered by giscus and all discussions can be found here: TheStaticTurtle/blog-comments
TheStaticTurtle










































