SPFD5408 TFT kijelző


Ebben a cikkben egy TFT lcd shield-et próbálok kivesézni. A shield Arduinora készült 2.4'' TFT érintő képernyővel, SPFD5408-as beépített vezérlővel. Fontosabb adatai:

240 x 320-as felbontás,

beépített háttérvilágítás 4db fehér leddel,

18 bit, 262144 különböző színárnyalat,

rezisztív érintő képernyő,

spfd5408 vezérlő beépített videó RAM-al,

8 csatornás digitális illesztő felület, vagy 4 csatornás ISP,

beépített microSD fogadó négy csatornás adatátvitellel.



Igazából sokat bajlódtam a hozzávaló könyvtár felkutatásával, általánosan aki Kínából ilyen típusú tft schildet rendel ne számítson túl sok jóra az illesztő könyvtárakkal kapcsolatban.

A hagyományos tft könyvtárak( ami más tft-ket simán kezel) nem használhatók, találtam ehhez a típushoz a youtube-on UTFT könyvtárat amivel már sikerült kicsikarni némi eredményt a kijelzőn(széles csíkok mögött futott a grafikus felület). Aztán sokadik nekifutásra találtam meg a következő könyvtárat ami már majdnem tökéletesen fut a schielden : TFTSPS_07781.

Mint kiderült ez a shield már egy újabb lcd kezelő chipel készült, amihez még nem igazán készültek megfelelő könyvtárak.

http://www.spelecshop.com/1402480/563382/Touch-Panel-Display-for-Arduino.html

Töltsd le a könyvtárat, másold be az Arduino/ librarie könyvtárba, nyisd meg az IDE-t és a File / Minták / TFTSPS_07781 / TFTLCD1 / LCDTEXT_SPS progit. Ezt töltsd fel az arduinora.


Ez a példa program kijelzőként kezeli schieldünket, segítségével szövegeket és különböző grafikus ábrákat jeleníthetünk meg rajta.

Nézzünk egy egyszerű szöveges példát:

// először az lcd kimenetek párosítjuk az Uno lábkiosztásához

#define LCD_CS A3

#define LCD_CD A2

#define LCD_WR A1

#define LCD_RD A0

#define LCD_RESET A4


// meghatározzuk a szín konstansokat

#define BLACK 0x0000

#define BLUE 0x001F

#define RED 0xF800

#define GREEN 0x07E0

#define CYAN 0x07FF

#define MAGENTA 0xF81F

#define YELLOW 0xFFE0

#define WHITE 0xFFFF


#include "TFTLCD7781.h" // a kijelző saját könyvtára

TFTLCD7781 tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //tft objektum létrehozása

void setup(){

tft.reset(); // tft reset

tft.initDisplay(); // inicializáljuk a kijelzőnket

}

void loop(){

tft.fillScreen(BLACK); // háttér szín beállítása

tft.setCursor(60,140); // kurzor pozíció beállítása

tft.setTextColor(CYAN); // szöveg szín

tft.setTextSize(3); // szöveg méret

tft.println("ARDUINO"); // szöveg kiíratása

delay(1000);

}


Azt hiszem sokat nem kell magyarázni a működésével kapcsolatban, ugyan így különböző grafikus alakzatok is megjeleníthetők, ezeket tartalmazza a LCDTEXT_SPS példa program. Egy kicsit átrágva a grafikus alakzatok kezelését, többnél feltűnt, hogy nem hajtódik végre megfelelően(ez a könyvtár se tökéletes).

A többi példaprogram nem működik ezzel a schildel, nagy küzdelmek árán azért sikerült összehozni, pontosabban átalakítani egy érintő képernyőt használó progit, ezt most itt mutatom be:

#include "TFTLCD7781.h"
#include "TouchScreen.h"


#define YP A2

#define XM A1 //érintő képernyő lábkiosztása

#define YM 6

#define XP 7

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 100);// érintőképernyő objektum

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1//lcd lábkiosztása
#define LCD_RD A0
#define LCD_RESET A4


// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0//szín definiciók
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF


TFTLCD7781 tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);//tft objektum

void setup(void) {
Serial.begin(9600);
Serial.println("Paint!");

tft.reset();

tft.initDisplay(); //képernyő inicializálása

tft.fillScreen(BLACK);//háttér szín

}

void loop(){

Point p = ts.getPoint(); // nyomás érzékelés és értékek hozzárendelése p objektumhoz

pinMode(XM, OUTPUT);

pinMode(YP, OUTPUT);

p.x = map(p.x, 200, 900,0,tft.width()); // az érzékelt érték konvertálása kimeneti értékké

p.y = map(p.y, 100, 900,0,tft.height());

if (p.z>10 && p.z<1000){ // tovább lép ha a nyomásérték nagyobb mint 10 kisebb mint 1000

Serial.print(p.y);

Serial.print(" , ");

Serial.println(p.x); //kiíratás soros monitorra

tft.fillRect(p.x,p.y,3,3,RED); //kiíratás a tft képernyőre

delay(1);

}

}


Egy kicsit bővebben: a ts.getPoint() érzékeli a nyomást a képernyő adott

pontján, a nyomás hatására felveszi a képernyőpont x és y értékét. A proginkba

létrehozunk egy p point-ot(mutatót) ami felveszi a ts értékét, így létrehozva egy

p.z (nyomásérték), egy p.x és egy p.y(koordináta értékek a nyomás érzékelési

pontjához) értéket. Az értékek 0-1023-ig vehetnek fel értéket de általában

ennél szűkebb tartományokban dolgoznak. A mi képernyőnk x = 200-900 és y =

100-900 tartományban érzékel, ezt a konvertáljuk át a képernyő felbontására

(240x320) a következő utasításokkal:

p.x = map(p.x, 200, 900,0,tft.width());

p.y = map(p.y, 100, 900,0,tft.height());

Mint kiderült minden grafikus objektum nem használható a könyvtárból így vonal

rajzoláshoz olyat választottam ami működik : tft.fillRect(p.x,p.y,3,3,RED);


Kb. ennyi, ezekre a példákra már lehet építeni, remélem segíthettem azokon akik ezt a TFT-t vásárolták.

A cikk folytatása: Újra SPFD5408 TFT kijelző 150812