Divoom Pixoo LED Display Replacement
2024-May-15, Wednesday 12:00 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
The bag is constructed well, of decent quality materials. The LED grid works very well. The app for it, on the other hand, is absolute hell. Other people have made alternative clients for them, like the DivoomClient for ESP32, Divoom Timebox Evo, but the only one I personally tried out was the Windows Diwoom client. Which worked pretty well, but made me realise the bluetooth communication isn't protected at all. If there isn't a client currently connected to the bag, there's nothing stopping anyone else from connecting and changing the displayed image. So clearly the hardware had to come out.
Dissection
There is an FCC filing for a slightly different bag, but it does include photos of this display hardware. First we have to get to it though.
There is a side pocket behind the display, that has a small opening to let the displays USB cable through, to hold the (not included) power pack. If you pull out this pocket, and unpick the stitching, you have hand-sized access to the display.
The display is held in place with a variety of layers. On the outside (of the bag) you have the plastic diffuser screen. Bonded to the screen, with an area cut out for the display, is a fabric mesh. The display package is glued into place on this. There is then a very stiff interfacing, with an area cut out for the display, laid on top of this, glued to the frame/edges of the display grid. And on top of all this is a piece of faux-leather (brown in my case) that keeps it all covered. With gentle, and persistent pressure all but the screen and mesh separate.
Sketch of the different layers holding the LED display in place
Photo by chebe
Original LED display grid after removal
Photo by chebe
Replacement Display
Now that we know what the original display looks like, we can look around for other 16x16 RGB LED panels to replacement it. Turns out we don't need to go far. Piromoni have the Stellar Unicorn, a 16x16 RGB LED matrix, with a Raspberry Pi Pico W attached in one package. I ordered it and it turned out to be just ever so slightly larger (width and height), but a fair bit thicker (depth). But we can make it work.
One thing the Stellar Unicorn doesn't have is a per-pixel grid, like the original. (At time of writing there are no linked models either.) Heavily relying on the dimensional drawing I opened up 3D Builder and made my own. I left spaces for the M2 screws in the corners, and M2.5 in the middle. I added a lip around the edge to glue it all to the screen/mesh, similar to the original. The back of the Stellar Unicorn has a bunch of buttons, so I created a back panel too, with gaps so the buttons could be accessed.
Front grid panel model
Photo by chebe
Back panel model
Photo by chebe
The first time I printed the front/grid it came out beautifully. A little bit of stringing but I went through the 256 holes with a flat head screwdriver and neatened it up. Unfortunately I discovered that the bag didn't quite fit that version. The bottom edge needed to be narrower. And when I printed it again my printer and/or filament was having a very bad day. It was a mess. I hit it with the heat gun to address the worst of the strings. But then I had to go through another 256 holes and file them all. It took a while. In the end it was functional, but nowhere near as pretty as the original result.
Back of the printed front grid panel
Photo by chebe
Front of the printed front grid panel
Photo by chebe
Front grid panel screwed onto Stellar Unicorn
Photo by chebe
I printed the back panel between the two front/grid panels, and the print quality is intermediate. But functional. I had to do a couple of iterations to get the spacings for buttons to feel right. I screwed it all together with four inset/countersunk screws on the front, regular screws on the back, and standoffs in between.
Back panel screwed onto Stellar Unicorn, top view
Photo by chebe
Front and back panels screwed onto Stellar Unicorn, showing button access on left side
Photo by chebe
Front and back panels screwed onto Stellar Unicorn, showing button access on right side
Photo by chebe
Front and back panels screwed onto Stellar Unicorn, showing the spacing between the board components and the panels
Photo by chebe
Software
This is a MicroPython device (with means using the Thonny code editor). Pimoroni have some code examples, and I'm using the Rainbow one here for testing. The W in Raspberry Pi Pico W means it can do wifi connectivity, but it isn't enabled by default. I'm planning to leave it off and just upload scripts the old fashioned way, and make use of the provided buttons for alternating. But I haven't delved into the code much yet.
Reassemble
The Stellar Unicorn with the addition of the panels is too thick to fit in the side pocket any more. So I had to cut open the lining next to that pocket, and awkwardly hand stitch bias binding to finish the raw edges. The USB cable is also on the opposite side of the board from the original, and doesn't reach to the side pocket, so I nestled the power pack in the section I cut open.
I sewed back up the side pocket, and melted the edges as a quick and dirty seam finish. I used 6mm strips of double-sided sticky tape along the front edges of the 3d printed grid to secure it to the screen/mesh. It has a good hold, but also pulls away with no damage to the fabric mesh.
Because my grid is slightly bigger than the original I lose about a third of each edge pixel, all the way around, to the black-out mesh. (The cut out area in the mesh isn't perfectly even/straight, on top of everything, so it's all a bit uneven, but close enough.) You can make out the unevenness of the walls of my grid, which didn't happen with the good print that is slightly too big. But it's a choice between 'character' and being (even more) off-centre. I'm okay with my choice.
View of the section behind the display pocket, with new opening, and power pack in place
Photo by chebe
New display in place, running Rainbow example, in low light, with the uneven grid edges visible
Photo by chebe
Outside view of the bag, new display in place, running Rainbow example
Photo by chebe
This bag is quite eye-catching, and people have asked me questions about it whenever I've brought it out. I look forward to customising the animations, eventually. There are repos that will decode the actual animations from the app, but there doesn't seem to be a ready library for implementing them in MicroPython (I saw a promising one for CircuitPython, which alas is not MircroPython), but I'll keep investigating. Also, the original display is still functional, so that might find a use somewhere that isn't public.