2.8 SPI TFT подключение

avgaz
Offline
Зарегистрирован: 23.09.2014

Добрый вечер, приобрел пару дисплеев 2.8 SPI TFT http://ru.aliexpress.com/item/A96-Free-Shipping-2-8-240x320-SPI-TFT-LCD-...

в описании указано что питание и логика 3.3В или 5В типа работать должно так и так, перепробовал кучу библиотек не фига не работает, горит белый экран и все тут.

Может кто подключал и подскажет как? или там все таки нужна логика 3.3В??

slider
Offline
Зарегистрирован: 17.06.2014

что значит  "перепробовал кучу библиотек" ?  Поди не так подключили. Там ещё бывает reset надо подключать к reset на ардуино, чтоб и дисплей сбрасывался при подаче напряжения питания.

библиотеки две : одна от UTFT , другая от Adafruit.  

забейте здесь в поиск - SPI TFT . много тем здесь открыто с аналогичными подключениями SPI на 1.8" 2.2" .

avgaz
Offline
Зарегистрирован: 23.09.2014

дак вот 3 либы и пробовал

две которые вы перечислили и вот эта https://github.com/gmtii/ili9341-arduino не на одной либе он не запустил едиственное что на той что по ссылке он реагирует на резет, на остальных просто горит экран.

Мне интересно может нужно на логические пины 3.3В и не мучатся а китает просто наеб в описании что логика работает от 5В?

slider
Offline
Зарегистрирован: 17.06.2014

вот статейка ещё красивая http://arduino-kit.ru/catalog/id/displey-sensornyiy-24-tft-lcd-240x320 , пока не читал.

если будете использовать совместно с картой памяти, то для их поочередного включения есть у дисплея и карты включающие их сигналы CS , только их их завести на разные пины ардуины и включать поочередно.

 

Естественно уровни должны быть не выше 3,3 ( я б даже сказал не выше 3.0в  , потому как на этом шилде  стоит микросхема 65Z5 , она 3,0в )

Если пошукать поиском SPI LCD TFT на ебай и али, можно у продавцов увидеть ссылки на либы и документацию 

к примеру http://www.ebay.com/itm/240x320-2-8-SPI-TFT-LCD-Touch-Panel-Serial-Port-Module-with-PCB-ILI9341-5V-3-3V/371278122006

 там в документации  http://www.winddeal.net/image/tools/37444.rar  об уровнях и питании сказано .

Именно на этой плате судя по фото 

1. нет транзистора включения подсветки, значит 

вывод LED - это анод светодиодов подсветки, катодами они сидят на минусе. поэтому правильно подключить к +5в через резистор около 30 ом (-60ом) . Или к +3,3в через низкоомник , на крайняк на прямую. 

2. нет преобразователей уровней, значит 

- для скетчей софтового SPI понадобиться либо сделать делители на резисторах как в статье http://arduino-project.net/chasy-na-arduino-tft01-22sp/ . Или для ограничения тока лог. уровней просто последовательно резисторы (проверял 30ком, 10ком - работает, а 100ком, 1ком - не работает) , для этого случая желательно на кондёр около стабилизатора 65Z5 повешать стабилитрон на 3,0-3,3в , потому как эти уровни пересиливают напряжение на стабилизаторе до4-4,5в , от этого дисплей может выйти из строя. //нахрапом , на UTFT у меня тож не завёлся, заработало на https://github.com/adafruit/Adafruit_ILI9341  ,  ( по сообщению http://forum.arduino.cc/index.php?topic=181679.msg1758347#msg1758347 , можете и всю страницу, тему глянуть)

подключал так

//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
  Adafruit_ILI9341 tft = Adafruit_ILI9341(    5,      6,       11,      13,       4,       12); 

в скетче закоментил аппаратный SPI , раскоментил програмный 

/***************************************************
  This is our GFX example for the Adafruit ILI9341 Breakout and Shield
  ----> http://www.adafruit.com/products/1651

  Check out the links above for our tutorials and wiring diagrams
  These displays use SPI to communicate, 4 or 5 pins are required to
  interface (RST is optional)
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.
  MIT license, all text above must be included in any redistribution
 ****************************************************/


#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
//       Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
Adafruit_ILI9341 tft = Adafruit_ILI9341(5, 6, 11, 13, 4, 12); 

void setup() {
  Serial.begin(9600);
  Serial.println("ILI9341 Test!"); 
 
  tft.begin();

  // read diagnostics (optional but can help debug problems)
  uint8_t x = tft.readcommand8(ILI9341_RDMODE);
  Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(ILI9341_RDMADCTL);
  Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(ILI9341_RDPIXFMT);
  Serial.print("Pixel Format: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(ILI9341_RDIMGFMT);
  Serial.print("Image Format: 0x"); Serial.println(x, HEX);
  x = tft.readcommand8(ILI9341_RDSELFDIAG);
  Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); 
  
  Serial.println(F("Benchmark                Time (microseconds)"));

  Serial.print(F("Screen fill              "));
  Serial.println(testFillScreen());
  delay(500);

  Serial.print(F("Text                     "));
  Serial.println(testText());
  delay(3000);

  Serial.print(F("Lines                    "));
  Serial.println(testLines(ILI9341_CYAN));
  delay(500);

  Serial.print(F("Horiz/Vert Lines         "));
  Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE));
  delay(500);

  Serial.print(F("Rectangles (outline)     "));
  Serial.println(testRects(ILI9341_GREEN));
  delay(500);

  Serial.print(F("Rectangles (filled)      "));
  Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA));
  delay(500);

  Serial.print(F("Circles (filled)         "));
  Serial.println(testFilledCircles(10, ILI9341_MAGENTA));

  Serial.print(F("Circles (outline)        "));
  Serial.println(testCircles(10, ILI9341_WHITE));
  delay(500);

  Serial.print(F("Triangles (outline)      "));
  Serial.println(testTriangles());
  delay(500);

  Serial.print(F("Triangles (filled)       "));
  Serial.println(testFilledTriangles());
  delay(500);

  Serial.print(F("Rounded rects (outline)  "));
  Serial.println(testRoundRects());
  delay(500);

  Serial.print(F("Rounded rects (filled)   "));
  Serial.println(testFilledRoundRects());
  delay(500);

  Serial.println(F("Done!"));

}


void loop(void) {
  for(uint8_t rotation=0; rotation<4; rotation++) {
    tft.setRotation(rotation);
    testText();
    delay(1000);
  }
}

unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(ILI9341_BLACK);
  tft.fillScreen(ILI9341_RED);
  tft.fillScreen(ILI9341_GREEN);
  tft.fillScreen(ILI9341_BLUE);
  tft.fillScreen(ILI9341_BLACK);
  return micros() - start;
}

unsigned long testText() {
  tft.fillScreen(ILI9341_BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(ILI9341_WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(ILI9341_RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(ILI9341_GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

unsigned long testLines(uint16_t color) {
  unsigned long start, t;
  int           x1, y1, x2, y2,
                w = tft.width(),
                h = tft.height();

  tft.fillScreen(ILI9341_BLACK);

  x1 = y1 = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t     = micros() - start; // fillScreen doesn't count against timing

  tft.fillScreen(ILI9341_BLACK);

  x1    = w - 1;
  y1    = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(ILI9341_BLACK);

  x1    = 0;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  tft.fillScreen(ILI9341_BLACK);

  x1    = w - 1;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

  return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
  unsigned long start;
  int           x, y, w = tft.width(), h = tft.height();

  tft.fillScreen(ILI9341_BLACK);
  start = micros();
  for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
  for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

  return micros() - start;
}

unsigned long testRects(uint16_t color) {
  unsigned long start;
  int           n, i, i2,
                cx = tft.width()  / 2,
                cy = tft.height() / 2;

  tft.fillScreen(ILI9341_BLACK);
  n     = min(tft.width(), tft.height());
  start = micros();
  for(i=2; i<n; i+=6) {
    i2 = i / 2;
    tft.drawRect(cx-i2, cy-i2, i, i, color);
  }

  return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
  unsigned long start, t = 0;
  int           n, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(ILI9341_BLACK);
  n = min(tft.width(), tft.height());
  for(i=n; i>0; i-=6) {
    i2    = i / 2;
    start = micros();
    tft.fillRect(cx-i2, cy-i2, i, i, color1);
    t    += micros() - start;
    // Outlines are not included in timing results
    tft.drawRect(cx-i2, cy-i2, i, i, color2);
  }

  return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

  tft.fillScreen(ILI9341_BLACK);
  start = micros();
  for(x=radius; x<w; x+=r2) {
    for(y=radius; y<h; y+=r2) {
      tft.fillCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int           x, y, r2 = radius * 2,
                w = tft.width()  + radius,
                h = tft.height() + radius;

  // Screen is not cleared for this one -- this is
  // intentional and does not affect the reported time.
  start = micros();
  for(x=0; x<w; x+=r2) {
    for(y=0; y<h; y+=r2) {
      tft.drawCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testTriangles() {
  unsigned long start;
  int           n, i, cx = tft.width()  / 2 - 1,
                      cy = tft.height() / 2 - 1;

  tft.fillScreen(ILI9341_BLACK);
  n     = min(cx, cy);
  start = micros();
  for(i=0; i<n; i+=5) {
    tft.drawTriangle(
      cx    , cy - i, // peak
      cx - i, cy + i, // bottom left
      cx + i, cy + i, // bottom right
      tft.color565(0, 0, i));
  }

  return micros() - start;
}

unsigned long testFilledTriangles() {
  unsigned long start, t = 0;
  int           i, cx = tft.width()  / 2 - 1,
                   cy = tft.height() / 2 - 1;

  tft.fillScreen(ILI9341_BLACK);
  start = micros();
  for(i=min(cx,cy); i>10; i-=5) {
    start = micros();
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(0, i, i));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(i, i, 0));
  }

  return t;
}

unsigned long testRoundRects() {
  unsigned long start;
  int           w, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(ILI9341_BLACK);
  w     = min(tft.width(), tft.height());
  start = micros();
  for(i=0; i<w; i+=6) {
    i2 = i / 2;
    tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
  }

  return micros() - start;
}

unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(ILI9341_BLACK);
  start = micros();
  for(i=min(tft.width(), tft.height()); i>20; i-=6) {
    i2 = i / 2;
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
  }

  return micros() - start;
}

Если вы подключали его напрямую к 5ти вольтовой ардуине, и у ней было хорошее питание, то вероятно ему уже каюк.

- для скетчей аппаратного SPI (дает большую скорость), всё же желательно использовать микросхемы преобразователей уровней, чтоб не заваливались фронты управляющих сигналов.  У меня заработало на резистивных делителях 1ком+20ком(просто что было легче поменять верхние 10ком)  . раскоментил аппаратный , закоментил софтовый. Заработало. На делителях 1ком+2ком нет.

...............................
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
       Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
//Adafruit_ILI9341 tft = Adafruit_ILI9341(10, 9, 11, 13, 8, 12); 
...............................

 Да скорость стала такая же быстрая как и 8ми битных дисплеях. подключение SPI   #13, #12, #11 осталось тоже, DC на 9,   CS на 10,  RESET соеденил с RES на ардуино, чтоб дисплей сбрасывался совместно с ардуиной (при подаче питания).

 

// потом следом и UTFT заработал , как в статье про часы на нём, на делителях 10к+20к. Очень странно - а раньше нивкакую  не запускался. наверно забыл что в memorysaver.h надо выбрать тип контроллера, ( оставить закоментированными только 

//#define DISABLE_ILI9341_S4P 1 // MI0283QT9 и 

//#define DISABLE_ILI9341_S5P 1 // TFT01_22SP / TFT01_24SP / TFT22SHLD / DMTFT28105

)

 

 

avgaz
Offline
Зарегистрирован: 23.09.2014

Спасибо, развернутый ответ.. Подключил пока через резисторы 10ком по такой схеме http://1.bp.blogspot.com/-0Zmb2xr-uEI/U8ZCaSnNQEI/AAAAAAAAMEE/eeV1dRPckLs/s1600/schema_conectare_ILI9341_Arduino_ver1m0.png и с либой Ucglib заработало с программным isp на апаратном висит nrf24, в месте на хотят работать, позже попробую вашу предложенную Adafruit_ILI9341 может она по резвее будет, а то эта тормозит жутко. А так заказал такие http://ru.aliexpress.com/item/1PCS-IIC-I2C-Logic-Level-Converter-Bi-Directional-Module-5V-to-3-3V/32417113805.html