Building the Geekiest Home Theater: TV wall mounting

My room TV is working great.  I’ve got the minnowboard max hooked up to some ws2801 LEDs and acting as a DLNA renderer.  Since my last post on it, I’ve also paired up my PS3 six-axis controller and have been using it as a mouse.  I have other cool ideas planned for it, but before those are finished, I wanted to get a Max-based system on my other TV and work it into a home theater setup.

First thing I have to do is get my TV off the floor.  The base for the TV broke, so when we moved we decided to mount it on the wall.  We found an “articulating” wall mount that looked like it would meet our needs:

What I like about this system, is that it has an open area on the base mount on the right and left that’s perfect for a double gang box.  So I grabbed one of these

It fit very nicely in the open area:

2015-04-18(2)

2015-04-18

I think it looks really clean -especially after I zip-tie up those cables!

I also wanted to add some ambilights to this setup like I did my room TV.  However, I want to do something better.  Enter, APA102.

The APA102 is similar to the older WS2801 in that it’s an individually addressable LED strip that supports 24 bit color.  But that’s about where the similarities end.  The WS2801, shown on the image below on the right, is a larger chip that takes up valuable space.  You can only typically find strips of 32 LEDs/meter of the WS2801 flavor.  The APA102 (shown on the left), however, have the IC built right into the LED.  This allows up to 144 LEDs/meter.

2015-04-16

The protocol is very similar to the WS2801.  You send an array of bytes, but in 32bit segments.  The first 32bit segment must be all 0’s.  The next byte is for brightness, usually all 1’s, and finally the 3 bytes is the data.  I updated my python light library to support the APA102 in only a few minutes.  Here’s basically the meat of the code:
data = bytearray()

#startframe
data += chr(0x00) + chr(0x00) + chr(0x00) +
     chr(0x00)

for rgb in ledsData:
data += chr(0xff)
# apa102 is GBR because THINGS
data += chr(rgb[1]) + chr(rgb[2]) + chr(rgb[0])

#endframe
data += chr(0xff) + chr(0xff) + chr(0xff) + chr(0xff)

self.spiDev.write(data)
The fun thing was discovering that it uses GBR color format.

Mounting the LEDs

Instead of mounting the LEDs on the back of the TV, I’ll be attaching them to the wall.  I’m using the same aluminum brackets I used with my last LEDs.  However, this time I’m going for a flat black strip 60LEDs/meter.  4 total meters of it for a grand total of 240 LEDs.  To power them all, I need 80Watts @5V.  This turned out to be a problem.  I was only able to find a 5V power brick that was 50W.  Not good enough.  After some more searching, I was able to find this on amazon:

This can supply up to 100W @5V which should be more than enough.  The problem is… where am I going to put this?  It’s too large to fit in a double or triple gang.  And if I run a cable through the wall for this, I’m guaranteed to lose a bit of voltage (4-8% depending on which wire I use).  I also need a place to put the Max.  After a trip to the Home Depot, i found what I need.  It’s an “telecommunications” box 14″ by 14″.  It fits and mounts between two studs.  Turns out this was almost perfect.  I cut a hole in the laundry room, right behind the TV, to the size of the box.  One thing I didn’t plan well, was that the double-gang box for the TV prevented both being in the same spot.  To fix this, I just cut a large hole in the box to let the gang box come through.  This ends up being advantageous because it’s so easy to wire and rewire from the box instead of removing the outlet.

IMG_20150418_170128295

I have plenty of room to mount a max in the middle.  There’s also a nice looking cover that screws shut to protect the insides from little hands:

2015-04-18(3)

That’s it for this part.  Next part I’ll continue the adventure building a home theater including mounting the LEDs, the Max and speaker system.