Kapazitiver
Berührungsschalter mit der Pingpong-Platine
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.
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
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