Arduino Mega 2560 + TFT Touch Screen

Hallo liebe Forum-Gemeinde :slight_smile:

Ich bin auf der Suche nach einem TFT Touchscreen für unsere Diplomarbeit in der Schule :smiley:
Ich habe derzeit diesen hier: http://www.amazon.de/SainSmart-3-2-TFT-LCD-Display/dp/B008HWL8QS/ref=sr_1_1?s=ce-de&ie=UTF8&qid=1390219977&sr=1-1&keywords=Sainsmart+3%2C2.
Da der Touchscreen sehr ungenau reagiert wollte ich fragen, ob ihr ein paar Tipps habts, wo ich eine Alternative finden könnte. :slight_smile:

Liebe Grüße & Vielen Dank im Voraus. XD

Da der Touchscreen sehr ungenau reagiert

Kannst Du das in Werte fassen? Wie ungenau ist denn Dein Exemplar? Hast Du den Touchscreen vorher kalibriert?

Danke für die schnelle Antwort :smiley:

Folgendes Problem habe ich:
Wenn man zum Beispiel das Paint-Example ausführt und dann eine Linie zeichnet macht er daneben auch Punkte obwohl man da nichts gedrückt hat.

Dann habe ich zum Testen 3 Buttons erstellt (Oben / Mitte / Unten).
Wenn ich dann den unteren Button drücke, erkennt der Touchscreen öfters das oben gedrückt worden ist.

Es funktioniert nur halbwegs wenn man genau in der Mitte drückt.
Wenn man aber auf der rechten Seite des Touchscreens drückt dann spinnt er wieder.

Kalibriert haben ich ihn noch nicht. Könnte ich noch versuchen.
Einfach die UTouch_Calibration ausführen ?

Das ist der zweite Sainsmart Touchscreen, beim ersten hat er überhaupt nur sporadisch funktioniert.

Liebe Grüße :slight_smile:

Ich habe ein ähnliches Touch-Display, aber nicht von Sainsmart, deshalb kann ich über die Qualität dieser Firma nur sehr wenig sagen. Aber ohne Kalibration dürfte das Teil nicht richtig funktionieren, das musst Du also schon machen, sonst darfst Du Dich über Seiteneffekte noch nicht beklagen. Die Werte, die Du bei der Kalibrierung rauskriegst, musst Du dann in Deine(n) Sketch(es) übernehmen, sonst bringt das Ganze nichts.
Übrigens: In der Beschreibung steht ausdrücklich, man müsse als Erstes die Kalibrierung machen, also ist das wohl kein Punkt, den man einfach überspringen kann.

Dann werde ich das gleich morgen machen :slight_smile:
Leider habe ich zum TFT-Touch-Display keine Beschreibung / Anleitung bekommen.
Auf der Herstellerseite bekommt man auch nicht viel heraus.

Danke euch :grin:
Sobald ich es getestet habe, werde ich darüber berichten ;).

Noch eine Frage hätte ich:
Ist der Sainsmart Mega 2560 langsamer als der Arduino Mega 2560?

Wir steuern einen Schrittmotor mit dem Sainsmart.
Kurzrum: Jede 10 Schleife setzt er den "Schrittpin" von 0 auf 1 bzw 1 auf 0.
Da ich noch einen Arduino Uno (Orginal) besitze, habe ich den Sketch raufgespielt und siehe da,
mit 10 Schleifen dreht der Motor durch. Weil es ihm zu schnell ist (Beschleunigung wird benötigt).
Dann habe ich die Schleifenanzahl auf 100 erhöht und dann fährt er fast gleich so schnell wie der Sainsmart Mega 2560 (Ohne Display).

mfG

Ist der Sainsmart Mega 2560 langsamer als der Arduino Mega 2560?

Sainsmart macht praktisch immer nur 1:1 Clones der Arduinos, manchmal einfach von älteren Releases, deshalb ist auch Dein Sainsmart mit grosser Wahrscheinlichkeit gleich schnell wie eine Original Mega2560.

Deine Abweichung wird sich wahrscheinlich anders erklären lassen. Ein UNO und ein Mega2560 haben andere Prozessoren drauf, die zwar gleich schnell getaktet sind, aber vor allem bei der Pinbelegung an einigen Orten abweichen. Deshalb kann das gleiche Programm für den UNO und für den Mega2560 kompiliert unterschiedlichen Code erzeugen. Dass allerdings gleich solche Abweichungen (Faktor 10) herauskommen können, bezweifle ich. Post mal den Code, vielleicht finden wir ja eine andere Ursache.

So hier ist einmal der Code :grin:
Ich habe 2 Arduinos laufen. Einmal mit Display, wenn ein Button gedrückt wird dann schickt er auf den UP / DOWN / Stopp-Pin und einmal zum Ausführen vom Code.
Ist mein erstes Projekt mit einem Arduino also nicht lachen :grin:

const int statusPin =  36; 
const int richtungPin =  40; 
const int stromabsenkungPin =  34; 
const int schrittPin =  38; 
const int upPin = 30;
const int downPin = 28;
const int stoppPin = 32;

int upState;
int downState;
int stoppState;

void setup() {
  pinMode(statusPin, INPUT);
  pinMode(richtungPin, OUTPUT);
  pinMode(stromabsenkungPin, OUTPUT);
  pinMode(schrittPin, OUTPUT);

  pinMode(upPin, INPUT);
  pinMode(downPin, INPUT);
  pinMode(stoppPin, INPUT);
}

void loop() {
  upState = digitalRead(upPin);
  downState = digitalRead(downPin);

  if(upState) {
    drive(LOW);
  }
  if(downState) {
    drive(HIGH); 
  }
}

void drive(boolean richtung) {

  int richtungState = richtung;
  int schrittState = LOW;

  int schleifenAnzahl = 0;

  while(digitalRead(stoppPin) == false) {
    int stromabsenkungState = LOW;
    schleifenAnzahl = schleifenAnzahl + 1;
    if(schleifenAnzahl >= 10){
      schleifenAnzahl = 0;
      if (schrittState == LOW){
        schrittState = HIGH;
      }
    }
    else{
      schrittState = LOW;
    }
    digitalWrite(stromabsenkungPin, stromabsenkungState);   
    digitalWrite(richtungPin, richtungState);
    digitalWrite(schrittPin, schrittState);
  }
  int stromabsenkungState = HIGH;
  digitalWrite(stromabsenkungPin, stromabsenkungState);   
}

Den gleichen Code verwende ich auch beim Uno nur, dass ich beim die Pinbelegung und bei Tools - Board - Arduino Uno, ändere.

mfG :slight_smile:

EDIT: Jetzt habe ich einen orginalen Mega 2560 getestet.
Gleiches Ergebnis wie beim Sainsmart Mega 2560. Also ist nur der Uno schneller.

Zum einen fällt mir auf, dass Du hier einen Vergleich machst, der nicht definiert ist:

while(digitalRead(stoppPin) == false) {

digitalRead() liefert HIGH oder LOW, wobei LOW mit 0 gleichzusetzen ist und somit Dein Code funktionieren sollte, aber dies einfach als Hinweis, solche Sachen können Probleme verursachen.

Ich glaube, dass das Problem bei digitalWrite() und digitalRead zu suchen ist, welches auf dem UNO und dem Mega nicht identisch implementiert ist. Wenn Du wirklich schnell sein willst, würde ich zu Direct-Port-Manipulation greifen. Das kannst Du auch so machen, dass Du nicht separate Versionen für UNO und Mega unterhalten musst:

volatile uint8_t *RCKport;
uint8_t RCKmask;
#define RCKpin 4

setup() {
  // initialize port and mask variables
  RCKport = portOutputRegister(digitalPinToPort(RCKpin));
  RCKmask = digitalPinToBitMask(RCKpin);
}

loop() {
  // replacement for digitalWrite(RCKpin, HIGH);
  *RCKport |= RCKmask;
  // replacement for digitalWrite(RCKpin, LOW);
  *RCKport &= ~RCKmask;
}
while(digitalRead(stoppPin) == false) {

Dieser Code sollte nur zum Testen funktionieren.
Der Motor fährt einen gewissen Weg ab, deshalb brauch ich keinen Stopp-Button.
Jedoch muss ich noch zwei Endschalter einprogrammieren.
Aber danke für den Hinweis :grin:.

Ich habe schon davon gehört. Nur schaut das alles kompliziert aus.
Ich habe diese Methode gefunden: digitalWriteFast,digitalReadFast,pinModeFast, etc
Ist auch sehr einfach zu benutzen.

mfG

Hinweis:
diese Lib geht nur wenn die Pin-Nummern zur Compile-Zeit bekannt sind.

Das ist hier der Fall, aber nicht bei allen Anwendungen

Danke für dein Hilfe :slight_smile: hast mir sehr weitergeholfen.

Zur Direct-Port-Manipulation: Gibt es eine "verständliche" Anleitung auf Deutsch ? :grin: