Sunday, 17 November 2013

Knock Clock Using DS1307 and an Arduino

Knock Clock!

A Knock Clock is a electro mechanical clock which tells the 'knocker' the time in audible 'knocks' to +/-10 minute accuracy. My better half saw one of these recently and asked me to make her one. This is my own implementation based on a circuit made by a member of the Manchester Hackspace - Paul Plowman!

The device itself is a basically a box with some electronics and a device for striking the side of the box to create the 'knock' sound. In this case I am using an electromagnetic plunger known as a solenoid. It is normally used to control valves or mechanical devices from an electronic controller. An electro-mechanical relay is essentially made up of a solenoid and a switch. More information about solenoids can be found via the internet and wikipedia!

Provide some form of output (cause the solenoid to actuate the time in hours and tens of minutes).

In this case the input is going to be sense the user knocking on the enclosure using a piezo buzzer as a simple microphone. Piezo crystals are a useful electrochemical crystalline structure which when force is exerted on the structure a high voltage low current signal is generated. It is the main component used is electric stove gas lighters and certain types of cigarette lighter. More wikipedia below:

Once the input has been detected it is necessary to process this input and then provide an output. To this end I am going to use the ever popular Atmel 328P microcontroller with the arduino bootloader. However I am not going to design a shield this time as I wanted to try to keep the cost of construction down. Using an arduino main board for every project can get expensive - even using clones is becoming expensive! So we have an input which we then need to compare to a known value - time! How does the microcontroller know what the time is? We could set the time on the microcontroller via the serial terminal each time the device is connected to a computer or we could use an ethernet controller and use the same technique; we could hard code the time from when the microcontroller was programmed and use that - best make sure the power is never removed! Or we could use a real time clock...I have decided to use a real time clock as this is in my opinion the best method to use ensuring that the clock keeps reasonable time.

Real time clocks are special integrated circuits which communicate via the I2C protocol directly to the microcontroller and are battery backed up which means that they are constantly powered by a small battery and never lose the time (once it has been set) even if power to the main circuit is removed. The accuracy over time is not always great (they lose a second each month) and the battery normally lasts about 5 years. There are several real time clock modules available to buy and rather than implement the circuit for myself I have bought one of these modules to save time. The real time clock device used in the module is based on the ubiquitous DS1307 by Maxim Semiconductor.

Now that we have a method of receiving and processing the input it is necessary to drive the output - a solenoid. Solenoids are fairly common devices and can be treated in much the same was as a relay - although a power hungry relay! It often takes a lot of current to drive a solenoid and the circuit will need to provide significant power (voltage and current) in order to make the solenoid actuate. The best way to achieve this is to use a Field Effect Transistor. I have discussed FETS in previous blog posts so I'm not going to go through this again - please read my previous posts.

We need an N-Channel metal oxide silicon field effect transistor ( N-MOSFET) with the following parameters:

Vds - 12V - I have decided to use 12V as the main voltage input

Vgs threshold - up to 5V - we need a logic level FET capable of being driven from the microcontroller

Ids - 1A or higher - we need a device capable of driving the Solenoid

T0220 Package - I like big through hole parts - they are easy to solder!

There are probably over a hundred devices that meet these requirements. If we do a search using Farnell Electronic's parametric search facility the following results are found:

We could use any of these N Channel-MOSFET devices and the VGS threshold voltage is the most important parameter as we need the device to work from a 5V digital signal from the microcontroller. As we don't have any particular preference I am going to choose the least expensive device to keep costs down and the cheapest device is one I already own!

The device I have chosen is the IRF630 by ST Microelectronics - the datasheet is below:

It meets all of the requirements and costs a very reasonable £0.56 from Farnell Electronics.

So....we now have all of the parameters for the Knock Clock decided we can go ahead and design the circuit. I have decided to use a basic implementation of the arduino using an Atmel 328p. The circuit will not have the serial to USB converter or a method of programming the microcontroller so we will have to provide a method of programming and talking to the microcontroller. The rest of the circuit is standard boiler plate electronics - A 12V to 5V linear regulator, a piezo electric speaker (being used as a microphone) and a MOSFET driving a solenoid. The centre header is for the real time clock module. The circuit is shown below:

I have included a six pin programming header to initially 'flash' the arduino bootloader onto the microcontroller and a header to allow communication with the microcontroller via a USB to serial cable. The 12Vdc input will be provided via a standard dc barrel jack or via 5mm screw terminals. The output to the solenoid is provided also via 5mm screw terminals.

Here is the PCB layout for the bottom layer:

Here is the top layer with the component identification:

The bill of materials for this project is as follows:

Part

Value

Device

Description

C1

22pF

Ceramic capacitor

Capacitor

C2

22pF

Ceramic capacitor

Capacitor

C3

0.1uF

Electrolytic
Capacitor

Capacitor Polarized

C4

10uF

Electrolytic
Capacitor

Capacitor Polarized

C5

10uF

Electrolytic
Capacitor

Capacitor Polarized

C6

100nF

Ceramic capacitor

Capacitor

C7

100nF

Ceramic capacitor

Capacitor

D1

1N4001

Axial rectifier

Diode

IC1

LM7805

T0220 package

Voltage Regulator

J1

Programming Header

6x 0.1' pitch header
pins

6 pin I2C programming
header

J2

12Vdc power jack

3.5mm dc power jack

Power Jack

JP1

6 pin Header

6x 0.1' pitch header
pins

Serial Communications
Header

JP2

5 pin Header

5x 0.1' pitch header
pins

RTC Header

JP3

5mm Screw Terminal

5mm screw terminal
phoenix connector

12Vdc input from
screw terminals

JP4

5mm Screw terminal

5mm screw terminal
phoenix connector

Solenoid output from
MOSFET

KK1

Heatsink

T0220 Heatsink

Heatsink for MOSFET

LED1

5mm Red LED

5mm Red LED

Power LED

Q1

IRF630

MOSFET N-CHANNEL

Common logic level
MOSFET

R1

10k

1/4W axial resistor

Resistor

R2

220R

1/4W axial resistor

Resistor

R3

1k

1/4W axial resistor

Resistor

R4

100k

1/4W axial resistor

Resistor

R5

1M

1/4W axial resistor

Resistor

S1

Microswitch

momentary tactile
switch

Momentary Switch for
reset

SP1

Piezo Buzzer

Piezo Buzzer

Piezo Buzzer used as
a microphone

U1

ATMEGA328P

ATMEGA328P - DIP
package

Microcontroller with
arduino bootloader

Y1

16MHz

16MHz crystal
(through hole)

16MHz Crystal for
microcontroller

Just for fun I used an online gerber viewer to show what the printed circuit boards will look like if manufactured:

Here is the Bottom Layer

Here is the top layer:

Well that is about all for now. In the next post I will show pictures of the actual construction and then finally I'll go through the programming of the firmware for the microcontroller. Enjoy - Langster!

About Me

I'm an electronics engineer and uber geek from the UK. I live in the North West of England in Manchester. I mostly spend my time working in electronics and developing custom electronic solutions to problems as well as a few fun projects. I do a lot of development using microcontrollers - particularly using the arduino