BinaryClock default screen |
Programming BinaryClock with FTDI cable |
BinaryClock sliding decimal time |
Schematics |
Prototype video
You may find schematics and photos along with the source code of BinaryClock on my GitHub project page. The schematics and the photos are under doc/ folder. I hope those are pretty self-explanatory.
Instructions
The table below explains how push buttons control BinaryClock.
# | Screen | Description | Buttons behavior | |||
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
1 | First | Slides Welcome Message | X | (2) Show time in binary | X | X |
2 | Default | Shows time in binary | (3) Slide time in decimal | (4) Set time | (5) Show date in binary | (6) Show events |
3 | Time in decimal | Slides time from right to left | (2) Show time in binary | X | (7) Slide date in decimal | (6) Show events |
4 | Set time | Set time in binary | X | Set next | Decrease | Increase |
5 | Date in binary | Displays date in binary | (7) Slide date in decimal | (8) Set date | (2) Show time | (6) Show events |
6 | Show events | Slides events from the next from today to the furthest from today | (2) Show time | (9) Show event year information | Previous event | Next event |
7 | Date in decimal | Slides date from right to left | (5) Show date in binary | X | (2) Show time | (6) Show events |
8 | Set date | Set date in binary | X | Set next | Decrease | Increase |
9 | Event year information | Show event year information | X | Skip | X | X |
Example: you are at screen #5 which displays date in binary. If you press the first button you will go to the screen #7 which slides date in binary. If you press the second button you will go to the screen #8 which sets the date. If you press the third button you will go to the screen #2 which displays time in binary. If you press the button number 4 you will go to the screen #6 which shows events. See the video above. More on events is on the next post.
How It Works
ATMEGA328p chip is what drives the BinaryClock. The chip runs the software. One 74HC595 (which is known as shift register) drives rows of the LED array, the other one drives columns. The output pins of the one which drives rows connect to the LED matrix through 260Ω resistors. 74HC595 which drives columns connects to LED array through ULN2803A which is also known as Darlington Transistor Array. Four push buttons are connected to ATMEGA328p which control the BinaryClock behavior.Shift registers are there to reduce the number of pins used on ATMEGA328p. If two 74HC595 were not there, 16 pins on ATMEGA328p would be needed to achieve the same. Shift registers as the name suggests shift bits with each clock tick. The wiki will tell more about that. A good thing about shift registers is that they can be placed in series. So it doesn't matter how many shift registers you put in series, the same number of pins on the microcontroller can be used. Resistors are there to not over stress the LED matrix. If too much current goes through LED it burns brighter, but faster. Darlington array is there not to over stress the columns shift register. The current goes through the rows to the columns and further on. To light up an LED on the array the column needs to be grounded and the current should be applied to the row. You may notice that there are only 8 pins which drive rows and 8 pins which drive columns, so if you apply current to 8 rows and ground 8 columns, all the rows and columns will be lit. To display a pattern you will want to travel through the rows and display the columns or vise versa. More on the topic is here. BinaryClock software scans rows and uses walking pattern (as discussed on the last link) on columns. Thus at one point of time all the LEDs in a column may be lit and too much current will go to the columns pin. Darlington Array protects columns shift register from that over stress.
Finally in the top left corner you may notice legs. Those are legs to connect BinaryClock to FTDI which can be connected to a PC. In other words, that is the interface to program BinaryClock.
You may notice some other parts on the schematics, such as 16Mhz crystal oscillator, capacitors and a resistor on the first pin of ATMEGA328p. I'm not discussing those parts here. Please, refer to this page to better understand their purpose.
Optimizations & Improvements & Further thoughts
Maxim display driver may be used to reduce the number of parts significantly. If it was used instead, I wouldn't have two shift registers and Darlington Array on the board. And I would have only one resistor instead of eight (on rows) although it would be of a different value. Atmega chip has 32kb memory. It may seem like not a huge amount, but compilation of BinaryClock for it reports this:
AVR Memory Usage ---------------- Device: atmega328p Program: 12306 bytes (37.6% Full) (.text + .data + .bootloader) Data: 1269 bytes (62.0% Full) (.data + .bss + .noinit)So, there are a lot of space left unused. You may want to extend the board with some sensors and then display the information from the sensors on the LED matrix.
Don't forget to edit lib/clock_event_personal.c with your personal events.
No comments:
Post a Comment