I started this project as a way to light up the Mirrored Fox costume in photos, since its look is highly dependent on the lighting around at the time.
The key requirements were:
- Long enough to light the whole body at once
- Lighting from 360 degrees, so I didn't need to worry about positioning it
- A soft light with the LEDs as hidden as possible
- Durable enough to carry around and not worry about it being dropped, sat on it
- As little "dead space" at the ends as possible
- Fully customisable patterns
- Some easy way of switching the patterns/brightness etc. without looking at a control
- Not too heavy
This wasn't available in any commercial product that I could find, at least not at any reasonable price, so I had to make my own.
The obvious choice for LEDs was WS2812 on a self-adhesive strip, so all other design choices were with this in mind.
Hardware
The Tube
This was the easiest bit, I mainly just had to decide on the overall diameter. I settled on 40mm frosted opal polycarbonate from Plastock.co.uk, 50mm would be a good choice too, and would make fitting more electronics a bit easier. 40x1500x2mm wall thickness is 430 grams weight, for 50mm it's 530 grams. Acrylic would also be suitable, although it would be more susceptible to scratching and cracking if you drop it.
The Spine
For the LEDs to be 360 degrees they will need to go onto a 'spine' running down the centre of the tube. I made a prototype using 10x1mm steel and it was ok, but a little heavy. I did some calculations of aluminium and thought that it might be a little flexy and visibly move around inside the tube. I finalised on 10mm pulltruded carbon fibre tube, from Bucks Composites. I picked the circular hole type to get maximum rigidity, and indeed it's very rigid! It's only available in 1m lengths, so I bought a piece of 8mm round tube to join them, and used regular 2-part epoxy resin. This does make it tricky to get wiring down the middle though - even though I filed the insides of the round tube I had to use a drawcord. The tube needs to be drilled to secure the controllers and battery holder using an M3 set screw and nut. I used a 4mm drill bit. The pulltruded carbon tube will split if you press too hard, so use a sharp drill bit and press lightly. Also be sure to drill it clear of any electronics and clean the tube after - carbon dust can be conductive.
As mentioned I used 10mm wide 60 LED per metre strip. It's self-adhesive so it was just a case of applying it down the tube. I wrapped the carbon tube with kapton tape at the ends, so that the soldered joints would be away from the carbon surface.
Battery Holder
I did a few tests using commercially available battery holders and realised that the only sensible option really was to have a single bare 18650 cell with a BMS directly attached, and flylead with an XT60 connector. WS2812s are nominally 5V, but can run on lower voltages quite happily (albeit less bright), so the plan was to connect them directly to the cell rather than mess around boosting quite a large current to 5V.
Inbetween my first prototype and doing a second version I bought a 3D printer, which seriously improved my ability to make a nice compact and tidy solution. I won't go into too much detail about the design choices, since I'm not an expert in 3D modelling or industrial design, so what you see is what I made up as I went along. To avoid printing with supports, one end is printed separately and glued on with superglue.
Basically the idea was that a single screw holds the whole thing together, and to charge it you can just remove the screw and slide the base out to remove the cell to charge/swap it. I did briefly think about a way to charge in-situ, but for safety I wanted to be able to charge the cell in a commercial charger. The cell has the ends uncovered for this reason.
Control Holder
I use ESP32s extensively for other stuff, so it was the only choice for controlling the stick. I previously bought a Lolin Pico ESP32-C3 for another project, and it seemed ideal for this. It's about $7 on AliExpress. It has wifi, BLE, plenty of GPIOs and is TINY. It also has a lithium charger and LDO regulator, but I used a separate boost regulator so it can work with voltages below the minimum for the regulator. I put the Lolin on PCB headers and soldered the regulator in underneath. The PCB is from a kit of development boards off AliExpress. The width of one of the boards from the kit fits the tube with only one cut needed, for the length.
I designed a holder to fit onto the spine, the PCB slides in and then, like the battery holder, one end is glued on. Update 15th June 2025: I have partially redesigned the control end so that the USB end of the control holder is glued on, not the spine end. This should be a bit more sturdy. I intend to change this again so the end is screwed on. I have not yet tried this new version
As mentioned before, the spine is attached to both control and battery holders using M3 setscrews and nuts. I placed the spine in and then marked where to drill. When I drilled the tube split lengthways (to the cut end) when I pushed the drill too hard, so be careful, although the screw is just to hold the mount in place so it won't really matter if one side splits.
Remote Control
The stick's pattern and brightness is controlled using a BLE "media remote", intended for controlling audio on a smartphone. It will work with any BLE remote, but you will probably have to remap the buttons to the correct keycodes. The code and holder model is specifically intended for this remote (also pictured below, in case the link is dead). I'll try and find the sketch I used to collect the button codes and upload to the repo. The button mapping is in notifyCallback
in main.cpp
.
In my design the remote lives on top of the staff, attached using neodyium magnets, but the magnet could easily be left out (or the 'pocket' removed in the design) and the remote used elsewhere. At some point I will design a wrist mount for the controller.
Wiring
I ran the battery wiring through a switch on the base (~20mm dia. rocker), then to the power pads of the LED strip, and then wired each strip in parallel around the spine AND then down through the spine to parallel the strips at the far end. I used some random mains cable I had laying around, so the colours are not 'traditional'! I used wire a little thicker than required, so the soldering isn't very pretty, but hopefully it minimised the voltage drop...
The data output pin is used to control all 4 strips in parallel, through a ~200ohm resistor. They could of course be driven from individual pins if you want to control each strip independently.
The ESP32 is powered (via. the buck-boost regulator) from a couple of pads of the LED strip, I took it from a little further down to avoid having all the wiring at the top.
The board has an INMP441 MEMS microphone on PCB headers. I had to make a little converter to raise it up and towards the centre. I'd recommend simply placing it in the centre on the first place!
Software
Please see this Github repo for the code I wrote to drive the staff. I wrote the first version from scratch by hand, and then for the revised (and current) version I used Copilot assistance to write some new patterns, and add the sound-reactive features.
It uses PlatformIO which can be a bit of a pain to get used to, but it's a lot more flexible than Arduino IDE.
3D Models
Please find the relevant models here on Printables. Some photos of the completed models are included.
TODO:
- Add photos of the build
- Add a wiring diagram