2.4 "TFT LCD Shield no funciona en Arduino Mega

9

Incluso en el sitio web de eBay se menciona que no puedo usar la pantalla TFT LCD Shield de 2.4 "en el adjunto a Arduino Mega. El problema es que compré este escudo por error. Quiero poner este escudo en Arduino Mega 2560. ¿Hay un ¿Cómo combinar Mega y 2.4 "Display Shield?

nota: probé el Arduino Uno de mi amigo. Shield está funcionando muy bien.

nota: La foto a continuación está determinando mi pregunta. La pantalla no ejecuta el código de mi Arduino. Solo ejecuta su LED.

ingrese la descripción de la imagen aquí

    // 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);
}
Bahía
fuente
1
El anuncio de eBay tiene esta afirmación sin sentido: "Este escudo NO funciona con los Mega Arduinos, pero va a ser la mitad de la velocidad de los tableros Uno-type debido a la forma en que Mega reorganiza todos los pines (no hay forma de moverse) esto!) "¿Cómo puede simultáneamente no funcionar, y ser la mitad de velocidad?
gwideman
¿Está utilizando la versión de 8 bits o la de 16 bits?
LoneWolf
Su código dice que use los pines 38-41 mientras mira la imagen, el escudo ni siquiera se conecta a los pines 38-41. También está definiendo un modelo lcd diferente para Mega que para UNO. Intente usar el mismo código que el uno; entoncesUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben
Mirando la redacción, parece que no funciona, pero eventualmente tendrán una biblioteca más lenta para que funcione.

Respuestas:

7

Acabo de comprar los mismos LCD Shields hace unos días, buscando una biblioteca para usarlo con una placa MEGA 2560 encontré https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code que soporta los tableros UNO y MEGA .

El uso es muy simple si queremos usarlo para MEGA , debemos cambiar el encabezado #include "uno_24_shield.h"en SWTFT.cpp a#include "mega_24_shield.h"

Descripción (útil para agregar soporte para el escudo en otras bibliotecas):

La incompatibilidad proviene de diferentes asignaciones de puertos para el pin-out de Arduino entre Mega y UNO.

en UNO el escudo LCD se conectará a travé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 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+

en MEGA se conectará a travé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 |
+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
usuario3473830
fuente
1
¡¡OH DIOS MÍO!! ESTÁ FUNCIONANDO: D Primero descargo Arduino Enhanced Release 1.0.5 desde aquí: forum.arduino.cc/index.php/topic,118440.0.html Luego abrí su código de GitHub y luego lo descargué. Abro swtft.cpp a través del programa DevC / C ++ que descargué antes. Cambio las líneas uno con estas: #include "mega_24_shield.h", luego subo el código a Mega y funcionó. Solo puse el LCD TFT de 2.4 "en MEGA, no hice nada más de conexión. Solo puse el escudo en Mega: D Dios te salva: D Muy especial gracias. El error ha estado durante 6 meses. Gracias.
Bahía
4

Una forma de proceder es crear una hoja de cálculo que muestre las posiciones de los pines utilizados por esta placa y las señales del escudo Arduino en las que se conectan. Junto a estos, necesita columnas que muestren las señales reales en ATMega2560 (para Mega2560) y ATMega328 (para Uno) a las que se conectan estos pines de protección. Puede obtener esta información de los dibujos esquemáticos Uno y Mega2560.

En un vistazo rápido, parece que los nombres de los pines del escudo Arduino para Uno y Mega son los mismos: por ejemplo, el pin del escudo '0' (cero digital) está en la misma ubicación en ambas placas, y lo mismo para otros pines.

Sin embargo, en el Uno digital-0 se conecta al ATMega328 Puerto D bit 0, mientras que en el Mega2560, se conecta al ATMega2560 Puerto E bit 0. Y las cosas se vuelven más obtusas con el digital 2..7.

Ahora, al girar bits individualmente usando digitalWrite (pin, valor), la biblioteca Arduino sin duda se encarga de traducir al puerto / bits apropiados que deben establecerse para el chip ATMega y la placa Arduino que está en uso. Sin embargo, las bibliotecas que usan funciones de nivel inferior (especialmente si necesitan escribir bytes enteros en los puertos, como lo haría una biblioteca LCD rápida) deberán realizar sus propios pasos para realizar esta traducción.

Entonces ... el primer paso es determinar si hay una biblioteca de controladores LCD separada para Mega2560.

A continuación, investigue si la biblioteca que tiene tiene un código de inicialización que se supone que determina en qué placa se está ejecutando (¿y está incluida su placa?), O si necesita establecer algún indicador para indicar qué placa está en uso.

De lo contrario, podría crear un lío de puentes o algún otro esquema de cableado para puentear las señales del Mega ATMega2560 del Mega para que esté conectado como lo estaría un Uno. No está claro que esto sea posible, ya que parte del puerto D de ATMega2560 ni siquiera está conectado a un encabezado.

O puede mirar el código fuente de la biblioteca y ver qué está haciendo realmente, y qué necesitaría hacer diferente para operar los pines ATMega 2560 a los que se conecta el escudo.

gwideman
fuente
2

¿Has visitado la página de inicio de la biblioteca? Página de la biblioteca de Henning Karlsen

Ha hecho un manual de usuario para la biblioteca. También hay una referencia a qué pin va y dónde en el documento de requisitos.

Lobo solitario
fuente
0

Debes comparar las funciones de los pines entre tu Mega y el Uno de tu amigo. Entonces necesita hacer que esas conexiones eléctricas sucedan. Hablo un poco sobre esto en la sección "ubicaciones de pin" de mi respuesta aquí .

Esto requiere "piratería". Se necesita hacer algo para redirigir esas conexiones físicas. Normalmente uso un escudo intermedio para traducir pines según sea necesario. Había un escudo hecho específicamente para este propósito, pero no pude encontrarlo. ¿Quizás este funcionaría ?

Chris K
fuente
SPI no es un problema, ya que el escudo está utilizando D0-D7 imagen . ¿Qué otras cosas podrían afectar esto?
Anonymous Penguin