Touchpad

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

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.

Touch.gif


Touchschaltplan.jpg

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:

Touchkreistest.jpg 

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:

Touchkreis mit 12 Feldern.gif

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:

Eingebauter Touchkreis.jpg

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.

Touch mit Tastfunktion.gif

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.



“”