Arduino + touchscreen: dauerhaftes senden von Koordinaten verhindern

Hallo Leute,

ich habe mir den Nintendo DS screen (4-wire) bei/von Sparkfun gekauft. Ich habe das Teil auch zum Laufen bekommen und kann mir die Position meines Fingers über die serielle Schnittstelle anzeigen lassen. Jetzt stört mich aber, dass der ganze serielle Monitor vollgeschrieben wird, auch wenn ich nicht auf den screen drücke. Das kommt wohl daher, dass da irgendwie die analogen Eingänge floaten, wenn nichts definiertes anliegt!? Kann man das irgendwie verhindern?
Jedenfalls dachte ich mir, dass ich das Problem durch Mittelwertbildung aus dem Weg räumen könnte...aber zum einen wird dann die Reaktionszeit runtergesetzt (bei größeren Schleifen) und zum anderen funktioniert das auch nur bedingt :~
Ab und an bzw. nach einer gewissen Zeit sendet der Controller munter weiter Koordinaten, obwohl ich den screen gar nicht berühre.

Hier mal mein Code:

const int analog_1 = 14;                                  //define Analog Pins0...4
const int analog_2 = 15;                                  //
const int analog_3 = 16;                                  //
const int analog_4 = 17;                                  //

void setup()
{
  Serial.begin(9600);                                    // Set data rate for communication
}

void loop()
{
  if(detect_touch())                                     // if touch detected print coordinates to serial Interface
  {
    Serial.println(Read_x(),DEC);
    Serial.println(Read_y(),DEC);
  }
  delay(100);
}


int Read_x()                                             // Read x-position
{
  int x_position = 0;
  
  pinMode(analog_1,INPUT);                      
  pinMode(analog_2,OUTPUT);
  pinMode(analog_4,OUTPUT);
  pinMode(analog_3,INPUT);


  digitalWrite(analog_2,LOW);
  digitalWrite(analog_4,HIGH);
  
  x_position=analogRead(2);
  //delay(50);
  digitalWrite(analog_4,LOW);
  return x_position;
}

 int Read_y()                                           // Read y-position
{
  int y_position=0; 
  
  pinMode(analog_1,OUTPUT);
  pinMode(analog_2,INPUT);
  pinMode(analog_3,OUTPUT);
  pinMode(analog_4,INPUT);

  digitalWrite(analog_1,LOW);
  digitalWrite(analog_3,HIGH);
  
  y_position = analogRead(3);
  //delay(50);
  digitalWrite(analog_3,LOW);
  return y_position;
  
}


boolean detect_touch()                                  // detect touch on screen
{
  int i;
  int sum_x = 0;
  int sum_y = 0;
  
  double average_x=0;
  double average_y=0;
  
  for (i = 0;i < 15; i++)                              // loop for the summation of x,y coordinates
  {
    sum_x += Read_x();
    sum_y += Read_y();    
  }
  
  average_x = sum_x/15;                                // averaging
  average_y = sum_y/15;
  
  if(average_x == Read_x() && average_y == Read_y())   // if x- and y-averages match to the current x- and y- value --> touch detected 
  {
    return true;
  }
  else 
    return false;  
}

Über die Mittelwertbildung habe ich mir erhofft, dass ich nur bei einem sicheren Berühren etwas über die serielle Schnittstelle ausgebe. Vielleicht hat von euch ja jemand einen heißen Tip wie man diesem Problem begegnen könnte!?

Viele Grüße,

Jimmy

Ich wuerde sagen, dass eine beruehrung detektiert werden sollte, wenn sich der zeitliche mittelwert der messwerte signifikant aendert.

Also

  1. mittelwert bilding um rauschen zu unterdruecken, pull-up / pull-down widerstaende gegen floating pins
  2. wenn sich der mittelwert significant aendert (schwellwert), dann ist ein ereignis eingetreten

Das ist aequivalent zu einer permanenten auto-kalibration auf einen "null-wert".

Hättest du hierfür vielleicht ein paar Zeilen Code!? Wie werte ich denn eine signifikante Änderung in meinem Code aus?
Grüße,

Jimmy

Im einfachsten fall ist das nur die relative aenderung des mittelwertes, also

( (vorher - nachher) / vorher ) > schwellwert

Natuerlich muss man noch den fall einer division durch 0 geeignet abfangen.

Okay...die Rechnung kann ich nachvollziehen! Danke für den Tip. Ich denk da muss nur noch ne Absolutwertbildung rein und fertig. Und hier meine letzte Frage: Wie fange ich denn die Division durch 0 ab ? Einfach mit if ? Danke und viele Grüße Jimmy

Schau mal hier: http://kalshagar.wikispaces.com/Arduino+and+a+Nintendo+DS+touch+screen

Hallo,

gute Seite :slight_smile: Habs mit 10kOhm Widerständen hinbekommen...vorher hab ich es aber mit 100kOhm Widerständen versucht und da hat es nicht geklappt. Hat jemand ne Ahnung warum es bei 100kOhm Widerständen als Pulldown nicht funktioniert?
Danke für eure Hilfe :slight_smile: