Yeah, I've got like 10 build threads going here, so what better time to start a new build thread?

I am making a Soul Cage for Halloween. Right now I'm in the waiting for parts phase. In the meantime, here's the Hackaday article that caught my interest.

https://hackaday.com/2025/09/25/trapped-soul-in-time-for-halloween/

🧵 1/N

#SoulCage #BuildThread #ESP32

Trapped Soul In Time For Halloween

While it is sort of disturbing, it is one of the best uses for a round LCD we’ve seen lately. What is it? Just [vishalsoniindia]’s SoulCage — a pendant that appears to have a poor…

Hackaday

While I wait, I thought I'd try obscuring it by flickering the LCD's backlight on and off. Here's a flickering backlight on a test pattern on the Reaction Diffusion Toy (different screen, same MCU).

🧵 2/N

#SoulCage #BuildThread #ESP32

Here's the brightness function. Sum of sine waves, un-gamma-corrected and rectified. The pattern repeats every 50 seconds.

No idea how it will look with the Soul Cage animations.

🧵 3/N

#SoulCage #BuildThread #ESP32

While waiting for parts, I printed the Soul Cage's housing (left). The Waveshare board comes with a machined metal housing. This printed part replaces the housing's back cover and deepens it to make room for a battery and a power switch.

I wanted something with more character, so I designed the one on the right. I found a nice 3D printed chain on Printables, and I added spike/loops to pass the chain through. The idea is that the soul is chained in.

🧵 4/N

#SoulCage #3DPrinting

The gray in the previous photo is just a working color. It photographs well, but I want something spookier. I picked up this fidget spinner at 3DPrintopia, and that's the filament I want. Do you know what it is? I sent email to AsylumLife, but no answer yet.

I will get some PolyMaker Shadow Red Dual Matte PLA if I don't find out what it is.
https://us.polymaker.com/products/panchroma-dual-matte?variant=43613087825977

🧵 5/N

#SoulCage #3DPrinting #Filament

AsylumLife responded. It was a limited edition filament, now gone. So I'll try plan B.

#SoulCage #Filament

Gotta decorate the case back. This is an attempt. Man, Fusion 360 fights you every inch of the way when you want to add lettering or artwork to a surface.

🧵 6/N

#SoulCage #3DPrinting

I designed a magnetic clasp for the Soul Cage's chain. There's already a magnetic clasp on Printables, but this one also has a mechanical engagement. It should be more secure.

I used my now-standard crush rib design to hold the magnets. I will Superglue them in too.

🧵 6/N

#SoulCage #3DPrinting

I'm adding static bursts to the Soul Cage video in addition to the flickering backlight. Here are the effects applied to the test pattern thing.

Why? The Soul Cage's video loop is only 8 seconds long. It's 8 very good seconds, but it does get repetitive. So I'm looking for ways to distract the viewer from noticing.

I've also tweaked the screen flickering algorithm to make it less repetitive.

Edit, 2 days later: 8 seconds, not 2.

🧵 7/N

#SoulCage #ESP32

This build thread is brought to you by Staples®.

I've used reams of paper as monitor stands for 40 years. They're cheap, they're solid, and they used to be ubiquitous in office environments.

🧵 8/N

#SoulCage #Staples

The Soul Cage's electronics and the new printer filament are here. I'm pretty happy with the color.

I've just started modifying the firmware. The current FW runs at 7 FPS. So first I need to speed it up before I add the static bursts.

🧵 9/N

#SoulCage #3DPrinting #Halloween

I am benchmarking tonight. It looks like the ESP32 S3 can copy from Flash to SRAM almost as fast as SRAM to SRAM.

The Soul Cage original firmware had the uncompressed video streams in .h files that initialized big arrays. Now I've moved the videos into partitions on the flash. I can recompile the app without having to wait for 14.5 MB of video to download every time.

And now I know how fast I can move the video into SRAM.

🧵 10/N

#SoulCage #ESP32

I am moving the Soul Cage's firmware from Arduino to ESP-IDF. Arduino is completely unusable for developing this app.

I just measured a compile and upload time of 4:33. Four and a half minutes. That's 1:20 to compile and link, 0:49 of mysterious "indexing", and 2:24 to flash. Yeah, it's a huge image, about 15 MB.

What's it doing with 1:20 compile time? This is an 8 core CPU; that's about 2 trillion cycles.

🧵 11/N

#SoulCage #Arduino #ESP32 #ESPIDF

With ESP-IDF, I created a custom flash partition table and stored the video streams in their own partitions. The app is under 300 KB, and it compiles, links, and flashes in 12 seconds.

Arduino can do custom partition tables. Maybe it can do custom workflow to build the filesystem images too. It would still take over a minute to compile, though.

🧵 12/N

#SoulCage #Arduino #ESP32 #ESPIDF

I published the housing to Printables and entered it in their Halloween contest. It's still running the original firmware.

https://www.printables.com/model/1442110-chain-wrapped-housing-for-soulcage

🧵 13/N

#SoulCage #Printables #3DPrinting

Chain-Wrapped Housing for SoulCage by kbob | Download free STL model | Printables.com

Printables.com

Hooray! The new firmware is functional! I am very happy with how this came out. I think that giving short glimpses into the video sustains interest, if your attention span is long enough.

There are two souls in the cage. This one is AFAD. (assigned female at death)

🧵 14/N

#SoulCage #Halloween #ESP32 #3DPrinting

Here's the AMAD soul.

I'll get the firmware up on Github shortly. I'm a ittle burnt out after working on this all night and day. (And more than a little euphoric at how well it came out.)

🧵 15/N

#SoulCage #Halloween #ESP32 #3DPrinting

The firmware is very rough, but it's on Github, along with prebuilt binaries if you want to build your own.
https://github.com/kbob/SoulCage-Firmware

As the Sirius Cybernetics Corporation's products all say, Share and enjoy!

🧵 16/N

#SoulCage #ESP32

GitHub - kbob/SoulCage-Firmware: Alternate firmware for the SoulCage Halloween prop

Alternate firmware for the SoulCage Halloween prop - kbob/SoulCage-Firmware

GitHub

I'm back to benchmarking memory-to-memory copy for the Soul Cage. There are three kinds of memory on the chip: SRAM, PSRAM, and flash. And I tried good old memcpy, ESP-IDF's DMA-based memcpy, and a memcpy that uses the vector registers for 16 byte loads and stores (called DSP copy in the results).

I am copying video off the flash at less than 8 FPS. So they're all fine.

🧵 17/N

#SoulCage #ESP32

We can do this the easy way or -- aw, heck. Let's just do it the hard way.

🧵 18/N

#SoulCage #ESP32 #OldSchoolUnix

For perfectly valid debugging reasons, I sped up the SoulCage's screen flicker and the soul switching 50✕. This version has a certain frantic panic.

(Yes, this is a different dev board. SoulCage builds for two boards now.)

🧵 19/N

#SoulCage #ESP32

I pronounce the Soul Cage project complete. And it's not even Halloween yet. Its public debut is this Sunday.

I've refactored the firmware from a big ball of mud into something I'm fairly proud of. And I still like the printed case.

Link-o-rama (all repeats):
https://github.com/kbob/SoulCage-Firmware
https://www.printables.com/model/1442110-chain-wrapped-housing-for-soulcage
https://hackaday.com/2025/09/25/trapped-soul-in-time-for-halloween/
https://www.instructables.com/SoulCage-the-Digital-Trapped-Soul-Pendant/

🧵 20/N

#SoulCage #ESP32 #3DPrinting #Halloween

GitHub - kbob/SoulCage-Firmware: Alternate firmware for the SoulCage Halloween prop

Alternate firmware for the SoulCage Halloween prop - kbob/SoulCage-Firmware

GitHub

I know I said the Soul Cage was complete, but I had this idea. The video streams are low speed: 7.5 FPS. The ESP32 has enough bandwidth (I think) to linearly interpolate between frames. Here's an animated file that shows the original on the left and interpolated frames on the right. The difference is much less than I expected.

(I hope Mastodon doesn't mangle the video...)

🧵 21/N

#SoulCage #ESP32

@kbob I like this effect. Feels like a "fresh" soul in the cage.
@kbob nice timing on the delay👏
@kbob this is incredibly rad! I’ve heaps of those round displays. They’re really great
@kbob I am very old. When I started university, if you were very lucky, you could compile a very simple undergraduate program twice in a day. Getting access to a terminal more than once per day was the limiting factor.

@woo I am also very old. Some of my undergraduate classes were taught using punch cards.

But in the intervening 45 years, I've gotten totally spoiled by sub-second turnaround.

@kbob @woo I’m old, too 🙂. I remember when a friend of mine “complained” of his newly acquired 486 PC. The “complaint” was that it was so much faster than his old 386 that he no longer had time to get a coffee and smoke a cigarette outside while his code was compiling! 🤣

[Edit] 386, not 368 🤦‍♂️

@kbob Some of my classmates chose to use cards because you could edit a couple of cards faster than editing a file and there was no queue for the card punch machines. I took my lecturers' advice to learn to use a line-editor on these new-tangled terminal things because they were going to be BIG, in the future.

@kbob Wait, you mean that the reason my ESP programs are so slow to compile is because they’re Arduino projects?

Maybe I should switch to ESP-IDF. Or check out platform.io. I’ve heard of it but I don’t know what it is.

@kbob ooh, this looks metal 🤘
@kbob Reminds me of that time when LinusTechTips came to our lab and hyped our ultra-high precision equipment that’s used to measure Staples supported LCD panels: https://m.youtube.com/watch?v=Um0PFoB-Ls4&t=380s
Look what we found in NVIDIA's Top Secret Gaming Monitor Lab

YouTube