Credits: Arduino sensing done by DZL, Processing sketch and Instructable done by Mads Hobye.
Disney Research lab designed a novel way to detect touch. You can see a video of their demo here:
I had the honor to meet them at CHI2012 in Texas and I discussed with them whether it would be possible to convert their system into the Arduino platform. Their immediate reaction was that the Arduino would not be able to generate good enough frequencies. I asked my friend DZL if he could solve this problem and this was his solution to the problem:
The Touché hardware uses a really fancy Direct Digital Synthesizer IC from Analog Devices. It generates a really pure sine wave signal with frequencies between 1kHz and 3.5MHz with high resolution. While the Arduino is capable of generating frequencies in this range the signal is a square wave with lots of harmonic frequency components and really low frequency resolution.
Simply using this signal with the circuit described in the Touché paper result in a really messy frequency graph due to the harmonics from the square wave. The solution is to use the filtering properties of the LC circuit to our advantage. By measuring the signal after the inductor (coil) rather than before we only see a nice sine wave shaped signal free of all the unwanted frequency components. As a result we now see a peak in signal at resonance rather than a notch but the signal contains the same information.
This has resulted in the following sensing capabilities:
Remove these ads by
Signing UpStep 1: Components neded
- Arduino
- Usb cable
- Shield
- pin headers
- Resister: 10k, 1MOmh, 3,3k
- Capacitor: 100pf, 10nf
- Diode: 1N4148 diode
- Coil / inductor: 10mH (cypax.dk part no: 07.055.0510)
- Water bottle as sensing object.
If you do not have the inductor, it is basically a coil. You should be able to roll your own. Grab an empty roll of toilet paper wind very thin wire around a couple of hundred times. You have to experiment until you get a peak on the graph.
Or be scientific:
http://www.pronine.ca/coilcal.htm
You want 10000µH









































Visit Our Store »
Go Pro Today »




I have started a new topic on the arduino forms to help push this along. You can follow/contribute here.
The serial transfer is a serialised struct with a tjeck sum. E.g. it is binary. If the bluetooth module sends some characters it is going to mess up the protocol, but easytransfer should be able to regain sync.
There might be some problems on the computer side of things. I would not be surprised if the guino program expects immediate connection. You might need to tweak the timing there. Or make it try to reconnect if it does not get any useable data.
void gBegin(int _eepromKey)
{
// Sets all pointers to a temporary value just to make sure no random memory pointers.
for(int i = 0; i < guino_maxGUIItems; i++)
{
guino_item_values[i] = &gTmpInt;
}
eepromKey = _eepromKey;
gInit(); // this one needs to run twice only way to work without serial connection.
internalInit = false;
//Serial.begin(38400);
//Serial.print("\r\n+STBD=115200\r\n");
//Serial.flush(); //without this bluetooth shield will not switch to 115200 baud
Serial.begin(115200); //new baud rate is remembered after power off so do not forget what you set this too
Serial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
Serial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
Serial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
Serial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
delay(2000); // This delay is required.
Serial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
//Serial.println("The slave bluetooth is inquirable!");
delay(2000); // This delay is required.
Serial.flush();
int val = 0;
while(val < 500){
val = analogRead(A1);
delay(1000);
}
ET.begin(details(guino_data), &Serial);
gSendCommand(guino_executed, 0, 0);
gSendCommand(guino_executed, 0, 0);
gSendCommand(guino_executed, 0, 0);
gSendCommand(guino_iamhere, 0, 0);
}
http://www.disneyresearch.com/project/touche-touch-and-gesture-sensing-for-the-real-world/
I keep getting this error in processing :
portName= Serial.list()[PortSelected];
Thanx for the awesome instructable. I am using the GUINO for seeing the output. I am getting one problem......the moving label is not getting updated in real time.....I have to disconnect and then connect the GUINO for the change in the Label. Can you please assist me in this problem as soon as possible.
http://madlabdk.wordpress.com/2013/04/08/2-touche-meets-pd-and-maxmsp/
and the github ;)
https://github.com/madlabdk/touche
keep on sharing !
I uploaded arduino graph, and ran the graph mxp and nothing happens. If I check the arduino serial port it it is just outputting nonsense (lots of numbers and symbols).
I did the same with the "peak" files and could not any results.
Any ideas?
thanks, i will try that and let you know. I wasn't aware that it makes a difference. The capacitance is the same as I said.. could you perhaps point me to the data sheet of the right ones? (or a reseller page like you did for the coil) That would help allot to finde the right pieces.
Thanks for the great tutorial, though I ran into some problems which I can't get solved.
The program works just fine when a use a small piece of aluminum-tape (yet if covered with a layer of paper for instance). But what happens when I enlarge the size of the sensor (which is necessary due to hardware reasons in my design) I loose the peak, the graph becomes flattened out and it is impossible to sense a difference between one finger or whole hand touch.. Is there any way to reduce the sensitivity?? Thanks in advance!
Guino_libray:62: error: 'EasyTransfer' does not name a type
Guino_libray.ino: In function 'void guino_update()':
Guino_libray:91: error: 'ET' was not declared in this scope
Guino_libray.ino: In function 'void gBegin(int)':
Guino_libray:162: error: 'ET' was not declared in this scope
Guino_libray:162: error: 'details' was not declared in this scope
Guino_libray.ino: In function 'void gSendCommand(byte, byte, int)':
Guino_libray:379: error: 'ET' was not declared in this scope
It is obviously just me and I am failing to understand what I have done wrong but any help would be much appreciated.
Thanks.
disneyTouchGuino.cpp: In function 'void setup()':
disneyTouchGuino:48: error: 'gBegin' was not declared in this scope
disneyTouchGuino.cpp: In function 'void loop()':
disneyTouchGuino:94: error: 'gUpdateValue' was not declared in this scope
disneyTouchGuino:101: error: 'guino_update' was not declared in this scope
disneyTouchGuino:102: error: 'gUpdateValue' was not declared in this scope
disneyTouchGuino.cpp: In function 'void gInit()':
disneyTouchGuino:110: error: 'gAddLabel' was not declared in this scope
disneyTouchGuino:112: error: 'gAddSpacer' was not declared in this scope
disneyTouchGuino:116: error: 'gAddFixedGraph' was not declared in this scope
disneyTouchGuino:117: error: 'gAddSlider' was not declared in this scope
btw, we did not have enough 10 nf capacitors at hand, but trying out smaller ones did not make too much of a difference.
Mean while: it should be really simple to make your own serial communication with the basic sketch.
Yes right now it compares the distance to the peak (really simple way to do it and it could be improved greatly with AI or just comparing the whole graph).
what door knob.....
@madshobye wonderful work mate
Cheers!
I tried to do the same here but I got a problem... When I run the program on Procesing, it open a window and... nothing! Its a blank window. I've changed he port number to 0 (becuse my arduino is on COM1), after the problem I've tried change the port number, but it don't run with other numbers..
Can you help me, please?