Introduction: Fiber Optic Matrix Display
Behold! This is a 35x7 RGB matrix display powered by a Raspberry Pi Pico and a bunch of WS2812B LEDs (Neopixels). I've never see anything quite like it on the internet before, hopefully I'm the first!
The display is a bit absurd, as it takes a much larger grid of LEDs (64 square inches) and condenses them down to a much smaller size (1.5 square inches).
In this instructable I will discuss how I constructed this and provide you with everything you need to make one of your own, but I encourage you to take this concept and come up with your own design.
They key ingredients that make this work are:
- 16x16 WS2812B matrix. Adafruit sells this one: https://www.adafruit.com/product/2547, and there are many other cheaper ones from the usual places online, like so: https://www.amazon.com/WESIRI-WS2812B-Flexible-Individually-Addressable/dp/B07PB2P81N
- Raspberry Pi Pico. https://www.digikey.com/en/products/detail/raspberry-pi/SC0915/13624793. Just about any other common microcontroller can do this as well, but you'll be on your own to program it unless it can also use circuitpython.
- PMMA fiber. There are two common types - "side glow" is meant to emit lite throughout the length of the fiber, but for this application we want "end glow" which minimizes the losses out the sides and sends most of the light down the length of it. I used 1.5mm, but there are many other sizes. https://www.amazon.com/dp/B07W6ZRJB6
The rest of the materials are up to you - choose whatever is best in your case for availability/cost/ease of manufacture. Many of the parts could be 3d printed, cut on a CNC mill or router, laser cut, or even made the old fashioned way with hand tools.
The one critical part that might dictate what material you use is the main display face where the fibers are condensed together; in this part there are a large number of small holes that are very close together:
- If you're drilling, the material should be sturdy enough not to deform adjacent holes
- FDM printing may give undersized or non-round holes
- Laser cutting may be a good fit, but be aware of the taper for your focal length
- Resin printing is a good bet, but you still need to dial in the final hole size - drilling the resin after will probably shatter or break into adjacent holes
Step 1: Design Files
This design is made up of mostly flat parts in a big sandwich. Because of this, there are no strict thickness requirements, in fact in the whole design the only critical dimension is the spacing of the LEDs in the array because we can't change them. Everything else is up to you and should be apparent when we look at what each part does.
3D models: A STEP file is attached. Instructables doesn't support ZIP or IGES files, so the original solidworks model and can be found here: https://github.com/elliotmade/Fiber-Optic-Matrix-Display/tree/main/3D%20Model
DXF flat files: There is a file for each of the flat parts -
- Back plate - this is just for structure, it makes room for some electronics to be tucked in, but it could be omitted. M3 tapped holes in this part.
- Middle plate - this supports the back of the LED matrix
- Gasket - this keeps the light from one LED separate from it's neighbors
- Front plate - this holds each fiber up to each LED
- Main display grid - this is the smaller grid that brings all of the fibers together and forms the face of the display
- Two posts that hold the display grid to the front plate. They are drilled and tapped for an M3 screw at both ends
- Eight spacers that go between the back and middle plates
- M3 screws. There are 8 holding the sandwich together, and four holding the posts on. Choose lengths or diameters that suit you. Use a nut on the back plate instead of the tapped holes if you prefer.
Step 2: Make the Flat Parts
I made each of these parts out of a different material, just for fun.
- Front plate: This is a black plastic, maybe polyethylene, that I found in my pile. The important factors on this are:
- A) the holes should be a tight fit for the PMMA fiber, in this case I used a 1.5mm drill for 1.5mm fiber and the fit was good. They should also be square to the face.
- B) the hole spacing should be fairly accurate to match the LED array, so that the light couples to the fiber
- C) the thickness should be enough to keep the fiber aligned - if it is too thin it might go through at an angle
- Gasket: This is made of EVA foam, laser cut. I chose foam because the LED matrix has some surface mount capacitors on it, and the foam will squish down and make a nice light-tight seal even on the bumpy surface. The holes don't necessarily need to be square, you could make this with a hammer and punch if you wanted.
- Middle plate: This is laser cut acrylic. Any material is fine, but non-conductive is a good idea due to the electrical connections on the back of the LED array in case of accidental contact.
- Back plate: This is a rusty mild steel 1/8 plate. This part isn't strictly required, any material should do the trick. The small holes are tapped M3, but could easily be thru holes to use with a nut instead.
Step 3: Make the Fun Parts
The front plate is the most difficult part to make. I tried to get the fibers as close as I thought I could get away with, and in order for that to work I needed a bunch of holes that were drilled very straight and at a very consistent spacing. CNC was a great way to achieve this, but a manual mill or drill press with an X/Y table could also work. Alternatively, choose a material that can be laser cut or have a try at 3d printing. The fibers are held in mainly by friction, so a close fit is important. I used a carbide PCB drill, and broke some along the way. This probably wasn't the best choice, but I was able to rescue the part.
The two posts are some steel round rod, but you could make them from wood, plastic, bamboo, or whatever makes you happy.
The small spacers are aluminum, just sections cut off of a rod for IKEA blinds (I think). No special requirements, just try to have them all the same length.
Step 4: Slap It Together
If you've followed along this far, hopefully this part is pretty straightforward. You'll notice that the posts holding the grid to the front plate actually take up two of the LED positions from the array - I chose to do this and figured I would just account for those two blank spots in the code, which worked out OK. This also means that you don't have to pay any particular care to which hole on the grid you wire up to which hole on the front plate. In the code there is a mapping table that you can plug some numbers in to that keeps it all aligned.
Threading the PMMA fibers into all the holes was hard on the fingers. I found that the roll of PMMA I had was pretty inconsistent in diameter, about 1/5 of it was unusable and wouldn't fit through the holes. I cut the fiber with regular flush cutters, threaded both ends into hole, then moved on to the next. Try to work in a pattern that gives you the most access to the next set of holes. Also try to avoid scratching or kinking the fibers, this will make a defect that lets light escape into a neighboring fiber.
Don't worry about extra length sticking out from either end - trim this off flush on the display end, and it doesn't have to be perfectly flush on the front plate/LED side. Do wear safety glasses, the plastic breaks in a way that shoots little bullets all over, directly at your eyes. Finally use a flame and run over the ends of all the fibers, this will round over the cut edge and polish it somewhat. It will also form a small ball on the end which helps it stay put, but if your holes are close then friction should be enough.
Step 5: Wiring
For this project the wiring is very simple. On the Raspberry Pi Pico:
- Connect GND to the GND wire of the LED array
- Connect 5V to the 5V wire of the LED array
- Connect GP15 to the DIN wire of the LED array.
This thing can be powered directly from the onboard USB of the Pico, but if you want to run high brightness or a lot of full white you may max out a USB charger or port. It all will still work, but you will see some color changes of the pixels when you hit the current limit. In that case, you can power it externally with the additional wires on the array, just hook them up to a higher amperage 5v supply.
In the photos you'll see that I used a breakout board with a couple buttons and a clock module on it - this isn't required, I'm using it because I had made some from a previous project.
Step 6: Code
I used Circuitpython for this project - it is a very easy way to get started working with microcontrollers, programming it is as easy as editing a text file and saving it to the device (because it acts as a USB storage device, the files are right there on it). Follow the steps to get started here: https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython
- Download the Adafruit Circuitpython bundle: https://circuitpython.org/libraries
- Install Circuitpython to the Pico
- Download the attached "code.py" file here, or get the latest version from github here: https://github.com/elliotmade/Fiber-Optic-Matrix-Display
- Put a copy of "code.py" in the root of the pico device
- Create a folder called "lib" on the Pico, and save a copy of "neopixel.mpy" from the bundle here
With Circuipython, the code files can be edited directly on the device with a text editor. Saving the file or modifying any file on the device will cause it to reboot and it will immediately start running the new code. That's all there is to it!
In my code there are a handful of examples, and a demo that does everything shown in the videos here. It's a bit messy, so it's going to be up to you to customize and get it to do what you want.
I mentioned earlier that it didn't matter how you wired up the LEDs to the display - this is the part where you account for that. One of the images above is a mapping table. The index for this list starts at 0, and this is the position of a particular LED in the LED array. The numbers you see are the position of the fiber in your grid. Example: if you connected the first LED in the array to the third position in your grid, you would put a "2" (start counting at 0 instead of 1) in the first position (index 0) of the list. To facilitate this, you can adjust the code so that you can light up the grid one LED at a time to validate as you make updates.
Step 7: Enjoy
If you've made it this far, you should have a visually unique and appealing thing.
There may be some slight variations in color from pixel to pixel, this is due to how the light from the LED couples to the fiber - in this case the LED is actually made of 3 separate LEDs, and the diameter of the fiber is actually smaller than the LED, so depending on the alignment you may get more red, green, or blue. This could be improved by increasing the distance from the fiber end to the LED, using a bigger fiber, or smaller LEDs. Or just leave it alone, because it still looks cool!
It is also bright, too bright! For one, it makes it very difficult to photograph, and secondly the intensity is very high if your viewing the fibers straight on. If you don't like that, consider adding a diffuser to the front of the grid - something translucent and white will cut down on the brightness and still give great color. For my photos and videos I have the brightness set to 10% of the maximum
While there should be enough in this instructable to reproduce what I've done, my hope was to convey the concept more than the exact instructions. What else can you do with this? Something wearable? A very small, high intensity display? A non-magnetic display to communicate with patients in an MRI machine, where the electronics are far away from the display?
First Prize in the
Make it Glow Contest