Kapazitiver Touch-Slider


Elektronik-Labor  AVR  Projekte   Touch

Das Ziel dieser Entwicklung ist ein kapazitives Bedienfeld für die Einstellung der Helligkeit einer LED-Lampe. Durch Berühren eine Kunststofffläche mit dem Finger kann eine beliebige Helligkeit eingestellt werden. Der Mikrocontroller misst die Kapazität von zwei isolierten Sensorflächen und kann dann entscheiden, ob die eine, die andere oder beide berührt wurden. Zieht man den Finger von einer Seite zur anderen, ändert sich kontinuierlich das Kapazitätsverhältnis, sodass ein analoger Einstellwert erkannt werden kann.

 

Als Sensoren wurden zwei 2-Pf-Münzen hinter einer dünnen Kunststoffplatte verwendet, hier einer Tic-Tac-Dose. Die Münzen waren gerade da und eignen sich auch deshalb gut für den Sensor, weil ihr Durchmesser etwa dem der Fingerspitze entspricht. Mit 4 Pf (nach heutigem Wert 2 Ct) für den gesamten Sensor ist dieser auch nicht übermäßig teuer. Zwar könnte man die Kosten mit 1-Pf-Stücken noch halbieren, aber das wäre vermutlich ein Sparen am falschen Ende. Außerdem handelt es sich hier mehr oder weniger um einen Prototyp, wobei die Sensoren in der Serie eher aus Kupferflächen unter einer Platine gebildet werden müssten.



Als Entwicklungsplattform dient das ES-M32 von Modul-Bus, weil es alle benötigten Hardwaregruppen schon an Board hat. Das LCD wird zur Ausgabe von Zwischenergebnissen verwendet. Der PWM-Ausgang liegt bereits über einen Jumper an einer LED auf dem Board. Und die Sensoren können direkt auf die Port-Anschlüsse gesteckt werden.



Die Entwicklung der Software hängt eng mit den Eigenschaften der verwendeten Sensoren zusammen. Verwendet man z.B. dickeres Isoliermaterial, wird die Kapazitätsänderung geringer. Das wirkt sich dann direkt auf die Software aus. Hier werden deshalb die einzelnen Entwicklungsschritte in den Programmen ESM32Touch1.bas bis ESM32Touch4.bas vorgestellt.

'ATmega32, 2 Touch-Sensoren

$regfile = "m32def.dat"
$crystal = 11059200
$hwstack = 16
$swstack = 32
$framesize = 32
Baud = 9600


Dim D As Integer
Dim T1 As Integer
Dim T2 As Integer

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2

Initlcd
Cls

Declare Sub Touch1
Declare Sub Touch2

Ddrc = 255
Portc = 0

Do
Touch1
Touch2
Locate 1 , 1
Lcd T1
Lcd " "
Locate 1 , 8
Lcd T2
Lcd " "
Waitms 500
Loop

Sub Touch1
For T1 = 1 To 500
Ddrc.0 = 0 'C4 hochohmig
Portc.1 = 1 'C5 high
Ddrc.1 = 1 'C5 niederohmig
If Pinc.0 = 0 Then Exit For 'C4 low?
Ddrc.1 = 0 'C5 hochohmig
Portc.1 = 0 'ohne Pullup
Ddrc.0 = 1
Next T1 'C4 low
Portc.0 = 0
Portc.1 = 0
Ddrc.0 = 1
Ddrc.1 = 1
End Sub

Sub Touch2
For T2 = 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 T2 'C4 low
Portc.4 = 0
Portc.5 = 0
Ddrc.4 = 1
Ddrc.5 = 1
End Sub

End

Für jeden der beiden Sensoren gibt es eine eigene Sub. Touch1 verwendet die Ports C0 und C1. In einer Zählschleife wird die Variable T1 schrittweise erhöht, bis der Vergleichskondensator von 10 nF etwa zur halben Betriebsspannung aufgeladen ist. T1 enthält dann einen Zählerwert, der von der Kapazität des Sensors abhängt.

Das erste Beispielprogramm ESM32Touch1.bas misst beide Sensoren und zeigt die Zählerwerte im LCD an. Der Leerlaufwert liegt jeweils bei ca. 300. Berührt man eine der beiden Flächen, sinkt der Zählwert um etwa 40 – 50 ab. Der Unterschied ist ausreichend groß um eindeutig ausgewertet werden zu können. Beide Sensoren können quasi gleichzeitig und unabhängig voneinander abgefragt werden. Jede Messung dauert nur etwa eine Millisekunde. Eine zusätzliche Wartezeit in der Hauptschleife ist nötig, damit man das LCD gut ablesen kann.




Nullpunktkorrektur
Die ersten Versuche zeigen, dass der Nullwert nicht ganz konstant ist. Er ändert sich z.B. mit der Temperatur, weil die 10-nF-Kondensatroen eine gewisse Temperaturabhängigkeit haben.
Im Programm ESM32Touch2.bas wird der Nullpunkt (T10 und T21) automatisch korrigiert. Außerdem wird diesmal nur die Differenz vom Ruhewert (T11 und T21) angezeigt.

Touch1
Touch2
T10 = T1
T20 = T2


Do
Touch1
Touch2
T11 = T10 - T1
T21 = T20 - T2
Locate 1 , 1
Lcd T11
Lcd " "
Locate 1 , 8
Lcd T21
Lcd " "

T3 = T11 + T21
If T3 < 5 Then
T10 = T1
T20 = T2
End If
Waitms 500
Loop

Die angezeigten Messwerte für beide Sensoren reichen bei voller Berührung etwa bis 50. Man kann erkennen, dass eine leichte Berührung kleinere Werte ergibt. Nun lässt sich auch bereits ein passender Abstand beider Sensoren ermitteln, bei dem eine Slider-Funktion  möglich wird. Der Abstand muss so eingestellt werden, dass eine Berührung zwischen beiden Sensoren sich noch ausreichend stark auf beide Messwerte auswirkt. Ein Abstand von 5 mm hat sich als sinnvoll erwiesen.


Slider-Funktion

Im Programm ESM32Touch3.bas realisiert eine erste Slider-Funktion durch Bestimmung des Verhältnisses zwischen beiden Sensoren. In der Anzeige erscheint ein Wert 0…100 %. Außerdem wird nun bereits der PWM-Ausgang angesteuert.

Wenn die Summe (T3) beider Messwerte über 10 liegt, wird eine gültige Berührung erkannt. Nun wird das Verhältnis T21 / (T21 + T11) berechnet und auf 100 % normiert. Erste Versuche zeigen, dass man kaum 0% oder 100% erreicht. Deshalb wird der Bereich 20% … 80% auf 0% … 100% gespreizt. Das Ergebnis liegt in T4. Es wird im LCD angezeigt und steuert zugleich den PWM-Ausgang.

Die Helligkeit der LED sollte sich entsprechend im Bereich 0 % bis 100 % verändern. Es zeigt sich aber, dass das menschliche Auge einen linearen Zuwachs an Helligkeit nicht als Linear empfindet, weil es für sehr große Helligkeitsunterschiede optimiert ist. Deshalb wird das Ergebnis T4 zunächst quadriert, dann auf den Bereich bis 1000 gebracht und dann erst ausgegeben.

Do
Touch1
Touch2

T11 = T10 - T1
T21 = T20 - T2

Locate 1 , 1
Lcd T11
Lcd " "
Locate 1 , 8
Lcd T21
Lcd " "

T3 = T11 + T21

If T3 < 5 Then
T10 = T1
T20 = T2
End If


If T3 > 10 Then
T4 = T21 * 120
T4 = T4 / T3
T4 = T4 - 10
If T4 < 5 Then T4 = 0
If T4 > 100 Then T4 = 100
Pwm1 = T4 * T4
Pwm1 = Pwm1 / 10
Pwm1a = Pwm1
Locate 2 , 1
Lcd T4
Lcd " "
Waitms 300
End If

Waitms 100

Loop
  

Das Ergebnis kann sich schon sehen lassen. Es können tatsächlich Helligkeiten zwischen 0% und 100% eingestellt werden. Ein kurzes Antippen der einen Sensorfläche schaltet die LED ganz aus, ein Antippen der anderen Fläche schaltet die ganz ein. Berührt man beide Flächen gleichzeitig mit zwei Fingern, ergibt sich eine Helligkeit von etwa 50%. Zieht man einen Finger langsam von einer Fläche zur anderen, ändert sich die Helligkeit entsprechend.


Mittelung
Der Slider funktioniert zwar schon, ist aber bisher noch etwas zu stufig. Für eine bessere Bedienbarkeit muss die Steuerung glatter werden. Dies gelingt mit einer Mittelung. Das Programm ESM32Touch4.bas verwendet eine gleitende Mittelwertbildung mit 20 Stützwerten. Das Ergebnis ist daher immer der Mittelwert aus den letzten 20 Messungen. 

Nun ist die Bedienung des Sliders optimal. Er reagiert unmittelbar auf kurze Berührungen, sodass man schnell aus- oder anschalten kann, aber auch eine mittlere Helligkeit sofort einstellen kann. Hält man den Finger kontinuierlich auf der Sensorfläche, wird eine weiche Steuerung erreicht. Die Helligkeit ändert sich kontinuierlich. Auch habe bestimmte Helligkeiten wie z.B. 20 % lassen sich leicht einstellen. 


'ATmega32, Touch 4, Slider mit Mittelwertbildung


$regfile = "m32def.dat"
$crystal = 11059200
$hwstack = 16
$swstack = 32
$framesize = 32
Baud = 9600


Dim D As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T10 As Integer
Dim T20 As Integer
Dim T11 As Integer
Dim T21 As Integer
Dim T3 As Integer
Dim T4 As Integer
Dim U1 As Integer
Dim U2 As Integer
Dim Pwm1 As Integer
Dim Mittel(20) As Byte
Dim Zeiger As Byte
Dim N As Byte
Dim I As Byte

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2

Initlcd
Cls


Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Start Timer1

Waitms 1000

Declare Sub Touch1
Declare Sub Touch2


Ddrc = 255
Portc = 0

Touch1
Touch2
T10 = T1
T20 = T2


Do
Touch1
Touch2
T11 = T10 - T1
T21 = T20 - T2
T3 = T11 + T21
If T3 < 5 Then
T10 = T1
T20 = T2
Zeiger = 1
N = 0
End If

If T3 > 10 Then
T4 = T21 * 120
T4 = T4 / T3
T4 = T4 - 10
If T4 < 5 Then T4 = 0
If T4 > 100 Then T4 = 100
Mittel(zeiger) = T4
If N > 0 Then
T4 = 0
For I = 1 To N
T4 = T4 + Mittel(i)
Next N
T4 = T4 / N
End If
Zeiger = Zeiger + 1
If Zeiger > 20 Then Zeiger = 1
N = N + 1
If N > 20 Then N = 20
Pwm1 = T4 * T4
Pwm1 = Pwm1 / 10
Pwm1a = Pwm1

Locate 1 , 4
Lcd T4
Lcd " "
Waitms 20
Else
Waitms 100
End If

Loop




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

Letzte Änderung in ESM32Touch5.bas: Der Sensor arbeitet ab der zweiten Berührung immer mit weichen Übergängen.
 Do
Touch1
Touch2
T11 = T10 - T1
T21 = T20 - T2
T3 = T11 + T21
If T3 < 5 Then
T10 = T1
T20 = T2
Zeiger = 1
'N = 0 'weiche Übergänge!
End If
...

Download: Quelltexte und Hexfiles
Siehe auch: Grundlagen des kapazitiven Sensors




Elektronik-Labor  AVR  Projekte   Touch