New SmartMatrix::GFX based shirt

I got to finish and try my new beta shirt with 6144 pixels instead of 768 pixels per side. That was a lot more work (months of work to get a new driver working and port my code). It’s not perfect yet, but it’s a good start.



  1. switch from ESP32 SPIFFS which is too slow/hangs for short times to FatFS
  2. Try and find an infrared library that works with RMT (the current one I use and wrote is interrupts driven and works badly with @Louis ’ ESP32 SmartMatrix driver. I think the driver is too resource intensive as the panel gets bright (if it’s light, it likely doesn’t hold the interrupt as often/long) and the IR driver can run more often/work better
  3. Try and get a neopixel string working again, which I’ve been failing at right now, need to research this further, lots of things going on to cause conflicts and crashes.
  4. Find/use flatter ribbon connectors to make the board less thick. I already unsoldered the power connectors (which actually was hard and somewhat damaged/flexed the boards but not in a critical way)

6x 32x64 semi flexible panels, front panel output sent to the rear panel to mirror the display with a single cable.
Peak power is close to 10A @ 5V, so I have to use a pretty thick power cable not to starve amps on the 6th panel that starts going bad if things get too bright.
In case you wonder, it means the rear panel is one frame refresh behind the front one, but given that there are thousands (millions?) of refreshes per second due to PWM color mixing, the offset is impossible to see even if the panels are side by side.

That’s awesome Marc! Quite an upgrade in pixels

I think the effect in one panel being a clock behind the rest is that the brightness of the pixels shifts, and might actually move pixels between rows. The timing and address lines are sent to all panels at once, where the pixel data only progresses through one set of panels for each latch pulse. Refreshing a pixel with the red channel of 0x800 would result in 0x400 on the second panel. 0x001 would result in 0x800 on the second panel, but on the next row. (I could have the direction backwards, I can’t remember if it’s MSB->LSB or vice versa without looking at the code. Interesting that’s it’s not that noticeable in person.

How comfortable is the shirt to wear? Does it get warm?

Did you replace the HUB75 vertical connectors with right angle connectors?

Try and get a neopixel string working again

Just curious, why neopixels and not DotStars? Cost? Availability? I have a strong preference toward the two-wire LEDs as they have Global Brightness Control to help with better color depth, but I’m curious why people choose other LEDs.

I already unsoldered the power connectors (which actually was hard and somewhat damaged/flexed the boards but not in a critical way)

I agree this is difficult without a hot air gun and careful technique. You need a lot of heat, but not too much. I’m thinking using diagonal cutters to cut the connector into four pieces, and then desoldering each pin one by one might work, but might damage the pads. I want to test this theory.

I’m going to be jumping in to the APA102 signal to HUB75 converter project (basically the SmartMatrix Library refresh code running on an ESP32 that also listens for incoming APA102 signals). That should allow you to move the timing sensitive refresh code to a separate CPU, saving you RAM and letting things like IR and Neopixels hopefully work better, and also allowing you to choose a different CPU for controller, if ESP32 isn’t actually the best choice for you, maybe it is. I’ll probably start a thread on this on the forum to discuss requirements (e.g. maybe P2 AB panel support?) before I get too far into development.

More questions, can you dance in the shirt or do you have to be careful about movement?

How are the panels attached to your shirt?

I hadn’t quite thought about that, and indeed having the panels side by side, I can’t quite tell the difference.
Sometimes I also run 32x64 on my 32x96 setup, and it just looks like the same pattern 3 times, I can’t really tell that they are different even though they might be a bit like you just said.

It’s not super comfortable but it’s not terrible either. My neopixel version was much better due to being lighter and thinner. Also, this one is really just a vest that I wear on top of the shirt while the neopixel one was embedded into the back of the shirt (I just can’t really do this here given that the panel is about 1cm think at the moment).
It does not get warm, warm is wasted energy and batteries :slight_smile:
One of its corners will take your eye out though, so I have to be careful when people hug me :slight_smile:

I already have WS2813B strips that actually work and bend without breaking (the WS2812 ones would eventually break their data line). I know that they’re crap signalling wise, but I just have a bunch already, so they’re nice to re-use.
Of course they’re also a lot cheaper, even if I could afford the better ones. Eventually I could switch if I have to, but I would have to redo my pant and shirt legs and arms.

I stupidly tried to save the connectors (which I did), but had to put my soldering iron on 480C and apply a fair amount of heat and force to get each pin out (I used a flat screwdriver to try and lift the whole thing while heating up each pin).

For now, I’m indeed still using my old ESP8266 to do pants and legs (I already had that working), and if I can’t find an RMT IR library, I may have to keep an ESP8266 to do IR too and send the commands to the ESP32 over serial.

Dancing is not a problem, it is attached over my shoulders with thin but solid metal wire. Then it’s attached around my waist to send power on both sides (redundant) and the ribbon from panel 3 to panel 4.
But for your other question: the panels are not actually attached to the shirt at the moment, they are resting on top. I may do something a bit better and have a black shirt on order to try this with.
(for neopixels I had a white shirt since I wanted to display through the shirt, but with rgbpanels, I think that’s not going to happen).

Last but not least, I need to find some thin enough flexible but non breakable plastic sheet I can put on top to protect the LEDs and maybe extend past the sharp corners a bit so that I don’t poke anyone with them. If the sheet acts as slight diffuser, that would be handy.
Suggestions there?

@Louis back to the topic of mirroring a display by plugging the last panel to the first panel of the mirror set, I thought about it again, because it sure does look identical.
Because you’re doing PWM to control how bright each color component, is, if you wait 16t on blue when you shift it on panel 1, and then you wait 8t while you leave that color off, those same time offsets are shifted onto the 2nd set of panels, so the colors look the same, there is just a delay too small to be visible.
Would you agree? So basically, it just works, which is good for my daisy chain wiring :slight_smile:

By the way, are you using BCM to limit the number of interrupts by varying the amount of time each interval t is?
I borrowed that trick from adafruit in my driver

Yes, I could read your driver details to try and find this, but it’s a lot more code than mine :slight_smile:
If you aren’t doing this yet, it would allow you minimize the amount of interrupts you do and give more time back to the main loop, or other ISRs.

I’d expect a potential 50% decrease (or 100% increase) in brightness to be visible, wouldn’t you? I’m surprised the effects of shifting data down the shirt aren’t more visible, but haven’t thought about it much.

basically, it just works, which is good for my daisy chain wiring


By the way, are you using BCM to limit the number of interrupts by varying the amount of time each interval t is?

I’m using BCM (as far as I can remember), but using DMA so that interrupts are limited. With Teensy, there’s an interrupt once per line, with the ESP32, once per frame or optionally less.

No, I don’t expect that.
If my array were 96x128, there would be that much more data to push, but with 96x64 x2, the same amount of data is pushed.
All I do is scavenge the bits that are falling off the 3rd panel, which is done without any change of data rate or refresh Hz. It introduces latency which is not visible because it’s so small.

thanks for those details