PDA

View Full Version : Need a cheap touch sensor idea.. here it is


mister_e
- 28th October 2005, 18:09
Hi all! Even if there's some built-in solution and dedicated IC to do the job, here's my few cents solution. Not that it is the only one and safest solution but it's working for me on few home-dedicated application.

The touch sensor itself:
almost everything you have on hand and conductive.

The only thing you have to do is to touch the XYZ conductive material and TADA! No mechanical switch or push button... only one floating piece of conductive material.

Maybe not suitable in harsh environement, but working great in home application.

The schematic:
<img src="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=570&stc=1&d=1130515579">

The code:

' Few cents touch sensor
' ======================
' Using : PIC12F629
'
' Circuit is quite simple. One pin(GP4) is used as a signal generator.
' This pin send signal to all "virtual push button" (GPIO<2:0>)
' via 3 X 22K resistor. The touch sensor could be almost everything
' conductive.
'
' Once a sensor is touched, the program will blink a LED as follow
' GPIO.0 => 1 Blink
' GPIO.1 => 2 Blink
' GPIO.2 => 3 Blink


' PIC config and programming mode
' ===============================
'
@ DEVICE PIC12F629,INTRC_OSC_NOCLKOUT ' internal RC osc
@ DEVICE PIC12F629,MCLR_OFF ' Disable external MCLR
@ DEVICE PIC12F629,WDT_OFF ' Disable WatchDog timer
@ DEVICE PIC12F629,PROTECT_OFF ' Disable device protect
@ DEVICE PIC12F629,CPD_OFF ' Disable Code-Protect
@ DEVICE PIC12F629,PWRT_ON ' Enable Power-up timer
@ DEVICE PIC12F629,BOD_ON ' Enable Brown-out detect

' I/O Alias definition
' ====================
'
LED VAR GPIO.5
Generator var GPIO.4

' Hardware definition
' ===================
'
TRISIO = $0F ' GPIO<3:0> as input
' GPIO<5:4> as output
'
CMCON = 7 ' Disable internal comparator

' Variable definition
' ===================
'
Sensor var byte
Loop var byte

' EEPROM assignement
' ==================
'
data @3,3,0,2,1 ' table to convert 'Sensor' variable result to according
' LED blink. See Result list bellow

' Software/hardware initialisation
' ================================
'
led = 0
generator = 0


Start:
' /////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
' / Start \
' /////////////////////////////////|\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'
' Short explanation of the whole thing.
' 1. Send a high level to all sensor input => GPIO<2:0>
' 2. Read GPIO port
' 3. Send a low level to all sensor input
' 4. Keep only GPIO<2:0> bits
' 5. Test result
'
' If no sensor has been touched, the result will be 7 => 0000 0111, case
' else, the body capacitance will introduce sufficient delay between
' step 1 and 2 wich will keep the according bit to 0.
'
' Results will be as follow
' NoSensor => 0000 0111 => 7
' GPIO.0 => 0000 0110 => 6
' GPIO.1 => 0000 0101 => 5
' GPIO.2 => 0000 0011 => 3
'
repeat
Generator = 1 ' enable sensor power
Sensor = GPIO ' read sensor
Generator = 0 ' disable sensor power
Sensor = Sensor & 7 ' keep only Sensor bits
'
until Sensor != 7 ' redo the test untill one sensor is touch
'
' Now we will flash an LED to confirm wich sensor has been touch
' GPIO.0 => 1 Blink
' GPIO.1 => 2 Blink
' GPIO.2 => 3 Blink
'
read sensor,loop ' convert result to blink
repeat
LED = 1
PAUSE 200
lED = 0
PAUSE 200
loop = loop - 1
until loop = 0

goto start ' do it again...

Have fun!

rsocor01
- 16th March 2009, 20:21
Hi all,
Currently, I'm working on a project where it would be nice to have a cheap touch sensitive switch. So, I looked at mister_e's entry about a touch sensor. I think it's a very clever idea, but there is a problem I can't make it work. I'm using a pic16f84 at 4 MHz, the same frequency that uses mister_e's pic. I have tried different combinations of resistors and I have added some capacitors but still it doesn't work.
When using an oscilloscope I can see the input signal at the input ports goes lower when touched by a finger but apparently not low enough to read a zero.
Does anybody have any ideas on how to make this work? Probably adding an op-amp would do the job. Thanks.

Robert.

Joe S.
- 17th March 2009, 07:05
Hello Robert,
Well we know it will not work without changing a few things for the 16F84, so post what you have and let's look and see. Open a new thread in PBP so as not to hijack this example thread.

Ioannis
- 17th March 2009, 08:39
Do NOT put extra capacitance at the inputs beside the sensor itself.

Even the Osc. probe will load inputs.

Maybe play with the 22k resistors. Also good idea would be to compare spcs of the two PIC's.

Ioannis

P.S. If necessary, admins move this message to keep thread clean. No problem.

George
- 8th September 2009, 23:17
What a great idea, is it working reliably - I have a device I need this sort of thing for, pref very cheap with little extra in the way of components, did rsocor01 ever get it running? He didnt mention it on his other thread. Just wondering. would higher value resistors and a longer charge period help with the sensitivity?

I need this unit to be fairly reliable, is it likely to do this if set up right? Hopefully will be mass produced. Most commercial capacitive systems take a running average and are constantly resetting their zero point to allow for atmospheric conditions etc dont they?

rsocor01
- 9th September 2009, 02:21
George,

No, I never got it to work the way it's explained in this threat. The way to go is with the series PIC16F72x. They work great. Refer to the threats started by byte_butcher about his project. That should help you.

Robert

George
- 10th September 2009, 02:01
Hey I tried it and got it going really well, i changed some values to make it more sensitive (I don't have much space available for the pad) ie - changed the resistor to 100K and put a 1ms delay in on the charge, through a 3mm sheet of glass a sensor pad size of down to 6mm x 6mm worked reliably. This was using a 16F676 @ 4MHz. Why is rsocor using a 16F84? I cant even understand why they are still being made and so popular, they are just junk along side the more modern chips.

Thanks Mister E for such a great idea, I think as long as I tune the sensor pad size/resistor it should be pretty reliable as I've had no issues with it yet and it worked first time.

Joe S.
- 10th September 2009, 05:48
Why is rsocor using a 16F84? I cant even understand why they are still being made and so popular, they are just junk along side the more modern chips.


There are dozens of books, hundreds of instructors who recommend them. They work out of the box with default configs, no A/Ds, No Comparators, perfect choice for that first PIC. Remember George, newbies often know absolutely nothing about PICs, and these chips offer the easiest way to get started without getting tripped. Move up to 16F628A / 648A, adds comparators and memory and timers, same footprint, 1 brick at a time, is how a wall gets built. But yeah, for the experienced programmer, to much money too little chip.

rsocor01
- 10th September 2009, 21:30
Currently, I am using the PIC16F72x series that have a built in Capacitive Sensing Module (CSM) that are designed for touch sensor applications. These chips work great. You don't need any tunning and they are 100% reliable.

The reason I first tryed Mister_E's circuit with a 16F84 is because that's one chip that I had handy at that moment. I could see a small change in voltage amplitude at the input ports when the sensors were touched, but they weren't reliable enough in the circuit I built. Maybe I needed to do some adjustments and tunning. Any ways, I think it's a great idea Mister E came out with.

I just love it to see all the smart a** comments you can find in here that do not contribute to resolve any issues and that do not provide any technical guidance at all.

Robert