Newbie Hilfe zu: Arduino Mega 2560 mit Shield v2.2 und 3.2 Touch TFT

Hallo,

ich komme mit meinem Arduino mit Touchpanel einfach nicht weiter .....

Ich möchte mich mit dem Arduino und der Display Fähigkeit beschäftigen, aber scheitere schon an der Hürde das Display mit dem Touchfeld anzusprechen.

Die Hardware besteht aus einem fertiges Kit das ich aus der 'Bucht' bestellt habe.

Es besteht aus:

  • Arduino Mega 2560
  • Shield v2.2 und
  • 3.2 LCD Touch TFT (3.2 tft 320 QDT 9341)

Ich habe mir die Arduino Software installiert und um die Libraries zu erhalten, von RinkyDinkiElekronics, folgende ZIP Files in die Bilbiothek hinzugefügt:

  • URTouch.zip
  • UTFT.zip
  • UTFT_Buttons.zip
  • UTFT_Geometry.zip

Nach dem Einladen des Beispiels 'UTFT_Demo_320x240_Serial_3.ino' hatte ich nur ein weißen Bildschirm am TFT. Erst als ich nach einiger Suche im Internet einen Hinweis gefunden habe, änderte ich die UTFT Anweisung auf "UTFT myGLCD(CTE32_R2,38,39,40,41);" und ich endlich bekam ich auch ein Bild auf das TFT. Auch die TestFiles 'UTFT_Demo_320x240_Serial_3' und 'UTFT_Rotate_Bitmap' sehe ich auf dem TFT.

Somit habe ich ja schon mal ein Bild, aber ich bekomme es nicht hin das Touchfeld anzusprechen.
Das Demoprogramm 'URTouch_ButtonTest_3.2.ino' liefert mir auch mit der Einstellung _myGLCD(CTE32_R2,38,39,40,41); ein Menübild, aber das Touchpanel funktioniert nicht.

// URTouch_ButtonTest 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a quick demo of how create and use buttons.
//
// This program requires the UTFT library.
//
// It is assumed that the display module is connected to an
// appropriate shield or that you know how to change the pin 
// numbers in the setup.
//

#include <UTFT.h>
#include <URTouch.h>

// Initialize display
UTFT    myGLCD(CTE32_R2,38,39,40,41);

// Initialize touchscreen
// ----------------------
URTouch  myTouch( 6, 5, 4, 3, 2);

// Declare which fonts we will be using
extern uint8_t BigFont[];

int x, y;
char stCurrent[20]="";
int stCurrentLen=0;
char stLast[20]="";

/*************************
**   Custom functions   **
*************************/

void drawButtons()
{
// Draw the upper row of buttons
  for (x=0; x<5; x++)
  {
    myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (10+(x*60), 10, 60+(x*60), 60);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (10+(x*60), 10, 60+(x*60), 60);
    myGLCD.printNumI(x+1, 27+(x*60), 27);
  }
// Draw the center row of buttons
  for (x=0; x<5; x++)
  {
    myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (10+(x*60), 70, 60+(x*60), 120);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (10+(x*60), 70, 60+(x*60), 120);
    if (x<4)
      myGLCD.printNumI(x+6, 27+(x*60), 87);
  }
  myGLCD.print("0", 267, 87);
// Draw the lower row of buttons
  myGLCD.setColor(0, 0, 255);
  myGLCD.fillRoundRect (10, 130, 150, 180);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (10, 130, 150, 180);
  myGLCD.print("Clear", 40, 147);
  myGLCD.setColor(0, 0, 255);
  myGLCD.fillRoundRect (160, 130, 300, 180);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (160, 130, 300, 180);
  myGLCD.print("Enter", 190, 147);
  myGLCD.setBackColor (0, 0, 0);
}

void updateStr(int val)
{
  if (stCurrentLen<20)
  {
    stCurrent[stCurrentLen]=val;
    stCurrent[stCurrentLen+1]='\0';
    stCurrentLen++;
    myGLCD.setColor(0, 255, 0);
    myGLCD.print(stCurrent, LEFT, 224);
  }
  else
  {
    myGLCD.setColor(255, 0, 0);
    myGLCD.print("BUFFER FULL!", CENTER, 192);
    delay(500);
    myGLCD.print("            ", CENTER, 192);
    delay(500);
    myGLCD.print("BUFFER FULL!", CENTER, 192);
    delay(500);
    myGLCD.print("            ", CENTER, 192);
    myGLCD.setColor(0, 255, 0);
  }
}

// Draw a red frame while a button is touched
void waitForIt(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}

/*************************
**  Required functions  **
*************************/

void setup()
{
// Initial setup
  myGLCD.InitLCD();
  myGLCD.clrScr();

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(0, 0, 255);
  drawButtons();  
}

void loop()
{
  while (true)
  {
    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      
      if ((y>=10) && (y<=60))  // Upper row
      {
        if ((x>=10) && (x<=60))  // Button: 1
        {
          waitForIt(10, 10, 60, 60);
          updateStr('1');
        }
        if ((x>=70) && (x<=120))  // Button: 2
        {
          waitForIt(70, 10, 120, 60);
          updateStr('2');
        }
        if ((x>=130) && (x<=180))  // Button: 3
        {
          waitForIt(130, 10, 180, 60);
          updateStr('3');
        }
        if ((x>=190) && (x<=240))  // Button: 4
        {
          waitForIt(190, 10, 240, 60);
          updateStr('4');
        }
        if ((x>=250) && (x<=300))  // Button: 5
        {
          waitForIt(250, 10, 300, 60);
          updateStr('5');
        }
      }

      if ((y>=70) && (y<=120))  // Center row
      {
        if ((x>=10) && (x<=60))  // Button: 6
        {
          waitForIt(10, 70, 60, 120);
          updateStr('6');
        }
        if ((x>=70) && (x<=120))  // Button: 7
        {
          waitForIt(70, 70, 120, 120);
          updateStr('7');
        }
        if ((x>=130) && (x<=180))  // Button: 8
        {
          waitForIt(130, 70, 180, 120);
          updateStr('8');
        }
        if ((x>=190) && (x<=240))  // Button: 9
        {
          waitForIt(190, 70, 240, 120);
          updateStr('9');
        }
        if ((x>=250) && (x<=300))  // Button: 0
        {
          waitForIt(250, 70, 300, 120);
          updateStr('0');
        }
      }

      if ((y>=130) && (y<=180))  // Upper row
      {
        if ((x>=10) && (x<=150))  // Button: Clear
        {
          waitForIt(10, 130, 150, 180);
          stCurrent[0]='\0';
          stCurrentLen=0;
          myGLCD.setColor(0, 0, 0);
          myGLCD.fillRect(0, 224, 319, 239);
        }
        if ((x>=160) && (x<=300))  // Button: Enter
        {
          waitForIt(160, 130, 300, 180);
          if (stCurrentLen>0)
          {
            for (x=0; x<stCurrentLen+1; x++)
            {
              stLast[x]=stCurrent[x];
            }
            stCurrent[0]='\0';
            stCurrentLen=0;
            myGLCD.setColor(0, 0, 0);
            myGLCD.fillRect(0, 208, 319, 239);
            myGLCD.setColor(0, 255, 0);
            myGLCD.print(stLast, LEFT, 208);
          }
          else
          {
            myGLCD.setColor(255, 0, 0);
            myGLCD.print("BUFFER EMPTY", CENTER, 192);
            delay(500);
            myGLCD.print("            ", CENTER, 192);
            delay(500);
            myGLCD.print("BUFFER EMPTY", CENTER, 192);
            delay(500);
            myGLCD.print("            ", CENTER, 192);
            myGLCD.setColor(0, 255, 0);
          }
        }
      }
    }
  }
}

Auch mit dem Beispiel aus RinkyDinky 'UTFT_Buttons_Demo_320x240.ino' bekomme ich das Touchpanel nicht hin. Hier erscheinen sogar schon Fehler beim Hochladen:

AppData\Local\Temp\arduino_modified_sketch_946745\UTFT_Buttons_Demo_320x240.ino: In function 'void loop()':
AppData\Local\Temp\arduino_modified_sketch_946745\UTFT_Buttons_Demo_320x240.ino:73:60: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
t1 = myButtons.addButton( 10, 20, 300, 30, "Button 1");

Kann mir jemand helfen den Fehler zu finden ?
Ich weiß nicht mehr weiter......

Gruß
Crusher

Hi

Bei der Suche auf eBay nach dem Shield stolperte ich über folgenden Satz:

  1. Please try to add level-shifters from 5Volt to 3.3Volt to the control lines if you can't run the item.

Wobei nur zwei Zeilen drüber steht, daß das Display 3,3V und 5V kompatible sei.

Hast Du Dir in dem Sketch Mal die Werte für X und Y ausgeben lassen?
Also: Funktioniert das Touch-Pad zumindest schon in groben Zügen?

Da Beides SPI unterstützt, sollte man Clock, MOSI und MISO zusammen fassen können, nur die CS-Pin's müssen separat verbleiben.

MfG

Vielen Dank für die Unterstützung =)

Hier erst noch eine Info die ich eben ausprobiert habe.
Mit den Settings 'UTFT myGLCD(ILI9341_16, 38, 39, 40, 41);' läuft das LCD auch.

Zu der Frage ob ich einen Wert vom Touch bekomme:

Ich bin noch nicht so fit im programmieren und weiß leider nicht wie der Code für so eine Abfrage lautet ...

Ich bekomme mit den Demoprogrammen bsher nur Bilder, Menüs oder Sinuskurven mit Ringen und Kästchen auf das Display.

Gruß
Crusher

Nach längerem suchen, lesen, probieren findet ein blindes Huhn ja auch mal ein Korn.....
Also es geht jetzt.

Mein Lösungsweg:

Arduino Einstellungen:


Werkzeug - Board = Arduino/ Genuino Maga or Mega 2560
Prozessor = ATmega2560 (Mega 2560)
Port = COM 4 (kann bei Euch auch anderst sein)

Librarys:


Librarys im ZIP-Format von RinkyDinkyElectronics runter geladen.
Alle vier Librarys in der Arduino Software hinzufügen

Sketch - Bibliothek einbinden - .ZIP Bibliothek hinzufügen ....

  • URTouch.zip
  • UTFT.zip
  • UTFT_Buttons.zip
  • UTFT_Geometry.zip

Programm öffnen:


Datei - Beispiele - URTOUCH - Arduino - URTOUCH_Button_Test

Bei den Model-Parametern des Display habe ich den Wert in ILI9341_16 ausgetauscht.
UTFT myGLCD(ILI9341_16,38,39,40,41);

Programm hochladen.


Das Programm in den Arduino hochladen.
USB Stecker Raus / USB Stecker rein.

Das Programm läuft, aber das Touchpanel reagiert nicht richtig auf die gedrückte Position.
-> Problem sind die falschen Kalibrierungs-Werte die mit in das Touchpanel übertragen wurden.

Diese Werte stehen im Ordner der Library URTOUCH in der Datei URTouchCD.h.
Wenn man diese Datei mit Notepad++ öffnet sieht man am Ende des Textes die hinterlegten Kalibrierungswerte.

// These calibration settings works with my ITDB02-3.2S.
// They MIGHT work on your 320x240 display module, but you should run the
// calibration sketch anyway. If you are using a display with any other
// resolution you MUST calibrate it as these settings WILL NOT work.
#define CAL_X 0x00378F66UL
#define CAL_Y 0x03C34155UL
#define CAL_S 0x000EF13FUL

Diese Werte sind aber für das ILI9341_16 nicht korrekt.

Kalibrierungswerte für das ILI9341_16 ermitteln:


Im Arduino das Programm für die Kalibrierung öffnen:
Datei - Beispiele - URTOUCH - Arduino - URTOUCH_Button_Calibration

Bei den Model-Parametern des Display habe ich den Wert wieder auf ILI9341_16 ausgetauscht.
UTFT myGLCD(ILI9341_16,38,39,40,41);

Programm hochladen.


Das Programm in den Arduino hochladen.
USB Stecker Raus / USB Stecker rein.

Der Anweisung des Kalibrierungspogrammes folgen und nacheinander mit dem Stift die geforderten Felder auf dem Display drücken.

Am Ende des Programms werden die Kalibrierungsdaten für das ILI9341_16 angezeigt.

Bei mir ist das:

#define CAL_X 0x03BD40EAUL
#define CAL_Y 0x03BD81BDUL
#define CAL_S 0x000EF13FUL

Die Kalibrierungsdatei URTouchCD.h im Libary Ordner nochmals öffnen.
Hier die ungültigen Kalibrierungswerte auskomentieren und die neuen Kalibrierungsdaten hinzuschrieben.
Die geänderte URTouch_CD.h Datei abspeichern.

Testen:


Das Demoprogramm für den Button-Test wieder laden.
Datei - Beispiele - URTOUCH - Arduino - URTOUCH_Button_Test

Model-Parametern kontrollieren.
UTFT myGLCD(ILI9341_16,38,39,40,41);

Programm in denArduino hochladen.

USB Stecker Raus / USB Stecker rein.

Und siehe da es funktioniert endlich so wie es soll .......

#####################################################
Das hat mich als Anfänger ja schon ein paar Nerven gekostet.
Aber ich hoffe das meine Forschungen irgend jemand anderes mal helfen können
#####################################################

Crusher606

Hi

Super Anleitung (ungetestet, Hardware nicht vorhanden) - schade eigentlich, daß ein blindes Huhn nix vom Karma sieht, Welches Du Dir hiermit ohne Zweifel verdient hast!

Besten Dank - so Beiträge darfst Du hier öfter ablassen :wink:

MfG