Slave Dials are clock movements without the actual time keeping circuit. All they contain is the mechanism to drive the hour and minute hands, which can be advanced by an electric pulse. This pulse is sent by a centralised master time-keeping mechanism. They were often used railway stations or large office building to ensure that all the clocks read the same time. You will still occasionally find such dials at markets, car-boot-sales and disposals.
I like the idea of bringing new life to old technology, and so conceived of the idea of melding the slave dial with a micro-controller and internet connection to create a old style slave dial with atomic clock accuracy.
These steps describe the process I went through, and includes all the schematics and source code. This same technique might also be applied to modern clock movements by bypassing the existing pulse-generation circuit.
- Arduino with WiFi (I used a YellowJacket board from Async Labs, but you could use any Arduino with WiFi or Ethernet enabled or a suitable shield).
- LM317 Regulator.
- TIP31 Transistor.
- 1N4004 Diode.
- Red LED.
- 9V Power Supply.
- DC Power Socket (to suit power supply).
- 0.1uF Capacitor.
- 1uF Electrolytic Capacitor.
- 22R Resistor.
- 3 x 1K Resistor.
- 10K Resistor.
- 100R Resistor.
- Self-adhesive Velcro.
- Electrical Tape.
- Foam (for sound insulation).
Step 1: Identify Slave Dial Characteristics
In order to drive the mechanism, I needed to know how much voltage had to be applied to the coil to reliably advance the hands, for how long, and how many seconds the hands would advance for each pulse. I was concerned about overdriving (and hence damaging) the coil, but also concerned about under-driving it, resulting in an unreliable movement.
I was able to find some general information on these units on the web (thanks to Google). My thanks to the people who put together the English Clock Systems website. It turns out that most such clocks would advance either 30 or 60 seconds depending on the model. The mechanism was specified as a combined resistance of around 3.5 ohms, and a current rating of 0.3 amps, for an operating voltage of 1.05 volts. IN reality, most such units were driven by banks of old dry-cell batteries with a voltage of 1.5 volts, so that is what I aimed for.
Note that slave dials such as this typically had a "shunt" resister is parallel with the coil. The reason for this was so because these clocks were often wired in series. Without the resister, if the coil on one clock went open circuit, all the clocks would stop working.
Step 2: Design Drive Circuit
The switching transistor is driven via one of the Arduino's output pins. I put an LED in parallel to help with debugging (so I can test the program without having the clock wired up). Finally I wired up a switch to one of the Arduino's other pins. The intent was to use this to enter a configuration mode (e.g. to setup the wireless network settings) however I never actually made use of this.
The Arduino I chose is a YellowJacket from Async Labs. Unfortunately they are no longer making them. If you check their forums (which will remain up for a while), you may find people putting together their own runs (open source hardware never dies after all). Alternatively, a different Arduino could be used. For example, a standard Arduino with an Ethernet shield could be used (with some code changes to accommodate the different network libraries). In this case, using POE (Power Over Ethernet) would also eliminate the need for a separate power cable. Rather than using a network time source, a GPS unit connected to a standard Arduino could also be used.
I used the freeware version of Eagle to document the circuit, prototyping each segment as I went.
With the circuit design and prototyped on breadboard, I moved to building it on some stripboard. I use a little Java application called DIYLC to design the strip-board layout.
Step 3: Build and Install Circuit
After that its just a case of cutting a piece to size, breaking the tracks at the appropriate points with a drill bit, and soldering everything together. Note that I used a set of single inline header sockets and pin headers to mount the Arduino. This allows me to remove it if needed. I also fitted a DC power socket to suit my power supply.
The PCB was mounted inside the clock using double-sided Velcro. I used some electrical tape to insulate it from the metal back-plane of the clock. The power socket was glued in place using some two-part epoxy. I did have to clean the area a bit first and use a little sandpaper on both the clock and the socket in order to ensure a good bond.
Step 4: Write Code to Drive Clock
The clock advance code has a few special considerations:
- Needs to advance the time in 30 second intervals.
- If the displayed time is behind, the advance should run faster until it is caught up.
- If the displayed time is far behind, and it is faster to just wait for the time to catch up rather than trying to get the clock display caught up, then the clock should simply wait.
- The clock maths has to be able to handle noon/midnight, where the time effectively wraps around to zero.
- The clock should keep track of the last position of the hands, so that this does not need to be reset if power is lost.
- There needs to be a mechanism to initially define the position of the hands, so the program can move them accordingly.
The code which stores the time in the EEPROM uses a few tricks to get as much life out of the Arduino's EEPROM as possible. Each bit of the EEPROM has a limited number of write cycles before it will fail. To stretch this out, I used one bit for each 30-second interval that the clock could display (a grand total of 1440 possible positions). It uses 180 bytes of EEPROM to store this. At midnight and noon, the array is cleared to all zeros. Then after the first 30 second interval the first bit is set. At 1 minute, a second bit is set and so on until jus before midnight or noon all the bits in the array are set. Hence each bit is written only 4 times a day. That should give a lifespan in excess of 15 years (most likely a good deal longer).
When the clock is powered-up, the last displayed time is read back from the EEPROM.
Adjusting the displayed time is done via a simple web page that the clock serves. This was also useful during debugging.
Step 5: Write Code to Synchronise Time
Two possible server addresses are used. If one fails then the other is tried. These are queried on startup, and every hour afterwards. The DAYTIME server sites recommend you limit how often you query them, and may block your address if abused.
Step 6: Finish Up
One last change I made was to add some foam rubber inside the clock body to help quieten the loud 'click' every 30 seconds. It is simply held in place by its shape.
I look forward to any comments, and hearing about other people making use of this or similar projects of their own.