kapazitives Touch Pad
Für die Eingabe von Informationen in Zusammenhang mit einem Display sind Taster, Drehgeber oder Potentiometer nicht immer die schönste oder auch beste Lösung. Entweder gibt es Probleme mit der Platzierung, der Größe oder die kleinen Spalten machen Probleme mit der Feuchtigkeit der Umgebung.
Möchte man eine optisch ansprechende Lösung realisieren, so sind Touch Sensoren bestens für solch eine Bedienung geeignet. Diese können hinter den verschiedensten Frontplatten, wie Aluminium, Plexiglas oder Fliesen angebracht werden und dedektieren ganz unsichtbar die Berührung.
Die beschriebene Methode ermittelt die Berührung nicht über eine Kapazitätsmessung, sondern wird über eine Charge-Transfer-Messung detektiert.
Hardware - Touch Pad
|
|
Funktionsprinzip
Es gibt 2 Kondensatoren die als Speicher für Ladungen dienen, den Kondensator Cs als Speicher und die "Touch" Elektrode als Kondensator gegen Erde.
Am Anfang werden beide entladen, um die Kondensatoren in einen definierten Zustand zu bringen. Das bedeutet, dass PB1 und PC1 als Ausgänge und auf LOW geschaltet werden. Etwas warten damit Entladung auch vollständig erfolgt. Danach werden in einer Schleife folgende Punkt abgearbeitet:
Der Endstand des Zählers verändert sich, wenn man mit dem Finger den Touchsensor berührt.
Sozusagen wird durch den kleineren Touch-Kondensator schrittweise der große Kondensator Cs aufgeladen. Die Anzahl der benötigten Ladezyklen hängt von der "Größe" des Touch Kondensator ab. Und die wiederum von dessen Umgebung (Finger).
Software - kapazitives Touch Pad
Beispiel Code von www.microcontroller.net für die Abfrage von 3 Tastern an Port A.
- Taster 0 --> PinA 4 und 5
- Taster 1 --> PinA 2 und 3
- Taster 2 --> PinA 0 und 1
#include "avr\io.h"
#include "util\atomic.h"
#define SK_A0 (1<
#define SK_B0 (1<
#define SK_A1 (1<
#define SK_B1 (1<
#define SK_A2 (1<
#define SK_B2 (1<
#define SK_A012 (SK_A0 | SK_A1 | SK_A2)
#define SK_B012 (SK_B0 | SK_B1 | SK_B2)
#define MAX_CYCLE 2000
uint16_t keys[3];
void read_senskey( void )
{
uint16_t i = MAX_CYCLE;
uint8_t a, b, x, y;
ATOMIC_BLOCK(ATOMIC_FORCEON){
a = DDRA & ~(SK_A012 | SK_B012);
b = PORTA & ~(SK_A012 | SK_B012);
y = SK_B012; // input mask
do{
DDRA = a; // tristate
PORTA = b | SK_B012;
DDRA = a | SK_B012; // Bx = strong high
DDRA = a; // tristate
PORTA = b;
DDRA = a | SK_A012; // Ax = strong low
if( --i == 0 ) // timeout
break;
x = y & PINA; // not immediately after DDRA
if( x ){
if( x & SK_B0 )
keys[0] = i;
if( x & SK_B1 )
keys[1] = i;
if( x & SK_B2 )
keys[2] = i;
}
y ^= x; // clear processed input
}while( y ); // all inputs done
DDRA = a | SK_A012 | SK_B012; // discharge
}
}
Links |
|
|
Forum - Touch Sensor
Forum - Qtouch
|
|
Downloads |
|
|
Software - einfach
Software
|
|