The M4 Feather LED strip driver


I set up my M4 Feather board previously using CircuitPython. But I ran out of RAM on the M4, so I went for a Teensy 4.1 instead for driving LED strips with CircuitPython.

This is my revisited build using the M4 in the Arduino environment.

Parts List

QtyPart #DescriptionManufacturer
12900Adafruit FeatherWing OLED - 128x32 OLED Add-on For FeatherAdafruit
13857Adafruit Feather M4 ExpressAdafruit
12830Stacking Headers for FeatherAdafruit
1LED strip1M 144 LEDs/m IP30 SK9822 stripBTF-Lighting
1B5390ANODAUniversal LED strip channelSuperBrightLEDs
1CAB-145764-pin JST SM Plug + Receptacle Cable SetSparkfun
110oz jarMoldable thermoplasticsPollyPlastics
3OSTTA024163Screw terminalsOn Shore Technology Inc.
1UPS1E102MHD1TO1000 uF radial electrolyticNichicon
17cm x 9cm PCBGeneric 7cm x 9cm PCB.Generic
1EGS10C-20GElectronics grade silicone adhesiveChipQuik

Build Log

Step 1: A recap of past construction

This is mostly a recap of the results of my previous effort that ran CircuitPython.

The hardware was fine but once I moved from a 60 LED strip to a 144 LED strip, the M4 didn’t have enough memory to hold bitmaps in RAM anymore if I was using CircuitPython. So, after I’d carefully migrated the CircuitPython codebase to a Teensy 4.1, I decided it was time to turn my M4 into an Arduino board.

The board

Here’s what the circuit board looks like. The screw terminals on the bottom are for the strip’s power, which it turns out I don’t really need because a single USB brick is just fine for 144 LEDs at the brightness level I run at, so I’ve got a crude jumper. To the right is the LED strip connector. I added an electrolytic capacitor to smooth any voltage jumps and it’s got a OLED Feather and a M4 Feather on the board.


I probably want to add a big fat button to this design so it’s easier to trigger it in the dark.

The staff

I made the handles with some low-temperature thermoplastic and a aluminium extrusion.

The whole appeal to the thermoplastics is that it’s kind of like a clay-sculpting experience and I’ve already got a heat-gun. And if you smoosh it up against the strip while the plastic is still hot, it’ll just stick like glue. I made the first strip with a single handle at the top that wraps around the back and that worked really well most of the time, but I realized that it really helps to add a second handle at around the mid-point, so my current staff has both, so here’s what my staff looks like:


I started out with some random JST-SM connectors I picked up off of Amazon but they were too flimsy and so I’ve been using the JST-SM pigtails that SparkFun sells because they are thicker gauge wire.

I use electronics grade silicone to glue the wires down and then wrap it in heat-sink.


The firmware

My starting point was the firmware I’d already written for my gen3basic lightpainter board.

I’d initially tried to port it to the M0 Feather Express… but it turns out that FastLED doesn’t have a proper setup for that and I realized I’d probably need an M4 Feather anyway so once I had my Teensy board all tested, I just started using the M4.

One of the nice things about the Arduino framework is that I didn’t need to change anything, as long as the library support is there. I went from an 8 bit AVR to a 32 bit ARM processor and because it was between two boards supported by FastLED, nothing needed to change.

From there, I decided that the easiest way to get images that I’d been using in CircuitPython onto the board was just to convert them to a C++ header file for the time being. Google led me to img2c which I ported to Python 3 and tweaked a bit to get the results I’d wanted.

I did a rough pass of refactoring to make it work more like the CircuitPython version in a few ways, but I probably need to do some deeper refactoring. It doesn’t use the OLED nor does it offload files on the flash drive.

The chassis.


I whipped up a quick design in OpenSCAD using NopSCADLib and BOSL2 and then I printed it on my printer with clear PETG. It took a few tries to get everything right, but I ended up with a usable print:


The results

I spent a few hours in the studio two weeks ago with some lovely circus performers for a photoshoot and they all love my lightpaintings. I’d been rushing to get it operational so I didn’t need to have a 60 LED strip around anymore so that it would be easier to keep spares around.

Here’s Cola Claret:

Cola lightpainting

I like how now I don’t need to have any 60 LED strips. I just have two staves with 144 LED strips in them, plus a spare 144 LED strips in case one of them breaks.