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.
Supplies
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
Other stuff:
- 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
- Done
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
35 Comments
Question 10 months ago on Introduction
Awesome. But.. can someone make me one and I purchase it? WOild love for my office..just dont have time to build right now..
Tip 11 months ago
Am glade to see project like that :)
11 months ago
Original idea, well executed, properly documented: Superb project.
By using a more appropriate adjective this simply is a Brilliant project!
11 months ago on Step 7
As a note for the high amperes power supply I am using a 7 amp 5v supply for my ws2811 string and that is not excessive for that purpose!
11 months ago
So cool!
Tip 11 months ago
I make telescope parts out of aluminum and have found aluminum is very "grabby". I'd recommend using an aluminum cutting fluid when drilling the holes. It might save on bits.
11 months ago
Great concept, I love it!
11 months ago
Epic beauty of a project!!
1 year ago on Step 7
What a freaking awesome project. It look something from the future or that could be featured in a sci-fi movie or steampunk like style. At first glance, it reminded me of the Borg, from Star Trek.
Really love it.
I thing I'll have a try at it. The front plate will be a challenge, but I'll have to try 3D printing it.
Cheers and great project.
Reply 1 year ago
I 3d printed all of it and it has worked out great
Question 1 year ago
I have built one and it looks so cool already, I will post pictures later, but: The top left LED (on the front 7x35 matrix index 0, most top left) never seems to light up. I noticed it is in the animated picture on the top of the page as well with your build... Never lights up… Why is that? I try to find it in the code but it is too hard for me I think. Is there something off by one somewhere? I would love to find it and make it light up :)
Answer 1 year ago
Hey good catch, I did not even see that! You're right, it was an off-by-one thing. I will update the code on github, or you can make the change in the screenshot I attached. Move line 862 down about 6 lines to below the if statements in the tick function and it should do the trick!
Reply 1 year ago
Wow thank you so much. I might never have found it :) I will upload a video and picture of my make now as well :)
Reply 1 year ago
I just updated the code on github once again - I added support for the real time clock and three buttons so it can tell time for real now. You can see the pins I used in the code, or later I will update the instructions here. Cheers!
Reply 1 year ago
time to pull the changes then :) i will show mine at the end of the month at a local openLab in the microcontroller theme section. it is an open lab for people from 12-18 to learn about electronics, hacking, diy, code, etc. // shall i rather link to this instructable or to your homepage? there will be a presentation display with a qr code probably to look it up.
Reply 1 year ago
Awesome! You can link here, there's more content on instructables than there is on my homepage at the moment.
1 year ago
Where do I find the neopixel library at?
Update: it is not included in the bundle. I had to get it separately here: https://github.com/adafruit/Adafruit_CircuitPython_NeoPixel
Reply 1 year ago
It should be in the bundle here: https://learn.adafruit.com/circuitpython-essential...
Or I think individually it is here, the file you're looking for is called neopixel.mpy: https://github.com/adafruit/Adafruit_CircuitPython...
1 year ago
OMG, 21st century string art! I love it! Someone, please make one that's a sailboat, and the hull is the "screen". I've got too much going on right now or I would totally do it!
Tip 1 year ago
Hey everyone who is building this or already has built one... if you are considering how to power it: it can be run for hours from a USB powerbank. Just for fun I plugged the matrix display into a portable USB powerbank this morning and forgot about it while going to town on some chores. 2 hours later I walked by the display and it was still happily displaying away. And it just used up about 25% of the charge of the 20.000mAh Powerbank (that is very old, probably it has way less usable capacity in reality). That's amazing news if you want to hang it somewhere and don't want any cable around. I even reconsider printing bigger spacers and accomodate a battery right into the device. Could incorporate a button to display something for maybe 2 minutes when pressed and then switch off again...
tl;dr:
The low brightness setting can be sustained quite long by a power bank. Try it.