This instructable talks about an algorithm that I used, circuit design and box design. But first, here is a video that illustrates how it all works together:
Step 1: Music Theory
As you might know sound is just air pushing against nerves in our ears. An air wave pushes – a nerve tracks the irritation. What we hear as a note are actually these air pushes with a constant period. In other words, if the nerve is tickled 130 times a second one hears a "C".
Devices that detect notes try to figure out how many times a second its microphone was "tickled", what was the frequency. Figuring out what note corresponds to what frequency is simple because there are "frequency → note" tables.
There are several algorithms that transform data read from a microphone into a frequency. The most prominent is a Fourier transform. The idea is quite simple: an input to is how strong was the air pushing in any given point in time. An output is how much of each frequency was contained in the input. I think it is best explained by a picture attached to this step.
It is obvious that you can detect a tune using this algorithm. However, a music lock project can be a little more efficient. We don't really need to know how much of each frequency the input contained. We just care if the input had a frequency of a note we are detecting. For instance, if the first note of our unlock sequence is D, we don't care how much A's or B's were in the input. We just need to know if D was there.
This is when Goertzel algorithm comes in handy. It is used to identify one target frequency. As a matter of fact, it is used in telephones to recognizes the tones produced by the buttons pushed on a telephone keypad.
Step 2: Components
ATMega328P with 16Mhz crystal is device's core. I chose this part because it is very easy to work with.
Electret Microphone with OPA344 opamp. Both are sold together from Sparkfun. Output from this device could be fed directly into the analog input of the ATMega.
Spektrum SPMAS2000L Servo this servo opens and closes box's lock mechanism. It needs 3.3V and delivers a linear motion of about a centimeter. It uses regular servo control interface.
As far as I understand such motors are usually used in airplane models to control ailerons. More could be read on the manufacturer's website.
TPS2020 Switch is a great switch with a very low quiniscent current which is less then 10 μA when the switch is off. This switch will control power to the lock servo.
LM2936Z Regulator is a 3.3V linear regulator with low quiescent current. It is precisely what we need because the box would be battery-powered.
MAX1555 is a battery charging circuit that can turn on a little LED when the battery is full.
Step 3: Circuit Design
It was not trivial to put everything into a small box. Since I wanted to manufacture everything at home, multi-layered circuit design did not quite work. So, I had to fake a multi-layered board with an Arduino shield-like circuit. Blue lines on the attached schematics represents bottom layer, red lines are connections via shield headers.
I used photoresist method to etch the actual board.
Step 4: Box Design
I have applied two layers of Minwax wood finish and a layer of their Polyurethane to protect the surface. Although the process was quite strait forward, I must confess that I have underestimated importance of sanding the surface before applying wood finish. Spots that did not get enough sending are quite visisble.
A picture of a lock mechanism is also attached to this step.
Step 5: Software
Program logic follows a simple flow that checks if the box is closed. If so, it attempts pattern recognition. If it takes too long to discover the pattern device goes back to sleep. If the pattern is detected the lock is opened.
If device is woken up when the lid is open it waits until the lid is actually closed. Once that happens it shuts the lock.
Step 6: Result
I took the box to several friends of mine: correct tune was detected when played on different pianos: grands, uprights and digital once. Detection resolution is a halftone.
I would be happy to receive any commands or answer any questions about this project.