Le blindage LCD TFT 2,4 "ne fonctionne pas sur Arduino Mega


9

Même sur le site Web d'Ebay, il est mentionné que je ne peux pas utiliser l'écran de blindage LCD TFT 2,4 "pour le connecter à Arduino Mega. Le problème est que j'ai acheté ce bouclier par erreur. Je veux mettre ce bouclier sur Arduino Mega 2560. Y a-t-il un moyen de combiner Mega et 2,4 "Display Shield?

note: J'ai essayé l'Arduino Uno de mon ami. Shield fonctionne très bien.

note: La photo ci-dessous détermine ma question. L'écran n'exécute pas le code de mon Arduino. Il ne fait fonctionner que sa LED.

entrez la description de l'image ici

    // 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
L'annonce eBay a cette déclaration absurde: "Ce bouclier ne fonctionne PAS avec les Mega Arduinos mais sa va être la moitié de la vitesse des cartes de type Uno en raison de la façon dont la Mega réorganise toutes les broches (il n'y a aucun moyen de se déplacer cela!) "Comment cela peut-il ne pas fonctionner simultanément et être à mi-vitesse?
gwideman

Utilisez-vous la version 8 bits ou 16 bits?
LoneWolf

Votre code dit d'utiliser les broches 38-41 tout en regardant l'image, le bouclier ne se connecte même pas aux broches 38-41. Vous définissez également un modèle lcd différent pour le Mega que pour l'UNO. Essayez d'utiliser le même code que l'uno; doncUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben

En regardant le libellé, il semble que cela ne fonctionne pas, mais finalement ils auront une bibliothèque plus lente pour le faire fonctionner.

Réponses:


7

Je viens d'acheter les mêmes écrans LCD il y a quelques jours, à la recherche d'une bibliothèque pour l'utiliser avec une carte MEGA 2560, j'ai trouvé https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code qui prend en charge les cartes UNO et MEGA .

L'utilisation est très simple si nous voulons l'utiliser pour MEGA, nous devons changer l'en-tête #include "uno_24_shield.h"dans SWTFT.cpp en#include "mega_24_shield.h"

Description (utile pour ajouter un support pour le bouclier dans d'autres bibliothèques):

L'incompatibilité provient de différents mappages de ports pour le brochage Arduino entre Mega et UNO.

dans UNO LCD shield sera connecté par:

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

dans MEGA, il sera connecté via:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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 MON DIEU!! CELA FONCTIONNE: D D'abord, je télécharge Arduino Enhanced Release 1.0.5 à partir d'ici: forum.arduino.cc/index.php/topic,118440.0.html Ensuite, j'ai ouvert votre code GitHub puis je l'ai téléchargé. J'ouvre swtft.cpp via le programme DevC / C ++ que j'ai téléchargé auparavant. Je change les lignes uno avec celles-ci: #include "mega_24_shield.h" puis je télécharge le code dans Mega et cela a fonctionné. Je ne mets que l'écran LCD TFT 2,4 "sur MEGA, je n'ai plus fait de connexion. Je mets juste le bouclier sur Mega: D Dieu vous sauve: D Merci très spécial. L'erreur est toujours depuis 6 mois. Merci.
Bay

4

Une façon de procéder consiste à créer une feuille de calcul indiquant les positions des broches utilisées par cette carte et les signaux de blindage Arduino auxquels ils se connectent. À côté de ceux-ci, vous avez besoin de colonnes montrant les signaux réels sur l'ATMega2560 (pour Mega2560) et l'ATMega328 (pour Uno) auxquels ces broches de blindage se fixent. Vous pouvez obtenir ces informations à partir des dessins schématiques Uno et Mega2560.

En un coup d'œil, il semble que les noms des broches de blindage Arduino pour Uno et Mega soient les mêmes: par exemple, la broche de blindage '0' (zéro numérique) est au même emplacement sur les deux cartes, et de même pour les autres broches.

Cependant, sur l'Uno digital-0 se connecte au bit 0 du port D ATMega328, tandis que sur le Mega2560, il se connecte au bit 0 du port E ATMega2560. Et les choses deviennent plus obtuses avec le numérique 2..7.

Désormais, lors du twiddling de bits individuellement à l'aide de digitalWrite (broche, valeur), la bibliothèque Arduino se charge sans aucun doute de traduire le port / les bits appropriés qui doivent être définis pour la puce ATMega et la carte Arduino qui sont en cours d'utilisation. Cependant, les bibliothèques qui utilisent des fonctions de niveau inférieur (en particulier si elles ont besoin d'écrire des octets entiers sur les ports, comme une bibliothèque LCD rapide peut le faire) devront prendre leurs propres mesures pour effectuer cette traduction.

Donc ... la première étape consiste à déterminer s'il existe une bibliothèque de pilotes LCD distincte pour Mega2560.

Ensuite, vérifiez si la bibliothèque que vous avez possède un code d'initialisation qui est censé déterminer sur quelle carte elle s'exécute (et votre carte est-elle incluse?), Ou vous demande de définir un indicateur pour lui indiquer quelle carte est utilisée.

À défaut, vous pourriez créer un gâchis de cavaliers ou un autre schéma de câblage pour brancher les signaux du Mega ATMega2560 de sorte qu'il soit câblé comme le ferait un Uno. Il n'est pas clair que cela soit possible, car une partie du port D de l'ATMega2560 n'est même pas câblée à un en-tête.

Ou vous pouvez regarder le code source de la bibliothèque et voir ce qu'elle fait réellement, et ce qu'il faudrait faire différemment pour faire fonctionner les broches ATMega 2560 auxquelles le bouclier se connecte.



0

Vous devez comparer les fonctions des broches entre votre Mega et l'Uno de votre ami. Ensuite, vous devez effectuer ces connexions électriques. J'en parle un peu dans la section "emplacements des broches" de ma réponse ici .

Cela nécessite un "piratage". Quelque chose doit être fait pour rediriger ces connexions physiques. J'utilise normalement un bouclier intermédiaire pour traduire les broches au besoin. Il y avait un bouclier spécialement conçu à cet effet, mais je ne l'ai pas trouvé. Peut-être que celui-ci fonctionnerait ?


SPI est pas un problème, car le bouclier utilise D0-D7 image . Quelles autres choses pourraient affecter cela?
Anonymous Penguin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.