It’s no secret that I LOVE LEDs. It’s also no secret that I love 3D printing, Raspberry Pis, Laser Cutting, and woodworking (I just started a new job in an office with a full-featured wood shop). This project combines all of these things into a final product that I’m really proud of. I built it as a gift for my girlfriend, Leah. Taking inspiration from many commercial and DIY Word Clocks (example 1, 2, 3, 4, 5) that I’ve seen around the web, I built my own take on this unique timepiece. It uses words to spell out the time, occasionally displays “secret messages” in an accent color, and slowly cycles display colors for Leah’s name. First, here’s some pictures of the finished product (then I’ll go into more detail on the design process).
Some Pictures of the Finished Product:
Read on for more details!
The Design Process
While looking at some of the other word clocks that are floating around the internet, I decided that there were a few things I wanted to focus on, and do differently from some of the others…
- I decided that I would make a frame out of hardwood that would serve as the means for displaying the clock on a desk or shelf. I wanted this wood frame to look highly professional and crisp. I also wanted to emulate the look of a framed piece of art, I did this with wood framing and the help of some glass in the front.
- Many of the DIY word clock implementations use individual LEDs for each letter, making wiring a huge mess. RGB LED panels, like the ones they use to make huge Times Square displays, can be gotten for super cheap. I decided that I would build around one of those.
- I didn’t like the designs that had spaces between words or unused letters. I toiled on the lettering design to ensure that every single letter is used in a message.
- Many of the existing designs allow a ton of light to bleed between letters. I devised a solution to isolate the letters with a 3D printed grid that virtually eliminates light bleed between letters.
- I wanted to be able to set any letter to any arbitrary color/brightness, while also supporting fading. Using the LED panel mentioned in (2) made this goal easy to achieve.
- I wanted to control the whole thing with a Raspberry Pi and Python. Why? I want to be able to use the clock as a platform for Leah and I to do some Python hacking. This word clock functions fine without an internet connection, but using a Pi makes it easy to hook up to the web for adding future features like a web interface to set an alarm clock – future expansion options!
- I wanted to embed “secondary” messages that would occasionally pop up to make Leah smile – things like “I love you” and “Time for Coffee!” Some of these messages show up briefly in an accent color (you can see some examples in the photos above).
With all the above goals in mind, I set to work. I didn’t take as many process shots as I wish I had, but here’s the run down….
First, I hooked up my Raspberry Pi to the RGB Matrix HAT + RTC Hat that I got from Adafruit Industries. This was a super convenient board, because it added the two features I needed: the ability to drive an RGB display from a Pi, and a realtime clock (RTC).
Once I had the electronics hooked up, I set to work writing the software. It’s all written in Python, and it uses Adafruit’s RPI RGB Matrix Library to drive the display at the required refresh rate. You can download all my code (and the other design files) from the GitHub link at the end of this post. Simultaneously, I started working on the 3D design, and the stencil design. I used Adobe Illustrator to create the stencil design. Knowing that I would be laser-cutting it, I made sure to use a font that wouldn’t create shape islands. Figuring out how to fill all the boxes, while ensuring all the time messages would be in the right order was a ton of work. I agonized over letter placement for several days, but it was lots of fun – like solving a puzzle of my own design. Here’s a shot of the illustrator file with the finished layout and my guides:
You may have already noticed that my word grid is 16×16, but the LED panel I selected is 32×32 RGB LEDs. I chose this panel because I liked its physical size (8×8 inches). I killed two birds with one stone by designing a 3D printed grid system that would subdivide the LED panel into 256 2×2 LEDs sections while also eliminating light bleed. The resulting assembly perfectly matches the size of my stencil, while also creating walls between letters that will eliminate the color bleeding issue that I observed in others designs. My 3D printer isn’t big enough to do the whole grid in one go, so I printed it in four sections that look like this:
Four of those grids piece together and nicely wrap around the LED display. With the added width of the lip on the grid, the whole assembly matches the dimensions of the laser-cut steel sheet. Here’s a cross section of the complete assembly:
For the cover glass, I simply went to my local framing store, and asked for them to cut me a piece of glass of the right dimensions. It was only a few dollars and took just a few minutes. Behind the glass, sits the stainless steel stencil. Being an electrical engineer, I knew the perfect source for my laser-cut stencil, a PCB solderpaste stencil vendor! Stainless steel stencils are often used to apply solder paste to printed circuit boards – they are precisely cut, look nice and shiny, and can be turned around for delivery very quickly. I exported my illustrator file to a DXF line drawing, and they were happy to cut it out and ship it to me. Behind the stainless steel stencil, I cut a piece of ordinary parchment paper to size and inserted it. Honestly, I was amazed at how well parchment paper worked as a diffuser. It lets just the right amount of light through, while diffusing and mixing the light into a pleasant glow. All those components then sit on top of the 3D printed grid, which is, in turn, super-glued to the RGB LED matrix. The matrix is then pressure fitted into the wood enclosure and hot glued in place from the rear. Before starting on the wooden frame, I completed my 3D model, and ensured that everything would fit together:
With my modeling done, the electronics/software working, and diffuser/steel/glass stack-up figured out, it was time to make the frame. I decided to use walnut because walnut is BEAUTIFUL. With lots of help from my amazing co-workers (who have more woodworking experience than I do, for now – Thanks, Noah!), I got the walnut cut to size, planed down to a uniform thickness, and mitered at 45 degrees on the ends.
I glued the mitered sides together and clamped over night:
I wanted to make sure that this clock feels buttery soft to the touch. That means it’s time for sanding!
I added separate pieces to the front of the box (you can see them if you look at the far side in the photo below) with a slight lip so that all the components could slide in from the back and be pressed against the front to keep everything in place.
With the frame construction and sanding done, it’s time for The Good Stuff. Literally, the wood finish I used is called “The Good Stuff.” It looks great, and keeps the word clock frame protected.
Now, it’s time to complete the assembly. First, I dropped in the glass, the stainless steel word grid, and the parchment paper diffuser. They fit perfectly!
Then, the 3D printed grid + LED panel slide in. Once it was all aligned, I used a small amount of hot glue on each side of the panel to hold it in place against the front glass.
Lastly, I installed the Raspberry Pi. I used some aluminum standoffs plus a 3D-printed stand that I whipped up. There are no externally visible screws or mounting holes on the clock frame. The Pi stand puts it at the right height to allow the ribbon cable to reach the display input connector. It also leaves sufficient room to plug in an Ethernet cable or Wi-Fi dongle (optional, since it uses an RTC and doesn’t need an internet connection to work), and the power cord.
That’s it! The word clock is done!
This project is licensed via the GNU GPL v3. Please Attribute and Share-Alike. You can download the source code, mechanical designs, and everything else you might need directly from the GitHub Repository linked below.