Touchpad
von Tobias Frintz
Dieses Platinentouchpad reagiert nicht wie die herkömmlichen Touchs auf Kapazität sondern auf den Hautwiderstand.
Die Funktionsweise:
Der Touch:
Auf einer Platine ist jeweils eine Minusleitung direkt neben einer Sensorleitung. Beim Berühren wird die Sensorleitung hochohmig mit der Minusleitung verbunden. Bei den Pullupwiderständen gilt desto höher der Wert desto feinfühliger reagiert der Touch. Ich würde hier Werte zwischen 500 Kiloohm und 2000 Kiloohm nehmen je nachdem wie man die Touchplatine aufgebaut hat und wo und wie man sie einsetzt.
Die Auswerteeinheit:
Die Auswerteeinheit ist extrem einfach: Ein 4066 cmos-Ic beinhaltet 4 digitale Schalter. Wenn die Steuerleitung an den Pluspol gelegt wird „schaltet“ der Schalter durch und wenn sie an Masse gelegt wird ist er geöffnet. Eine der Seiten der Schalter sind an den Mikrocontroller angeschlossen, die anderen an Minus, die Steuerleitungen an den Touch Ein AVR wertet die Signale von dem 4066 aus und sendet wenn der Touch berührt wurde dem Hostcontroller seriell die Daten
Touchkreis mit 4 Feldern:
Eine Möglichkeit ist ein Touchkreis zu bauen. Natürlich kann man auch andere Formen gestalten. Bei dieser Version kann man srollen (im Uhrzeigersinn oder gegen den Uhrzeigersinn über den Kreis fahren) und hat die Möglichkeit 4 Taster (Oben, Unten, Recht, Links) zu benutzen. Durch ein Doppelklick (wie beim Laptop) wird dem Touchcontroller gezeigt das es sich um ein Tasten handelt und nicht um srollen. Ich hab hier ein ATtiny13 eingesetzt, weil er die benötigten Portpins hat, sehr bekannt ist/ oft eingesetzt wird und preiswert ist
Der Aufbau des Touchs
Man muss bei der Platine eigentlich nur zwei Sachen beachten:
1) Der innere Kreis darf nicht direkt an den vier Sensorflächen anliegen, weil sonst der Touch sehr feuchtigkeitsempfindlich wird und 2) Das Gehäuse muss die Sensorleitungen die zu den Sensorflächen führen vollständig abdecken sonst würde man z.B wenn man Rechts berührt die Leitung wo nach Oben führt auch an Masse legen.
Die Funktionsweise der Software des AVRs
Im Hauptprogramm wird erst kontrolliert ob zu hohe Feuchtigkeit ist dann ob man die Tastensperre aktiviert werden sollte und dann werden noch alle Toucheingänge abgefragt und wenn eine Sensorfläche berührt wurde wird die alte Berührung mit der jetzigen verglichen. Wenn ein danebenliegendes Feld berührt wurde wird mit dem Uhrzeigersinn scrollen oder gegen den Uhrzeigersinn srollen in Register 18 gespeichert danach oder wenn ein anderes Feld berührt wurde wird die jetzige Berührung einfach in das Register wo die alte Berührung ist verschoben.
Hinweiß: Dieses Programm ist lediglich ein Testprogramm wo die Berührungen über 3 Leds anzeigt. Wenn man den Touch in der Praxis einsetzen will muss man das Programm umschreiben und eventuell Funktionen wie Tasten hinzufügen und entweder die Software in ein Timerinteruppt integrieren (im Host) oder wie oben beschrieben z.B ein ATtiny nehmen und eine Schnittstelle zum Host aufbauen.
;+----------------------------------------------------------------------
;| Title : Touchkreiscode
;+----------------------------------------------------------------------
;| Funktion : man mit dem Uhrzeigersinn scrollen und gegen den
;| Uhrzeigersinn
;| Schaltung : Die Anschlüsse PB4, PB2, PB1, PB0 sind an die 4
;| 4066 IC-Ausgänge angeschlossen. Die anderen an
;| Minus. Die Steuereingänge des 4066 sind an die
;| 4 Touchfelder angeschlossen mit hochomigen
;| Widerständen zu Plus (damit dei eingänge nicht
;| wahllos an und ausschalten)
;|
;+----------------------------------------------------------------------
;| Prozessor : ATtiny13 , ATmega8
;| Takt : egal
;| Sprache : Assembler
;| Datum : heute
;| Version : 1.1
;| Autor : Tobias Frintz, 15
;| Tobias-Frintz@web.de
;+----------------------------------------------------------------------
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
; r16 ist das Arbeitesregister
;
; r17 speichert die alte Berührung:
; oben = 1
; rechts = 2
; unten = 3
; links = 4
;
; r18 ist das Register in dem das Ausggangssignal steht
; Feuchtigkeitsfehler = 0b00000001
; Tastensperre = 0b00000111
; Gegen den Uhrzeigersinn = 0b00000010
; Mit dem Uhrzeigersinn = 0b00000100
; Obengetastet = 0b00000101
;
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
sbi DDRC,0 ;Leds auf Output
sbi DDRC,1
sbi DDRC,2
sbi PORTB,0 ; Pullup einschalten für Touch
sbi PORTB,1
sbi PORTB,2
sbi PORTB,4
ldi r18,0b00000000
clr r19
clr r20
clr r21
clr r22
;------------------------------------------------------------------------
mainloop: wdr
rcall Tastensperre
out PORTC,r18
sbis PINB,0
rjmp Obenberuehrt
sbis PINB,1
rjmp Linksberuehrt
sbis PINB,2
rjmp Untenberuehrt
sbis PINB,4
rjmp Rechtsberuehrt
rjmp mainloop
;------------------------------------------------------------------------
Obenberuehrt:
ldi r16,2
cp r17,r16
breq im_uhrzeigersinn
ldi r16,4
cp r17,r16
breq geg_uhrzeigersinn
ldi r17,1
rjmp mainloop
;--------------------------------------------------------------------------
Rechtsberuehrt:
ldi r16,3
cp r17,r16
breq im_uhrzeigersinn
ldi r16,1
cp r17,r16
breq geg_uhrzeigersinn
ldi r17,2
rjmp mainloop
;-------------------------------------------------------------------------
Untenberuehrt:
ldi r16,4
cp r17,r16
breq im_uhrzeigersinn
ldi r16,2
cp r17,r16
breq geg_uhrzeigersinn
ldi r17,3
rjmp mainloop
;--------------------------------------------------------------------------
Linksberuehrt:
ldi r16,1
cp r17,r16
breq im_uhrzeigersinn
ldi r16,3
cp r17,r16
breq geg_uhrzeigersinn
ldi r17,4
rjmp mainloop
;---------------------------------------------------------------------------
Tastensperre:
sbic PINB,0
ret
sbis PINB,1
ret
sbic PINB,2
ret
sbis PINB,4
ret
;jetzt ist die tasstensperre aktiviert
ldi r18,0b00000111
out PORTC,r18
ldi r17,100
Aktiviert: wdr
rcall Feuchtigkeit
sbis PINB,0
rjmp Aktiviert
sbic PINB,1
rjmp Aktiviert
sbis PINB,2
rjmp Aktiviert
sbic PINB,4
rjmp Aktiviert
ldi r18,0b00000000
out PORTC,r18
ret
;------------------------------------------------------------------------------
im_uhrzeigersinn:
ldi r18,0b00000100
ldi r17,100
rjmp mainloop
;---------------------------------------------------------------------------
geg_uhrzeigersinn:
ldi r18,0b00000010
ldi r17,100
rjmp mainloop
;---------------------------------------------------------------------------
Feuchtigkeit:
sbic PINB,0 ; Wenn auf dem Touchpad Wasser ist
ret ; sind alle Touchfelder "berührt"
sbic PINB,4 ; dieses Unterprogramm ist dazu da
ret ; diesen Fehler zu erkennen und es
sbic PINB,2 ; dem Host mitzuteilen
ret ; "Reinigen sie ihr Touchfeld"
sbic PINB,1
ret
rjmp Feuchtigkeitsfehler
;------------------------------------------------------------------------------
Feuchtigkeitsfehler:
ldi r18,0b00000001
out PORTC,r18
ldi r17,100
rjmp Feuchtigkeitsfehler
;------------------------------------------------------------------------------
Touchkreis mit mehr als 4 Feldern
Die Funktionsweise
Wenn man ein Touchkreis mit mehr als 4 Touchfelder bauen will braucht man für jede 4 zusätzlichen Felder ein 4066 Ic mehr. Eine platzraubenende und teuere Lösung, deswegen hab ich ein Touchkreis entwickelt wo man beliebigviele Felder die durch 3 Teilbar sind mit nur einem Ic auswerten kann. Zusatzlich kann man wie bei dem einfacheren 4-Feld-Touchkreis Tasten, nur kann man hier nur 3 Tastfelder auswerten (mit Dioden) ohne noch einen Zusätzlichen IC zu verwenden. Das Prinzip von diesem Touch ist auch ziemlich einfach:
Wenn ein Berührung von ...
1 nach 2 stattfand ist einmal mit dem Uhrzeigersinn gescrollt worden
2 nach 3 stattfand ist einmal mit dem Uhrzeigersinn gescrollt worden
3 nach 1 stattfand ist einmal mit dem Uhrzeigersinn gescrollt worden
1 nach 3 stattfand ist einmal gegen den Uhrzeigersinn gesrollt worden
3 nach 2 stattfand ist einmal gegen den Uhrzeigersinn gesrollt worden
2 nach 1 stattfand ist einmal gegen den Uhrzeigersinn gesrollt worden
Der fertige Touch:
Tasten
Wenn man auf dem Touchpad auch "OK" und "Abrechen" oder ähnliche "Taster" zusätzlich zu dem srollen integrieren könnte, würde man kein einzigen echten Taster mehr benötigen und hätte ein extrem schickes robustes Design (wenn man will sogar Wasserdicht). Hier die Idee zur Umsetzung:
Tasten bei dem Touch mit 4 Feldern
mainloop: wdr
rcall Tastensperre
out PORTC,r18
sbis PINB,0
rjmp Obenberuehrt
sbis PINB,1
rjmp Linksberuehrt
sbis PINB,2
rjmp Untenberuehrt
sbis PINB,4
rjmp Rechtsberuehrt
rjmp Nichtsberuert
rjmp mainloop
Wenn man am Ende der mainloop das Unterprogramm "Nichtsberuert" steht wird es immer aufgerufen wenn kein Feld berührt wurde. Wenn man dann ein Register jedesmal wenn das Unterprogramm aufgerufen wird um 1 runterzählen lässt (vielleicht eine doppelte schleife -> ausprobieren) ist in diesem "Nichtsberührtregister" sozusagen gespeichet wie lange nichts gedrückt wurde. Und wenn dann z. B. Oben berührt wird und die alte Berührung auch Oben war muss man das "Nichtsberührtregister" überprüfen. Ich würd sagen zwischen 0,5 und 2 Sec kann man das Tasten zählen lassen.
Tasten bei dem Touch mit mehr als 4 Feldern
Das Prinzip ist genau das gleiche wie bei dem Touch mit 4 Feldern. Nur bei diesem hier kann man nicht die 3 sich immmerwiederholenden Felder als Taster nehmen weil sie an verschiedenen Stellen am Touch vorkommen und man so nicht feststellen kann wo man das Touch berührt hat aber man hat zum Glück noch ein 4066 Eingang frei. Wenn man in mit 4 Dioden an 4 nebeneinanderliegende Felder anschließt hat man schon ein Tastfeld in dem Kreis. Man scrollt dann durch das Menü bestätigt mit einem Doppelklick auf dem Touch oben und als letzten Menüpunkt würde ich Zurück oder Abbrechen nehmen.
Probleme
bei zu kleinen Touchfeldern
Man muss darauf achten das man die Touchfelder (vorallem bei dem Touchkreis mit mehr als 4 Feldern) nicht zu klein gestaltet denn sonst berührt man beim darüberfahren vielleicht zufällig ein Feld nicht und dann kommt es zu Fehlern beim Auswerten.
In Standgeräten:
Das Problem in Standgeräten ist das man normalerweise waagerecht tippt. Daher berührt nur die Fingerkuppe den Touch. Ich würde hier die Sensorflächen ein bisschen näher an den Minuskreis legen, außerdem die Pullupwiderstände vor den 4066er Eingängen erhöhen (nicht zu hoch sonst treten Probleme auf wenn man schwitzt, dagegen Haucht oder sich in stark feuchten Räumen befindet).
In Handgeräten:
Hier hat man den Vorteil das man fast parallel zum Gehäuse den Touch berührt (-> große Auflegefläche daher kann man die Pullups vor den 4066er Eingängen ein bisschen senken) In Handgehäusen bietet sich oft nicht viel Platz deswegen würde ich eine kleine doppelseitige Platine verwenden auf der eine Seite der Touch und auf der Rückseite die Auswerteelektronik komplett in SMD.
“”