O TFT LCD Shield de 2,4 "não está funcionando no Arduino Mega

9

Mesmo no site do ebay , é mencionado que eu não posso usar a tela TFT LCD de 2,4 "conectada ao Arduino Mega. O problema é que eu comprei esse escudo por engano. Quero colocar esse escudo no Arduino Mega 2560. Existe algum maneira de combinar Mega e 2.4 "Display Shield?

nota: experimentei o Arduino Uno do meu amigo. Shield está funcionando muito bem.

Nota: A foto abaixo está determinando minha pergunta. A tela não roda o código do meu Arduino. Ele apenas executa seu LED.

insira a descrição da imagem aqui

    // 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);
}
Baía
fonte
11
O anúncio do eBay tem esta afirmação absurda: "Esse escudo NÃO funciona com os Mega Arduinos, mas será metade da velocidade das placas Uno-type, devido à maneira como o Mega reorganiza todos os pinos (não há como se locomover" this!) "Como ele pode não funcionar simultaneamente e ter meia velocidade?
precisa saber é o seguinte
Você está usando a versão de 8 bits ou 16 bits?
LoneWolf
Seu código diz para usar os pinos 38-41 enquanto olha para a imagem em que a blindagem nem se conecta aos pinos 38-41. Você também está definindo um modelo de lcd diferente para o Mega e para o UNO. Tente usar o mesmo código que o uno; assimUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben
Olhando para o texto, parece que não funciona, mas eventualmente eles terão uma biblioteca mais lenta para fazê-lo funcionar.

Respostas:

7

Aconteceu de eu comprar as mesmas Shields LCD há poucos dias, à procura de uma biblioteca para usá-lo com uma placa MEGA 2560 eu encontrei https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code que suporta placas UNO e MEGA .

O uso é muito simples, se quisermos usá-lo para o MEGA , devemos mudar o cabeçalho #include "uno_24_shield.h"no SWTFT.cpp para#include "mega_24_shield.h"

Descrição (útil para adicionar suporte para o escudo em outras bibliotecas):

A incompatibilidade vem de diferentes mapeamentos de portas para o pin-out do Arduino entre o Mega e o UNO.

no escudo UNO LCD será conectado através de:

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

no MEGA, ele será conectado através de:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
user3473830
fonte
11
OH MEU DEUS!! ESTÁ FUNCIONANDO: D Primeiro baixei o Arduino Enhanced Release 1.0.5 a partir daqui: forum.arduino.cc/index.php/topic,118440.0.html Em seguida, abri o código do GitHub e depois baixei. Abro o swtft.cpp através do programa DevC / C ++ que baixei antes. Altero as linhas uno com estas: #include "mega_24_shield.h", depois carrego o código no Mega e funcionou. Coloquei apenas o LCD TFT de 2,4 "no MEGA, não fiz mais nada. Só coloquei o escudo no Mega: D Deus te salva: D Muito obrigado, muito obrigado. O erro ainda está em 6 meses. Obrigado.
Bay
4

Uma maneira de proceder é criar uma planilha mostrando as posições dos pinos usados ​​por esta placa e os sinais de blindagem do Arduino aos quais eles se conectam. Além disso, você precisa de colunas que mostrem os sinais reais no ATMega2560 (para Mega2560) e ATMega328 (para Uno) aos quais esses pinos de blindagem se conectam. Você pode obter essas informações nos desenhos esquemáticos do Uno e Mega2560.

Em uma rápida olhada, parece que os nomes dos pinos de blindagem do Arduino para Uno e Mega são os mesmos: por exemplo, o pino de blindagem '0' (zero digital) está no mesmo local em ambas as placas e da mesma forma para outros pinos.

No entanto, no Uno digital-0 é anexado ao ATMega328 Porta D bit 0, enquanto no Mega2560, ele é anexado ao ATMega2560 Porta E bit 0. E as coisas ficam mais obtusas com o digital 2..7.

Agora, ao girar bits individualmente usando digitalWrite (pino, valor), a biblioteca do Arduino, sem dúvida, cuida da conversão para a porta / bits apropriados que precisam ser configurados para o chip ATMega e a placa Arduino que estão em uso. No entanto, as bibliotecas que usam funções de nível inferior (especialmente se precisarem gravar bytes inteiros nas portas, como uma biblioteca rápida do LCD) precisarão seguir suas próprias etapas para fazer essa tradução.

Então ... o primeiro passo é determinar se existe uma biblioteca de drivers de LCD separada para o Mega2560.

Em seguida, investigue se a biblioteca que você possui possui um código de inicialização que deve determinar em qual placa está sendo executada (e sua placa está incluída?) Ou requer que você defina algum sinalizador para informar qual placa está sendo usada.

Se isso não acontecer, você poderá criar uma confusão de jumpers ou algum outro esquema de fiação para pular os sinais do Megaega2560 do Mega, para que ele seja conectado como um Uno. Não está claro se isso é possível, uma vez que algumas das portas D do ATMega2560 nem estão conectadas a um cabeçalho.

Ou você pode olhar o código fonte da biblioteca e ver o que ela está realmente fazendo e o que seria necessário para operar os pinos do ATMega 2560 aos quais o escudo se conecta.

gwideman
fonte
2

Você verificou a página inicial da Biblioteca? Página da biblioteca de Henning Karlsen

Ele fez um manual do usuário para a biblioteca. Há também uma referência a qual pino vai para onde no documento de requisitos.

Lobo solitário
fonte
0

Você precisa comparar as funções dos pinos entre o Mega e o Uno do seu amigo. Então você precisa fazer essas conexões elétricas acontecerem. Eu falo sobre isso um pouco na seção "localizações dos pinos" da minha resposta aqui .

Isso requer "hacking". Algo precisa ser feito para redirecionar essas conexões físicas. Normalmente, uso um escudo intermediário para traduzir os pinos conforme necessário. Havia um escudo feito especificamente para esse fim, mas não consegui encontrá-lo. Talvez este funcionasse ?

Chris K
fonte
SPI não é um problema, como o escudo está usando D0-D7 imagem . Que outras coisas poderiam afetar isso?
Anonymous Penguin