There is a running joke between my sister and I about 'gifting' clocks. She never wants one. One day I pulled a picture of a word clock up on my phone to show her. She immediately said that she wanted one. This project aims to document the process of making this clock. I have built clocks in the past using various displays but none of those designs are suitable for this project.
I made a cardboard cutout of a 20"x20" square. I then printed my letter matrix to scale (6 sheets of 8.5" x 11"), combined with tape, and trimmed to fit. I then drilled a hole at each letter in the matrix (256) in a rough location. The hole is sized slightly smaller than the LED's I plan on using to allow for a snug fit. I was planning on wiring up the matrix last night, but had a few other things pop up. Here are a few pictures of the cardboard cutout and letter matrix (with and without holes). There is also a picture of the cutout in the shadow box I'm using for the container.
I am very close to finishing the main controller software. I had some issues with the Particle Cloud IDE and decided to move everything local. I did end up using the Particle Dev atom IDE provided on their website. This IDE uploads and compiles the code in the cloud and downloads a complete binary file that I can flash to the photon with dfu-utils. I could not get the photon android app to work to connect to WiFi so I used various particle CLI tools to do the job. After a bit of messing with the tools I had my work flow going for me. I am using the SparkTime lib (for NTP) and the SparkIntervalTimer lib (for timed tasks) to aid in various tasks in the controller code. I need to do a bit more polishing of the firmware code but it will eventually make its way to the github repo.
In the firmware, I used the Particle Cloud to aid in configuration options such as:
NTP Server URL
Display On Time
Display Off Time
as well as displaying the current configuration of the device. The only thing this does not handle is connection to WiFi.
I wrote a quick python utility to aid in the generation of bitmaps for the 16x16 matrix driver. The utility can generate / print a code friendly array of bytes (encoded in binary) that can be used as a bitmap. This bitmap can them be combined with other bitmaps in external memory or other memory space (more than likely code store space) and then indexed to be sent over to the display driver.
Last night I finally found the time to populate the display driver board. I did not populate the I2C pull up resistors because these can easily be added later if needed. The AVR should have internal pull ups on those pins. I also started testing with a Atmega328P vs an Atmega8 due to familiarity. These chips will be swapped later.
I have tested setting fuses and programming via iscp, burnt the bootloader and was able to flash with the boot loader. So the programming chain looks good. Next step would be to verify the functionality of the rest of the hardware.
The most common approach that I when looking into word clocks is that each word is mapped to a a digital output. This is a good idea, however limits the recreation and portability of the hardware. The clock will display special days relevant to the clocks owner. Given the the possible customization of the display I cannot wire each word to individual pins. Instead, I will make a generic 16x16 LED Matrix Driver. My goal was to create this clock using (mostly) parts on hand and to make the design reusable in case any other family members or friends want a word clock. I more than likely will not optimize the design for battery operation.
The clock can be broken down into three parts. Each part will be documented in future project logs.
The display matrix
Straight forward 16x16 LED Matrix
The display driver
A controller (ATMEGA8 or ATMEGA328) that handles the multiplexing of the LED Matrix.
Uses 74HC595 and ULN2803 for IO expansion and current sinking
Processes time and special events then writes to the display.