2,4 "TFT LCD Shield funktioniert nicht mit Arduino Mega


9

Selbst auf der Website von ebay wird erwähnt, dass ich beim Anbringen an Arduino Mega kein 2,4-Zoll-TFT-LCD-Shield-Display verwenden kann. Das Problem ist, dass ich dieses Shield versehentlich gekauft habe. Ich möchte dieses Shield auf Arduino Mega 2560 setzen. Gibt es ein Weg, um Mega und 2,4 "Display Shield zu kombinieren?

Hinweis: Ich habe das Arduino Uno meines Freundes anprobiert. Schild funktioniert sehr gut.

Hinweis: Das Foto unten bestimmt meine Frage. Auf dem Display wird der Code meines Arduino nicht ausgeführt. Es läuft nur seine LED.

Geben Sie hier die Bildbeschreibung ein

    // UTFT_Demo_320x240 (C)2012 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// This program is a demo of how to use most of the functions
// of the library with a supported display modules.
//
// This demo was made for modules with a screen resolution 
// of 320x240 pixels.
//
// This program requires the UTFT library.
//

#include <UTFT.h>
#define ILI9320_16 18
// Declare which fonts we will be using
extern uint8_t SmallFont[];

// Uncomment the next line for Arduino 2009/Uno
//UTFT myGLCD(UNO_24,A2,A1,A3,A4);   // Remember to change the model parameter to suit your display module!

// Uncomment the next line for Arduino Mega
UTFT myGLCD(ILI9320_16,38,39,40,41);   // Remember to change the model parameter to suit your display module!

void setup()
{
  randomSeed(analogRead(0));

// Setup the LCD
  pinMode(A0,OUTPUT);       // for the UNO_SHIELD_1IN1
  digitalWrite(A0,HIGH);    // the RD pin must be set high
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
}

void loop()
{
  int buf[318];
  int x, x2;
  int y, y2;
  int r;

// Clear the screen and draw the frame
  myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 319, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.fillRect(0, 226, 319, 239);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
  myGLCD.setBackColor(64, 64, 64);
  myGLCD.setColor(255,255,0);
  myGLCD.print("<http://electronics.henningkarlsen.com>", CENTER, 227);

  myGLCD.setColor(0, 0, 255);
  myGLCD.drawRect(0, 14, 319, 225);

// Draw crosshairs
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(159, 15, 159, 224);
  myGLCD.drawLine(1, 119, 318, 119);
  for (int i=9; i<310; i+=10)
    myGLCD.drawLine(i, 117, i, 121);
  for (int i=19; i<220; i+=10)
    myGLCD.drawLine(157, i, 161, i);

// Draw sin-, cos- and tan-lines  
  myGLCD.setColor(0,255,255);
  myGLCD.print("Sin", 5, 15);
  for (int i=1; i<318; i++)
  {
    myGLCD.drawPixel(i,119+(sin(((i*1.13)*3.14)/180)*95));
  }

  myGLCD.setColor(255,0,0);
  myGLCD.print("Cos", 5, 27);
  for (int i=1; i<318; i++)
  {
    myGLCD.drawPixel(i,119+(cos(((i*1.13)*3.14)/180)*95));
  }

  myGLCD.setColor(255,255,0);
  myGLCD.print("Tan", 5, 39);
  for (int i=1; i<318; i++)
  {
    myGLCD.drawPixel(i,119+(tan(((i*1.13)*3.14)/180)));
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(159, 15, 159, 224);
  myGLCD.drawLine(1, 119, 318, 119);

// Draw a moving sinewave
  x=1;
  for (int i=1; i<(318*20); i++) 
  {
    x++;
    if (x==319)
      x=1;
    if (i>319)
    {
      if ((x==159)||(buf[x-1]==119))
        myGLCD.setColor(0,0,255);
      else
        myGLCD.setColor(0,0,0);
      myGLCD.drawPixel(x,buf[x-1]);
    }
    myGLCD.setColor(0,255,255);
    y=119+(sin(((i*1.1)*3.14)/180)*(90-(i / 100)));
    myGLCD.drawPixel(x,y);
    buf[x-1]=y;
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some filled rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRect(70+(i*20), 30+(i*20), 130+(i*20), 90+(i*20));
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some filled, rounded rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRoundRect(190-(i*20), 30+(i*20), 250-(i*20), 90+(i*20));
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some filled circles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillCircle(100+(i*20),60+(i*20), 30);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some lines in a pattern
  myGLCD.setColor (255,0,0);
  for (int i=15; i<224; i+=5)
  {
    myGLCD.drawLine(1, i, (i*1.44)-10, 224);
  }
  myGLCD.setColor (255,0,0);
  for (int i=224; i>15; i-=5)
  {
    myGLCD.drawLine(318, i, (i*1.44)-11, 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=224; i>15; i-=5)
  {
    myGLCD.drawLine(1, i, 331-(i*1.44), 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=15; i<224; i+=5)
  {
    myGLCD.drawLine(318, i, 330-(i*1.44), 224);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some random circles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=32+random(256);
    y=45+random(146);
    r=random(30);
    myGLCD.drawCircle(x, y, r);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some random rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(316);
    y=16+random(207);
    x2=2+random(316);
    y2=16+random(207);
    myGLCD.drawRect(x, y, x2, y2);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

// Draw some random rounded rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(316);
    y=16+random(207);
    x2=2+random(316);
    y2=16+random(207);
    myGLCD.drawRoundRect(x, y, x2, y2);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(316);
    y=16+random(209);
    x2=2+random(316);
    y2=16+random(209);
    myGLCD.drawLine(x, y, x2, y2);
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,318,224);

  for (int i=0; i<10000; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    myGLCD.drawPixel(2+random(316), 16+random(209));
  }

  delay(2000);

  myGLCD.fillScr(0, 0, 255);
  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRoundRect(80, 70, 239, 169);

  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("That's it!", CENTER, 93);
  myGLCD.print("Restarting in a", CENTER, 119);
  myGLCD.print("few seconds...", CENTER, 132);

  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.print("Runtime: (msecs)", CENTER, 210);
  myGLCD.printNumI(millis(), CENTER, 225);

  delay (10000);
}

1
Die eBay-Anzeige hat diese unsinnige Aussage: "Dieses Schild funktioniert NICHT mit den Mega Arduinos, aber es wird halb so schnell sein wie die Uno-Boards, da das Mega alle Pins neu anordnet (es gibt keine Möglichkeit, sich fortzubewegen." dies!) "Wie kann es gleichzeitig nicht funktionieren und halbe Geschwindigkeit sein?
Gwideman

Verwenden Sie die 8-Bit- oder die 16-Bit-Version?
LoneWolf

Ihr Code besagt, dass Sie die Stifte 38-41 verwenden müssen, während Sie sich das Bild ansehen. Die Abschirmung ist nicht einmal mit den Stiften 38-41 verbunden. Sie definieren auch ein anderes LCD-Modell für die Mega als für die UNO. Versuchen Sie, denselben Code wie uno zu verwenden. soUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben

Wenn man sich den Wortlaut ansieht, hört es sich so an, als würde er nicht funktionieren, aber irgendwann werden sie eine langsamere Bibliothek haben, damit er funktioniert.

Antworten:


7

Ich war zufällig gerade vor dem gleichen LCD - Shields ein paar Tage zu kaufen, für eine Bibliothek suchen , um es mit einer MEGA 2560 Board zu verwenden Ich fand https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code die unterstützt sowohl UNO- als auch MEGA- Boards.

Die Benutzung ist sehr, einfach , wenn wir es benutzen wollen für MEGA sollten wir den Header ändern #include "uno_24_shield.h"in SWTFT.cpp zu#include "mega_24_shield.h"

Beschreibung (nützlich zum Hinzufügen von Unterstützung für das Schild in anderen Bibliotheken):

Die Inkompatibilität ergibt sich aus verschiedenen Port-Zuordnungen für die Arduino-Pinbelegung zwischen Mega und UNO.

in UNO LCD-Abschirmung wird verbunden durch:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| LCD Data Bit  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| Digital pin # |  7  |  6  |  5  |  4  |  3  |  2  |  9  |  8  |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| Uno port/pin  | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PB1 | PB0 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+

in MEGA wird es verbunden durch:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| LCD Data Bit  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| Digital pin # |  7  |  6  |  5  |  4  |  3  |  2  |  9  |  8  |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| MEGA port/pin | PH4 | PH3 | PE3 | PG5 | PE5 | PE4 | PH6 | PH5 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+

1
OH MEIN GOTT!! ES FUNKTIONIERT: D Zuerst lade ich Arduino Enhanced Release 1.0.5 von hier herunter: forum.arduino.cc/index.php/topic,118440.0.html Dann habe ich Ihren GitHub-Code geöffnet und dann heruntergeladen. Ich öffne swtft.cpp über das DevC / C ++ - Programm, das ich zuvor heruntergeladen habe. Ich ändere Uno-Zeilen mit diesen: #include "mega_24_shield.h", dann lade ich den Code in Mega hoch und es hat funktioniert. Ich habe nur das 2,4 "TFT LCD auf MEGA gelegt, ich habe keine Verbindung mehr hergestellt. Nur ich habe das Schild auf Mega gelegt: D Gott rettet dich: D Ganz besonderes Dankeschön. Der Fehler ist immer noch seit 6 Monaten. Danke.
Bay

4

Eine Möglichkeit, fortzufahren, besteht darin, eine Tabelle zu erstellen, in der die von dieser Karte verwendeten Stiftpositionen und die Arduino-Abschirmungssignale aufgeführt sind, an die sie angeschlossen sind. Daneben benötigen Sie Spalten mit den tatsächlichen Signalen des ATMega2560 (für Mega2560) und des ATMega328 (für Uno), an die diese Abschirmungsstifte angeschlossen sind. Sie können diese Informationen aus den schematischen Zeichnungen von Uno und Mega2560 abrufen.

Auf den ersten Blick scheinen die Namen der Arduino-Abschirmungsstifte für Uno und Mega identisch zu sein: Beispielsweise befindet sich der Abschirmungsstift '0' (digitale Null) auf beiden Platinen an derselben Stelle und auch für andere Stifte.

Beim Uno Digital-0 wird jedoch an ATMega328 Port D Bit 0 angeschlossen, während beim Mega2560 an ATMega2560 Port E Bit 0 angeschlossen wird. Mit Digital 2..7 wird es stumpfer.

Wenn Sie nun Bits einzeln mit digitalWrite (Pin, Wert) drehen, kümmert sich die Arduino-Bibliothek zweifellos um die Übersetzung in die entsprechenden Ports, die für den verwendeten ATMega-Chip und die verwendete Arduino-Karte eingestellt werden müssen. Bibliotheken, die Funktionen niedrigerer Ebene verwenden (insbesondere wenn sie ganze Bytes in Ports schreiben müssen, wie dies bei einer schnellen LCD-Bibliothek der Fall sein könnte), müssen jedoch ihre eigenen Schritte unternehmen, um diese Übersetzung durchzuführen.

Der erste Schritt besteht darin, festzustellen, ob es für Mega2560 eine separate LCD-Treiberbibliothek gibt.

Untersuchen Sie als Nächstes, ob die Bibliothek, über die Sie verfügen, über einen Initialisierungscode verfügt, der bestimmen soll, auf welcher Karte sie ausgeführt wird (und ist Ihre Karte enthalten?), Oder ob Sie ein Flag setzen müssen, um anzugeben, welche Karte verwendet wird.

Andernfalls könnten Sie ein Durcheinander von Steckbrücken oder ein anderes Verdrahtungsschema erzeugen, um die Signale des Mega ATMega2560 so zu überbrücken, dass sie wie ein Uno verkabelt sind. Es ist nicht klar, dass dies möglich ist, da ein Teil von Port D des ATMega2560 nicht einmal mit einem Header verbunden ist.

Oder Sie sehen sich den Quellcode der Bibliothek an und sehen, was sie tatsächlich tut und was sie anders machen müsste, um die ATMega 2560-Pins zu bedienen, mit denen die Abschirmung verbunden ist.



0

Sie müssen die Funktionen der Pins zwischen Ihrem Mega und dem Uno Ihres Freundes vergleichen. Dann müssen Sie diese elektrischen Verbindungen herstellen. Ich spreche darüber ein wenig im Abschnitt "Pin-Positionen" meiner Antwort hier .

Dies erfordert "Hacking". Es muss etwas getan werden, um diese physischen Verbindungen umzuleiten. Normalerweise verwende ich einen Zwischenschild, um die Stifte nach Bedarf zu verschieben. Es gab einen Schild, der speziell für diesen Zweck hergestellt wurde, aber ich konnte ihn nicht finden. Vielleicht würde dieser funktionieren ?


SPI ist kein Problem, da die Abschirmung das Bild D0-D7 verwendet . Welche anderen Dinge könnten dies beeinflussen?
Anonymer Pinguin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.