2,4 "TFT LCD Shield tidak berfungsi pada Arduino Mega


9

Bahkan di situs web ebay disebutkan bahwa saya tidak dapat menggunakan layar LCD TFT 2.4 "yang terpasang pada Arduino Mega. Masalahnya adalah saya membeli perisai ini secara tidak sengaja. Saya ingin meletakkan perisai ini ke Arduino Mega 2560. Apakah ada cara untuk menggabungkan Mega dan 2.4 "Display Shield?

Catatan: Saya mencoba Arduino Uno teman saya. Shield bekerja dengan sangat baik.

Catatan: Foto di bawah ini menentukan pertanyaan saya. Layar tidak menjalankan kode Arduino saya. Ini hanya menjalankan LED-nya.

masukkan deskripsi gambar di sini

    // 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
Iklan eBay memiliki pernyataan tidak masuk akal ini: "Perisai ini TIDAK bekerja dengan Mega Arduinos tetapi itu akan menjadi setengah kecepatan papan tipe Uno karena cara Mega menata ulang semua pin (tidak ada cara untuk berkeliling ini!) "Bagaimana bisa secara bersamaan tidak bekerja, dan setengah kecepatan?
gwideman

Apakah Anda menggunakan versi 8bit atau 16bit?
LoneWolf

Kode Anda mengatakan untuk menggunakan pin 38-41 sambil melihat gambar perisai bahkan tidak terhubung ke pin 38-41. Anda juga mendefinisikan model lcd yang berbeda untuk Mega daripada untuk UNO. Coba gunakan kode yang sama dengan uno; jadiUTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben

Melihat kata-katanya, sepertinya itu tidak berhasil, tetapi pada akhirnya mereka akan memiliki perpustakaan yang lebih lambat untuk membuatnya bekerja.

Jawaban:


7

Saya kebetulan membeli Perisai LCD yang sama beberapa hari yang lalu, mencari perpustakaan untuk menggunakannya dengan papan MEGA 2560 yang saya temukan https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code yang mendukung papan UNO dan MEGA .

Penggunaannya sangat, sederhana jika kita ingin menggunakannya untuk MEGA kita harus mengubah header #include "uno_24_shield.h"di SWTFT.cpp menjadi#include "mega_24_shield.h"

Deskripsi (berguna untuk menambahkan dukungan untuk perisai di perpustakaan lain):

Ketidakcocokan berasal dari pemetaan Port yang berbeda untuk pin-out Arduino antara Mega dan UNO.

di UNO LCD perisai akan terhubung melalui:

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

di MEGA itu akan terhubung melalui:

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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
YA TUHAN!! BEKERJA: D Pertama saya unduh Arduino Enhanced Release 1.0.5 dari sini: forum.arduino.cc/index.php/topic, 118440.0.html Lalu saya membuka kode GitHub Anda lalu mengunduhnya. Saya membuka swtft.cpp melalui program DevC / C ++ yang saya unduh sebelumnya. Saya mengubah satu baris dengan yang berikut ini: #sertakan "mega_24_shield.h" lalu saya unggah kodenya ke Mega dan berhasil. Saya hanya meletakkan 2,4 "LCD TFT ke MEGA, saya tidak membuat lebih banyak koneksi. Hanya saya menempatkan perisai ke Mega: D Tuhan menyelamatkan Anda: D Sangat istimewa terima kasih. Kesalahannya masih selama 6 bulan. Terima kasih.
Bay

4

Cara untuk melanjutkan adalah membuat spreadsheet yang menunjukkan posisi pin yang digunakan oleh board ini, dan sinyal pelindung Arduino yang mereka tancapkan. Di sebelah ini, Anda perlu kolom yang menunjukkan sinyal aktual pada ATMega2560 (untuk Mega2560) dan ATMega328 (untuk Uno) yang ditempelkan oleh pin perisai ini. Anda bisa mendapatkan info ini dari gambar skematik Uno dan Mega2560.

Dalam sekilas, tampaknya nama pin perisai Arduino untuk Uno dan Mega adalah sama: misalnya, pin perisai '0' (nol digital) berada di lokasi yang sama di kedua papan, dan juga untuk pin lainnya.

Namun, pada Uno digital-0 menempel pada ATMega328 Port D bit 0, sedangkan pada Mega2560, ia melekat pada ATMega2560 Port E bit 0. Dan hal-hal menjadi lebih tumpul dengan digital 2..7.

Sekarang, ketika memutar-mutar bit secara individual menggunakan digitalWrite (pin, value), perpustakaan Arduino pasti akan menerjemahkan ke port / bit yang sesuai yang perlu diatur untuk chip ATMega dan papan Arduino yang digunakan. Namun, pustaka yang menggunakan fungsi tingkat rendah (terutama jika mereka perlu menulis seluruh byte ke port, seperti pustaka LCD yang cepat) akan perlu mengambil langkah mereka sendiri untuk membuat terjemahan ini.

Jadi ... langkah pertama adalah menentukan apakah ada pustaka driver LCD terpisah untuk Mega2560.

Selanjutnya, selidiki apakah pustaka yang Anda miliki memiliki kode inisialisasi yang seharusnya menentukan papan apa yang digunakannya (dan apakah papan Anda termasuk?), Atau mengharuskan Anda menetapkan beberapa tanda untuk memberi tahu papan apa yang sedang digunakan.

Jika gagal, Anda dapat membuat kekacauan jumper atau skema pengkabelan lainnya untuk melompati sinyal ATMega2560 Mega sehingga terhubung seperti Uno. Tidak jelas apakah ini mungkin, karena beberapa Port D ATMega2560 bahkan tidak ditransfer ke header.

Atau Anda dapat melihat kode sumber untuk pustaka dan melihat apa yang sebenarnya dilakukan, dan apa yang perlu dilakukan berbeda untuk mengoperasikan pin ATMega 2560 yang terhubung dengan perisai.



0

Anda perlu membandingkan fungsi pin antara Mega dan Uno teman Anda. Maka Anda perlu membuat sambungan listrik tersebut terjadi. Saya berbicara sedikit tentang ini di bagian "pin lokasi" dari jawaban saya di sini .

Ini membutuhkan "peretasan". Sesuatu harus dilakukan untuk mengubah rute koneksi fisik tersebut. Saya biasanya menggunakan perisai perantara untuk menerjemahkan pin sesuai kebutuhan. Ada perisai yang dibuat khusus untuk tujuan ini tetapi saya tidak dapat menemukannya. Mungkin yang ini akan berhasil ?


SPI bukan masalah, karena perisai menggunakan gambar D0-D7 . Apa hal lain yang dapat memengaruhi ini?
Penguin Anonim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.