OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » Arduino » Arduino v příkladech - VIII. díl - dotykový displej

Arduino v příkladech - VIII. díl - dotykový displej

Úvod

Při zapojování svého prvního grafického dotykového displeje, jsem jako správný začátečník, hledal podporu na internetu. Doslova stovky článků, ale žádný z nich mi displej zprovoznit nepomohl. Po týdenní flustraci, jsem použil cestu pokus omyl. Cílem této série článků, je Vás této hrůzy ušetřit, a užít si té pohody – zmáčknout a jedem.

Díky dotykovému displeji můžeme nejen zobrazovat nějaké hodnoty, ale i zapínat, nastavovat, chránit přístup heslem, vlastně cokoliv Vás napadne a to všechno za běhu Arduina. Vaše projekty dostanou duši a úplně se změní pohled na využití toho mrňavého čipu. Posměváčci třeste se.

Zabývat se budeme jedním konkrétním displejem – tedy SPI ILI 9341, označený TJCTM24028-SPI. Pokud se pokusíte zapojit podle tohoto návodu jiný displej, je velmi pravděpodobné že to nebude fungovat.

Co je to dotykový displej

Koho znám, to má normálně na telefonu a nijak to neřeší. Pojďme si to popsat. Dotykový displej jsou ve skutečnosti dvě, spolu nijak nesouvisející, samostatné součástky.

První z nich je obrazovka, podsvícená diodou, kde je součástí desky grafický čip. Tomuto čipu zasíláme příkazy a ten maluje. Také umí vracet data aktuálního nastavení displeje. Čip i dioda mohou být napájeny rozdílným napětím, což v našem případě není.

Druhá část je dotyková plocha, v našem případě odporová. Tím že se této plochy dotkneme spojíme v určitém bodě dvě vodivé části a podle odporu souřadnic se určí kde se plocha stlačila. Náš konkrétní displej nevrací hodnoty odporu, ale má čip, který vrací přímo koordináty stisku.

Jaké máme dotykové displeje

Pro naše potřeby je rozdělím na dvě skupiny.

První skupinou jsou ty narážecí, tzv. shieldy. Jsou všude za pár desetikorun. Koupíte displej, nasadíte např. na UNO, nahrajete knihovnu a ono to většinou funguje. Zase super, ale je do té doby, než budete chtít k Arduinu připojit periférie. Najednou zjistíte, že nemáte žádné volné piny. Parádní hračka a to nemluvím o tom, že toho tlusťocha chcete dát do nějaké krabičky. Ale považte, žádné dráty.

Druhou skupinou jsou displeje komunikující po SPI, UART, nebo I2C. I2C se v rozumné velikosti nedá sehnat, UART je poněkud dražší, takže nám zbývá SPI, který je jen o pár korun dražší než shieldy. Hlavní výhodou je, že i po zapojení na UNO vám zbývá dost pinů a můžete ho umístit do pěkné malé krabičky, mimo vlastní Arduino. Nevýhodou je, že většina z nich komunikuje na úrovni 3,3V a je tedy potřeba použít převodník úrovní. Ale to by pak nebyla zábava, kdyby bylo všechno ideální.

My budeme používat TJCTM24028-SPI displej s obrazovkou 2,8" o rozlišení 240x320 bodů. Koupíte jej v našem eshopu.

Potřebné součástky

  • Arduino UNO
  • Displej TJCTM24028-SPI
  • Převodníky úrovní 5V – 3,3V, celkem 8 kanálů
  • Propojovací kabely
  • Ideálně externí zdroj 3,3V (není nezbytný, ale odlehčíte Arduinu)

Popis pinů

Displej

  1. VCC : napájení 3,3V (POZOR – skutečně jen a pouze 3,3V)
  2. GND : zem
  3. CS : SPI Slave Select displej – PIN  UNO 10 pro využití módu FAST, jinak libovolný digitální PIN
  4. RESET : reset displeje, je možno zapojit na libovolný digitální pin. Pokud není v programu určen, připojte na VCC +3,3V. Fakticky není potřeba ho připojovat k Arduinu, program funguje bez problémů a ušetříte PIN.
  5.  D/C : výběr data/command – PIN UNO 9 pro využití módu FAST, jinak libovolný digitální PIN.
  6. SDI(MOSI) : SPI Master Out Slave In – PIN UNO 11
  7. SCK : SPI Serial Clock – PIN UNO 13
  8. LED : – napájení podsvícení 3,3V
  9. SDO(MISO) : SPI Master In Slave Out PIN UNO 12. Knihovna neobsahuje funkce pro ověření dat z displeje. Tento PIN se zapojovat nemusí. Ušetříte tak místo na převodníku.

Dotyková plocha

  1. T_CLK : SPI Serial Clock – PIN libovolný digitální (7)
  2. T_CS : SPI Slave Select displej – PIN libovolný digitální (6)
  3. T_DIN : SPI Master Out Slave In – PIN libovolný digitální (5)
  4. T_DO : SPI Master In Slave Out – PIN libovolný digitální (4)
  5. T_IRQ : přerušení – PIN podporující HW přerušení UNO 2,3, ale není to nezbytné

Displej má piny striktně definovány s tím, že RESET a MISO se zapojovat k Arduinu nemusí a ušetří se tak 2 kanály na převodníku úrovní a jeden na Arduinu. U dotykové plochy je zapojení všech pinů nezbytné, je ale možné použít v podstatě jakýkoli PIN.

Zapojení displeje

Ve FULL verzi využijete na Arduinu celkem 11 pinů a tedy 11 kanálů převodníku úrovní. Pokud máte displej blízko Arduina, piny MISO, T_DO a T_IRQ můžete připojit přímo k Arduinu a je velmi pravděpodobné že to bude fungovat. Pak budete potřebovat pouze 2 čtyř kanálové převodníky.

V SMALL verzi nepřipojíte piny RESET a MISO a pin T_IRQ můžete připojit přímo k Arduinu, tedy Vám také budou stačit 2 čtyř kanálové převodníky. Toto bude fungovat spolehlivě, protože T_IRQ přenáší pouze stisk, kde má Arduino větší toleranci pro zjištění stavu HIGH/LOW, než při komunikaci TTL.

14 pinů displej, převodníky napětí, 2 napájení, samá zem = spousta propojovacích kabelů = ještě více kontaktů = zaručený zdroj problémů na nepájivém poli. Když to zapojíte a nebude to fungovat, je to na 99,9% v těch kontaktech. Na nepájivém poli s ničím jiným vlastně nebojuji.

Knihovny

Najít funkční knihovnu pro SPI displej ILI 9341, je kousek hodný Sherloka Holmse. Všichni říkají, že ji mají, žádná nefunguje, když tak jen něco a jen jedna z těch co opravdu funguje, k tomu ještě umí zarovnat text na střed a vpravo. Super funkce, kterou jiní strůjci knihoven nedoceňují. Knihovna pro dotykovou plochu je normální Utouch. Tady je obě máte je stažení TFT_ILI9341 a Utouch.

Práce s knihovnami

Když jsem začínal, knihovny jsem pouze používal. Jestli jsme na tom stejně, s displejem se to změní. Mějte na paměti, co projekt to v podstatě nastavení. Pojďme si popsat co a kdy je zapotřebí udělat.

Displej a režim FAST

Existují dva módy běhu. Něco jako NORMAL a FAST. Doporučuji používat režim FAST, displej vykresluje opravdu velmi, ale velmi rychle.

Pro spuštění módu FAST, je zapotřebí připojit displej viz popis pinů a současně v souboru Run_faster.h odkomentovat řádek #define F_AS_T. Dále pokud používáte UNO, NANO atd. je nutno zakomentovat řádek #define MEGA_TFT_ILI9341. Pokud používáte Arduino s procesorem ATmega2560, nechte tento řádek odkomentovaný. Jaké použít piny pro zapojení na Arduino MEGA je taktéž v tomto souboru.

Pokud budete mít problémy se zobrazováním, obvykle na větší vzdálenosti, vypněte funkci FAST.

Displej a písma

Jak jsme už řekli, písma jsou vlastně jenom obrázky. Výhodou je, že si snadno můžete tvořit svoje fonty. Klíčovou nevýhodou je, že zabírají neuvěřitelně mnoho místa v mikrokontrolérech, kde ho od počátku není mnoho. U UNO, NANO atd. se to dá vyřešit tak, že omezíte počet využitých fontů a v souboru Load_fonts.h zakomentujete písma, která nemáte v programu využita. U MEGA zase musíte bezpodmínečně všechny odkomentovat, jinak displej nebude fungovat korektně. Nicméně u MEGA to tolik nevadí. Tak máme místa. V následujícíh dílech si ještě ukážeme jak v souvislosti s písmy, ještě lépe využít paměť.

Pokud zobrazujete písmo a nevidíte ho, tak je proto, že ho máte v knihovně zakomentováno, nebo se dovoláváte písma, které neexistuje. Tedy předpokládám, že nejdříve nakreslíte tlačítko a potom tam vložíte popisek a ne naopak.

Dotyková plocha a kalibrace

Pokud využijete knihovnu UTouch, která je zde ke stažení, je displej již kalibrován a měl by fungovat i Vám. Přesto pokud mohu doporučit, proveďte si vlastní kalibraci. Spusťte následující program, proklikejte se displejem a výsledné hodnoty zadejte do souboru UTouchCD.h. Pak si spusťte testovací program a otestujte.

Program kalibrace displeje

V programu nic neupravujte. Nahrajte a klikejte. Není moc popsán, není to důležité. Program můžete stáhnou zde.

Opět program nahrajte. V počátku doporučuji měnit pouze orientaci displeje. Správnou funkčnost zapojení a kalibraci poznáte podle toho, že tam kde se displeje dotknete, objeví se černá tečka.

//------------------------------------------------------------------
// inicializace zakladnich knihoven
#include <SPI.h> // knihovna pro komunikacni rozhrani SP
#include <TFT_ILI9341.h> // knihovna displeje
#include <UTouch.h> // knihovna dotykové části
//------------------------------------------------------------------
// nastaveni pinu displej
//#define sclk 13  // Don't change, this is the hardware SPI SCLK line
//#define miso 12  // Don't change, this is the hardware SPI MISO line
//#define mosi 11  // Don't change, this is the hardware SPI MOSI line
#define TFT_CS    10   // Chip select for TFT display, don't change when using F_AS_T
#define TFT_DC     9   // Data/command line, don't change when using F_AS_T
//#define TFT_RST    8   // Reset, you could connect this to the Arduino reset pin
#define TOUCH_CLK  7   // Touch SCLK
#define TOUCH_CS   6   // Touch chip select
#define TOUCH_DIN  5   // Touch MOSI
#define TOUCH_DOUT 4   // Touch MISO
#define TOUCH_IRQ  2   // Touch IRQ
//------------------------------------------------------------------
// Promenne a nastaveni vstupu displej
TFT_ILI9341 tft = TFT_ILI9341(TFT_CS, TFT_DC);
// UTouch(byte clk, cs, din, dout, irq)
UTouch  touch(TOUCH_CLK, TOUCH_CS, TOUCH_DIN, TOUCH_DOUT, TOUCH_IRQ);
//------------------------------------------------------------------
// Promenne displej
const byte TFT_rotation = 2; // nastaveni otoceni displeje
byte TOUCH_rotation; // nastaveni orientace dotykove plochy
int x; // radek x displej
int y; // radek y displej

void setup() {
  Serial.begin(9600); // nastaveni seriove komunikace rychlost 9600bd
  //------------------------------------------------------------------
  tft.init(); // inicializace TFT displeje
  tft.setRotation(TFT_rotation);
  tft.setTextColor(TFT_BLACK);
  //------------------------------------------------------------------
  if (TFT_rotation == 0 || TFT_rotation == 2) TOUCH_rotation = PORTRAIT; // nastaveni otoceni dotykove plochy
  else if (TFT_rotation == 1 || TFT_rotation == 3) TOUCH_rotation = LANDSCAPE; // nastaveni otoceni dotykove plochy
  touch.InitTouch(TOUCH_rotation); // inicializuje dotykovou plochu
  touch.setPrecision(PREC_HI); // nastavi citlivost dotykove plochy

  tft.fillScreen(TFT_WHITE); // vycisti pole pro novy zapis
  tft.drawCentreString("TEST DOTYKOVE", 120, 120, 4);
  tft.drawCentreString("PLOCHY", 120, 150, 4);
}

void loop() {
  //------------------------------------------------------------------
  // cteni dotykoveho displeje
  if (touch.dataAvailable()) { // kontrola prijatych dat z dotykoveho panerlu
    touch.read(); // pokud jsou data precte je a ulozi do promenych
    x = touch.getX(); // ulozeni koordinatu dotyku do prommene
    y = touch.getY(); // ulozeni koordinatu dotyku do prommene
    if (TFT_rotation == 0) { // oprava dotyku pro pripad otoceni displeje
      x = map(x, 0, 239, 239, 0);
      y = map(y, 0, 319, 319, 0);
    }
    else if (TFT_rotation == 3) { // oprava dotyku ro pripad otoceni displeje
      x = map(x, 0, 319, 319, 0);
      y = map(y, 0, 239, 239, 0);
    }
    Serial.print (F("x= "));
    Serial.println (x);
    Serial.print (F("y= "));
    Serial.println (y);
    tft.fillScreen(TFT_WHITE); // vycisti pole pro novy zapis
    tft.fillCircle(x, y, 10, TFT_BLACK); // nakresli tecku v miste kde jste se dotkli
  }
}

Pro pochopení je program pečlivě popsaný. Na podrobný popis jednotlivých funkcí se zaměříme v příštím díle.

Závěr

Práce s displejem je nejtěžší v okamžiku kdy ho zapojujete a hledáte tu správnou knihovnu. Pak je to jednoduché. V příštích několika dílech se podíváme jak na to v praktických příkladech.

JB

jaroslav.bohac@arduinotech.cz

Přidat komentář

Zvýrazněné položky jsou povinné.

Přehled komentářů

  1. Skvělá ukázka (Michal, 17.7.2016 17:28:42) Odpovědět | Zobrazit odpovědi

    Zdravím, v první řadě bych chtěl poděkovat za názorný popis a zapojení. Začínám s arduinem (NANO) a až podle tohoto se mi podařilo zprovoznit dotykovou funkci tohoto TFT displeje.
    Vše funguje jak má, až na maličkost: zjistil jsem, že u dotyku je osa Y otočená. V programu si to dokážu opravit, ale otázkou je, čím to je ? poradíte ? Díky, Michal

    1. Re: Skvělá ukázka (JB, 24.10.2016 23:14:49) Odpovědět

      Děkuji, beru to jako pochvalu :-). Je to dáno knihovnou, použitým displejem a jeho otočením. Když data zobrazíte otočená o 180°, jedno fungovat bude druhé ne. Opravit se to dá v knihovně. Pro ty co s tím bojují, stačí do sketche přidat funkci y = map(y, 0, 239, 239, 0);

  2. Jak je to stím napětím ???? (Jarek, 3.8.2016 21:48:44) Odpovědět | Zobrazit odpovědi

    Velmi pěkný popis displaye. Jak je to, ale s napěťovou úrovní signálů ? V článku píšete, že display funguje jenom s úrovní 3.3V, ale v eshopu se uvádí, že má zabudovaný stabilizátor z 5V na 3.3V a je 5V/3.3V kompatibilní !!
    Navíc na PCB je doopravdy napájen stabilizátor 5V - 3.3V označení 65Z5 SMD SOD23 a je u něho nespojený jumper J1, který v případě spojení asi spojí vstupní pin s výstupen napětí 3V (tedy vyřadí stabilizátor z činosti). Jak to tedy doopravdy Je ????

    1. Re: Jak je to stím napětím ???? (JB, 24.10.2016 23:25:10) Odpovědět

      Je to jak to píšete. Displej má stabilizátor, ten ale slouží pouze ke konverzi napájení a skutečně se zapojuje přes jumper J1. Logické úrovně jsou však stále 3,3 V.

      Nenapadá mě rozumné praktické využití, převodník také musíte napájet 3,3V a výstup tohoto napětí nemá. A pájet tam někam drát? To je na rozhodnutí každého bastlíře :-).

    2. Re: Jak je to stím napětím ???? (Gennadii, 14.12.2016 17:46:37) Odpovědět

      Haló
      Prompt dostupnost displeje 2,2 palce 320 x 240 SPI TFT LCD displeji ILI9341 51 / AVR / STM32 / PIC


TOP produkty

Arduino MEGA2560

Arduino MEGA2560
424 Kč s DPH

Arduinotech GSM shield

Arduinotech GSM shield
877 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist