• Starting the 16x16 Matrix (20" x 20")

    mikeneiderhauser11/25/2015 at 14:58 0 comments

    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.


  • Main Controller Software Update

    mikeneiderhauser11/25/2015 at 14:31 0 comments

    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
    • Timezone settings
    • Display Brightness

    as well as displaying the current configuration of the device. The only thing this does not handle is connection to WiFi.

    All of this was done with a local HTML file with some JavaScript and AJAX functions. This will also make its way to the github repo.

  • Matrix bitmap generator

    mikeneiderhauser10/28/2015 at 13:26 0 comments

    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.

    The utility does take a cfg file so you can change the text per button. Take a look at the github repo for the tool.

    Below is a pic of the tool as well as all of the bitmaps I generated / needed for the word clock.

    static const uint8_t bitmaps[BITMAP_CT][BITMAP_SZ] = {
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b11111101,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11100000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00011100,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b11110000,0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00001111,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00000000,0b11110000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b11100000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b11000000,0b00000111,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b01111100,0b00000001,0b00000000,0b00000000,0b00011111,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b11011000},
    {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,...
    Read more »

  • Populated Board

    mikeneiderhauser10/23/2015 at 14:10 0 comments

    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.

  • Overview

    mikeneiderhauser09/24/2015 at 19:17 0 comments

    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.

    1. The display matrix
      1. Straight forward 16x16 LED Matrix
    2. The display driver
      1. A controller (ATMEGA8 or ATMEGA328) that handles the multiplexing of the LED Matrix.
        1. Uses 74HC595 and ULN2803 for IO expansion and current sinking
    3. The controller
      1. Processes time and special events then writes to the display.
      2. Handles communications to the NTP server etc