Some time ago, I became fascinated with the concept of ‘Story.’ Being an Engineer, Story is not often something I think about. We are given a spec, we build to the spec, optimize and iterate. There is some discovery along the way, but we are discovering the process of getting to a well-defined end-point. To me, finding Story is discovering the endpoint through the process. I wanted to try using this method to design something, and decided to use doors as a starting point.
My approach was two pronged—on the one hand, I brainstormed a large number of phrases involving doors and on the other hand, I drew many 2-3 panel comics involving doors. After generating, I let these sit for a day and came back and started looking for patterns or common themes. In the future, I think a more formal affinity process would be a useful step in organizing and documenting this process.
Several themes emerged:
- Doors as something keeping you from getting something you want.
- Doors protecting you from something that wants you.
- Not knowing what’s behind doors.
- Doors as an expression of personality.
As I started to see these themes, I realized that the door is just the medium for fundamental statements about the human condition and that you can apply narrative theory to find the ‘Story’ of your medium and build a design up from there. I decided to explore and combine 3 and 4.
A long time ago, I learned that every complex solution comes from iteration on a simple system. Rather than try to just build the circuit straight up, I decided to start as simple as possible and integrate components and features one at a time.
Doing some initial research on automatic door knockers, I came across an excellent post describing a secret knock-detecting door. This looked like a perfect starting point, so I decided to recreate it with my own hardware. To simplify input and output, I started with a simple button for input and an LED for output. I took the code provided and modified it so that it replayed rather than validating the recorded knock pattern. I also had to modify the code to detect a digital signal from the push button rather than an analog signal from the sensor.
Since we want to be able to detect knocks, we need a sensor well suited for the purpose. Fortunately, the Arduino website has a great tutorial on making and using a knock sensor, though all we really need is the circuit diagram.
I wired this up, and added back the code to sense analog values. Initially, nothing was working and I had to set the threshold very low to pick up anything. Then I remembered that since we're trying to detect vibration, the piezo element needs to be pressed firmly against the surface we're knocking on.
After applying a small weight, it became very *very* sensitive to any kind of bump or scrape, and it made me wonder how far away I could still detect the knocking. Could be fun to attach something like this to a wall and use it to control a home automation system.
Knock detection works!
Next step is to allow output. I wanted to use a small solenoid to perform the knocking action. Unfortunately, the arduino can only output ~40mA, which is definitely not enough to drive the current the solenoid was pulling out of a 9V battery.
I grabbed an opto-isolated solid state relay and connected it between the arduino and the solenoid. Unfortunately, the 9V battery was no longer working. I checked the stats on the relay and noticed that it has a voltage drop of ~2V at the current the solenoid was pulling, which cut the voltage getting to the solenoid below the solenoid's 'on' voltage.
Since the relay could handle up to 60V, I decided to just double up on the batteries and hit the solenoid with 18V. This is well over the solenoid's recommended operating voltage, but since the pulses are short and intermittent, overheating won't be an issue.
Solenoid output works!
Since the circuit was extremely small, I realized that it could be used in basically any context. Rather than attach it to a door permanently, I thought it would be cooler to put it in a stand-alone wooden box to keep as a tech demo. I found a good-looking wooden box, put all the electronics inside and finished it with a nice merlot wood stain.
I secured the piezoelectric element to the box with some superglue and attached the solenoid with gorilla glue, hot glue, super glue and elmers, just to be safe. I thought about using screws, but I didn't want anything sticking outside the box.
I put my box out into the world and watched out people interacted with it. I was surprised at how frequently a few common patterns came up, particularly shave and a haircut. The problem was that people were looking for the 'response' rather than just a repetition of the patter. So, I added back in the knock validation code, but set it up to only look for a few specific pattern-requiring responses and then to issue the appropriate response if one of those patterns was detected.
Download the latest version of the code.