05.01.2013Dotyková plocha (rezistivní)

Dostala se mi do ruky rezistivní dotyková plocha pro jeden HTC mobil, tak jsem udělal jednoduché demo jejího použití.

Funguje stejně jako potenciometr
Rezistivní dotyková plocha funguje velmi jednoduše. Je to vlastně plocha s několika elektrodami a odporovou vrstvou na ploše. Tím jak se dotknete nějakého místa na ploše se spojí dvě vodivé desky. Vzdálenost dotyku od elektrody určuje velikost odporu. Zjednodušeně řečeno pak funguje stejně jako potenciometr, který dává skoro od 0 do skoro maxima (u MSP430 je to 1024). X a Y souřadnice je potřeba čist odděleně, protože na ploše jsou 4 elektrody. 2 pro X a 2 pro Y. Pro čtení X je potřeba nastavit na dvou pinech napájení a ze třetího čist, pro čtení Y jsou to jiné 2 piny na napájení a jiný pin pro čtení.

Rozložení pinů


Jednoduchá demonstrace použití dotykové plochy


Ukázkový kód pro dotykovou plochu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// zapojení dotykove plochy
//  Y Vcc - P2.1
//  X Vcc - P2.0
//  Y Gnd - P1.5 / X read
//  X Gnd - P1.4 / Y read
 
// zapojeni LEDek pro demonstaci
//  P1.6, P2.5, P2.4, P2.3
 
int x=0;
int y=0;
boolean touched=false;
 
void setup()
{
  pinMode(P1_6,OUTPUT);
  pinMode(P2_5,OUTPUT);
  pinMode(P2_4,OUTPUT);
  pinMode(P2_3,OUTPUT);
}
 
int readX()
{
  pinMode(P1_4,OUTPUT);
  pinMode(A5,INPUT);
  pinMode(P2_0,OUTPUT);
  pinMode(P2_1,INPUT);
  digitalWrite(P1_4,LOW);
  digitalWrite(P2_0,HIGH);
 
  delay(1);
  int val=analogRead(A5);
  return val;
}
 
int readY()
{
  pinMode(A4,INPUT);
  pinMode(P1_5,OUTPUT);
  pinMode(P2_0,INPUT);
  pinMode(P2_1,OUTPUT);
  digitalWrite(P1_5,LOW);
  digitalWrite(P2_1,HIGH);
 
  delay(1);
  int val=analogRead(A4);
  return val;
}
 
void loop() {
  x=readX(); 
  y=readY();
   
  touched=false;
  if(x>10 || y>10)
  {  
    // top left
    if(!touched && x<500 && y>500){
      digitalWrite(P1_6,HIGH);
      digitalWrite(P2_5,LOW);
      digitalWrite(P2_4,LOW);
      digitalWrite(P2_3,LOW);
      touched=true;
    }
    // top right
    if(!touched && x>500 && y>500){
      digitalWrite(P2_5,HIGH);
      digitalWrite(P1_6,LOW);
      digitalWrite(P2_4,LOW);
      digitalWrite(P2_3,LOW);
      touched=true;
    }
    // bottom left
    if(!touched && x<500 && y<500){
      digitalWrite(P2_4,HIGH);
      digitalWrite(P2_5,LOW);
      digitalWrite(P1_6,LOW);
      digitalWrite(P2_3,LOW);
      touched=true;
    }
    // bottom right
    if(!touched && x>500 && y<500){
      digitalWrite(P2_3,HIGH);
      digitalWrite(P2_5,LOW);
      digitalWrite(P2_4,LOW);
      digitalWrite(P1_6,LOW);
      touched=true;
    }
  }
   
  // none was touched
  if(!touched){
    digitalWrite(P2_5,LOW);
    digitalWrite(P2_4,LOW);
    digitalWrite(P2_3,LOW);
    digitalWrite(P1_6,LOW);
  }
}