Constructing a Sea of Segments
Background
Some concepts by no means appear to go away, this one began in 2013. Sitting in cafe, my thoughts wandered from the theoretical stuff I used to be studying throughout an MSc, and I had the thought to create a big show from seven-segment shows.
Electronics was a passion, however I had no concept the place to start, and after a little bit of analysis I noticed that Skot Coshere had just about finished precisely what I used to be considering. Kudos to him, he did a terrific job.
A few years later, I made a small (12 x 3 digit) attempt at a show. It was a breadboard prototype and the fact was that I simply wasn’t able to making one thing greater.
Quick ahead about 5 years (Jan 2020) and for some motive, I discovered myself some low-cost LED drivers on eBay, the drivers that Skot had utilized in his venture. They appeared excellent for the job and I went forward and purchased a load.
After a beer with a friend after which a chat with a curator, my concept was accepted for an exhibition which was 6 weeks away, I had the deadline I wanted and an excuse to not simply work on consumer tasks! (The exhibition by no means occurred due to Covid-19)
By this time, I had a couple of tasks beneath my belt and I had realized a couple of issues about electronics. I had used the PRU on the BeagleBone Black to manage lots of solenoids, and later numerous LED panels. I really like the best way the BeagleBone has the consolation of Linux but in addition the programmability of the PRU and thus interfacing with the true world. With the introduction of the PocketBeagle, it felt like a no brainer to make use of it for this venture.
The PCB
The show is constructed from 8 x 6 = 48 PCBs, every of which controls 8 x 4 = 32 digits by way of two TLC5920 LED drivers.
The PCB can tile in two instructions, both taking knowledge from the highest or the fitting facet and outputting to the underside and left facet. As much as eight channels could be fed in from the highest, the primary channel will get routed although the LED drivers after which comes out of the left facet. All different channels are shifted by one and routed out of the underside.
This allowed me to start out with numerous parallel streams of synchronous serial knowledge at one PCB (in a nook) and the connections between the boards would channel the info to the fitting place.
The ability to the show comes from a metal lattice that additionally gives structural help for the PCBs. A 48V provide is related to 2 lengths of metal wire that connect to the vertical bars, these then present energy to all of the PCBs by way of the horizontal bars. A skinny insulator is between a few of the vertical and horizontal bars to forestall shorts.
Pads on the PCB, by way of standoffs, join the lattice to the PCB the place a buck converter provides the 5V that the drivers require.
PocketBeagle
The beaglebone runs a program written in C that listens for frames over UDP. No processing is finished on the beaglebone, all of the pixel manipulation to get the info in the fitting order is finished within the video processing stage. The PRU code is written in meeting and bit bangs the info to the drivers.
I obtain numerous grayscale ranges by utilizing binary code modulation. I wished to get 8 bits of color depth on the segments, however given the association of the PCBs and the truth that the LEDs are already multiplexed (solely an eighth of the LEDs are on at anybody time), I couldn’t get this a lot depth with out getting a really noticeable flicker. In the long run I needed to accept 5 bits, so 32 ranges, however after all in actuality it was much less due to the non linearity of our notion of LEDs.
Software program
I wrote a C++ program (utilizing the good Cinder framework) to learn movies and pictures and work out how the segments needs to be lit. Throughout the program, you may load media, transfer it round and management playback. There are additionally choices for gamma correction, bit depth and find out how to convert color to grayscale.
As an alternative having a LUT for every pixel’s phase, I used the GPU to work out which pixels within the supply footage are over a phase, by writing a fraction shader to color the brightness of the pixel (pink channel) and index of a phase (inexperienced & blue channels). So the fragment shader outputs one thing like:
I then learn this again from the GPU reminiscence and accumulate all of the brightness ranges for every phase. There are additionally a couple of different GLSL shaders that do issues like brightness & distinction and rising the world of a phase to take account of extra pixels.
You’ll be able to stream frames to the show in addition to save them.
Lastly, there are a bunch of Python scripts that do issues like: drawing textual content, color correction for segments, playback of a set of saved frames and extra.
Meeting
The LED shows are encased in an “smoked” acrylic field and the again plate is constructed from laser reduce metal.
Consequence
Extra pictures could be discovered on the project web page.