So, nachdem ich mich schon einige Zeit mit dem Gedanken an ein Touch-TFT getragen habe, hat mich dieser Thread dazu bewogen auch mal mein Glück mit Sainsmart zu versuchen. Da noch einen DFRduino Mega2560 in der Schublade liegt, habe ich mir das Display und den passenden Adapter einzeln bei Ebay gekauft. In Summe 28 Euro (durch Preisvorschlag statt Sofortkauf). Das Display hat laut Verkäufer auch einen SSD1289 Controller verbaut.
Als Library habe ich zum einen die im Ebay-Text verlinkte "lcd32.zip", welche neben den Datasheets die ITDB02_Graph16 und die ITDB02_Touch enthält. Das erste was auffällt ist, das die ITDB02_Graph16 bei der Initialisierung einen Parameter mehr benötigt, als Anschlüsse auf dem Board vorhanden sind. RS, WR, RST und CS finde ich als Pins auf dem Adapter, allerdings den Anschluss für "ALE" gibt es nicht. Außer dem 16 Datenleitungen ist der Rest für den Touch-Controller. Ich habe somit das Demo ITDB02_Graph16_DEMO auch nicht zum laufen bekommen.
Zum Glück gibt es aber im Sketch selbst den Link auf die Seite von Henning Karlsen. Dort gibt es die aktuelle Version der UTFT und der UTouch Library.
Die Grafik-Demos funktionierten auf Anhieb. Man muss allerdings beim Mega den entsprechenden Eintrag im Sketch aus- bzw. einkommentieren.
// Uncomment the next line for Arduino 2009/Uno
//UTFT myGLCD(ITDB32S,19,18,17,16); // Remember to change the model parameter to suit your display module!
// Uncomment the next line for Arduino Mega
UTFT myGLCD(ITDB32S,38,39,40,41); // Remember to change the model parameter to suit your display module!
Leider hat mein Display einen kleinen Grafikfehler. Ich habe am rechten Rand im unteren Drittel einen ca 1cm langen blauen Streifen, der immer angezeigt wird, wenn das Display aktiv ist. Also werde ich es wohl nochmal umtauschen müssen.
Was witzigerweise nicht funktionierte, war die UTouch Lib. Die ITDB02_Touch Lib funktionierte hingegen schon. Schaut man sich den Code beider Libs an, so ist er nahezu identisch. Die UTouch Lib hat aber die Möglichkeit das Display zu kalibrieren, bzw. Kalibrierungsdaten in Form einer zusätzlichen Headerdatei zu inkludieren. Auffällig ist, das die UTouch Bibliothek den Eingang T_IRQ (hier meldet der Touch-Controller ein Ereignis) zunächst als Ausgang definiert und auf HIGH setzt. Nur in der Funktion "bool UTouch::dataAvailable()" wird der Pin kurz als Eingang gesetzt, gelesen, und dann wieder als Ausgang gesetzt. Da mir das unsinnig erschien, habe ich das kurzerhand geändert.
Hier ein diff der Änderung:
--- UTouch.cpp.orig.cpp 2012-11-15 00:02:18.000000000 +0100
+++ UTouch.cpp 2013-03-20 06:43:58.000000000 +0100
@@ -53,7 +53,7 @@
pinMode(T_CS, OUTPUT);
pinMode(T_DIN, OUTPUT);
pinMode(T_DOUT, INPUT);
- pinMode(T_IRQ, OUTPUT);
+ pinMode(T_IRQ, INPUT);
digitalWrite(T_CS, HIGH);
digitalWrite(T_CLK, HIGH);
@@ -150,12 +150,10 @@
}
bool UTouch::dataAvailable()
-{
- bool avail;
- pinMode(T_IRQ, INPUT);
- avail = !digitalRead(T_IRQ);
- pinMode(T_IRQ, OUTPUT);
- return avail;
+{
+ bool avail;
+ avail = !digitalRead(T_IRQ);
+ return avail;
}
int UTouch::getX()
Damit funktionierte dann auch die "originale" UTouch Lib. Der Kalibrierungssketch ist auch sehr praktisch. Man brennt ihn auf den Mega und folgt den Anweisungen auf dem Screen. Am Ende spuckt der Sketch auf dem Display die Werte aus, die man in die UTouchCD.h an den passenden Stellen eintragen muss, damit die erkannten Touch-Positionen stimmen. Das hat bei mir sehr gut funktioniert.
Reset- oder Initialisierungsprobleme hatte ich bei keinem Beispiel. Was mir noch zu Llzzards Problem einfällt, hast Du mal versucht den Arduino mit einem externen Netzteil zu betreiben, statt nur per USB? Evtl. zieht ja die Hintergrundbeleuchtung so viel Saft, das der Rest der Elektronik nicht weiter mit macht. Unwahrscheinlich, aber möglich. Daher vielleicht einfach mal testen.
Mario.