Kapazitiver Berührungsschalter mit der Pingpong-Platine


Elektronik-Labor  AVR  Projekte   Touch



Einfach eine Glasfläche oder ein Display mit dem Finger berühren und damit etwas steuern, das liegt jetzt voll im Trend. Man findet diese Technik in allen möglichen Geräten vom PC bis zum Smartphone. Dahinter stecken meist kapazitive Sensoren. Atmel hat die Qtouch-Technologie von Quantum gekauft und bietet z.B. den QT113A für eine kapazitive Schaltfläche an. Eine Anwendung des ICs findet man in Elektor 7/8/2010. Außerdem stellt Atmel eine komplette und kostenlose C-Bibliothek für AVR-Controller zur Verfügung, mit der man kapazitive Schalter, Slider und Drehknöpfe realisieren kann. Man braucht jeweils zwei ganz normale Ports, einen Kondensator und eine isolierte Metallfläche. Zur Vermeidung von Funkstörungen sollte noch ein Widerstand verwendet werden. 

 

Aber kann man das z.B. auch in Bascom machen? Dazu habe ich zuerst einmal das Arbeitsprinzip untersucht. An den Portpins sieht man eine Serie schneller Schaltimpulse, die den Kondensator allmählich aufladen.


 
Das Bild zeigt die Aktion der Ports in vier Phasen, die sich immer wiederholen. Wie man sieht, liegt der Kondensator niemals gleichzeitig an GND und VCC. Er dürfte sich deshalb bis in alle Ewigkeit nicht aufladen.

 

Aber jetzt kommt der kleine Kondensator Cx der Schaltfläche hinzu. In der Phase 2 liegen beide Kondensatoren in Reihe an VCC und GND. Bei 10 pF und 10 nF würde sich der große Kondensator zwar nur um ein Tausendstel der Spannung des kleinen Kondensators aufladen, aber die vielen kleinen Schritte addieren sich schließlich zu einer Spannung die bei ihrer Auswertung in Phase 4 die Eingangs-Schaltspannung des Ports erreicht. Bei 10 pF würde man z.B. 500 Zyklen brauchen, bei 20 pF nur 250 Zyklen.

Hier eine Lösung für Bascom und die Pingpong-Platine:

Download: Touch2.zip
$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 64
$swstack = 64
$framesize = 64


Dim D As Integer


Open "comb.4:9600,8,n,1,inverted" For Output As #1
Open "comb.5:9600,8,n,1,inverted" For Input As #2

Ddrc.4 = 1
Ddrc.5 = 1
Portc = 0


Print #1 , "Touch"
Do
D = 0
'Do
' D = D + 1
For D = 1 To 500
Ddrc.4 = 0 'C4 hochohmig
Portc.5 = 1 'C5 high
Ddrc.5 = 1 'C5 niederohmig
If Pinc.4 = 0 Then Exit For 'C4 low?
Ddrc.5 = 0 'C5 hochohmig
Portc.5 = 0 'ohne Pullup
Ddrc.4 = 1
Next D 'C4 low
'Loop
Portc.4 = 0
Portc.5 = 0
Ddrc.4 = 1
Ddrc.5 = 1
Print #1 , D
Waitms 500
Loop

End

Ein Kondensator mit 10 nF wird direkt an den freien Ports C4 und C5 angeschlossen. Der Kondensator bildet in diesem Versuch zugleich die Sensorfläche. Man berührt also die Isolierung des Scheibenkondensators. Ohne Berührung zeigt das Programm zuverlässig und konstant z.B. 454 Ladezyklen.



 
Jetzt soll der Sensor das LED-Display schalten. Man muss dazu während der Sensorabfrage den Interrupt sperren. Außerdem wurde eine automatische Anpassung der Schaltschwelle eingebaut.

Download Touch4.zip

$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 64
$swstack = 64
$framesize = 64

Dim Leds(12) As Word
Dim X As Byte
Dim Y As Byte
Dim N As Word
Dim D As Word
Dim Dmax As Word
Dim Dx As Word

Declare Sub Standby
Declare Sub Test
Declare Sub Initialisierung
Declare Sub Led1(byval X As Byte , Byval Y As Byte)
Declare Sub Led0(byval X As Byte , Byval Y As Byte)


Initialisierung

Do
D = 0
Disable Interrupts
Portc.4 = 0
Portc.5 = 0
Ddrc.4 = 1
Ddrc.5 = 1
For D = 1 To 500
Ddrc.4 = 0 'C4 hochohmig
Portc.5 = 1 'C5 high
Ddrc.5 = 1 'C5 niederohmig
If Pinc.4 = 0 Then Exit For 'C4 low?
Ddrc.5 = 0 'C5 hochohmig
Portc.5 = 0 'ohne Pullup
Ddrc.4 = 1
Next D 'C4 low
Portc.4 = 0
Portc.5 = 0
Ddrc.4 = 1
Ddrc.5 = 1
Enable Interrupts
If D > Dmax Then Dmax = D
Dx = Dmax - 30
If D < Dx Then
For N = 1 To 12
Leds(n) = 255
Next N
Waitms 1000 'LED an
Else
For N = 1 To 12
Leds(n) = 0
Next N 'LED an
End If
Waitms 10
Loop



Ein Test mit einer zusätzlichen Metallfolie als Sensorfläche zeigt, dass die Touch-Funktion durch das Kartongehäuse des Pingpong-Spiels hindurch funktioniert.







http://www.youtube.com/watch?v=Ulv3deoVaVg

Eine Version des Programms für den ATtiny13:

'Kapazitiver Touch-Sensor
'1,5 nF zwischen B3 und B4
'Sensorplatte an B4
'LED mit 1 k an B1

$regfile = "attiny13.dat"
$crystal = 1200000


Dim D As Integer

Ddrb.1 = 1

Do
D = 0
'Do
' D = D + 1
For D = 1 To 1500
Ddrb.3 = 0 'B3 hochohmig
Portb.4 = 1 'B4 high
Ddrb.4 = 1 'B4 niederohmig
If Pinb.3 = 0 Then Exit For 'B3 low?
Ddrb.4 = 0 'B4 hochohmig
Portb.4 = 0 'ohne Pullup
Ddrb.3 = 1 'B3 low
Next D
'Loop
Portb.3 = 0
Portb.4 = 0
Ddrb.3 = 1
Ddrb.4 = 1
If D < 30 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
Waitms 50
Loop

End

Download:  CAPsensor.zip


Touch-Sensor mit nur einem Port





http://www.youtube.com/watch?v=b8OT90imhCQ


Software für die Pingpong-Platine:
'Touch1, Sensorfläche an PC.4
'LED an PC.5

$crystal = 8000000
$regfile = "m8def.dat"
$hwstack = 32
$swstack = 8
$framesize = 24


Config Portc = Output

Do
Ddrc.4 = 1 'entladen
Portc.4 = 0
Ddrc.4 = 0 'hochohmig
Portc.4 = 1 'pullup
If Pinc.4 = 1 Then 'schon high?
Portc.5 = 0
Else
Portc.5 = 1 'LED an
End If
Ddrc.4 = 1
Portc.4 = 0 'wieder entladen
Waitms 10
Loop

End


Elektronik-Labor  AVR  Projekte   Touch