Skocz do zawartości
Rak_Rakoski

Uruchomienie wyświetlacza tft SPI na arduino

Pomocna odpowiedź

Napisano (edytowany)

Witam, mam problem z uruchomieniem w/w wyświetlacza na arduino z powodu opisu pinów. Na różnych stronach i blogach wyświetlacz używa pinów MOSI MISO CS DC..

Natomiast na moim module występują piny CLK RST RS CS SDA

Próbowałem podłączyć wyświetlacz do magistrali I2C i SPI ale bez skutku. Proszę o pomoc lub wskazówki dot. połączenia i oprogramowania wyświetlacza.

Wyświetlacz podłączam przez dzielnik rezystorowy ponieważ wyczytałem że zasilany jest napięciem 3,3V. Na niektórych forach podają że wyświetlacz pracuje na napięciu 5V Jeśli to możliwe to proszę mi wyjaśnić na jakim napięciu powinien pracować.

Link do wyświetlacza: https://abc-rc.pl/pl/products/wyswietlacz-lcd-tft-2-0-spi-176x220px-arduino-10169.html

Edytowano przez Rak_Rakoski

Udostępnij ten post


Link to post
Share on other sites

Zanim kupisz wyświetlacz to lepiej sprawdzić jakie biblioteki go obsługują. Bo prawie każdy do 320x240 da się uruchomić, ale nie do każdego są gotowce, a samemu to rozgryzać to zwykle nie dla kogoś, kto zaczyna z Arduino.

Jak już znajdziesz bibliotekę to w niej jest opisane co do czego przy ustawieniach w szkicu, np. do ST7735 mam taki początek:

#define TFT_CS     10
#define TFT_RST    9  // you can also connect this to the Arduino reset
                      // in which case, set this #define pin to 0!
#define TFT_DC     8

i nawet nie muszę wiedzieć jakie są funkcje tych pinów, po prostu je tu podłączam (reszta to SPI sprzętowe i wiadomo gdzie to podłączyć do UNO). SPI to 4 piny, MOSI, MISO, SCK i CS, I2C to CLK i DATA (dwukierunkowy).

Twój być może ma opcję podłączenia jako I2C lub SPI, ale to zwykle konieczność zmiany jakiś rzeczy na płytce i jak kupiłeś go jako SPI to od prób z tym interfejsem bym zaczął.

Zwykle MOSI to SDA (często w LCD DIN, data in), MISO się nie używa z LCD, chyba że coś odczytujesz, CS i CS masz to samo chip select, DC lub RS to przełącznik data/command i nie ma tego w I2C. Jak zerkniesz na grafiki przy wyszukiwaniu tutoriali do ST7735 to na pewno dojdziesz co do czego, a i do ILI9225 sporo pokazuje.

Czy masz 5V czy 3.3V to widać po budowie płytki - jest jakiś bufor, regulator napięcie, tranzystory, ale ostateczny test to podłączenie na żywca i sprawdzenie czy padnie (szansę przeżycia zwiększają rezystory 100-1000om). Można podłączyć oscyloskop i popatrzeć jakie faktycznie są poziomy sygnału. To że ktoś ma wersję tego LCD kompatybilną z 5V, to nie znaczy że Ty taką masz, nie wszyscy chcą mieć 5V, jednak dużo więcej można zrobić z ekranem TFT na nowszych uC, a te zwykle są 3.3V - ESP, ARM. Bezpieczniej użyć konwertera logiki, są od 2zł.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ten sterownik nie ma nawet trybu pracy I2C więc nie sugeruj się dziwnymi nazwami pinów. Przede wszystkim wrzuć czytelne zdjęcie odwrotnej strony tego wyświetlacza albo chociaż spisz i zapodaj nazwy wszystkich sygnałów na złączu. Wtedy uradzimy jak to podłączyć i który sygnał do którego pinu Arduino przy użyciu wskazanej biblioteki. Której używałeś do prób? Koniecznie musi obsługiwać LCD z ILI9225, tu jest jakaś:

https://www.arduinolibraries.info/libraries/tft_22_ili9225

i ona faktycznie korzysta tylko z zapisu do wyświetlacza. Jeśli dobrze podłączysz, powinno zadziałać od pierwszego razu. Wydaje mi się, że te dzielniki skopały sprawę. Scalak widoczny na zdjęciu ze sklepu to prawdopodobnie konwerter poziomów i na 95% możesz spokojnie pracować z sygnałami 5V. No, ale zdjęcie (i nazwa tego chipu) konieczne.

Edytowano przez marek1707
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

 Układ scalony: LVC245A

oraz zdjęcie

20190802_130047.thumb.jpg.8a7f8cc8a0f19f8dc4373af3eafbda05.jpg

Czy jak podłączę 3,3V zamiast 5V to wyświetlacz da jakiś znak życia?

Edytowano przez Rak_Rakoski

Udostępnij ten post


Link to post
Share on other sites

Moim zdaniem U1 to stabilizator 3.3V więc możesz spokojnie do Vcc podłączyć 5V. Z wyjścia tego stabilizatora zasilany jest kontroler wyświetlacza i konwerter poziomów LVC245 więc wszystko się zgadza, sygnały wejściowe także mogą być 5V.

Czy z 3.3V będzie działało? Stabilizator przepuści wtedy dalej wszystko co podasz minus jakiś mały spadek więc od biedy zadziała, tylko co niby? Nie wiemy jak jest zrobione podświetlanie ekranu, bo ono często potrzebuje trochę wyższego napięcia i wtedy z 3.3V może świecić bardzo słabo lub wcale. W każdym razie, jeśli nie podłączysz żadnych sygnałów cyfrowych a tylko 3.3V lub 5V na Vcc, to chociaż powinno być widać światło z diod LED. Słaby to eksperyment, bo niczego nie sprawdza, ale jeśli bardzo Cię ręce swędzą - próbuj.

Powinieneś wciągnąć z sieci bibliotekę do ILI9255 i wgrać sobie do Arduino pierwszy z brzegu przykład. Jeśli podłączysz piny tak jak jej autor sugeruje i nie popsułeś niczego wcześniejszymi eksperymentami, to demo ruszy z kopyta, to żadna magia. Przykładowe podłączenie dla biblioteki wskazanej w poprzednim poście to:

#define TFT_RST 8
#define TFT_RS  9
#define TFT_CS  10  // SS
#define TFT_SDI 11  // MOSI
#define TFT_CLK 13  // SCK

Oprócz tego oczywiście obowiązkowo masa GND i zasilanie VCC +5V i jedziesz. Linia SDI (11) to u Ciebie SDA.

Biblioteka używa jeszcze pinu 3 Arduino do kontroli podświetlania LED, ale Twój wyświetlacz nie ma takiego wejścia więc ignorujesz to.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Jeszcze jedno robię drugi projekt opary o wyświetlacz OLED i barometr BMP108 oba na I2C. Pytanie brzmi jak zaadresować polecenia dla barometru i wyświetlacza?

Udostępnij ten post


Link to post
Share on other sites

"Robienie projektu" nie polega na skleceniu paru drutów wg tutoriala więc może poświęć trochę czasu i poczytaj o protokole I2C. Zostanie Ci na dłużej. Potem już tylko ponowny rzut oka do kart katalogowych elementów na które się zdecydowałeś (bo przecież oglądałeś jakieś dokumenty zanim uznałeś, że te a nie inne moduły się nadają, czy.. jednak..  nie?) i zaczniesz rozumieć zawarty w tym protokole mechanizm adresowania.

https://www.nxp.com/docs/en/user-guide/UM10204.pdf

Udostępnij ten post


Link to post
Share on other sites

Może za wcześnie użyłem określenia "Robienie projektu" dożę do zrobienia stacji pogodowej. Czytałem o I2C tutoriale manuale specyfikacje ale polecenia i2c.write czy coś takiego robi wodę z mózgu jak mam wysłać metodą i2c.write żądanie do barometru i wyświetlacza bo konkretnie tego nie umiem/nie rozumiem nigdzie to nie jest pokazane (przynajmniej tam gdzie patrzyłem)

Udostępnij ten post


Link to post
Share on other sites

Przykro mi. Jeśli rzeczywiście tyle przeczytałeś, przejrzałeś gotowe programy, tutoriale, obejrzałeś przykłady z bibliotek np. Arduino i nadal tego nie rozumiesz, to może to Cię na obecnym poziomie przerasta? Nie wiem jak Ci pomóc, przecież nie ma sensu robić specjalnej szkółki dla jednej osoby. Poleciłbym artykuły czy kursy na Forbocie albo jakieś strony typu"Magistrala I2C dla opornych" lub nawet przykłady z biblioteki "wire.h" , ale pewnie też już próbowałeś i nadal kicha.. Cóż, spróbuj zacząć pisać programy na rzeczywistym sprzęcie, uruchamiać, wyciągać wnioski i może zadawać bardziej precyzyjne pytania. Wtedy szansa odpowiedzi gwałtownie rośnie. Metoda" jeden problem na raz" też jest niezła. Może dokończ ten TFT? Co na nim będzie?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Na TFT na razie nic nie planuje chcę go po prostu odpalić, ale chyba zamienię tego Oleda na tft z uwagi na wielkość. (Oled mniejszy)

Oleda natomiast wrzucę do przyszłego prędkościomierza do samolotów rc.
Mimo wszystko dziękuję za pomoc i naświetlenie tematów.

Edytowano przez Rak_Rakoski

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Udało mi się uruchomić oleda i barometr na i2c. Musiałem tylko wpisać adres barometru 0x77 i oleda 0x3c

bmp.begin(0x77);

display.begin(SSD1306_SWITCHCAPVCC, 0x3c);

Wszystko pięknie działa.

Co do tft chyba jest wadliwy, podpiąłem go tak jak pisaliście oraz na kilka innych sposobów używając szkiców z bibliotek i oprócz białego ekranu nic nie uzyskałem 😞

Edytowano przez Rak_Rakoski

Udostępnij ten post


Link to post
Share on other sites

Oczywiście najprościej powiedzieć: wadliwy i nie wnikać. Czasem rzeczywiście elementy psujemy w czasie jakichś nieprzemyślanych eksperymentów, ale mimo wszystko najczęściej niedziałanie wynika z innych, prozaicznych zupełnie przyczyn typu zły kablek albo schemat jednak inny niż miał być. Jeśli jeszcze masz ochotę, to opisz dokładnie co zrobiłeś: jakiej biblioteki użyłeś, co wgrałeś, do jakiej płytki Arduino i jak to połączyłeś - schemat + zdjęcie. Jedyny wyświetlacz, który po kupieniu u mnie nie działał (a prywatnie przewinęło sie kilkadziesiąt różnych) to taki, w którym kurier zgniótł szkło rzucając jedną paczkę na drugą i pech chciał, że ten był zapakowany jedynie w kopertę bąbelkową. Wszystkie pozostałe były OK. To nie przesądza, ale jest dobrym argumentem za tym, że elementy raczej przychodzą sprawne.

A co do I2C to brawo. Czyżby nie taki diabeł straszny?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Płytka Arduino Uno z ESP (dwa moduły jedna plytka nie mogę podlinkować produkt prawdopodobnie wycofany ze sklepu) biblioteki Adafruit-GFX-Library-master Adafruit_ILI9341-master

szkic z biblioteki

#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);

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)"));
  delay(10);
  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);
  yield();
  tft.fillScreen(ILI9341_RED);
  yield();
  tft.fillScreen(ILI9341_GREEN);
  yield();
  tft.fillScreen(ILI9341_BLUE);
  yield();
  tft.fillScreen(ILI9341_BLACK);
  yield();
  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);
  yield();
  
  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

  yield();
  tft.fillScreen(ILI9341_BLACK);
  yield();

  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;

  yield();
  tft.fillScreen(ILI9341_BLACK);
  yield();

  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;

  yield();
  tft.fillScreen(ILI9341_BLACK);
  yield();

  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);

  yield();
  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);
    yield();
  }

  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(i, i, 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*10, i*10));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(i*10, i*10, 0));
    yield();
  }

  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));
    yield();
  }

  return micros() - start;
}

Schemat podłączeń.

TFT.thumb.png.7d1653b253507053815b5b8aa6efa97b.png

Zdjęcia płytki Arduino nie mogę wrzucić Forbot wyświetla błąd -200

Udostępnij ten post


Link to post
Share on other sites

Sląd tam ILI9341?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...