Introduction: DIY 3D Controller
Make a 3D interface using an six resistors, aluminum foil, and an Arduino. Take that, Wii.
Update: a much more thorough explanation of this project is available from Make Magazine. It might be easier to follow their instructions, and I think their code is more up to date.
The basic goal here was to make a 3D hand-position sensing system that most people can build, while still preserving some semblance of functionality. To get an idea of possible applications, check out the demo video. If you think you can build one that is simpler and equally accurate, or slightly more complex and more accurate, share in the comments!
DIY 3D Interface: Tic Tac Toe from Kyle McDonald on Vimeo.
Step 1: Materials
Step 2: Make the Plates
This sensor will work using simple RC circuits, with each circuit sensing distance in one dimension. I found that the easiest way to arrange three capacitive plates for this purpose is in the corner of a cube. I cut the corner of a cardboard box into an 8.5" cube, and then cut some aluminum foil to fit as slightly smaller squares. Tape on the corners keeps them in place.
Don't tape down the entire perimeter, we'll need it later for attaching the alligator clips.
Step 3: Make the Connectors
- Cut three equal lengths of shielded cable. I chose about 12". The shorter the better. Coaxial cable works, but the lighter/more flexible the better.
- Strip the last half inch or so to reveal the shielding, and the last quarter inch to reveal the wire.
- Twist the alligator clips to the wires onto the wires and solder them together.
- Add some heat shrink tubing or hot glue to keep things together.
Step 4: Make the Circuit
- Set the pin to output mode.
- Write a digital "low" to the pin. This means both sides of the capacitor are grounded and it will discharge.
- Set the pin to input mode.
- Count how much time it takes for the capacitor to charge by waiting for the pin to go "high". This depends on the values for the capacitor and the two resistors. Since the resistors are fixed, a change in capacitance will be measurable. The distance from ground (your hand) will be the primary variable contributing to the capacitance.
We'll make this circuit at the base of each wire.
- Solder the 10k resistor to the end of the wire opposite the alligator clip
- Solder the 270k resistor between the shield and the wire (plate). We'll shield the wire with the same 5 V we use to charge the capacitors
Step 5: Finish and Attach the Connector
Once the 3 connectors are finished, you might want to add heat shrink tubing or hot glue to insulate them from each other, because you'll be soldering the shielding/5 V points together.
For me, it was easiest to solder the two outermost connectors together and then add the third.
Once you've soldered the three connectors, add a fourth wire for supplying the shield/5 V.
Step 6: Connect and Upload Code
- Plug the connector into the Arduino (pins 8, 9 and 10)
- Snap the alligator clips onto the plates (8:x:left, 9:y:bottom, 10:z:right)
- Provide power by plugging the fourth wire (my red wire) into the Arduino's 5 V
- Plug in the Arduino, start up the Arduino environment
- Upload the code to the board (note: if you are outside North America, you will probably need to change #define mains to 50 instead of 60).
Step 7: Do Something Cool!
The first thing I did with this was make a simple 3D Tic Tac Toe Interface. If you want to start with a working demo, the code is available here, just drop the folder "TicTacToe3D" in your Processing sketches folder.
Three helpful things that the Tic Tac Toe code demonstrates:
- Linearizes the raw data. The charge time actually follows a power law relative to distance, so you have to take the square root of one over the time (i.e., distance ~= sqrt(1/time))
- Normalizes the data. When you start up the sketch, hold the left mouse button down while moving your hand around to define the boundaries of the space you want to work with.
- Adding "momentum" to the data to smooth out any jitters.
Step 8: Variations and Notes
- Build massive sensors
- Optimize the resistors and code for things that vibrate quickly, and use it as a pickup/microphone
- There are probably other tricks for decoupling the system from AC hum (a huge capacitor beteween the plates and the ground?)
- I've experimented with shielding the plates on the bottom, but it only seems to cause problems
- Make an RGB or HSB color picker
- Control video or music parameters; sequence a beat or melody
- Large, slightly bent surface with multiple plates + a projector = "Minority Report" interface
The Arduino playground has two articles on capacitive touch sensing (CapSense and CapacitiveSensor). In the end, I went with an inversion of a design I stumbled across in a friend's copy of "Physical Computing" (Sullivan/Igoe) describing how to use RCtime (the circuit had the capacitor and one resistor fixed, and measured the valueof a potentiometer).
The microsecond timing was accomplished using some slightly optimized code from the Arduino forums.
Again: just from starting at tons of theremin schematics I don't completely understand, I'm well aware there are better ways to do capacitive distance sensing, but I wanted to make something as simple as possible that's still functional. If you have an equally simple and functional design, post it in the comments!
Thanks to Dane Kouttron for tolerating all my basic electronics questions and helping me understand how a simple heterodyne theremin circuit works (originally, I was going to use these -- and, if tuned correctly, it would probably be more accurate).