Week 11: Input Devices
This week
Capacitive touch!
Assignment: add a sensor to a self-designed board and read it
For this week’s assignment I decided to experiment with capacitive touch. As
a basis, I used the overall circuit design suggested by Neil’s transmit-receive
step response example from the input devices
page. I made some modifications:
- Integrated four different pad patterns directly on the board for testing.
One pattern consists of two rectangular pads, another consists of interleaving pads,
and two others attempt to integrate indicator LEDs into the pattern.
- Connect power and communication through the 6-pin I2C header dictated by the
final project output board.
While milling the board I decided (for no particular reason other than ‘it was there’
and ‘Bantam Tools apparently recommends this’)
to try using a 80-degree engraving bit instead of the normal 1/64” flat endmill.
This turned out to be a questionable decision: dialing in the correct cut depth
ended up being something of a “trial and error” process, and I had several iterations
where the bit was cutting too deep (which is catastrophic as cut width depends on
cut depth directly).
Eventually I was able to mill a board where both the front side and back side
had acceptable traces. The back side wasn’t perfectly dialed in but the board
was still fine electrically.
The cut width on the front side was small enough that it started causing some
problems as I tried to stuff and test the board:
- Tiny copper whiskers causing bridging between traces.
- Small spacing makes solder bridges very easy to form. Using extremely fine
solder and carefully controlling feed rate helps.
Theory and practice of capacitive touch
The idea is this: software sends a voltage pulse on the sense pin and measures
the size of the return pulse on the return pin.
I modified Atmel’s I2C peripheral example code
to do the following on each loop:
- Assert +5 on the currently active sense pin.
- Measure the return voltage on the return pin after a small delay, using the onboard ADC.
- Assert GND on the currently active sense pin.
- Measure the return voltage on the return pin after a small delay.
- Store the difference in voltage in a buffer.
- Advance the sense pin counter by 1 increment (so do a different sense pin next loop).
During the process of debugging this board I discovered the following things:
- Boards must never be allowed to touch. (This makes voltage regulators emit
copious amounts of magic smoke. Conveniently, this is an excuse for me to
revise my final project board.)
- Magnet wire as a trace repair solution is fairly fragile. (Another excuse
to revise my final project board.)
- The way Atmel’s example code works with the t44a’s USI peripheral and interacts
with the Arduino Wire library (as used on my final project board) seems to
preclude doing large amounts of processing between I2C read/write cycles.
(In particular, if the t44a spends too long between reads from the I2C
buffer, communication between the two boards grinds to a halt for reasons
I haven’t been able to adequately characterize.)
- Whether or not the ADC is active and reading a channel is independent of
whether or not the corresponding pin is actually set as output! It is valid
to set the ADC to read an output pin – even though there are not really any
good reasons to do this.
But eventually I was able to get an adequate capacitive response from the
4 pads.
Because of the small size of the pads the integrated LEDs end up getting in the
way of making a clean touch, so it is probably easier to leave them out. The
interleaved pads are able to produce a response over a slightly larger region
of potential touches (determined empirically) than the non-interleaved pads,
so any replacement for the Adafruit Trellis probably wants to use them.