2.4 "TFT LCD Shield가 Arduino Mega에서 작동하지 않습니다


9

ebay 웹 사이트 에서도 Arduino Mega에 부착 할 때 2.4 "TFT LCD Shield 디스플레이를 사용할 수 없다고 언급되어 있습니다. 문제는 실수로이 쉴드를 구입 한 것입니다.이 쉴드를 Arduino Mega 2560에 설치하고 싶습니다. 메가와 2.4 "디스플레이 쉴드를 결합하는 방법?

참고 : 나는 친구의 Arduino Uno를 사용해 보았습니다. 방패가 잘 작동합니다.

참고 : 아래 사진은 내 질문을 결정합니다. 디스플레이에서 Arduino의 코드가 실행되지 않습니다. LED 만 실행합니다.

여기에 이미지 설명을 입력하십시오

    // 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
eBay 광고에는 다음과 같은 의미가 없습니다. "이 방패는 Mega Arduino와는 작동하지 않지만 Mega가 모든 핀을 재배 열하는 방식 때문에 Uno- 타입 보드 속도의 절반이 될 것입니다. 이것!) "어떻게 동시에 작동하지 않고 절반 속도가 될 수 있습니까?
gwideman

8 비트 또는 16 비트 버전을 사용하고 있습니까?
LoneWolf

코드를 보면 38-41 번 핀을 사용하라고합니다. 또한 Mega에 대해 UNO와 다른 LCD 모델을 정의하고 있습니다. uno와 동일한 코드를 사용해보십시오. 그래서UTFT myGLCD(UNO_24,A2,A1,A3,A4);
Gerben

문구를 보면 작동하지 않는 것처럼 들리지만 결국에는 작동 속도가 느린 라이브러리가 있습니다.

답변:


7

난 그냥 MEGA 2560 내가 찾은 보드와 함께 사용하기 위해 라이브러리를 찾고, 며칠 전 같은 LCD의 방패를 구입하는 일이 https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code 하는 UNOMEGA 보드를 모두 지원합니다 .

MEGA 에 사용하려면 사용법이 매우 간단합니다 #include "uno_24_shield.h". SWTFT.cpp 의 헤더를 다음 과 같이 변경해야 합니다.#include "mega_24_shield.h"

설명 (다른 라이브러리의 쉴드에 대한 지원을 추가하는 데 유용) :

비 호환성은 Mega와 UNO 간의 Arduino 핀아웃에 대한 다른 포트 매핑에서 비롯됩니다.

UNO LCD 방패를 통해 연결됩니다 :

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

MEGA 그것을 통해 연결됩니다 :

+---------------+-----+-----+-----+-----+-----+-----+-----+-----+
| 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
세상에!! IT : 작동 중입니다. 먼저 Arduino Enhanced Release 1.0.5를 여기에서 다운로드하십시오. forum.arduino.cc/index.php/topic,118440.0.html 그런 다음 GitHub 코드를 연 다음 다운로드하십시오. 이전에 다운로드 한 DevC / C ++ 프로그램을 통해 swtft.cpp를 엽니 다. 다음과 같이 uno 행을 변경합니다 : #include "mega_24_shield.h"그런 다음 코드를 Mega에 업로드하면 제대로 작동합니다. 나는 단지 2.4 "TFT LCD를 MEGA에 올려 놓았고, 더 이상 아무것도 연결하지 않았습니다. 단지 방패를 메가에 올려 놓았습니다. D 하나님은 당신을 구원해 주셨습니다 : D 매우 특별한 감사합니다. 오류는 6 개월 동안 계속되었습니다.
베이

4

진행하는 방법은이 보드에서 사용하는 핀 위치와 이들이 연결되는 Arduino 실드 신호를 보여주는 스프레드 시트를 만드는 것입니다. 이 옆에 ATMega2560 (Mega2560) 및 ATMega328 (Uno)의 실제 신호를 표시하는 열이 필요합니다. 이 정보는 Uno 및 Mega2560 회로도에서 얻을 수 있습니다.

간략히 살펴보면 Uno와 Mega의 Arduino 쉴드 핀 이름이 같은 것 같습니다. 예를 들어, 쉴드 핀 '0'(디지털 제로)은 두 보드의 동일한 위치에 있으며 다른 핀의 경우도 마찬가지입니다.

그러나 Uno digital-0에서는 ATMega328 포트 D 비트 0에 연결되고 Mega2560에서는 ATMega2560 포트 E 비트 0에 연결됩니다. 그리고 디지털 2..7에서는 상황이 더 불분명합니다.

이제 digitalWrite (pin, value)를 사용하여 비트를 개별적으로 처리 할 때 Arduino 라이브러리는 사용중인 ATMega 칩 및 Arduino 보드에 설정해야하는 적절한 포트 / 비트로 변환을 처리합니다. 그러나 하위 레벨 기능을 사용하는 라이브러리 (특히 빠른 LCD 라이브러리처럼 포트에 전체 바이트를 작성해야하는 경우)는이 변환을 수행하기 위해 자체 단계를 수행해야합니다.

첫 번째 단계는 Mega2560을위한 별도의 LCD 드라이버 라이브러리가 있는지 확인하는 것입니다.

다음으로, 어떤 보드에서 실행중인 보드 (및 보드가 포함되어 있는지)를 결정하는 초기화 코드가있는 라이브러리가 있는지 또는 어떤 보드가 사용 중인지 알려주는 플래그를 설정해야하는지 조사하십시오.

그 실패, 당신은 할 수 가있을 것 우노처럼 유선있어되도록 메가의 ATMEGA2560의 신호를 점퍼 점퍼의 혼란 또는 다른 배선 방식을 만들 수 있습니다. ATMega2560의 일부 포트 D가 헤더에 연결되어 있지 않기 때문에 이것이 가능하다는 것은 확실하지 않습니다.

또는 라이브러리의 소스 코드를보고 실제로 수행중인 작업과 실드가 연결되는 ATMega 2560 핀을 작동하기 위해 수행해야하는 작업을 확인할 수 있습니다.



0

메가와 친구의 우노 사이의 핀 기능을 비교해야합니다. 그런 다음 전기 연결이 이루어져야합니다. 여기에 대한 답변 의 "핀 위치"섹션에서 이에 대해 조금 이야기 합니다 .

이를 위해서는 "해킹"이 필요합니다. 물리적 연결을 다시 라우팅하려면 무언가를 수행해야합니다. 나는 보통 필요에 따라 중간 실드를 사용하여 핀을 변환합니다. 이 목적을 위해 특별히 만들어진 방패가 있었지만 찾을 수 없었습니다. 어쩌면이 것이 효과가 있습니까?


방패가 D0-D7 picture를 사용하고 있기 때문에 SPI는 문제가되지 않습니다 . 다른 것들이 이것에 영향을 줄 수 있습니까?
익명 펭귄
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.