UPDATE: Arduino and iPhone code is posted!
We have been wanting to re-design our family room for quite a while. Playing music or watching a movie is incredibly cumbersome, because we have 6 remote controls, and so many systems that at least one component is usually not working. We wanted a way to simplify these aspects, while at the same time creating a nice piece of furniture that didn't dominate the room like our current set up.
For starters, all the woodworking is custom and done by hand, and that alone took about 6 months to complete, working on and off over breaks and during the summer. In addition, there is a lot happening "under the hood".
We have an Arduino mounted inside one of the cabinets, which controls several infrared LEDs pointed at the sensors in our DVD player, cable box, amp, TV screen, Apple TV, and video switcher. The Arduino is connected to our home-wifi network so we can control it from our iPhones on an app that my dad wrote. This app is basically a simplified, condensed version of the 6 remotes we normally need to watch TV or a movie, or listen to music. For instance, with the simple push off a "Watch DVD" button, the iPhone-app connects to our wifi-network and tells the Arduino to flash the correct IR sequence to turn everything on, switch the TV and amp inputs to 'DVD player', and opens the disk drive on the DVD player. The app then switches to a DVD-specific control panel with controls for playing and pausing the DVD player, and volume controls for the amp.
We also listen to music throughout the house a lot, and we use the same sound system that we use for movies. So, wherever we are in the house, we can turn the amp on by choosing "Listen to iTunes" from the app main-menu, and the app will switch to the pre-existing app called "Remote" which allows us to play music from our desktop computer through the speakers in our family room via an airport express.
All of this functionality is nicely condensed into one easy-to-use app on your phone!
The hope is that this entertainment center will make it much more convenient to control entertainment in our house, while at the same time acting as a nice piece of furniture and giving us some cool mood lighting! (there are RGB LED strips mounted underneath to provide some ground effects)
My dad and I have been playing around with this idea for a while, but we really began designing in fall 2012. By November 2012, we had picked a final design, and when I came home from college for winter break in late December we immediately went to our favorite hardwood supplier and picked out all of our wood. Over the following month we finished the frame assembly and glued up the table top. I had to go back to school in late January 2013, and from then until March neither of us worked on it much. Over spring break we worked for another week, got all the cabinet pieces cut, and the floor panels made. Over summer 2013 we finished the electronics, and then during the fall my dad finished up the software for the iPhone app. Overall, this took about a year to complete.
Step 1: Design
So, the basic skeleton frame will be assembled in this fashion, with mortise and tenon joints. Plywood panels will fill in the skeleton so it actually looks like a solid piece of furniture, and this will be done by recessing the plywood into grooves cut into the adjacent frame pieces. This will all be explained more later too. We chose to use cherry because we wanted it to match the kitchen table.
We built this to replace a much larger entertainment center, partly because the current one is way to big and obstructive. So, we decided to make this one pretty low and narrow so it doesn't take up too much space. We tweaked the dimensions in SketchUp until we were happy. As you can see, we went through several different designs before we found one we were happy with (we played around with adding some glass shelves supported by chrome tubes, but decided not to do that, partly because the table top turned out so nice that we didn't want to put anything on top of it!)
Step 2: Buying Materials
Whenever we need a lot of hardwood, we always love going to McBeath's Hardwood in Berkley CA. They have a fantastic selection of basically everything, from domestic stuff like maple and cherry to really exotic African rosewood like bubinga. It is a lot of fun picking through the rough cut lumber to find that perfect piece of wood.
This place also has a great selection of veneers. We looked through all of them to find the right type of wood for the cabinet door panels, and eventually found the perfect stuff. It is called bird's eye maple, which is a type of maple that has a rare genetic defect that causes the wood to have all of these little beautify "bird's eyes". They look amazing even when the veneer is un-sanded and un-finished, so we could only imagine how awesome it would look once we sanded and finished it. The only problem is, since it's so rare, it also costs a lot... A full sheet (2x8 feet) was 400 dollars, so we opted to get two quarter sheets at 100 dollars each. We figured we could get three door panels out of each quarter sheet, so that should be sufficient.
Later on in the build we realized we had a lot of extra scrap left over, which is great because this stuff wasn't cheap! But, it sure is pretty!
So, we left McBeath's with a minivan full of cherry lumber, bird's eye maple veneer, and a couple sheets of 1/4 and 1/2 inch figured cherry plywood which we will use for the side panels, floor, and shelves, and headed back home to start the build!
Step 3: Legs
Anyways, the first step is always planing the rough lumber. We planed ours down to about 1.5 inches. Next we ripped the board down to about 2.5 inch strips. This way, we can glue two of these strips together to get a piece thats about 2.5 x 3 inches. We glued up these boards so that we could get one leg out of the short piece, and the other three legs out of the longer piece. After we glued the boards together we cut them down on a table saw, and then planed to their final dimensions of about 2.25 x 2.25 inches. Next, we used our radial arm saw to cut the legs to length.
Once we had these legs, we started cutting the tenons for all the skirt pieces that must be attached. On each leg, there are four skirts that attach (refer to diagram in design step), so that means we had four tenons to cut per leg. However, we also want to recess plywood in between the legs on the sides of the entertainment center, so this meant cutting an extra groove down the length of each leg to fit the plywood in. Keep in mind that there is a little bit of leg that has to be groove-free because it sticks out below the bottom skirt like a foot. To make sure we didn't cut the grooves too far down on each leg, we set up a stop on our table saw and pushed our leg pieces through only up to the stop.
The interior shelves need something to rest on, so we decided to use a simple shelf pin method, which means we need to put in holes for those shelf pins. We decided on having four holes spaced 3 inches apart for each shelf so it can be adjusted to four different heights. This meant drilling four holes in each leg.
Finally, we added a taper to the inside edge of each leg, just to make it a little more interesting and sort of continue our arch pattern for the cabinet doors. We did this with a taper jig on the table saw.
Step 4: Side Skirts
Again, the first step is planing. We planed our boards down to 3/4 inch, and we made sure to do the final planing pass on each board one after another. This ensures that the planer was set to exactly the same width for each board, therefore ensuring that the different boards are all the same width.
Next we used chalk to sketch out rough placement of each skirt in the wood. There were also some other pieces like the 'uprights' (which you'll see later) which had to be cut from the same boards, so we chalked those in too. This chalking technique just makes sure that you actually have enough wood for all the pieces you plan to cut out of it!
Once we had a layout of our pieces on the boards, we ripped everything to width and cross cut everything to length.
Next came pulling out the dado blade set and getting those mounted onto the table saw. A dado blade is basically a regular table saw blade but just super fat. It allows you to make a super wide cut, and take a lot of material off all at once. The dado blade is useful for this specific application because it allows you to make tenons quickly and accurately. Simply set up a block and push your piece through with a miter gauge, then rotate it onto a different side and repeat. Do this for all four sides of your piece and wallaa! You've got a tenon! Refer to the pictures for more information.
Step 5: Side Panels
We used 1/4 inch figured cherry plywood for the paneling in the side panels, and we cut these down to length with our radial arm saw. We had to rip them to the correct width after, and we did this with the table saw.
Once we had the paneling cut, we did a test fit with all the pieces. The paneling fits into the channels that we cut into the inside of the legs and side skirts. The channeling was a bit wide for the plywood so when we glue up we will use shims from the back to make sure there weren't any gaps on the outside (refer to picture above for more explanation on this).
There were so many different things to check during the glue up that we had to make a list for ourselves so we didn't forget to check anything. For instance, we had to make sure the whole thing was square and flat, we had to make sure the top skirt was flush with the legs, we had to check to make sure the dimension was correct from the bottom of the legs to the bottom skirt, we had to shim the paneling so there were no gaps on the outside, etc. There are just a lot of things to check! And the glue doesn't stay workable forever, so the list really helped.
Step 6: Front Bottom Skirt
First of all, we wanted the cabinet doors to be flush with the skirt when the doors are closed, which meant we had to make the skirt thicker [to make construction easier]. So, we had to glue two boards together to make the skirt.
However, we didn't realize we needed to do this until we had already cut out the board for the bottom skirt, so we had to cut another board the same length and glue it on the back after the fact. This wasn't ideal because it is always good to cut to final dimension after you glue so that you get nice clean lines and dont have to spend hours sanding down glue bumps or ridges between boards. But, like I said, we already had cut the skirt to final dimension. So, after we glued, we had to trim a little off, which made the final dimension of the bottom skirt a little less then intended. The overall length was still the same thankfully, but it was just a little narrower then intended.
We also had to use the dado blades to make some wide rabbits so that the upright pieces would recess into this skirt.
Step 7: Uprights
There wasn't much we had to do on these guys. The tops will be flush mounted with a butt joint to the top skirt, and the bottoms will be recessed into the bottom skirt, into those notches we cut in the last step. The only interesting feature of these pieces are the two sets of four holes on the back of each, which will be used to hold the shelf pins that support the shelves. I didn't get any pictures of drilling those holes, but we used the same set up as we did for drilling the same holes in the legs.
Step 8: Frame Assembly
This first step was actually broken down into two sub steps, because we didn't have enough clamps to do the whole glue up at once. First we glued together the bottom half: the two front and back skirts on the bottom. We put two long pipe clamps over the bottom skirts to hold the joints in place while they dried, and we also put a clamp across the diagonal to make sure the whole thing was square. An easy way to check if something is square is to measure the two diagonals, if they are the same, it's square! So, we measured both, and then put a clamp on the longer side and cranked the clamp down until the diagonals were equal.
We let that dry overnight, and then did the same exact thing except on the top skirts. That marked the end of the first stage of assembly!
The second assembly stage was adding in some cross-braces in-between the bottom front and back skirts to support the floor panels, and something similar in-between the top skirts to provide rigidity (because the top skirts were super thin so they moved a lot even after being glued in).
In this second stage we also glued in the uprights.
Step 9: Table Top
Planing these boards was really interesting because they were so thick and wide, however we got it done eventually after a lot of heavy lifting. We picked pieces with some big knots and holes in them because those features are really interesting.
We used three boards for the table top, two ~7 inch pieces sandwiching an ~11 inch piece. The final top must be a little less than 22 inches, so this configuration will give us some extra to trim off on each side at the end. Once we figured out the arrangement we taped a big triangle across the top so that we can line up the boards easily.
Next we trimmed off both edges of each board to get a nice straight smooth surface to apply glue to. The general technique for this step takes advantage of the rough board's "true edge". All rough lumber is supposed to have a true edge, which means that edge is supposed to be more or less straight. The other edge can be as wonky as ever, but as long as you have that one relatively true edge, you can put that edge against the table saw fence, then cut off the wonky side. Then, by flipping the board around and putting the clean edge you just made up against the fence, you can cut off the relatively true edge so you have an actual true edge. Now you are left with two clean-cut edges on your previously-rough lumber.
We used this technique for truing up the two smaller boards, but on the large 11 inch board, both sides were un-true. If this is the case, you have to fake a true edge by screwing an actual true edge to one side. Refer to the images for further explanation of this. Once the first cut is made, you unscrew this added true edge, and then cut the other side the same way as before with the normal technique.
Once we had all three of our boards trued, we did a test clamp up to make sure all gaps in the joints closed up. We noticed that while the gaps were closed, the boards were warped enough that we had to add vertical clamps as well as horizontal clamps to hold the boards in the same plane. We devised a method of clamping the entire table top to the flat, rigid table saw bed to aid this flattening process. Using a flashlight in a dark garage to help us see cracks and openings, we decided this method actually worked.
Once we were convinced this would work, we undid out clamps and prepared for the actual glue up. We applied Titebond III glue to both sides of each joint, and clamped everything up, making sure to wipe up excess glue drops. After a coldish night and day drying in the garage, we decided to move it inside where it was warmer to make sure the glue really did dry properly. Thanks Mom for letting us bring sawhorses into the kitchen!
After the glue dried for another day, we made the final dimension cuts on the table top. We wanted a slight bevel on the sides and front edges of the top (not the back because it will be butted up against a wall, so the edge should be straight). I used an angle gauge and the sketch up model on my laptop to transfer the correct bevel angle to our skill saw. We used a skill saw and a guide for these cuts instead of the table saw because the top is just so heavy that its easier to move the saw than the workpiece, haha. Before cutting, we applied masking tape to the top and bottom edges of the table top to prevent tear out.
Step 10: Floor Panels
First we ripped the plywood down to width on the table saw, and then we used our radial arm saw to cross cut each piece to length. Because there are some legs and uprights that protrude into the floor space around the corners, we had to make several notches in the corners of each floor panel so they would fit. We used our bandsaw to make these corner notches.
Step 11: Cabinet Door Frames
After planing the cherry boards down, we used our table saw to rip the pieces to width, and then used a stop on the radial arm saw to make sure all corresponding pieces were the same length.
The sides of the doors will overlap over the tops and bottom pieces, so we cut a dado groove all the way down the interior sides of each of the four pieces, and then cut tenons in the ends of the top and bottom pieces. This way, the four pieces fit together with tenons, and there is also a groove all the way around the interior (the veneer panels will fit in there).
The top piece on each door has an arc in it so that overall theres a big arc across the top of all the cabinets. Because its easier to cut the dado grooves if the edge is straight, we cut the top pieces oversize (in width), cut a deep groove, and then used the band saw to get the arc.
Step 12: Cabinet Door Veneer Panels
To do this, we painted Titebond II (2) glue on the back of the veneer and on the plywood (both cut slightly oversize). After this dried, we lined up the veneer on top of the plywood (with the glue faces together), and then used a clothes iron to bond the two pieces together. We used one layer of a paper grocery bag to protect the veneer from the hot iron.
It was then just a matter of cutting each panel to width and length. We used the radial arm saw to cut to length, and the table saw to cut to width.
Step 13: Cabinet Assembly
We used small craft paint brushes to paint glue (Titebond 2) in the groves and on the tenons, then fit everything together and placed it onto the jig. We had two clamps holding the door down to the jig, and two clamps along the top and bottom of the door to squeeze the joints together and close up the gaps.
Step 14: Sanding
Even though this was probably the step that took the most time, it has the shortest write up. Just make sure to sand with the grain, and switch hands often so one doesn't fall off. Also, it's a good idea to wear some type of ventilator because breathing fine sawdust for two days straight probably isn't good.
Step 15: Door Hinges
Each of our doors needs two hinges, so that is 12 holes total. Again, to make this process easier we built a jig. We extended the bed of the drill press by screwing on a piece of plywood, and then set the fence to the correct position so the distance from the door edge was always the same for each hole. To set the fence, we used a cabinet door from our kitchen that uses the exact same hinges. Then we added 'stops' on both sides so that the vertical position of the hinges would be the same for each door.
Before drilling holes in our doors, we drilled and installed two test doors to make sure all the placement was right and everything. (we used our oak test door and the bottom piece of our door-assembly-jig as our test doors). Check out this video that shows the two test doors in action (look for the 'blue motion'!).
Once we were confident that the drilling jig was correct, we drilled all the holes in the actual doors. Then we put in all the hinges and marked the pilot holes for the screws that actually attach the hinges. We stopped after drilling the pilot holes, because we wanted to apply finish to everything before mounting the hinges and the doors to the rest of the entertainment center.
Step 16: Finishing
Step 17: Mounting the Doors
We wanted a consistent gap along the bottom of the doors, all the way across all six, so we used stacks of playing cards to set the gap on each door when we put the screws in to mount it to the frame. Each playing card is almost exactly 1 hundredth of an inch thick, so we stacked 5 to give us a gap of .05" along the bottom edge.
Once all the doors were on, and once we set the top on, it really looked like a completed piece of furniture. My dad and I stepped back and were like "wow, that really looks pretty good...". We had been looking at all the pieces separately for months, but it wasn't till they were all assembled that it really came to life. We moved it into our family room, in front of our current entertainment center which it will be replacing, just to get a sense of what it would look like.
Step 18: Shelves
Anyways, we needed three shelves, one per cabinet space. It was a simple matter of ripping the piece to width on the table saw, and then cross cutting to length with the radial arm saw. We also had to cut notches in the corners of the two side shelves with the band saw so they would fit in-between the legs (refer to photos).
Step 19: Installation
The central cabinet area has enough room for all of the media equipment, which leaves us the two side cabinets for storing DVDs, extra A/V cables
Step 20: RGB LEDs!
Step 21: Arduino Hardware
We also wanted to add some sort of feature to the Arduino so that we can see what its IP address is. The Arduino will be connected to our wireless network, so it will be given some IP address that may change if we reset the Arduino, or the power goes out, etc. Our iPhone app needs to know the IP to actually send it data, so yeah, we need to know what the IP is. We decided to hook up an LCD screen to the Arduino and have the IP displayed there. This would also allow us to post error messages and debugging statements, etc.
We’ve got a wifi shield and an LCD screen plugged into an Arduino Mega, and then just a bunch of IR and RGB LEDs plugged into digital outputs. Not very complex in terms of wiring.
The sort of complex part was building a nice display box for everything to mount to, and making everything modular enough that we could remove components in order to de-bug or replace them.
We took measurements off of all the components, and then designed a laser-cut acrylic box to house everything.
Cool Idea for the Future:
I really want to add a ‘door detector’. This would just be a momentary button mounted near the cabinet door that is in front of the DVD player. When the door is closed the button is depressed, if its open the button is un-pressed. If we push “Watch DVD” on our iPhone app, and the door is open, the Arduino will tell the DVD player to eject the disk drive. If the door is closed, it will wait until the next time the door is opened, and then it will eject the disk drive.
Step 22: Arduino Software
The Arduino connects to our home wifi network and sets up a wireless server. The iPhone connects to that server and will send some sort of information down to the Arduino depending on user input.
The reason I say “some sort of information” is because there are really two types of commands that we can send, high level and low level. Low level commands would be different button presses on a remote, like “turn the TV on” or “turn the volume up one click on the amplifier”. High level commands are bundles of these low level functions, like “Watch DVD”. This command has to turn on the DVD player, amp, and TV, then open the DVD disk drive, then set the amp to the right input setting, then set the TV to the right input setting, it should also check to make sure the amp volume is at a reasonable level, etc. There is a lot of information and commands stuffed into “Watch DVD”. And so, the question is: do we send high level commands to the Arduino, and then the Arduino software breaks down these commands into all the separate low level commands? Or on the other hand, do we do all of the breakdown into the low level commands on the iPhone app, and send those individual low level commands down to the Arduino, which just executes them?
Another question is this. Each low level command has a ~200 digit list of numbers corresponding to a PWM code for the IR LED which is actually responsible for transmitting that information to whatever media device we are talking to. Do we store this list on the Arduino or the iPhone app? (more said about this type of signal later in this step).
The easiest and most efficient thing to do would be to store everything on the Arduino. This way, we only need to send a small amount of information over wireless, and since the Arduino does all the processing, it would be easy to control everything from a web page just like the iPhone app. (if the iPhone was sending low level commands over wireless, then the web page would have to do the same and it would be cumbersome to use).
However, the Arduino Uno only has about 32 kb of memory onboard (we were originally using an Uno before switching to Mega). There is a micro SD card reader on the wifi shield, and we were planning on using that to store some of the overflow data, but we couldn’t get it working.
The Arduino Mega has a lot more memory, around 128 kb, but we tried using it to control the IR LEDs and it was not working. We tracked down the problem to the loop in the code that generates the carrier frequency for the IR signal. Let me explain how the signal is actually generated and transmitted:
It acts a lot like an AM radio. The IR LED flashes at a certain carrier frequency (32 kHz), and then there is a square wave superimposed over that which actually carries the information. The lists we are using to store the command information look something like [300, 50, 200, 60]. This means turn on the carrier frequency for 300 milliseconds, then turn it off for 50, then turn it back on for 200, and off for 60. Each command signal is actually about 50 of these ‘on-off’ commands.
Now, to actually generate a signal like this with Arduino, you need a function that outputs the carrier frequency, and then another function that calls the carrier function at the correct time and for the correct duration. Since all of these timing issues have such high resolution, it is also necessary to call a function which tells the Arduino not to do anything else at all during this process, ensuring that the timing is very accurate. Otherwise, the signal would not be recognized by whatever device you are pointed it at, like a DVD player for instance.
Like I said, the problem we found in switching from Uno to Mega was in the carrier frequency function. This function has a couple digital write commands that actually generate the signal, but it also has a couple delays so that overall, the function executes at the right frequency. Now, a digital write command on an Uno actually takes about 3 milliseconds to execute, so you must factor this in when determining how long the delays should be. However, a digital write command on a Mega takes a bit longer, and so, when we put the Uno code on the Mega, we were generating an incorrect carrier frequency! Thanks to my dad who figured all this out.
So, with this problem fixed, we were able to switch to using a Mega. This was great because it not only gave us all the memory we needed (we hope) to store all the low level command break down and other logic right on the Arduino, but also gave us more pins to work with.
Step 23: IPhone App Development
Basically, the app launches with a home screen that has the following options (buttons): Watch TV, Watch Movie, Listen to iTunes. Clicking each of these takes you to a separate control panel designed specifically for that kind of entertainment.