SantyagoSantyago
YouTube RSS Google+ Facebook GitHub

Newsletter Arduino

Zapisz się do Newslettera, aby otrzymać informację o nowych wpsiach w dziale Arduino!

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Sprzęt dostarczają

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Popularne wpisy

Facebook

Google+

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Wyświetlacz TFT HY43B/HY50B FT800

Tworzenie bardziej skomplikowanych interfejsów graficznych na wciąż popularnych 8-bitowcach do niedawna było bardzo kłopotliwe. Ograniczenia stanowiły głównie dwa elementy - powolne taktowanie MCU oraz ograniczona pamięć. Specjalnie piszę w formie "było", bowiem zastosowany kontroler FT800 w opisywanym dziś wyświetlaczu HY43B/HY50 pozwala osiągnąć to, co zdawało się wręcz niemożliwe i karkołomne.

Czym jest układ FT800

FT800 określany jest mianem EVE (Embedded Video Engine), czyli wbudowanym silnikiem wideo, zaprojektowanym do obsługi wyświetlaczy TFT WQVGA (480x272) oraz QVGA (320x240). Oprócz obsługi wyświetlaczy, kontroluje również rezystancyjne ekrany dotykowe, posiada wbudowany syntezator dźwiękowy oraz wyjście audio. Układ z powodzeniem odtwarza 8-bitowe monofoniczne pliki PCM,  4-bitowe ADPCM oraz pliki w formacie μ-Law z częstotliwością próbkowania od 8kH do 48kHz. Komunikacja z FT800 może odbywać się za pomocą magistrali SPI z prędkością do 30MHz lub I2c z prędkością do 3.4Mhz.

W odróżnieniu od tradycyjnych kontrolerów, nie przesyłamy pojedynczych pikseli, a posługujemy się zestawem wbudowanych instrukcji, które są interpretowane i wykonywane po stronie FT800, co z kolei eliminuje konieczność stosowania zewnętrznych i dość kosztowych buforów ramek. Dzięki temu uzyskujemy coś na wzór akceleracji sprzętowej wykonywanych operacji. Brzmi ciekawie? Jestem pewny, że pokochacie ten wyświetlacz równie jak ja!

Rzućmy na chwilę okiem na diagram z którego poznamy ogólną jego budowę funkcjonalną. Wyróżnić możemy interfejs komunikacji z MCU, blok rejestrów, pamięci RAM o rozmiarze 256kB, pamięci ROM w której znajdują się między innymi podstawowe czcionki, widgety, ikony itp. oraz trzy silniki - graficzny, dźwiękowy i dotyku.

Zanim jednak zaczniemy rozmawiać z FT800, niezbędne jest poznanie mapy pamięci oraz zasady działania, która nieco różni się od standardowych kontrolerów TFT.

Bardzo ważnym dla nas obszarem pamięci będzie RAM_G o rozmiarze 256kB - to w niej będziemy mogli przechowywać wszelkie dane, takie jak dodatkowe czcionki, ikonki, obrazy PNG/JPG lub zapamiętywać listę instrukcji, o której za chwilę.

Kolejnym istotnym dla nas obszarem jest ROM_FONT,  w którym znajdują się fabrycznie zapisane czcionki o różnych rozmiarach.

Jednak najważniejszy  dla nas może okazać się obszar RAM_DL. To w nim będziemy zapisywali polecenia, które układ będzie wykonywał. Każde polecenie zajmuje rozmiar 4 bajtów, więc nie trudno wyliczyć, że jednorazowo możemy zlecić układowi 2000 zadań. Z jednej strony mogłoby wydawać, że jest to mało - jednak szybko zobaczycie, że jest to ilość wystarczająca do większości zastosowań.

Kolejnym regionem jest 380 bajtowy obszar różnych rejestrów, z których możemy odczytywać wiele przydatnych informacji. Np.: ilość wyświetlonych klatek obrazu lub stan ekranu dotykowego.

Z punktu programowania mniej istotny będzie ostatni 4kB obszar RAM_CMD, pełniący formę buforu poleceń układu.

Wyświetlacze FT800CB-HY43B i FT800CB-HY50

Na rynku zagranicznym jest kilka wyświetlaczy z kontrolerem FT800, jednak są to gotowe zestawy szkoleniowe z dodatkowym układem MCU, które ciężko byłoby połączyć np. z Arduino. W ofercie sklepu elty.pl są dostępne gotowe panele TFT o rozmiarach 4.3" i 5" z ekranem dotykowym, które w banalny sposób połączymy z naszym mikrokontrolerem. W komplecie dostajemy wyświetlacz w czarnej ramce oraz taśmę FPC. Bardzo dobrze rozwiązano tu mocowanie ramki, którą w razie konieczności możemy odkręcić i użyć jako nakładkę do umieszczenia samego ekranu w otworze obudowy urządzenia.

Z tyłu znajdziemy niezbędne dla nas złącza. Do wyboru mamy gniazdo FPC oraz dodatkowe miejsce na przylutowanie goldpinów, tak aby wpiąć wyświetlacz w ewentualne gniazdo. Pomyślano również o przejściówce FPC na standardowe goldpiny o rastrze 2.54mm. W tym celu wystarczy wyłamać adapter z lewej strony i przylutować goldpiny.

Podłączenie odbywa standardowo wykorzystując SPI. Bez obaw możemy go podłączyć pod mikrokontrolery z logiką 5V, ponieważ wyświetlacz posiada wbudowane już bufory 74LCX125 z tolerancją 5V. A więc:

  • Adapter ↔ Arduino UNO
  • 5V ↔ 5V
  • GND ↔ GND
  • SCK ↔ D13
  • MISO ↔ D12
  • MOSI ↔ D11
  • INT ↔ D10
  • CS ↔ D9
  • PD ↔ D4

Pin Audio służy do przesyłania sygnału dźwiękowego (Audio PWM out, push-pull output, 16mA sink/source current).

Biblioteka Arduino

Na stronie internetowej EVE Projects znajdziemy wszelką i niezbędną dokumentację oraz dema. To co nas jednak interesuje, to biblioteka dla Arduino: FTDI_V1.2.0_09072014(FT800).zip, którą wystarczy rozpakować do katalogu libraries/

----------------------

Uwaga. Jeśli korzystasz z Arduino IDE 1.6.0 lub nowszej, powyższe biblioteki nie będą w stanie się poprawnie skompilować, dlatego przygotowałem specjalne wersje dla Arduino IDE > 1.6.0:

FTDI_V1.4.0_FT800: pobierz biblioteki dla Arduino 1.6.x

----------------------

Znajdziemy w niej przykłady dla różnych platform szkoleniowych: ADAM_4DLCD_FT843, Breakout_4DLCD_FT843, VM800B35, VM800P35 oraz VM800P43_50. W przypadku Arduino nteresować nas będą jedynie przykłady dla modelu VM800P43_50, który obsługuje poprawnie wyświetlacze FT800CB-HY43B i FT800CB-HY50. Bez problemu wykorzystamy również dodatkowy czytnik kart SD, który jest wymagany do uruchomienia większości przykładów.

Zasada działania

Zrozumienie zasdy działania kontrolera FT800 jest tutaj kluczowe. W standardowych kontrolerach wysyłaliśmy dane bezpośrednio do pamięci. Oznaczało to, że aby narysować linię o długości 200 pikseli, musieliśmy wysłać sporą ilość danych - współrzędne X i Y oraz kolor. Niejednokrotnie jest to co najmniej 4 bajty na współrzędne i 3 bajty na kolor. Tak więc dla linii 200 pikseli jest to ponad 600 bajtów. Do tego jeszcze dochodzą bajty sterujące. W przypadku bardziej złożonych danych do wyświetlenia ilość wzrasta lawinowo, co czyni wyświetlanie bardzo powolnym. W przypadku FT800 wystarczy wysłać tylko kilka 4 bajtowych poleceń.

Drugą istotną różnicą jest sposób wyświetlania. Jeśli przypomnimy sobie obsługę wyświetlaczy TFT, które już opisywałem, aby wyświetlić kolejną ramkę animacji  musieliśmy wyczyścić cały ekran. A w przypadku zmiany wyświetlanej wartości tekstowej, konieczne było wyczyszczenie tego, co było wyświetlone pod spodem. To również powodowało, że wyświetlanie szybkozmiennych elementów było bardzo kłopotliwe.

Tutaj sprawa wygląda zupełnie inaczej. Najpierw musimy zdefiniować wszystkie elementy do wyświetlenia, a następnie wysłać do FT800. Wysłanie kolejnej listy powoduje automatyczne wyczyszczenie obrazu i wyświetlenie nowego. Z jednej strony wydaje się, że jest to problem, bo po co ponownie wyświetlać stałe elementy? Z drugiej jednak strony, nie musimy się o nic martwić. W razie konieczności możemy zapisać stałe polecenia do pamięci RAM, a potem je doklejać - ale to już pokażę następnym razem, ponieważ wpisów o FT800 będzie znacznie więcej, głównie z powodu mało czytelnych przykładów dołączonych do biblioteki.

Dziś zajmiemy się tylko inicjalizacją wyświetlacza i wyświetlania tekstu oraz liczb, a także korzystania z predefiniowanych zmiennych rozmiaru ekranu, czy sposoby centrowania tekstu.

W kolejnych odcinkach omówimy pozostałe funkcje wyświetlacza - osbługę ekranu dotykowego, kalibrację, obsługę widgetów, wyświetlanie obrazów, odtwarzanie dźwięku itd.

Przykład 1 - Inicjalizacja i wyświetlanie tekstu

  1. #include "SPI.h"
  2. #include "Wire.h"
  3. #include "FT_VM800P43_50.h"
  4.  
  5. FT800IMPL_SPI FTImpl(FT_CS_PIN,FT_PDN_PIN,FT_INT_PIN);
  6.  
  7. boolean DisplayInit()
  8. {
  9.   uint32_t chipid = 0;
  10.  
  11.   Serial.println("Inicjalizacja ekranu");
  12.  
  13.   // Inicjalizujemy ekran
  14.   FTImpl.Init(FT_DISPLAY_RESOLUTION);
  15.  
  16.   delay(20);
  17.  
  18.   // Pobieramy ID ukladu i sprawdzamy czy to FT800
  19.   chipid = FTImpl.Read32(FT_ROM_CHIPID);
  20.     
  21.   if (chipid != FT800_CHIPID)
  22.   {
  23.     Serial.print("Nie obslugiwany uklad: 0x");
  24.     Serial.println(chipid, HEX);
  25.     return false;
  26.   }
  27.    
  28.   Serial.print("Obslugiwany uklad: 0x");
  29.   Serial.println(chipid, HEX);
  30.  
  31.   // Wlaczamy ekran
  32.   FTImpl.DisplayOn();        
  33.  
  34.   return true;
  35. }
  36.  
  37. void scena(unsigned long int czas)
  38. {  
  39.   FTImpl.DLStart(); // Otwieramy liste wyswietlania
  40.  
  41.   FTImpl.ColorRGB(0xFF,0xFF,0xFF); // Ustawiamy kolor bialy (R,G,B)
  42.  
  43.   // Wyswietlamy tekst w naroznikach
  44.   // Parametry: x, y, rozmiar 16-31, centrowanie, tekst
  45.   FTImpl.Cmd_Text(10, 10, 20, FT_OPT_CENTERY, "LEWO-GORA");
  46.   FTImpl.Cmd_Text(FT_DISPLAYWIDTH-10, 10, 20, FT_OPT_RIGHTX | FT_OPT_CENTERY, "PRAWO-GORA");
  47.   FTImpl.Cmd_Text(10, FT_DISPLAYHEIGHT-10, 20, FT_OPT_CENTERY, "LEWO-DOL");
  48.   FTImpl.Cmd_Text(FT_DISPLAYWIDTH-10, FT_DISPLAYHEIGHT-10, 20, FT_OPT_RIGHTX | FT_OPT_CENTERY, "PRAWO-DOL");
  49.  
  50.   // Wyswietlamy napis na srodku
  51.   FTImpl.ColorRGB(0xFF,0xFF,0x00); // Ustawiamy kolor zolty (R,G,B)
  52.   FTImpl.Cmd_Text(FT_DISPLAYWIDTH/2, FT_DISPLAYHEIGHT/2-15, 29, FT_OPT_CENTER, "www.jarzebski.pl");
  53.  
  54.   // Wyswietlamy liczbe z parametru funkcji
  55.   FTImpl.ColorRGB(0x00,0xFF,0x00); // Ustawiamy kolor zielony (R,G,B)
  56.   FTImpl.Cmd_Number(FT_DISPLAYWIDTH/2, FT_DISPLAYHEIGHT/2+15, 29, FT_OPT_CENTER, czas);
  57.  
  58.   // Latajace hashe
  59.   int offset1 = czas % FT_DISPLAYWIDTH;
  60.   int offset2 = FT_DISPLAYWIDTH - offset1;
  61.  
  62.   FTImpl.ColorRGB(0x00,0xFF,0xFF); // Ustawiamy kolor turkusowy (R,G,B)
  63.   FTImpl.Cmd_Text(offset1, FT_DISPLAYHEIGHT/2-50, 31, FT_OPT_CENTER, "#");
  64.   FTImpl.Cmd_Text(offset2, FT_DISPLAYHEIGHT/2+50, 31, FT_OPT_CENTER, "#");
  65.  
  66.   FTImpl.DLEnd(); // Zamykamy liste wyswietlania
  67.   FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczenie  
  68. }
  69.  
  70. void setup()
  71. {
  72.   Serial.begin(9600);
  73.  
  74.   while(!DisplayInit()){}
  75. }
  76.  
  77. void loop()
  78. {
  79.     scena(millis());
  80. }

Jak widzimy, w pętli loop() wysyłamy kompletną scenę, do której przekazujemy parametr w postaci czasu millis(). Scena wykorzystuje przekazaną wartość i ją wyświetla.

Materiał filmowy

Przydante dokumenty

http://www.jarzebski.pl/datasheets/FT800_AN240_From_the_GroundUp.pdf

http://www.jarzebski.pl/datasheets/FT800_AN246_Sample_Arduino_App.pdf

http://www.jarzebski.pl/datasheets/FT800_AN318_Arduino_Library.pdf

http://www.jarzebski.pl/datasheets/FT800_datasheet.pdf

http://www.jarzebski.pl/datasheets/FT800_programmers_guide.pdf

Udpstępnij dalej!

http://www.jarzebski.pl/arduino/komponenty/wyswietlacz-tft-hy43b-hy50b-ft800.html

Reklama

Komentarze Komentarze
Avatar 1
rafalski76 Windows 7 / Mozilla 11.0
19 styczeń 2015 - 13:11 Brak informacji

RE-WE-LA-CJA! Już zamawiam ekranik :) Z niecierpliwością czekam na kolejne części. Pozdrawiam...

Avatar 2
Korneliusz Android 4.4 / Safari 537.36
20 styczeń 2015 - 05:51 Brak informacji

To fakt, ekran jest kapitalny :)

Avatar 1
rafalski76 Windows 7 / Safari 537.36
29 styczeń 2015 - 09:59 Brak informacji

Własnie doszedł zamówiony ekran. Jestem pod wrażeniem możliwości i prędkości renderowania :) To całkiem nowy wymiar projektów Arduino!

Avatar 1
Sergiusz Windows 7 / Mozilla Firefox 41.0
07 październik 2015 - 20:38 Warszawa

Czy kolega "rafalski76" mógłby się odezwac do mnie na maila. Mam parę pytań ;) Mój mail ---> sergiusz.fan@interia.pl

Avatar 1
#r2d2# Linux Ubuntu / Mozilla Firefox 35.0
19 styczeń 2015 - 22:17 Warszawa

Gdzie można kupić to cudo? Bo oprócz jednej oferty na Allegro nie znalazłem nigdzie tego wyświetlacza :-(

Avatar 2
Korneliusz Android 4.4 / Safari 537.36
20 styczeń 2015 - 05:51 Brak informacji

Ja swój kupiłem na elty.pl

Avatar 1
Błażej Windows 7 / Safari 537.36
09 luty 2015 - 23:23 Brak informacji

Troszkę szkoda, że nie ma biblioteki i przykładów dla IDE 1.5.x lub 1.6.0.
Ale to da się obejść. Ekran jest ok. Już instaluję w maszynie...

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
10 luty 2015 - 23:27 Bytom

Kapitalnie :)

Avatar 1
Błażej Windows 7 / Safari 537.36
10 luty 2015 - 22:28 Brak informacji

Mam mały problem, może pomożecie.
Podzieliłem sobie plik ino na więcej, a mianowicie:
1) W pliku głównym mam:

#define __PROG_TYPES_COMPAT__
#include
#include
#include
#include "TouchLcd.h"
FT800IMPL_SPI tlcd(FT_CS_PIN,FT_PDN_PIN,FT_INT_PIN);
TouchLcd myTouchLcd;
void setup(){}
void loop(){}

2) W pliku TouchLcd.h:
#ifndef TouchLcd_h
#define TouchLcd_h
#include "Arduino.h"
class FT_VM800P43_50;
extern FT800IMPL_SPI tlcd;

class TouchLcd
{

};
#endif;

3) W pliku Touchlcd.cpp:
#include
#include
#include
#include "TouchLcd.h"

Reszta kodu wykasowana. Otrzymuję błędy:
TouchLcd.cpp.o*:In function `FT_RTC::DecToBcd(unsigned char)\'
FT_SD.h*:FT_SD()\'
FTDI_Touch.cpp.o*:FTDIlibrariesFT_SDFT_SD.h:159: first defined here
TouchLcd.cpp.o*:In function `FT_RTC::DecToBcd(unsigned char)\'

i tak do wielu funkcji.

Coś pokopałem z extern, ale zupełnie nie wiem co...

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
10 luty 2015 - 23:27 Bytom

Ciekawe, wygląda na to, że najpierw musisz dodać nagłówek w którym jest funkcja DecToBcd ?

Avatar 1
Błażej Windows 7 / Safari 537.36
11 luty 2015 - 00:04 Brak informacji

Tych błędów jest cała masa, a ewidentnie jest to powtórne definiowanie, więc to chyba nie to...

Avatar 1
Błażej Windows 7 / Safari 537.36
11 luty 2015 - 00:35 Brak informacji

Pierwsze 3 includy to:
#include "SPI.h"
#include "Wire.h"
#include "FT_VM800P43_50.h"

Avatar 1
wasyl2007 Windows 7 / Mozilla 11.0
10 kwiecień 2015 - 12:49 Brak informacji

Wszystko ładnie,pięknie tylko w necie same dema,a co z odczytem jakiś wartości z czujników itp.Moze jakiś przykładzik?

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 kwiecień 2015 - 16:28 Bytom

Jakich czujników ? :)

Avatar 1
EHB Windows 7 / Safari 537.36
12 kwiecień 2015 - 16:54 Brak informacji

Czy już widział może ktoś z Was wersję z kontrolerem FT801 i dotykiem pojemnościowym? Czy jeszcze czymś więcej różnią się te kontrolery niż tylko dotykiem? (FT800 - rezystancyjny, FT801 - pojemnościowy z mulkti...)

http://www.ftdichip.com/Support/Documents/AppNotes/AN_333_FT800_and_FT801_Touch_Capabilities.pdf

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
12 kwiecień 2015 - 17:15 Bytom

Tutaj mają z pojemnościowym: http://unisystem.pl/

Avatar 1
EHB Windows 7 / Safari 537.36
12 kwiecień 2015 - 21:36 Brak informacji

@Korneliusz...

No w sumie tak...
Ja znalazłem również te produkowane przez FTDI:
http://www.ftdichip.com/Products/Modules/VM801B.html

lub te same dostępne także w Polsce:
http://www.soselectronic.pl/?str=371&artnum=179811&name=ftdi-vm801b50a-bk

no ale żeby za sam pojemnościowy dotyk płacić 600 PLN?? to przecież więcej niż za kompletny 7" wyświetlacz z dotykiem w tablecie Larka :D (cały tablet Lark albo Manta to coś około 200 pln!!! ) raczej sam kontroler ekranu i dotyku może dałoby się do tych tabletowych dopasować ??

Avatar 1
grzegorzw Windows 7 / Safari 537.36
19 maj 2015 - 09:18 Brak informacji

witam,
próbuję skompilować projekty do tego ekranu i nie moge dołaczyć
#include "FT_VM800P43_50.h"
otrzymuję tak czy inaczej komunikat
Font.ino:30:28: error: FT_VM800P43_50.h: No such file or directory
pozdrawiam

Avatar 1
Błażej Windows 7 / Safari 537.36
02 czerwiec 2015 - 11:43 Wołomin

A zainstalowałeś bibliotekę???
Jeśli tak, podeślij kod.

Avatar 1
Maty Windows / Safari 537.36
22 maj 2015 - 22:48 Brak informacji

Bardzo fajny blog. Czekam na więcej lekcji. Szkoda ze w sieci jest malo materiału na ich temat. Przydałby się przykład jak wyświetlać np dane z czujników. Godzinę albo coś. Sam w sobie lcd\'k jest fantastycznie super szybki.

Avatar 1
Błażej Windows 7 / Safari 537.36
02 czerwiec 2015 - 11:45 Wołomin

Czy komuś udało się podpiąć to urządzonko do DUE?
Jaki konwerter poziomów użyliście?
Ja jakoś nie mogę :(. Jeszcze będę sprawdzał.

Maty, co potrzebujesz - napiszę Ci przykład.

Avatar 1
Marcin Windows 7 / Mozilla Firefox 38.0
19 czerwiec 2015 - 14:32 Warszawa

Uruchamiam ten wyświetlacz (na Leonardo Eth), ale mam jakieś problemy z zawieszaniem się (albo obraz zastyga, albo pojawiają się krzaki, albo biały/czarny ekran).
Wygląda na to, że dołączenie oscyloskopu do linii SCK i MOSI pomaga (przez dłuższy czas się nie zawiesza), choć nie rozwiązuje problemu całkowicie.
Próbowałem też zmniejszyć częstotliwość zegara SPI, ale to też nie pomogło.

Macie może jakieś sugestie??

I jeszcze zauważyłem, że aby móc uruchomić przykłady pobrane ze strony FTDI muszę z nich usuwać te linijki:
FTImpl.SetDisplayEnablePin(FT_DISPENABLE_PIN);
FTImpl.SetAudioEnablePin(FT_AUDIOENABLE_PIN);

MOSI z kolei ma 3.3V (Arduino 5V), ale to chyba nie powinno mieć znaczenia.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
20 czerwiec 2015 - 01:11 Bytom

Wyświetlacz jest bardzo czuły na stabilność napięcia zasilającego, sprawdź linie zasilania czy nie dużych spadków

Avatar 1
Marcin Windows 7 / Mozilla Firefox 38.0
24 czerwiec 2015 - 13:23 Warszawa

Rzeczywiście, trzeba było poprawić łączenie. Zastosowałem krótką taśmę i całe złącza 5x2 i 3x2.

Avatar 1
Blazej Android 4.1 / Safari 537.36
10 lipiec 2015 - 21:03 Warszawa

Ja dołożyłem szeregowo do MISO R27.

Avatar 1
MiJu Mac OS X / Safari 600.1.4
30 czerwiec 2015 - 20:12 Warszawa

Czy komuś udało się może przerobić bibliotekę pod IDE 1.6.5 albo może wiecie gdzie mogę pobrać taką ... nie ukrywam, że napaliłem się strasznie kupiłem wyświetlacz ale nie doczytałem drobnym druczkiem o kompatybilności z IDE no i tera mam problem bo inne biblioteki w moim projekcie mają z owu problem ze starszym IDE ... może macie jakiś pomysł.

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 34.0
11 lipiec 2015 - 22:37 Bytom

Możesz przekleić komunikat błędu?

Avatar 1
G. Windows / Safari 537.36
13 lipiec 2015 - 09:33 Lublin

Tutaj szczegóły: https://github.com/arduino/Arduino/issues/2789

Szkoda tylko, że FTDI nie zamierza zmodyfikować bibliotek.

Avatar 1
hebi Windows / Safari 537.36
02 październik 2015 - 19:14 Rzeszów

Aby na szybko uruchomic demo z przykladów FT800 na Arduino 1.6.x można dodać na poczatku kodu definicje:

#define prog_uchar const unsigned char
#define prog_char const char

Rozwiązuje większość problemów bez grzebania w kodzie.

W chyba wersji 1.5.7 zmieniła się definicja prog_uchar, a raczej zniknęła

previous: prog_uchar text[] PROGMEN = { "Hello World" };
now: const unsigned char text[] PROGMEM = { "Hello World" };

Własnie po godzinie stresu udało mi się uruchomić mój wyświetlacz na Uno ;]

Avatar 1
Fanatyk Windows 7 / Mozilla Firefox 39.0
11 sierpień 2015 - 13:56 Brak informacji

Mam pytanko jak wyswietlic double na tym wyswietlaczu?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 41.0
19 październik 2015 - 22:49 Bytom

Zamień na stringa :)

Avatar 1
Janusz Windows 7 / Mozilla Firefox 42.0
06 grudzień 2015 - 21:26 Warszawa

Czy kolega mógłby podesłać kod do obsługi klawiatury dla FT800 taki odchudzony dla UNO ?

Avatar 1
Piotr Windows / Safari 537.36
27 grudzień 2015 - 09:26 Poznań

Witam.
Mam taki mały problem z transformacją typu float na const char lub string.
Chodzi głównie o to aby wyświetlana była temperatura i inne warości zmiennoprzecinkowe na FT800.

Drugim problemem jest procedura kalibracji ekranu.
skąd i gdzie zapisać dane kalibracji, bo przy zwykłym resecie...(no nie za ciekawie to wygląda.
Z Góry dziękuję Szczególnie Panu, Korneliuszu.

Avatar 1
Piotr Windows / Safari 537.36
29 grudzień 2015 - 12:07 Warszawa

Może ten kod da się przerobić pod arduino

#include
#include
#include

char *iascii(int);

char* fascii(float i) /* Function to convert a floating point number into a stream of ASCII characters */
{
char *s;int j,k;
float a,b,c;
j=i;
s=(char*)malloc(10*sizeof(char));
s=iascii(j);
printf("%s.",s);
i=i-j;

for(a=0,c=0.1,k=1;(b=(i-a))!=0;a+=c)
{
if(b<0)
{
b=i+a;
k++; a=c/10; c=a;
}
if(a==1)
{ a=c/10;c=a;}
}

for(;k>0;k--)
{
i=10*i;
}
j=i;
s=iascii(j);
return s;
}

char* iascii(int i) /* Function to convert an integer into a stream of ASCII charcters */
{
char *s;
int j,k;
s=(char*)malloc(10*sizeof(char));
for(j=0;i!=0;j++)
{
*s++=(i%10)+48;
i=i/10;
}*s=\'\';

for(k=j;k>0;k--,s--);
j--;
for(i=0;(j-i)>0;j--,i++)
{
char c; /* Loop to reverse the string s */
c=s[i];
s[i]=s[j];
s[j]=c;
}

return s;
}

int main()
{
char *s;
float i;
puts("Enter any positive floating point number");
scanf("%f",&i);
s=fascii(i);
printf("%s",s);
}

Avatar 1
Piotr Windows / Safari 537.36
10 luty 2016 - 09:25 Poznań

// 11111111111111
// Zapis kalibracji do EEPROM
//****************************************************************************************
void kalibracja() // kalibracja dotyku ekranu
{
FTImpl.DLStart(); // Otwieramy liste wyswietlania
FTImpl.ClearColorRGB(0x00, 0x00, 0x00); // Kolor czyszczenia czarny
FTImpl.Clear(1, 1, 1); // Czyścimy ekran
FTImpl.ColorRGB(0xFF, 0xFF, 0xFF); // Ustawiamy kolor bialy (R,G,B)
FTImpl.Cmd_Text((FT_DISPLAYWIDTH / 2), (FT_DISPLAYHEIGHT / 2), 30, FT_OPT_CENTER, flashtext(0));//Dotknij punkty
FTImpl.Cmd_FGColor(0xFFFF00); // Kolor pierwszego planu
FTImpl.Cmd_BGColor(0x444400); // Kolor drugiego planu
FTImpl.Cmd_Calibrate(0); // Kalibracja
FTImpl.DLEnd(); // Zamykamy liste wyswietlania
FTImpl.Finish(); // Renderujemu liste i czekamy na ukonczeni

// Pobranie zawartosci 12 rejestrow i wyswietlenie w konsoli
Serial.println(F("uint8_t touchCallibration[24] = {"));
for (uint8_t i = 0; i < 24; i++)
{
EEPROM.write(EEPROM_CALIBRATION_DATA_START + i, FTImpl.Read(REG_TOUCH_TRANSFORM_A + i));

if ((i % 4 == 0) && (i > 0)) Serial.println();
Serial.print(F("0x"));
Serial.print(FTImpl.Read(REG_TOUCH_TRANSFORM_A + i), HEX);
if (i < 23) Serial.print(F(", "));
}
EEPROM.write(0, 0xAF);
Serial.println();
Serial.println(F("};"));
nrmenu = 0;
}
//****************************************************************************************
// w setup po inicjalizacji

if ((EEPROM.read(0) != 0xAF) || b == 3 ) //czy w EEPROM procesora o adresie 0 zawiera wartość 0xaf lub wciśnięty przycisk podczas uruchamiania
{
kalibracja(); //jeśli nie, wiec kalibrujemy ekran i zapisujemy wyniki w EEPROM procesora
}
else
{
for (int i = 0; i < 24; i++) // jeśli jest ... kopiujemy dane do rejestów "dotyku"
{
FTImpl.Write(REG_TOUCH_TRANSFORM_A + i, EEPROM.read(EEPROM_CALIBRATION_DATA_START + i));
}
}
//****************************************************************************************
//****************************************************************************************
//****************************************************************************************
//22222222222222222222**************************************************
char *TempChar(float ft) //zamienia temperature F L O A T na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length);
return bufor; // zwracamy bufor do funkcji
}
przykład wykozystania
FTImpl.Cmd_Text(180, 80, 22, 0, strcat(TempChar(TempFloat[1]), " \'C"));
FTImpl.Cmd_Text(180, 110, 22, 0, TempChar(TempFloat[2]));

//****************************************************************************************
//****************************************************************************************
//****************************************************************************************
///333333333333333333333333333333
// Stringi zapisane we FLASH nie zabieraja nam RAM-u
// Konfigurowanie string_table jest procesem dwuetapowym. Najpierw zdefiniować ciągi STR_xx.
const char STR_0 [] PROGMEM = "Dotknij punkty"; // od 0-19 nazwy przycisków
const char STR_1 [] PROGMEM = "WITAM";
const char STR_2 [] PROGMEM = " Piotr";
const char STR_3 [] PROGMEM = "Wymien czujnik";
const char STR_4 [] PROGMEM = " \'C";
// Następnie ustawiamy tabele na odwoływanie się do ciągów.
const char* const string_table[] PROGMEM = {
STR_0, STR_1, STR_2, STR_3, STR_4}// i tak ile chcemy, aby tylko flashu starczylo

char bufor[60]; // Upewnij się, że jest wystarczająco duży dla największego ciągu STR_xx powyżej

//****************************************************************************************
char *flashtext(int i) //////////////// Funkcja zwraca stringi z pamięci flash
{
return strcpy_P ( bufor, (char *) pgm_read_word (& (string_table [i]))); // Niezbędne odlewy i wyłuskania, po prostu skopiować.
}
//****************************************************************************************
FTImpl.Cmd_Text(200, 130, 30, FT_OPT_CENTER, flashtext(0));//Dotknij punkty

mam nadzieję, że komuś się przyda:):)

Avatar 1
thornet Windows / Mozilla Firefox 47.0
11 sierpień 2016 - 21:38 Brak informacji

a nie lepiej użyć PSTR

FTImpl.Cmd_Text(200, 130, 30, FT_OPT_CENTER, (PSTR("text")));

Avatar 1
Piotr Windows / Safari 537.36
30 styczeń 2017 - 22:46 Warszawa

Nie wiem, czy lepiej?
Dla jednej linii tekstu pewnie tak.

Avatar 1
Piotr Windows / Safari 537.36
05 styczeń 2016 - 11:33 Poznań

Witam
Dzisiaj przyszło Mega2560 i nie mam już sił, nic nie działa. Jak podłączyć FT800 Mega2560

Bardzo proszę o pomoc w tym temacie.

Avatar 1
Piotr Windows / Safari 537.36
13 styczeń 2016 - 16:01 Warszawa

Widzę, że temat umarł.

Znalazłem fajny programik do obsługi wyświetlacza
na stronie producenta,zgodny z ARDUINO,
FTDI EVE Screen Editor.

Większość w/w problemów rozwiązałem,
nie mniej jednak proszę o pomoc przy podłączeniu do MEGA 2560,
nie chce kombinować na pałę aby czegoś nie uszkodzić.
na razie piszę na UNO ale nie da się ukryć, że pamięć po mału się kończy.

Avatar 1
Piotr Windows / Safari 537.36
13 styczeń 2016 - 16:03 Warszawa

PS
Przydało by się chociaż omówienie wgrania polskiej czcionki,
na pewno już ktoś to robił, widziałem w necie sporo takich wyświetlaczy a na nich polska czcionka.

Pozdro dla wszystkich

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
04 luty 2016 - 16:30 Bytom

I to będzie temat na kolejny odcinek :)

Avatar 1
piotr Windows / Safari 537.36
10 luty 2016 - 08:58 Poznań

Super nie mogę się doczekać. Wyświetlacz jest na prawdę super,
a tak na prawdę to Twoja stronka Korneliuszu.
ps.
Zauważyłem, że przydało by się obrócić wyświetlanie o 180 stopni,
po odwróceniu widać lepiej pod większym kątem nachylenia.
Wie ktoś jak by to trzeba było zrobić?

Avatar 1
Rafal Windows / Safari 537.36
01 luty 2016 - 19:04 Brak informacji

Kupiłem taki wyświetlacz Riveldi: RVT28AEFNWR00. Niestety nie jestem w stanie zmusić go do działania z Arduino. Podpinam go poprzez shielda. Z konfiguracją FT_VM801P43_50.h ekran pozostaje niepodświetlony. Zmiana FT_CS_PIN z 9 na 10 powoduje, że się podświetla. Kombinowałem ale nie jestem w stanie nic na nim wyświetlić ;( Może ktoś pomoże?

Dzięki,
Rafal

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
04 luty 2016 - 16:29 Bytom

Cześć - jakie Arduino posiadasz i którą wersję IDE? :)

Avatar 1
Rafal Windows / Safari 537.36
04 luty 2016 - 20:40 Brak informacji

Nie wiem czemu mi się wkleiło wcześniej FT_VM801P43_50.h. Oczywiście powinno być FT_VM800P43_50.h - i z takiej konfiguracji korzystam. Arduino to UNO. Jako IDE używam eclipse\'a od baeyens\'a.
Dostaję jakiś dziwny chipId:

FTImpl.Read32(FT_ROM_CHIPID);

O ile dobrze teraz pamiętam było to A4A4A4. Ktoś miał kiedyś podobny problem i miał walniętą taśmę. Ja mam dwie i na obu to samo.

R.

Avatar 1
Michał Windows XP / Safari 537.36
10 luty 2016 - 18:32 Brak informacji

Dzień dobry,

uprzejmie proszę o informację (dla laika), na czym polegają zmiany w bibliotece dla Arduino IDE > 1.6.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
10 luty 2016 - 23:51 Bytom

inny sposób dostępu do pamięci - tak w skrócie :)

Avatar 1
Radek Windows / Safari 537.36
28 luty 2016 - 08:48 Radom

Witam,

Jak sprawdzić długość wyświetlanego tekstu, tak aby wyświetlić bezpośrednio np. za wartością, jednostkę, np:

FTImpl.Cmd_Number(10,10,20, FT_OPT_CENTERY, wilgotnosc);
FTImpl.Cmd_Text(50, 10, 20, FT_OPT_CENTERY, " %");

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 43.0
02 marzec 2016 - 21:58 Bytom

Musisz połączyć w jeden string

Avatar 1
Bike.Bajer Windows / Safari 537.36
04 kwiecień 2016 - 21:00 Warszawa

Cześć!
Mam pytanie do użytkowników tego wyświetlacza. Znacie może "komende" do zmiany wartości podświetlenia/jasności? Mój wyświetlacz świeci cały czas na 100%, tak, że patrząc prostopadle do niego nic nie widać :(. Tylko pod kątem coś widać.

Avatar 1
Aqarative Windows / Safari 537.36
06 kwiecień 2016 - 11:27 Brak informacji

Jesli pracujesz na Arduino to;
FTImpl.Write(REG_PWM_DUTY,podswietlenie); // Gdzie podświetlenie max 128, 0= wygaszenie wyswietlacza.

Avatar 1
piotricz Windows / Safari 537.36
05 kwiecień 2016 - 16:18 Lublin

Wyświetlacz ma minus, wrażliwy na zakłócenia. Przy stosowaniu arduino + przekaźnik + FT800 ciężko wygłuszyć zakłócenia.

Avatar 1
Radek Windows / Safari 537.36
14 kwiecień 2016 - 09:48 Sieradz

Czy są jakieś wymagania, do jakich pinów Arduino (PWM, INT) mają być podłączone piny INT, CS, PD FT800? Czy mogą to być dowolne?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
26 kwiecień 2016 - 23:44 Bytom

Wszystko zależy od definicji w nagłówku .h. Zwyczajowo CS może być dowolny pin cyfrowy, po zmianie właśnie w pliku nagłówka. INT zależy, jeśli stricte ma obsługa przerwać, musisz wybrać pin obsługujący przerwania.

Avatar 1
Radek Windows / Safari 537.36
28 kwiecień 2016 - 18:50 Sieradz

Nie mogę sobie poradzić z podłączeniem FT800 do ATmega1284p. Zmieniałem piny wg różnych konfiguracji, ale problem wciąż występuje. Pisałem z prośbą o pomoc na elektrodzie, ale bez odzewu. Może tutaj znajdzie się podpowiedź?
http://www.elektroda.pl/rtvforum/topic3191877.html

Avatar 1
Radek Android 6.0 / Safari 537.36
18 maj 2016 - 18:04 Warszawa

Hej,
ktoś wie jak wyświetlić napisy (FTImpl.Cmd_Text) obrócone o 90 stopni?

Avatar 1
Kamil Windows 7 / Safari 537.36
04 lipiec 2016 - 14:50 Toruń

Witam,

Wie ktoś może dlaczego jak nie podłączę pinu INT to cały ekran zmienia się płynnie na biały? Jakby jasność na 100% wtedy się przestawiała.

Avatar 1
Martin Windows / Safari 537.36
14 październik 2016 - 08:46 Brak informacji

Witam,
Proszę wybaczyć mój polski, używam tłumacza.
Kupiłem ten LCD: http://elty.pl/pl/p/Wyswietlacz-LCD-5-800x480-z-panelem-dotykowym-sterowanianie-SPI%2C-kontoler-FT810-/1783
Czy ktoś ma doświadczenie zadowolić FT810 lub bibliotekę funkcjonalną dla FT810? Używam Arduino 1.6.10.
Pobrałem https://elty.pl/upload/download/FT_App_Gradient.rar~~dobj kodu, który nie działa i zakończyć ten błąd:

Arduino: 1.6.10 (Windows 10), Board: "Arduino/Genuino Uno"

WARNING: Category \'\' in library UIPEthernet is not valid. Setting to \'Uncategorized\'
In file included from sketchFT_Platform.h:198:0,

from sketchFT_CoPro_Cmds.cpp:31:

FT_DataTypes.h:53: error: \'prog_uchar\' does not name a type

typedef prog_uchar ft_prog_uchar8_t;

^

FT_DataTypes.h:54: error: \'prog_char\' does not name a type

typedef prog_char ft_prog_char8_t;

^

FT_DataTypes.h:55: error: \'prog_uint16_t\' does not name a type

typedef prog_uint16_t ft_prog_uint16_t;

^

In file included from sketchFT_Platform.h:199:0,

from sketchFT_CoPro_Cmds.cpp:31:

FT_Gpu_Hal.h:275: error: \'ft_prog_uchar8_t\' does not name a type

ft_void_t Ft_Gpu_Hal_WrMemFromFlash(Ft_Gpu_Hal_Context_t *host,ft_uint32_t addr,const ft_prog_uchar8_t *buffer, ft_uint32_t length);

^

FT_Gpu_Hal.h:276: error: \'ft_prog_uchar8_t\' has not been declared

ft_void_t Ft_Gpu_Hal_WrCmdBufFromFlash(Ft_Gpu_Hal_Context_t *host,FT_PROGMEM ft_prog_uchar8_t *buffer,ft_uint32_t count);

^
exit status 1
\'prog_uchar\' does not name a type

Avatar 2
Korneliusz Mac OS X / Safari 537.36
14 październik 2016 - 14:39 Brak informacji

Hi i will check this today

Avatar 1
Martin Windows / Safari 537.36
14 październik 2016 - 20:10 Brak informacji

Dziękuję bardzo,
Chciałbym tu użyć przykładu, zgodnie z którym może działać bardzo dobrze z wyświetlaczem FT800. Możliwe jest modyfikowanie tego przykładem i ubiegać się o FT810? Niestety myliłem się.

Dzięki za wszelkie rady.

Avatar 1
TFTLCDCyg Windows 8 / Safari 537.36
15 październik 2016 - 06:10 Brak informacji

Try this modified library for FT81X on Due, MEGA, UNO, Teensy 3.2 based on Gameduino 2 library:

http://www.mediafire.com/file/26ouvrp2tkhhln8/GD2+para+FT80X_GD3+para+FT81X.rar

Enjoy it!

Avatar 1
TFTLCDCyg Windows 8 / Safari 537.36
15 październik 2016 - 06:14 Brak informacji

For arduino Due:

FT81X Arduino Due

MOSI 11
MISO 12
SCK 13
GND GND
VCC 5V on HotMCU-FT81X TFT´s, 3.3V on Riverdi-FT81X
CS 10

Avatar 1
Bazyliszek Windows / Mozilla Firefox 50.0
04 styczeń 2017 - 14:40 Wrocław

Witam,
Ten artykuł ujawnił istnienie FT800 - wspaniałej platformy graficznej - Dzięki!
Mam już Ft800 (dokładnie Ft800CB FOR HY 43B/50B) i uruchamiam na nim wszystkie przykłady dla Arduino za wyjątkiem tych, które wykorzystują czytnik kart SD.
Np. aplikacja Image Viewer, podłączenie jak poniżej:
FT_SD_CSPIN: 8
FT_CS_PIN: 9
FT_PDN_PIN: 4
FT_INT_PIN: 3
tak podłączyłem do Arduino Uno.
Po uruchomieniu nic się nie wyświetla.
Jeśli podłącze FT_INT_PIN: do portu #10 otrzymuję komunikat ""STORAGE DEVICE NOT FOUND".

Czytnik kart działa z innym programem z wykorzystaniem biblioteki SD.h w tym samym fizycznym podłączeniu z FT800 - więc jest sprawny (czyta zawartość karty).

Proszę o pomoc albo jakąś sugestie.
Pozdrawiam

Avatar 1
Piotr Windows / Safari 537.36
29 styczeń 2017 - 20:58 Warszawa

Czy te przykłady nie wymagają od procesora większej pamięci???
Kiedyś uruchamiałem , ale na mega 2560.
na uno raczej nie pociągnie.
ps.
no i musisz na kartę wcześniej wgrać pliki potrzebne dla programu.

Avatar 1
bike.bajer Windows / Safari 537.36
08 styczeń 2017 - 00:59 Kęty

Witam.
Ma ktoś jakieś sensowne rozwiązanie wyświetlania wartości ujemnych i zmiennoprzecinkowych?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 50.0
19 styczeń 2017 - 18:19 Bytom

Zamień na stringa

Avatar 1
Piotr Windows / Safari 537.36
29 styczeń 2017 - 21:12 Warszawa

char *TempChar(float ft) //zamienia temperature F L O A T na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length);
return bufor; // zwracamy bufor do funkcji
}
//****************************************************************************************
char *IntToChar(int ft) //zamienia temperature I N T E G E R na C H A R [x]
{
String temp = String(ft);// zmiana float na string odczytu temperatury z czujnika "i" do temp1
temp.toCharArray(bufor, 8); // zmiana string na *char z temp do bufora( 6 znaków)
int8_t Length = strlen(bufor);
temp.toCharArray(bufor, Length + 1);
return bufor; // zwracamy bufor do funkcji

}
//****************************************************************************************
float IntToFloat(int x) // zamienia temp integer na float 0,10 - 2 miejsca po przecinku
{
return ((float)x / 10);
}
//****************************************************************************************
//**************************************************************************************************************************************//
void CzytajTemp(int b) // czyta i zamienia temperature F L O A T na INTEGER * 10 //32,7 = 327
{
TempFloat[b] = sensors.readTemperature(FA(sensorsAddress[b]));
TempInt[b] = int(10 * TempFloat[b]);
sensors.request();
// Serial.print(" int- ");Serial.print(TempInt[b]);
// Serial.print(" char-");Serial.print(TempChar(b));
// Serial.print(" float-");Serial.println(TempFloat[b]);
}

// tak wywołujesz
FTImpl.ColorRGB((tag3 == 0) ? 0x00ff7f : 0xff7f00);//111111 // lewo góra
FTImpl.Cmd_Text(143, 100, 30, FT_OPT_RIGHTX, flashtext( 166 + dane[nrdanx])); //typ
FTImpl.ColorRGB((tag3 == 1) ? 0x00ff7f : 0xff7f00);//2222222 // prawo góra
FTImpl.Cmd_Text(285, 100, 30, FT_OPT_RIGHTX, strcat(TempChar((float)dane[nrdanx + 1] / 10 ), " s")); //sek
FTImpl.ColorRGB((tag3 == 2) ? 0x00ff7f : 0xff7f00);//3333333 // lewo dół
FTImpl.Cmd_Text(143, 165, 30, FT_OPT_RIGHTX, strcat(IntToChar(dane[nrdanx + 2]), " %")); //%
FTImpl.ColorRGB((tag3 == 3) ? 0x00ff7f : 0xff7f00);//4444444 // prawo dół
FTImpl.Cmd_Text(285, 165, 30, FT_OPT_RIGHTX, strcat(IntToChar(dane[nrdanx + 3]), " %")); //%

u mnie wszystko śmiga
możesz sobie dostosować

Avatar 1
Piotr Windows / Safari 537.36
29 styczeń 2017 - 21:22 Warszawa

Witam Korneliuszu.
Obiecałeś kiedyś tam pokazać jak czcionkę wgrać itp.
Może przyszedł już na to czas.
Widzę że coraz więcej ludzi posiada te wyświetlacze, a Google odsyła najczęściej do Ciebie Korneliuszu

Pozdrawiam
Piotr

Skomentuj wpis