<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Photons, Electrons, and Dirt &#187; BeagleBone Black</title>
	<atom:link href="https://bikerglen.com/blog/category/beaglebone-black/feed/" rel="self" type="application/rss+xml" />
	<link>https://bikerglen.com/blog</link>
	<description>A blog by Glen Akins</description>
	<lastBuildDate>Thu, 20 Aug 2026 01:41:47 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Folding the Six Panel Wall into a Cube</title>
		<link>https://bikerglen.com/blog/folding-the-six-panel-wall-into-a-cube/</link>
		<comments>https://bikerglen.com/blog/folding-the-six-panel-wall-into-a-cube/#comments</comments>
		<pubDate>Sun, 25 May 2014 23:18:17 +0000</pubDate>
		<dc:creator><![CDATA[Glen]]></dc:creator>
				<category><![CDATA[BeagleBone Black]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[LED Matrix]]></category>
		<category><![CDATA[Lighting]]></category>
		<category><![CDATA[RGB LED]]></category>

		<guid isPermaLink="false">http://bikerglen.com/blog/?p=127</guid>
		<description><![CDATA[After seeing this cube and this cube, I decided it was time to build an LED cube of my own leveraging the BeagleBone Black and FPGA work I had already done for my six-panel mini video wall. The cube project &#8230; <a href="https://bikerglen.com/blog/folding-the-six-panel-wall-into-a-cube/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>After seeing <a href="https://www.flickr.com/photos/osr/12689589335/">this cube</a> and <a href="https://learn.adafruit.com/diy-led-video-cube/overview">this cube</a>, I decided it was time to build an LED cube of my own leveraging the BeagleBone Black and FPGA work I had already done for <a href="http://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/">my six-panel mini video wall</a>. The cube project is essentially purely mechanical since the existing BBB software and FPGA code will work unmodified to drive the cube.</p>
<div id="attachment_154" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/hangingcube.jpg"><img class="size-large wp-image-154" title="Hanging Cube" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/hangingcube-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">The finished cube hanging from the rafters in my basement.</p></div>
<p><span id="more-127"></span></p>
<h2>3D Printed Brackets</h2>
<p>The first step in this project was to decide how to hold the six RGB LED panels together in a cube shape. I experimented with cutting and drilling aluminum angle iron into brackets to hold each panel to its neighbors. That experiment worked but was not easy to replicate. I finally decided to draw a set of brackets using Sketchup and have the brackets 3D printed. The brackets would attach at the corners and midpoints of each panel. Since I do not own a 3D printer, I used <a href="http://sculpteo.com">sculpteo.com</a> to print the brackets out of white nylon.</p>
<div id="attachment_130" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/brackets.jpg"><img class="size-large wp-image-130" title="3D Printed Brackets" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/brackets-1024x683.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">3D printed brackets. The larger brackets hold the corners together. The small brackets hold the midpoints together.</p></div>
<p>I wanted to be able to hang the cube from the ceiling. Rather than hang the cube by its power cord or networking cable, I decided to hang the bracket using a piece of wire rope. I swaged two stops on to one end of the wire rope. The wire rope and stops are a bit rough and would eventually wear through the plastic nylon corner so I used <a href="shapeways.com">shapeways.com</a> to 3D print a pre-drilled hanging bracket for the top corner out of stainless steel.</p>
<div id="attachment_131" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/cube-hanging-bracket.jpg"><img class="size-large wp-image-131" title="cube-hanging-bracket" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/cube-hanging-bracket-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">Cube Hanging Bracket</p></div>
<p>Both the Sketchup and STL files for each of these different brackets are in my <a href="https://github.com/bikerglen/beagle/tree/master/projects/led-panel-6up/mechanical/3d_cube">github repository</a>.</p>
<h2>Panel Order</h2>
<p>The next step was to decide the order of the panels. I wanted to minimize the seams between images so I decided panels 1, 2, and 3 should connect at their sides then panels 4, 5, and 6 should connect at their sides. I also wanted the panel with the minimum number of wired connections to be the lid. Panel 1 only has one power connection and one data connection so it had to be the lid. Finally panels 1, 2, and 3 would slide sideways into panels 4, 5, and 6. This would make the corner where panels 1, 4, and 5 come together the top.</p>
<div id="attachment_129" style="width: 647px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/123456.png"><img class="size-full wp-image-129" title="Panel Ordering" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/123456.png" alt="" width="637" height="425" /></a><p class="wp-caption-text">Panel ordering. Panels 1, 2, 3 and 4, 5, 6 form two seamless units that are connected together.</p></div>
<h2>Construction</h2>
<p>The next step was to assemble the cube using the brackets and M3 x 6mm screws.</p>
<div id="attachment_191" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/brackets2.jpg"><img class="size-large wp-image-191" title="Brackets Connecting Panels" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/brackets2-1024x681.jpg" alt="" width="640" height="425" /></a><p class="wp-caption-text">Some of the brackets holding the RGB LED panels together.</p></div>
<p>The lid panel is secured using friction. I cut the heads off four longer M3 screws and threaded those into the four corners of the lid panel. Friction and gravity are enough to hold the lid panel on top of the cube.</p>
<div id="attachment_133" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/lid.jpg"><img class="size-large wp-image-133" title="M3 Post on Lid Panel" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/lid-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">One of four corners of panel 1, the lid panel, showing the M3 post used to hold the lid on to the cube.</p></div>
<p>Temporarily assemble the cube and mark the corners of the panel where the wire rope will exit the cube.</p>
<div id="attachment_135" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/corners1.jpg"><img class="size-large wp-image-135" title="corners1" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/corners1-1024x681.jpg" alt="" width="640" height="425" /></a><p class="wp-caption-text">Mark the corners with a white paint marker then file them down with a rotary tool.</p></div>
<p>Disassemble the marked panels and use a rotary tool or file to knock the corners of the panels down just enough for the wire rope to exit the cube. Labeling the panels with tape makes it easier to keep track of which panel is which as the cube is being assembled.</p>
<div id="attachment_147" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/corners2.jpg"><img class="size-large wp-image-147" title="Corners After Grinding" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/corners2-1024x681.jpg" alt="" width="640" height="425" /></a><p class="wp-caption-text">The corners of panels 1, 4, and 5 were they meet at the top of the cube. The corners were knocked down just enough with a rotary tool for the wire rope to exit the cube.</p></div>
<p>Complete the mechanical assembly of the cube using seven of the nylon corner brackets and eight of the nylon side brackets. The corner brackets will need to be rotated to accommodate the holes in the panels.</p>
<div id="attachment_148" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/inside.jpg"><img class=" wp-image-148 " title="Inside the Cube Before Wiring" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/inside-1024x768.jpg" alt="" width="640" height="480" /></a><p class="wp-caption-text">Inside the cube before wiring. Looks like I forgot a screw too.</p></div>
<h2> Electrical Connections</h2>
<p>Now wire the cube. Connect the output of panel 6 to the input of panel 5, the output of panel 5 to the input of panel 4, etc., until finally connecting the output of panel 2 to in the input of panel 1. You’ll need to make a slightly longer ribbon cable assembly to connect the output of panel 4 to the input of panel 3. Connect the output of the LogiBone FPGA board to the input of panel 6.</p>
<p>After making the data connections, use three of the wire harnesses that came with the LED panels to supply power to the cube. I used a wire nut to join all the ground connections together and another wire nut to join all the +5V connections together. These were connected using some hookup wire to a 2.1mm DC barrel jack that mates with the plug on my +5V DC power supply.</p>
<div id="attachment_150" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/connections.jpg"><img class="size-large wp-image-150" title="Wired Cube Interior" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/connections-1024x768.jpg" alt="" width="640" height="480" /></a><p class="wp-caption-text">Wired cube interior. The BBB and LB FPGA boards are inside a plastic bag until a proper mounting bracket can be fabricated.</p></div>
<p>Be sure to use electrical tape to insulate any exposed power conductors and secure any cables that could come loose inside the enclosure. I have the BeagleBone Black and LogiBone FPGA board inside a plastic bag to keep them from shorting to any exposed conductors on the LED panels. This is a temporary measure (beware of heat!) until I have time to design a bracket to mount the BBB and LB boards to the inside surface of one of the LED panels.</p>
<h2>The Finished Product</h2>
<p>Here’s a photo of the finished cube hanging in my basement.</p>
<div id="attachment_154" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/hangingcube.jpg"><img class="size-large wp-image-154" title="Hanging Cube" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/hangingcube-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">The finished cube hanging from the rafters in my basement.</p></div>
<h2>Using a Stand to Display the Cube</h2>
<p>I also built a small stand out of dowel rods and MDF plywood. I’ve yet to paint the stand. If you would rather use a stand than hang the cube, the magic angle for cutting the dowel rods is 55 degrees. The stand still needs to be painted flat black.</p>
<div id="attachment_160" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/05/deskstand.jpg"><img class="size-large wp-image-160" title="Cube Stand" src="http://bikerglen.com/wp/wp-content/uploads/2014/05/deskstand-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">The cube sitting in its stand on my desk. The dowel rods are cut at 55 degrees and hold the cube with the top corner pointing straight up. The stand still needs to be painted black.</p></div>
<h2>Some Ideas for Improvements</h2>
<p>The interior of the cube gets quite warm. Ideally the BBB and LB would be located in a plastic housing attached to the wire rope above and outside the cube. A short ribbon cable would then run from the plastic housing to the interior of the cube. Lastly, I need to install the wireless drivers and connect to the BBB over WiFi instead of using a wired Ethernet cable. This would greatly reduce the bulky wiring exiting the top of the cube.</p>
]]></content:encoded>
			<wfw:commentRss>https://bikerglen.com/blog/folding-the-six-panel-wall-into-a-cube/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Expanding the BeagleBone Black and FPGA to Drive 6 (or more) Panels</title>
		<link>https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/</link>
		<comments>https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/#comments</comments>
		<pubDate>Sat, 05 Apr 2014 06:07:09 +0000</pubDate>
		<dc:creator><![CDATA[Glen]]></dc:creator>
				<category><![CDATA[BeagleBone Black]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[LED Matrix]]></category>
		<category><![CDATA[Lighting]]></category>
		<category><![CDATA[RGB LED]]></category>

		<guid isPermaLink="false">http://bikerglen.com/blog/?p=73</guid>
		<description><![CDATA[After completing my first BeagleBone Black + FPGA project and tutorial where I drove a single 32&#215;32 RGB LED matrix, I decided it was time to go bigger. The result is the project shown below—a 3 x 2 matrix of &#8230; <a href="https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>After completing my first BeagleBone Black + FPGA <a href="http://bikerglen.com/blog/?p=42">project</a> and <a href="http://bikerglen.com/projects/lighting/led-panel-1up/">tutorial</a> where I drove a single 32&#215;32 RGB LED matrix, I decided it was time to go bigger. The result is the project shown below—a 3 x 2 matrix of 32&#215;32 RGB LED panels. That’s 6,144 RGB LEDs or 18,432 LED chips—each of which can be controlled with 12-bit color at a refresh rate of 200Hz. Let’s take a closer look at the steps required to move from driving one panel to driving six panels.</p>
<p>Here is a video on YouTube of the <a href="http://www.youtube.com/watch?v=LBeVMGOgWvY">six panel project in action</a>.</p>
<div id="attachment_84" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1838_2128.jpg"><img class="size-large wp-image-84" title="Perlin Noise" src="http://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1838_2128-1024x681.jpg" alt="" width="640" height="425" /></a><p class="wp-caption-text">576mm x 384mm RGB LED “wall” displaying a frame of Perlin noise. The BeagleBone Black can perform the roughly 600,000 3D Perlin noise calculations required to produce a smooth animation sequence at about 50% CPU utilization.</p></div>
<div id="attachment_88" style="width: 650px" class="wp-caption alignleft"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/04/video-wall-rear.jpg"><img class="size-large wp-image-88" title="rear of rgb led wall" src="http://bikerglen.com/wp/wp-content/uploads/2014/04/video-wall-rear-1024x682.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">576mm x 384mm RGB LED “wall” construction showing six 192mm x 192mm 32&#215;32 RGB LED panels, the 3mm thick aluminum frame, two pieces of 20x40mm aluminum extrusion, wall mounting brackets, electronics, and power supply.</p></div>
<p><span id="more-73"></span></p>
<h2>The Frame</h2>
<p>The first step was to build a frame to mount the panels. I used a set of calipers to locate each mounting hole and determine the clearance required for each of the connectors on the LED panels. I drew the frame using the free front panel design software from frontpanelexpress.com. I added holes to mount the BeagleBone Black and a 60W +3.3V power supply. Once I had the basic layout completed, I decided to use 20mm x 40mm aluminum extrusions to give the panel some depth to hold the electronics behind the frame and panels. I finally had the frame and two wall mounting brackets fabricated at frontpanelexpress.com.</p>
<h2>The Verilog</h2>
<p>The Verilog needed some changes to drive the increased number of panels:</p>
<ul>
<li>The number of clock cycles used to shift each set of RGB data bits into the panels was reduced from 3 to 2.</li>
<li>The frame buffer memories were increased from 2 x 1024 x 12 bits to 2 x 8192 x 12 bits.</li>
<li>To maintain my 12-bit color depth and 200Hz refresh rate, the clock used to drive the panel refresh logic was bumped to 25MHz from 10MHz.</li>
<li>I added support for global dimming so that the overall brightness of the panel could be controlled without affecting the color depth of the panel.</li>
</ul>
<p>These changes were relatively quick and easy to make. A few simulations and a run through the Xilinx ISE tools yielded a new bit file ready to drive up to six panels.</p>
<p>The Xilinx Spartan 6 LX9 has enough block RAM to drive up to 16 panels. By bumping the clock to 30MHz from 25MHz, 8 panels could be driven. If the refresh rate were dropped to 100Hz, 16 panels could be driven. If more I/Os were available on the LogiBone FPGA board, 16 panels could be driven at 200Hz. All with 12-bit color.</p>
<h2>The Software</h2>
<p>Most of the software used to display patterns only required changing the display width and height defines and the write levels function to port to the larger display. The exception was the Perlin noise routine. In a floating point implementation with all compiler optimization disabled, the Perlin noise routine could only drive about 1.5 panels. I converted the Perlin noise routine to use fixed point arithmetic and turned on -O3 compiler optimizations. With these changes, the BeagleBone Black can perform the approximately 600,000 3D Perlin noise operations required to update the 6144 pixels fifty times a second at about 50% CPU utilization.</p>
<h2>The Results</h2>
<p>Below are some photos and <a href="http://youtu.be/LBeVMGOgWvY">here is a video of the six panel project in action</a>.</p>

<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1838_2128/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1838_2128-150x150.jpg" class="attachment-thumbnail" alt="576mm x 384mm RGB LED “wall” displaying a frame of Perlin noise." /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/video-wall-rear/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/video-wall-rear-150x150.jpg" class="attachment-thumbnail" alt="576mm x 384mm RGB LED “wall” construction." /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/bbb_mounting/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/bbb_mounting-150x150.jpg" class="attachment-thumbnail" alt="BeagleBone Black CPU board, LogiBone FPGA board, and PMOD-to-panel adapter board." /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/wall_mounting_detail/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/wall_mounting_detail-150x150.jpg" class="attachment-thumbnail" alt="Wall Mounting Detail" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/extrusion_detail/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/extrusion_detail-150x150.jpg" class="attachment-thumbnail" alt="Extrusion Detail" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1820/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1820-150x150.jpg" class="attachment-thumbnail" alt="Sneak Preview" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/img_20140404_213943_802/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/IMG_20140404_213943_802-150x150.jpg" class="attachment-thumbnail" alt="Obligatory Generic Falling Blocks Video Game" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1848/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1848-150x150.jpg" class="attachment-thumbnail" alt="Bloodshot Eyeball Animated GIF" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1875/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1875-150x150.jpg" class="attachment-thumbnail" alt="Audio Spectrum Analyzer" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1883/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1883-150x150.jpg" class="attachment-thumbnail" alt="Test Pattern" /></a>
<a href='https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/dsc_1845/'><img width="150" height="150" src="https://bikerglen.com/wp/wp-content/uploads/2014/04/DSC_1845-150x150.jpg" class="attachment-thumbnail" alt="Nyan Cat" /></a>

<h2>Resources</h2>
<p>Source code for the FPGA, the software, and the frame design are available in my <a href="https://github.com/bikerglen/beagle/tree/master/projects/led-panel-6up">github repository</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://bikerglen.com/blog/expanding-the-beaglebone-black-and-fpga-to-drive-6-or-more-panels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Driving a 32&#215;32 RGB LED Matrix with a BeagleBone Black and an FPGA</title>
		<link>https://bikerglen.com/blog/driving-a-32x32-rgb-led-matrix-with-a-beaglebone-black-and-an-fpga/</link>
		<comments>https://bikerglen.com/blog/driving-a-32x32-rgb-led-matrix-with-a-beaglebone-black-and-an-fpga/#comments</comments>
		<pubDate>Fri, 04 Apr 2014 20:33:19 +0000</pubDate>
		<dc:creator><![CDATA[Glen]]></dc:creator>
				<category><![CDATA[BeagleBone Black]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[LED Matrix]]></category>
		<category><![CDATA[Lighting]]></category>
		<category><![CDATA[RGB LED]]></category>

		<guid isPermaLink="false">http://bikerglen.com/blog/?p=42</guid>
		<description><![CDATA[My latest project uses a BeagleBone Black and a Xilinx Spartan 6 LX9 FPGA to drive a 32&#215;32 RGB LED matrix. This project lets me display cool and interesting patterns on a matrix of 32&#215;32 RGB LEDs. That’s 1024 RGB &#8230; <a href="https://bikerglen.com/blog/driving-a-32x32-rgb-led-matrix-with-a-beaglebone-black-and-an-fpga/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>My latest project uses a BeagleBone Black and a Xilinx Spartan 6 LX9 FPGA to drive a 32&#215;32 RGB LED matrix.</p>
<div id="attachment_49" style="width: 650px" class="wp-caption alignnone"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/04/IMG_1478_blog.jpg"><img class="size-large wp-image-49" title="BeagleBone Black + LogiBone FPGA board driving a SparkFun 32x32 RGB LED panel." src="http://bikerglen.com/wp/wp-content/uploads/2014/04/IMG_1478_blog-1024x683.jpg" alt="" width="640" height="426" /></a><p class="wp-caption-text">BeagleBone Black + LogiBone FPGA board driving a SparkFun 32x32 RGB LED panel.The displayed pattern is a frame from a Perlin noise pseudorandom sequence.</p></div>
<p>This project lets me display cool and interesting patterns on a matrix of 32&#215;32 RGB LEDs. That’s 1024 RGB LEDs or 3072 individual LED chips that need to be controlled! Rather than attempt to control all the LEDs in software only or using one of the BBB’s programmable real-time units (PRU), I decided to use the CPU to generate the patterns and use the FPGA to handle the heavy duty task of refreshing the LEDs.</p>
<p><span id="more-42"></span>Using the FPGA to refresh the LEDs leaves me with nearly 100% of the BBB CPU available to generate patterns and lets me implement 12-bit color at a refresh rate of 200Hz. A 200Hz refresh rate has no perceptible flicker and prevents scan lines from showing when photographing or filming the panel. A typical 12-bit color software implementation using the PRU to refresh the panels only refreshes at 50 to 60Hz.</p>
<p>Having the CPU free to compute patterns rather than refresh the display lets me generate some rather complicated patterns that otherwise might not be possible. Right now the most complicated and interesting pattern is seamlessly looping Perlin noise but other various abstract patterns, animated GIFs, text, etc., can be displayed.</p>
<p>Seamlessly looping Perlin noise running at 50Hz on 1024 pixels requires 102,400 3D Perlin noise calculations per second. Using floating point math with no compiler optimization, this quickly burns through the BBB CPU cycles. Had I attempted to refresh the panel using a small embedded processor such as an Arduino, I wouldn’t have had the CPU bandwidth available to both calculate this complicated pattern and refresh the display.</p>
<div id="attachment_68" style="width: 650px" class="wp-caption alignnone"><a href="http://bikerglen.com/wp/wp-content/uploads/2014/04/rgb-led-panel-with-power.png"><img class="size-large wp-image-68" title="rgb led panel wiring" src="http://bikerglen.com/wp/wp-content/uploads/2014/04/rgb-led-panel-with-power-1024x576.png" alt="" width="640" height="360" /></a><p class="wp-caption-text">The wiring that is required to interface the BBB and LogiBone FPGA board to the 32x32 RGB LED panel.</p></div>
<p>To build this project, I used a stock BeagleBone Black SOC board, a ValentFX LogiBone FPGA board with a Xilinx Spartan 6 LX9 FPGA, a 32&#215;32 RGB LED panel from SparkFun, and some jumper wires from Pololu Robotics. The LogiBone FPGA board was a beta unit acquired through their Kickstarter campaign. To build and simulate the FPGA, I used the free Xilinx WebPack tools. Being free, the Xilinx WebPack tools permit hobbyists (or anyone building small designs) to simulate, synthesize, map, and place and route code for a select set of Xilinx’s devices.</p>
<p>Speaking of simulation, do it! The very first bit file I loaded into the FPGA board worked the very first time I loaded it except that I had a mirror image on the display from feeding the RGB data into the display right-to-left instead of left-to-right. I reversed the order, ran another sim, and built another part. Bingo. Second try. Perfection.</p>
<p>After building everything and getting everything to work, I made a short video demonstration of the project, wrote a complete tutorial on how anyone with a BeagleBone Black, a LogiBone FPGA board, and an LED panel can replicate results, then uploaded all the required code and files to github. Below are links to the code, tutorial, and video.</p>
<p>Links to Project Files:</p>
<p><a title="Source Code" href="https://github.com/bikerglen/beagle/tree/master/projects/led-panel-v01">Source Code</a></p>
<p><a title="Step-by-Step Tutorial" href="http://bikerglen.com/projects/lighting/led-panel-1up/">Step-by-Step Tutorial</a></p>
<p><a title="Demonstration Video" href="http://youtu.be/OIyI8KaPdwk">Demonstration Video</a></p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>https://bikerglen.com/blog/driving-a-32x32-rgb-led-matrix-with-a-beaglebone-black-and-an-fpga/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
