2,4 "TFT LCD Shield nie działa na Arduino Mega

9

Nawet na stronie internetowej ebay jest wspomniane, że nie mogę używać 2,4-calowego wyświetlacza TFT LCD Shield podłączonego do Arduino Mega. Problem polega na tym, że kupiłem tę tarczę przez pomyłkę. Chcę umieścić tę tarczę na Arduino Mega 2560. Czy jest jakiś sposób na połączenie Mega i 2,4 "Display Shield?

Uwaga: przymierzyłem Arduino Uno mojego przyjaciela. Tarcza działa bardzo dobrze.

Uwaga: zdjęcie poniżej określa moje pytanie. Na wyświetlaczu nie działa kod mojego Arduino. Działa tylko z diodą LED.

wprowadź opis zdjęcia tutaj

    // 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);
}
Zatoka
źródło
1
Reklama na eBayu ma takie nonsensowne stwierdzenie: „Ta tarcza NIE działa z Mega Arduinos, ale będzie o połowę mniejsza niż płyty typu Uno ze względu na sposób, w jaki Mega zmienia rozmieszczenie wszystkich pinów (nie ma sposobu na obejście to!) „Jak może to jednocześnie nie działać i mieć połowę prędkości?
gwideman
Czy używasz wersji 8-bitowej lub 16-bitowej?
LoneWolf
Twój kod mówi, aby używać pinów 38-41, patrząc na obraz, tarcza nawet nie łączy się z pinami 38-41. Definiujesz także inny model lcd dla Mega niż dla UNO. Spróbuj użyć tego samego kodu co uno; więcUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben
Patrząc na to, wygląda na to, że nie działa, ale w końcu będą mieli wolniejszą bibliotekę, aby to działało.

Odpowiedzi:

7

Kilka dni temu kupiłem tę samą osłonę LCD, szukając biblioteki do użycia z płytą MEGA 2560. Znalazłem https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code, który obsługuje zarówno płyty UNO, jak i MEGA .

Użycie jest bardzo proste, jeśli chcemy go użyć dla MEGA , powinniśmy zmienić nagłówek #include "uno_24_shield.h"w SWTFT.cpp na#include "mega_24_shield.h"

Opis (przydatny do dodawania wsparcia dla osłony w innych bibliotekach):

Niezgodność wynika z różnych mapowań portów dla pin-out Arduino między Mega i UNO.

w UNO ekran LCD zostanie podłączony poprzez:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+

w MEGA zostanie połączone poprzez:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
użytkownik3473830
źródło
1
O MÓJ BOŻE!! TO DZIAŁA: D Najpierw pobieram Arduino Enhanced Release 1.0.5 stąd: forum.arduino.cc/index.php/topic,118440.0.html Następnie otworzyłem kod GitHub, a następnie go pobrałem . Otwieram swtft.cpp poprzez program DevC / C ++, który wcześniej pobrałem. Zmieniam linie uno za pomocą: #include „mega_24_shield.h”, następnie przesyłam kod do Mega i to działa. Położyłem tylko 2,4-calowy wyświetlacz TFT LCD na MEGA, nie zrobiłem więcej nic. Po prostu położyłem tarczę na Mega: D Bóg cię ocala: D Bardzo dziękuję. Błąd jest jeszcze od 6 miesięcy. Dzięki.
Zatoka
4

Jednym ze sposobów jest utworzenie arkusza kalkulacyjnego pokazującego pozycje pinów używanych przez tę płytkę oraz sygnały osłony Arduino, do których się podłączają. Obok nich potrzebujesz kolumn pokazujących rzeczywiste sygnały na ATMega2560 (dla Mega2560) i ATMega328 (dla Uno), do których przyłączają się te kołki osłony. Możesz uzyskać te informacje ze schematów rysunków Uno i Mega2560.

W skrócie wygląda na to, że nazwy pinów Arduino dla Uno i Mega są takie same: na przykład, pin pinów „0” (zero cyfrowe) znajduje się w tym samym miejscu na obu płytkach, podobnie jak inne piny.

Jednak na Uno digital-0 dołącza się do bitu 0 portu D ATMega328, podczas gdy w Mega2560, dołącza się do bitu 0 ATMega2560. A z cyfrą 2..7 robi się coraz bardziej tępo.

Teraz, gdy kręcimy bity indywidualnie za pomocą digitalWrite (pin, wartość), biblioteka Arduino bez wątpienia zajmuje się tłumaczeniem na odpowiedni port / bity, które należy ustawić dla używanego układu ATMega i płyty Arduino. Jednak biblioteki, które używają funkcji niższego poziomu (szczególnie jeśli muszą zapisywać całe bajty na portach, jak może to zrobić szybka biblioteka LCD), będą musiały podjąć własne kroki, aby dokonać tego tłumaczenia.

Więc ... pierwszym krokiem jest ustalenie, czy istnieje osobna biblioteka sterowników LCD dla Mega2560.

Następnie sprawdź, czy biblioteka, którą posiadasz, ma kod inicjujący, który ma określać, na której płycie działa (i czy Twoja płyta jest dołączona?), Czy wymaga ustawienia flagi, aby poinformować ją, która płyta jest używana.

W przypadku jego braku, to mogłoby tworzyć bałagan skoczków lub jakiś inny schemat okablowania do zewrzyj Mega na sygnały ATmega2560 tak, że przewodową się jak Uno będzie. Nie jest jasne, czy jest to możliwe, ponieważ część portu D ATMega2560 nie jest nawet podłączona do nagłówka.

Możesz też spojrzeć na kod źródłowy biblioteki i zobaczyć, co ona właściwie robi i co musiałaby zrobić inaczej, aby obsługiwać piny ATMega 2560, z którymi łączy się osłona.

gwideman
źródło
2

Czy sprawdziłeś już stronę główną biblioteki? Strona biblioteki Henninga Karlsena

Opracował instrukcję obsługi biblioteki. W dokumencie dotyczącym wymagań znajduje się również odniesienie do tego, który pin idzie gdzie.

Samotny wilk
źródło
0

Musisz porównać funkcje pinów między Mega a Uno twojego przyjaciela. Następnie musisz wykonać połączenia elektryczne. Mówię o tym trochę w sekcji „lokalizacje pinów” mojej odpowiedzi tutaj .

Wymaga to „hakowania”. Trzeba coś zrobić, aby przekierować te fizyczne połączenia. Zwykle używam tarczy pośredniej do translacji pinów w razie potrzeby. Specjalnie do tego celu stworzono tarczę, ale nie mogłem jej znaleźć. Może to zadziała ?

Chris K.
źródło
SPI nie stanowi problemu, ponieważ tarcza używa obrazu D0-D7 . Jakie inne rzeczy mogą na to wpłynąć?
Anonimowy pingwin