Wyświetlacz TFT 2.2 SPI ILI9341
Kolejnym, ciekawym wyświetlaczem jest 2,2" ekran TFT o rozdzielczości 240x320 wykorzystujący kontroler ILI9341. Jednym z bardziej znanych wyświetlaczy, które wykorzystują ten kontroler jest odrobinę większy 2.8" shield od Adafruit z ekranem dotykowym. Niestety cena jaką proponuje producent oscyluje w granicach 30$, nie licząc kosztów wysyłki do Polski. Natomiast opisywany dziś model, bez problemu kupimy na Allegro za niecałe 40 złotych.
Nie bez powodu opisuję właśnie ten egzemplarz. Po pierwsze, wyświetlacz ten posiada dwukrotnie większą rozdzielczość niż opisywany wcześniej HY-1.8 SPI. Po drugie, rozmiar i jego budowa pozwoli idealnie wpasować się w zaślepkę zatoki 5.25" w obudowie komputerowej. Pomimo, że ekran jest tu wyraźnie większy, to płytka PCB na której się znajduje, nie wystawie poza ramkę wyświetlacza (tak jak to miało miejsce w przypadku HY-1.8). Na odwrocie znajduje się również slot na karty SD.
Do obsługi tego wyświetlacza możemy posłużyć się standardową biblioteką Adafruit-ILI9341-Library oraz Adafruit-GFX-Library.
Uwaga na zasilanie i poziomy logiczne 3.3V
Napięcie zasilania tego wyświetlacza jak i poziomy logiczne wynoszą 3.3V, dlatego szczególnie należy uważać przy podłączeniu go do mikokontrolera działającego w logice 5V. O ile w przypadku Arduino UNO zasilanie 3.3V nie stanowi problemu, to sygnały cyfrowe już tak, dlatego też należy przekonwertować logikę 5V na 3.3V. Jeśli przypomnimy sobie schemat połączeń wyświetlacza HY-1.8, gdzie w roli konwertera napięć został tam wykorzystany bufor CD4050BE, to w przypadku ILI9341 niestety on nie zadziała. Na szczęście możemy skorzystać z prostego dzielnika napięcia z rezystorami o wartościach 1.8kΩ i 3.3kΩ. Takich dzielników będziemy potrzebowali cztery. W ten sposób "przeniesiemy" nasz sygnał cyfrowy z Arduino UNO z poziomu 5V do poziomu 3.3V.
- D13 poprzez dzielnik napięcia podłączamy do pinu SCK
- D12 podłączamy bezpośrednio do pinu MISO
- D11 poprzez dzielnik napięcia podłączamy do pinu MOSI
- D10 poprzez dzielnik napięcia podłączamy do pinu CS
- D9 podprzez dzielnik napięcia podłączamy do pinu DC
- RESET oraz LED podłączamy do zasilania 3.3V
- GND podłączamy do masy
Układ połączeń
Fragment kodu dla sprzętowego SPI w Arduino UNO R3
- #define TFT_DC 9
- #define TFT_CS 10
- #include <Adafruit_GFX.h>
- #include <Adafruit_ILI9341.h>
- #include <SPI.h>
- Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
- void setup(void)
- {
- tft.begin();
- tft.fillScreen(ILI9341_BLACK);
- tft.setCursor(0, 0);
- tft.setTextSize(2);
- tft.setTextColor(ILI9341_WHITE);
- tft.setTextWrap(true);
- tft.print("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ");
- }
- void loop() {}
Wymiary wyświetlacza
Reklama
Komentarze
Cześć!
Artykół zainspirował mnie do kupna tego fajnego wyświetlacza.
Jedynie co mnie niepokoi to jasność jego. Jak jest w przypadku Twojego wyświetlacza?
To znaczy? :) Jasność podświetlania? Że za ciemny? Że za jasny? :)
Przepraszam, że nie sprecyzowałem. Jest za ciemny. Zastanawiam sie jak podswietlanie ulepszyć tak by w dziennym swietle mozna by komfortowo z niego korzystać.
Pozdrawiam i gratuluje fajnego bloga.
Może masz jakiś wadliwy egzemplarz? Jeśli nie mówimy o świetle słonecznym, tylko dziennym to w moim przypadku jasność jest OK
Witam, mam pewien problem, posiadam wyżej wymieniony wyświetlacz i arduino Mega2560, po przerobieniu powyższego kodu dokładnie linijki:
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, 51, 52, 53, 50);
Ponieważ akurat ten model posiada wyprowadzenia SPI na tych pinach, teoretycznie powinno działać ale po wgraniu kodu włącza się jedynie na chwile podświetlenie i gaśnie dzieje się tak na 2 egzemplarzach wyświetlacza co może być tego przyczyną?
Szczerze to bladego pojęcia nie mam :) ale na dniach zaopatrzę się w megę i zobaczę co to może być
Witam, czy ten problem z podłączeniem tego TFT do Mega2560 udało się rozwiązać, bo mam ten sam wyświetlacz i problem z uruchomieniem :)
hej Korneliusz, świetny artykuł, orientujesz się może jaki ma pobór prądu ten wyświetlacz, oraz ten na 1.8"?
Sprawdzę po niedzieli bo akurat będę przy nim majstrował
Bardzo fajny artykuł, mam płytkę Leonardo i wyświetlacz 2,4" na ili9341, kompiluje się ładnie i nic. Wyświetlacz świeci na biało, ale nic się nie dzieje. na dzielnikach napięcia mam 2,9V (1,8k i 3,3k) może tu jest problem ?
Powinno być ok, próbowałeś z jakimś konwerterem zamiast oporników?
Do których pinów Leonardo podłączasz odpowiednie wyprowadzenia wyświetlacza?
Witam. A ja mam inne pytanie jak wgrać do programu AUDRINO te biblioteki? Wiem, że to nie jest problem jak się wie jak. Dziękuję za pokazanie jak to się robi?
Srysiu
Z tego co się orientuję, to nie wgrywasz żadnych bibliotek do Arduino. Do kompilacji i asemblacji brane są te dodatkowe pliki i razem z nimi tworzony jest plik binarny proramu i wysłany do Arduino. Arduino nie wie, że korzystałeś z czegoś typu "Adafruit_ILI9341". Dla niego jest to np. 01010010 ;)
Ale daaaawno nie wrzucałem niczego na Arduino i nie wiem jak trzeba dodawać te pliki do projektu.
Witaj Korneliusz
masz moze przykład do takiego wyświetlacza? http://allegro.pl/lcd-2-8-spi-ili9341-ekran-dot-arduino-raspberry-i5032481292.html
chodzi mi o funkcję "włącz/wyłącz
wiem ze button ustawia się tak "if ((x>=250) && (x<=300)) // Button: 5 "
ale za nic nie umiem więcej... będe wdzięczny za każdy trop :)
Chodzi Ci o ekran dotykowy?
tak :) nigdzie nie mogę znależc zadnego małego przykładu
a to próbowałeś?
1) http://www.seeedstudio.com/wiki/2.8%27%27_TFT_Touch_Shield_V2.0#Touch_Panel_Output_Pins
dzięki, tego nie widziałem, tyko z Adafruit..
popatrzę sobie moze coś rozszyfruję :)
Witam.
W nawiaaniu do komentarza Kamila:
"masz moze przykład do takiego wyświetlacza? http://allegro.pl/lcd-2-8-spi-ili9341-ekran-dot-arduino-raspberry-i5032481292.html"
Udalo Ci sie uruchomic funkcje dotykowe dla tego ekranu ?
Wyswietlanie dziala bez problemu, ale nie jestem w stanie znalezc zadnej sensownej informacji o tym jak podlaczyc touch dla tych 5 pinow.
Hej Korneliusz po kupnie takiego samego wyświetlacza zawędrowałem tu chce go odpialić czy mógłbyś mi przesłać cały szkić od którego mógłbym zaczac dalej . Bo ten fragment sie nie kompiluje . Biblioteki obie dodałem prze okienko IDE 1.0.5 .
Ale to jest cały szkic :) Pokaż lepiej komunikat błędu
a czy rezystory są konieczne ? bez nich nie zadziała ?
Na logice 3.3V :) na 5V bym nie ryzykował
Wgrałem jeszcze raz biblioteki i skompilowało choć niektóre komunikaty przy kompilacji były na pomarańczowo . Ale chyba spaliłem go bo myslałem że podpinam do Arduino Due a podpiłem do MEGA2560 a tam porty chodzą na 5 V .Ekran ładnie świeci na biało po włączeniu . Stosujecie rezytory szeregowe 10 k na liniach sygnałowych jak już nie dajecie buforda CD4XXX . Pytanie czy LED podpinać przez tranzystor jesli chce wygaszać ekran czy normalnie pod pin portu (20mA )
Witam. Zakupiłem wyświetlacz 2.8TFT SPI 240x320 v1.1 i podłączyłem do arduino uno zgodnie ze schematem. Program skompilował się bez błędów. Wyświetlacz świeci na biało, ale nic się nie dzieje. na dzielnikach napięcia mam 3,2V (1,8k i 3,3k). Kolega Krzysztof miał podobny problem. Co może być.
Masz złą sekwencja inicjalizującą.
Poprawna sekwencja powinna zaczynać się od komend 0x01 i 0xcf. Poszukaj takich przykładów.
Gdzie szukać tej sekwencji?
Udało Ci się uruchomić? Ja ma ciągle tylko biały ekran.
Siemacie, mam takie pytanie, jak mam ten lcd, ale bez spi, tylko 16 bit, to mogę użyć 8 bitowej szyny, oraz jak się połączyć z nim wtedy?
Której połówki bitó użyć do komunikacji? Bo trzeba najpierw mu powiedzieć jak się połączyć chyba i inicjalizować?
Bez zmiany stanów podawanych na piny IM[3..0] nie da się zmienić konfiguracji interface wyświetlacza z 16 bit na 8. Jeśli ci się to jednak uda display będzie działał w trybie 8 bit. Chip można skonfigurować tak żeby korzystał z D[7..0] lub D[17..10]. Szczegóły w dokumentacji. IMHO jeśli kasa nie dusi skombinuj display z fabrycznym linkiem szeregowym. Na Allegro od 40PLN bez przesyłki.
Mam na spi 128x160, szybkością nie poraża wraz z xmega na 40Mhz, ale może to kwestia bascom.
Dlatego jestem ciekawy czy na równoległym by działał szybciej.
Teoretycznie po łączu równoległym powinno być szybciej, ale nie jest to bezwzględna prawda w każdych okolicznościach.
Są XMegi które wyprowadzają sprzętową magistalę zewnętrzną (EBI).
W takim wypadku SPI nie ma żadnych szans. Jeśli jednak trzeba
emulować magistralę na drodze programowej (czyli programowo realizować CS, RD/WR, linie danych i adresów) to suma czasu grzebania po rejestrach może być porównywalna z wypchnięciem 8 bajtów przez SPI.
Na początek spróbuj ustawić prędkość SPI brzebiąc po rejestrach gdyż
BASCOM może ci blokować ustawienie prędkości na max (może mieć
predefiniowane prędkości znacznie mniejsze do możliwości sprzętu).
No, ale i tak musi kod ustawić linię DC, i tylko to. CS ustawiłem na stałe. Bez żadnej poprawy. Mam spic_ctrl = &B11010000
Co ciekawe sama funkcja print nieźle spowalniała, zamiast tego dałem spic_data = zmienna_dane z oczekiwaniem na bit wysłania i jest wyraźnie szybciej. Ale nadal widać migotanie. Na bas tego isę chyba nie da wyeleminować. Za dużo pierdół zabiera za dużo taktów.
Zamieniłem biblioteki Adafruit_ILI9341 na PDQ_GFX.
Zobacz
2x szybsze przepisywanie znaków (zmierzyłem)
Mam pytanko apropos dotyku tez go puszczac przez konweter sygnalu? na 3.3V? ja w tej chwili mam odpalony lcd uzywaja cd4050 i chce dotyk aktywowac i zastanawiam sie jak i czy przez scalaka czy bezposrednio?
Otóż niestety ST7735 na szynie równoległej jest bardzo mało szybszy niż ten po SPI. A szkoda. No ale nie miałem się co spodziewać, kiedy to co zpowalnia to kod a nie szyna danych. Trzeba zaprząc ten DMA.
co trzeba zrobić żeby wyświetlacz pokazywał zmieniającą się czcionkę?
wyrzuciłem na ekran tft.print(voltage) i nie zmienia mi liczb, pokazuje pierwszą, potem tylko nadpisuje i zostają prostokąty w kolorze czcionki zamiast zmienijące się na ekranie numery,
wiesz Korneljusz jak to ustawić?
tft.print(voltage,3) // powinno wyświetlić trzy miejsca po przecinku
Mam pytanie: Dlaczego przy tym wyświetlaczu nie zadziała bufor CD4050?
Znalazłem na stronie: http://gordonsprojects.blogspot.co.uk/2014/04/arduino-tft-serial-spi-22-ili9341.html podłączenie tego wyświetlacza z tym buforem i wszystko działa pięknie i płynnie a przede wszystkim zredukowała się ilość użytych rezystorów :)
Mam pytanie.A podłączone złącze MISO bezpośrednio do Arduino nie zniszczy tego portu i czy to samo dotyczy jak bym chciał go podłączyć do Arduino mega?
Zależy od poziomów logicznych
Witam.
Jaką komendą można obrócić teks na wyświetlaczu, żeby wyświetlał się w orientacji poziomej.
Z góry dziękuje i pozdrawiam
Witam
Mam problem z wyświetlaczem, gdy temperatura się zmienia to pokrywają mi się cyfry na wyświetlaczu i wszystko staje się nieczytelne. jak mogę temu zaradzić, bardzo proszę o pomoc.
Tak to wygląda na zdjęciu:
http://zapodaj.net/bc21ea9280bfb.jpg.html
#define TFT_DC 9
#define TFT_CS 10
#include
#include
#include
#include
#include
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
int val;
int tempPin = 1;
void setup(void)
{
tft.begin();
tft.fillScreen(ILI9341_BLUE);
tft.setRotation(3);
tft.setFont(&FreeSans9pt7b);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.setTextWrap(true);
}
void loop()
{
val = analogRead(tempPin);
float mv = ( val/1024.0)*5000;
int cel = mv/10;
int farh = (cel*9)/5 + 32;
tft.setCursor(5, 30);
tft.print("stan");
tft.setCursor(5, 150);
tft.print("temperatura:");
tft.setCursor(220, 150);
tft.print(cel);
tft.setCursor(270, 150);
tft.print("*C");
tft.setCursor(5, 200);
tft.print("cisnienie");
delay(1000);
}
Już rozwiązałem problem, zamiast:
tft.setTextColor(ILI9341_WHITE);
trzeba wstawić:
tft.setTextColor(ILI9341_WHITE, ILI9341_BLUE);
czyli białe napisy a tło niebieskie
pozdrawiam
Czcionka domyślna ma możliwość zdefiniowania koloru tła i dla tej czcionki
jest OK. Czcionka którą zdefiniowałeś (tft.setFont(&FreeSans9pt7b);) nie ma możliwości zdefiniowania koloru tła i dla tej czcionki metoda nie działa.
Tak to wygląda po moich testach.
Poza tym czcionka ma zdefiniowaną wielkość (7b) i zapis tft.setTextSize(2);
niczego nie zmienia.
Czy coś przeoczyłem?
Da się podłączyć dwa lub trzy takie wyświetlacze pod jedno Arduino, tak, żeby wyświetlały to same lub indywidualne treści?
Da się ;)
Przydałby się tutorial podłączenia lcd tft 3.5" na ILI9481 do Arduino Uno R3 lub ESP8266-12E.
Hej,
Pytanie mam dość trywialne, mianowicie nie korzystam z Arduino, ale chciałbym podpatrzyć rozwiązanie, czy ktoś mógłby mi zalinkować
Chciałbym go dostosować do swoich potrzeb.
Mam pytanie odnośnie podobnego wyświetlacza np tu:
http://www.ebay.com/itm/2-2-SPI-TFT-LCD-Display-Module-Board-240x320-For-Arduino-MEGA-UNO-Mega2560-/272018001924
, który ma do VCC połączone jeszcze dwa elementy elektroniczne, a w opisie jest napisane, że działa na napięciu wejściowym 5V/3,3V. Czy to oznacza że w tym modelu można go podłączać bez konwertera lv sygnałów na 5V??
Pewnie tak, ale najlepiej spytać sprzedawcę
Pytanie. Czy jest możliwość zmiany jednej linijki tekstu bez przeładowania całego obrazu ?
Tak jest to możliwe, musisz najpierw wyczyścić w kolorze tła, obszar na którym znajduje się tekst
Albo wybrać czcionkę z tłem.
Taką opcję ma czcionka domyślna.
tft.setTextColor(ILI9341_BLUE, ILI9341_BLACK);
Ustawiasz kolor czcionki i kolor tła (powyżej niebieska czcionka, czarne tło).
Metoda dużo szybsza niż przepisywanie tła.
Fajny wyświetlacz, trochę kulawo się programuje ze względu na to, że czcionki Adafruit nie mają tła jak Korneliusz wspomniał. Czcionka podstawowa ma tło, ale to kwadraty. Fajnie gdyby zrobił ktoś ładne czcionki z tłem. Druga sprawa to to, że na Atmedze jest wolny po SPI. Wyświetlacze z ILI9341 po ISP są szybsze, ale wymagają więcej pinów do interfejsu równoległego. Ja ominąłem problem stosując Esp8266 (Esp12) do 160Mhz zegar. ILI9341 może pracować z 40Mhz po SPI, gdzie widziałem apki w których po modyfikacji bibliotek wyświetlacz pracował 15fps na esp12. Ale jest problem z tymi wyświetlaczami z dotykiem w rozmiarach 2,4. Problem to Chińczycy. Na rynku są wersje, które nie chętnie pracują z na pewno esp8266. Wpinam jednego producenta i chodzi. Witam innego i nie startuje. Czasem zaskoczy i już działa, ale brak zasilania i znów robi się biały. Jak będę rozłączał zasilanie, to za którymś razem się podniesie. Obydwie płytki różnią się drobnymi detalami. Moje podejrzenia to SPI i długość ścieżek, lub reset. Ty potrzebuje pomocy.
Po dodaniu komentarza zabrałem się do roboty. Zacząłem od funkcji reset. W swoim projekcie reset mam na sztywno podpięty pod zasilanie wyświetlacza. Zmieniłem to połączenie. Reset podpiąłem do plusa zasilania przez rezystor 10 kohm i bezpośrednio obciążyłem niewielkim kondensatorem elektrolitycznym 1 mikro. Ekran startuje za każdym razem. Mojej zabawy.
DZIĘKI KOLEGO. JESTEŚ WIELKI!!
POZDRAWIAM
Po dodaniu komentarza zabrałem się do roboty. Zacząłem od funkcji reset. W swoim projekcie reset mam na sztywno podpięty pod zasilanie wyświetlacza. Zmieniłem to połączenie. Reset podpiąłem do plusa zasilania przez rezystor 10 kohm i bezpośrednio obciążyłem niewielkim kondensatorem elektrolitycznym 1 mikro. Ekran startuje za każdym razem. Mojej zabawy.
Działa, dzięki :)
Witam, z góry sory za prostotę pytania, ale jestem zielony jeżeli chodzi o elektronikę. Moja znajomość jej kończy się na lutowaniu układów z konkretnych skematów DIY ;) Nie mniej jednak chciałbym się dowiedzieć czy mógłbym zastosować ten wyświetlacz do swoich celów. I oczywiście serdecznie proszę o podpowiedź.
Obecnie posiadam kamerkę sportową Xiaomi YI i podłączony pod nią za pomocą kabla FPV (USB) Video output monitor TFT (do kamer cofania). Pytanie czy istnieje możliwość wykorzystania takiego wyświetlacza i podłączenia bezpośrednio pod sygnał output z kamerki. Jeżeli chodzi o zasilanie to sprawa widzę jest prosta 3.3V do + i -, a syngał da się bezposrednio podłączyć pod układ???
Bardzo bym prosił o pomoc w temacie. Pozdrawiam
witam,
Mam problem nie kompiluje mi sie zaden przyklad na żadna płytke, wywala duzo błędów. Biblioteki sciagniete z Githuba.arduino najnowsze 2020. ktos ogarniety pomoze... na I2C wszystko smiga na ledowych wyswietlaczach a tutaj od razu zonk