Instructables
Picture of Touche for Arduino: Advanced touch sensing.
Update: New interface - look at the last step.

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:


At the conference they told me that they used 200 steps and they were able to get up to 2000. We have 150 in the above video. 
 
Remove these adsRemove these ads by Signing Up
1-40 of 105Next »
RCH62 months ago

Hi... I am using Guino dashboard for blinking an Led at about every half of millisecond, and I am plotting the graph according as the led turns on and off. The problem is the width of graph is tooo small to recognize the signal. How can we increase or manipulate the axis??? @Madshobye

RCH62 months ago

Hi... I am using Guino dashboard for blinking an Led at about every half of millisecond, and I am plotting the graph according as the led turns on and off. The problem is the width of graph is tooo small to recognize the signal. How can we increase or manipulate the axis??? @Madshobye

RCH62 months ago

Hi... I am using Guino dashboard for blinking an Led at about every half of millisecond, and I am plotting the graph according as the led turns on and off. The problem is the width of graph is tooo small to recognize the signal. How can we increase or manipulate the axis??? @Madshobye

jcarthew8 months ago

Hi, Thanks for posting this! I am having an issue that I suspect is related to my arduino board having a dodgy clock or something but I wanted to check - the peaks move from right to left very quickly during operation - the amplitude remains constant but the Readnumber changes constantly. Any suggestions? I am going to try with another mega soon. Thanks again!

jcarthew jcarthew8 months ago

Tried it on a second board - no change.

jeraman jcarthew4 months ago

What an amazing instructable, thank you for posting! Now I am having the same issue described here on Arduino Uno. Would anyone have an idea of what is going on? Thanks for the help!

clemniem5 months ago

Is it possible to use the Touche on another Pin then Pin 9?
I'd love to use it with the Mozzi library to create output Sound. But they both use Pin 9.
Thanks in Advance,
Clem

madlabdk1 year ago
Hey Mads, We built the touché (thank you so much for your instructables) and interfaced it with two environments we love: PureData and Max/MSP. We have succeeded in this. Here we go the project:
http://madlabdk.wordpress.com/2013/04/08/2-touche-meets-pd-and-maxmsp/
and the github ;)
https://github.com/madlabdk/touche

keep on sharing !
Ive week working on a very similar project for a while, and wanted to check this out. Can you explain how to set it up?
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?

Did you ever figure this out? I'm running into the same problem, and I really need to work with this data in Max MSP rather than processing.

Hoperin Hoperin7 months ago

Solved! In case anyone else stumbles upon this problem, IT IS YOUR BAUD RATE! I made a post about it on the Arduino forums:

http://forum.arduino.cc/index.php?topic=224730.msg...

The code works beautifully so madlabdk if you see this you are amazing! And of course Madshobye as well, bless yall, and this community!

bonniee7 months ago

Thanks so much for this Instructable! I'm looking forward to trying it. I'm new to these kinds of circuits, so I have a quick question -- for the inductor, is there a restriction on which kind I should purchase? Looking at Mouser, there are a ton of different (and different-looking) varieties...Does the max current or max resistance rating matter? Thanks!

zwsro8 months ago

May I ask if any Coil with10mH will do? I cannot seem to find something identical to the one you use. What I found was a coil that actually looks like a resistor.

This is awesome. The technique itself is cool, and having an Arduino implementation makes it so much better!

Just a quick comment on the Processing code, I was having issues with it because the dynamic arrays weren't getting initialized. The SerialEvent function was freaking out at me, so I just changed the declarations at the top:

float[] DynamicArrayTime1 = {}, DynamicArrayTime2 = {}, DynamicArrayTime3 = {};

float[] Time1 = {}, Time2 = {}, Time3 = {};

float[] Voltage1 = {}, Voltage2 = {}, Voltage3 = {};

float[] current = {};

float[] DynamicArray1 = {}, DynamicArray2 = {}, DynamicArray3 = {};

Hopefully that helps someone else who gets stuck. :)

palatis8 months ago

Hello, I'm having really small readings that's difficult to distinguish between different touch patterns (like one finger tip, multiple fingers, grab, palm... etc), the values are like:

untouched:

  • Top: 1.00
  • Interpolated: 21.00
  • Basline (no value)
  • Value: 21.00

palm:

  • Top: 1.00
  • Interpolated: 26.00
  • Baseline (no value)
  • Value: 26.00

I tried several differnt touch interface, including:

  • nothing (just the wire)
  • a glass of water (in a ceramics cup)
  • a piece of aluminum paper (~14x30 cm^2)
  • a tin can (empty milk powder can)

all giving similar results, almost indistinguishable.

I tried 2 types of inductors

  • axial lead (brown black black silver)
  • radial (103J)

I tried to play with different values of resistors, capacitors, and inductors, but nothing made a difference.

I'm stuck at here, can somebody help me?

螢幕截圖 2014-02-13 13.49.17.png螢幕截圖 2014-02-13 13.49.27.png
TWP498 months ago

We get "PlottArray was not declared in this scope" each time we try to up load to the arduino. We have trired the various suggestions given in these comments--GUINO version and still get the same message.

sopon_iamas128 months ago

Thank you so much for sharing this.

I used it with plants in my graduation research.

If anyone interested and have some time, you are very welcome to visit my page at
http://www.instructables.com/id/Calm-Relaxed-Interaction-Plant-Plus-1

fvon oertzen10 months ago
Thanks a lot for this instruction Mads!

Somehow I can't see any graph in processing. The original sketch just opens a blank window. Also tried your GUINO approach. The application only shows the setup bar on the left side nothing else.
I tried older versions of Processing still it didn't work.

I'm using an Arduino Duemilanove (ATmega128). Might that be the cause?

Any help would be highly appreciated. I really wanna get this running!
i meant ATmeaga168 of course.
madshobye (author)  fvon oertzen10 months ago
It should work. Sound like something is wrong with the serial communication. Wrong port comes to mind. I am not sure.
iziccoz1 year ago
What is the use of 3K3 pull down resistor in that circuit? (before inductor) In disney paper theres no pull down resistor in hardware description. Thanks for reply
I'm am trying to decipher the arduino code to figure out what frequencies are being swept. My understanding is that you are you are trying 160 different frequencies. The TCCR1A and TCCR1B registers indicate no scaling and a fast PWM setting. The system clock is 16 MHz and the timers are prescaled to system clock divided by 64 = 250kHz. The frequencies that are being swept are then 250/1 = 250kHz to 250/160 = 1563Hz. Is this correct?
Hi I'm interested in the same question you had -- did you ever figure out the frequency range being swept here?
sopon121 year ago
Hi, Thanks for sharing the super helpful source code.
The code works very well. I am finding a way to add more plant for touching.
I am planning to add more analog input and use only one Arduino.
Could you please suggest and guide me how to do?
Since the data sent to Processing is more complicated than normal way, so I have no idea how to make it. I am looking forward to any suggestion! Cheers!
Hi, thanks for your amazing idea. I want to extend it to work on the touch on a cardboard. I just wonder, if a bias inductor/capacitor (mentioned in disney's paper), or an amplifier can help to make it more sensitive about small variation, and gestures recognition?
http://forum.arduino.cc/index.php?topic=166747.0  

I have started a new topic on the arduino forms to help push this along. You can follow/contribute here.
I am trying to alter this code to allow the use of a bluetooth com port. This will isolate ground from earth and provide a more customized/flexible sensor for generic use. I have gotten so far as to get the bluetooth shield up and running at 115200 baud using the hardware serial ports (0,1). I also freeze the touche program in gbegin(...) until the bluetooth connection is paired and connected. If I begin the connection using a terminal I get a single transmission of garbled characters. I'm guessing that this is the structure that Easy Transfer is sending or some dashboard configuration information. However if I try to open in Guino interface it will not connect, the bluetooth module doesn't even detect an attempt to connect. The only difference between what I'm doing and what is there originally is that the bluetooth module will occasionally send out status information about it's connection. Any help you can provide would be greatly appreciated.
madshobye (author)  farmersride1 year ago
I have little experience with bluetooth, but I would love the idea of getting it to work. Please post the code and maybe make an instructable if you get it up and running.

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.
Thanks for the response! The code for gbegin(...) is below. This requires the seedstudio bluetooth shield with jumpers set so that hardware serial ports are used. The bluetooth device is paired and ready for a serial connection as soon as the Guino app is started - however the first characters sent out of the unit will likely be a status message from the bluetooth module saying that it is connected. The bluetooth shield flashes it's red/green lights when it is inquireable when it establishes a serial connection this changes to two green flash per second continuous. The guino application does not even establish a connection as the red and green continue flashing indicating that it has not been inquired. Any/all suggestions appreciated, I don't really know how to spy on the bluetooth or serial traffic to further debug whats going on.

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);

}
czaide1 year ago
the purpose of the diode was not mentioned in the given document. by the way, thank you for the reply earlier.
czaide1 year ago
what is the purpose of the diode? and can you explain why is that when we connect ourselves to the sensor, the amplitude increases? please reply asap. we need it for a presentation.
madshobye (author)  czaide1 year ago
You can find the paper about the original system here:

http://www.disneyresearch.com/project/touche-touch-and-gesture-sensing-for-the-real-world/

I want to use this with Max. So I was trying use processing rather than guino.
I keep getting this error in processing :

portName= Serial.list()[PortSelected];
booster1231 year ago
@naman123 tera rply nhi aaya be........n mads tnxx for d awesome project..:)
naman1231 year ago
Hello...
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.
ferrygun1 year ago
I have replicated this project using Raspberry Pi. It is very slow but it works. Check out this video here: http://youtu.be/cljP1Z7pc4Y
birdm4n1 year ago
changed the capacitors and now it work's like a charm! thanks! you might want to consider adding this to the inscructable ;) (the fact that it has to be ceramic capacitors)
birdm4n1 year ago
having some problems with the reply function (the captachas are not showing up) so I will just post my reply directly:

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.
birdm4n1 year ago
(removed by author or community request)
madshobye (author)  birdm4n1 year ago
Your capacitors looks wrong. I think you should use ceramic capacitors. Let me know if that worked for you.
1-40 of 105Next »