8 (800) 350-30-16

Сенсорный дисплей TFT 2.4 дюйма

Дата: / Категория: Дисплеи / Автор: DOC_tr

Это какая-то жесть, трэш и хардкор!

С этим экраном без пол-литра разобраться невозможно!  

Ну ладно, свое негодование я выразил, теперь можно приступить к инструкции подключения сенсорного экрана к Arduino. Как вы уже догадались из заголовка статьи - подключать мы будем Сенсорный дисплей TFT 2.4 дюйма.

Я взял готовую библиотеку для работы с сенсорным дисплеем - Adafruit_TFTLCD и TouchScreen (их выкладывать не буду, и так много в интернете), и попробовал пример paint из Образцов.

Не скажу, что был удивлен, когда ничего не заработало, но это меня немного расстроило.

После этого я перепробовал 5 различных библиотек, но все равно все впустую.

Вдруг я наткнулся на библиотеку, написанную как раз для данного контроллера SPFD5408 - github или архив на нашем сайте. Попробовав ее запустить, я было вздохнул с облегчением, когда на экране появились надписи, и уже начал ликовать, но и тут меня ждало разочарование - тачскрин не работал. Точнее работал, но только один раз и при тыке в определенное место. Я уж начал грешить на экран, но решил добить все это дело до конца и пошел сравнивать коды библиотек.

В стандартной библиотеке Adafruit_TFTLCD выбор устройства идет с помощью следующего кода:

uint16_t identifier = tft.readID();

if(identifier == 0x9325) {
Serial.println(F("Found ILI9325 LCD driver"));
} else if(identifier == 0x9328) {
Serial.println(F("Found ILI9328 LCD driver"));
} else if(identifier == 0x7575) {
Serial.println(F("Found HX8347G LCD driver"));
} else if(identifier == 0x9341) {
Serial.println(F("Found ILI9341 LCD driver"));
} else if(identifier == 0x8357) {
Serial.println(F("Found HX8357D LCD driver"));
} else {
Serial.print(F("Unknown LCD driver chip: "));
Serial.println(identifier, HEX);
Serial.println(F("If using the Adafruit 2.8\" TFT Arduino shield, the line:"));
Serial.println(F(" #define USE_ADAFRUIT_SHIELD_PINOUT"));
Serial.println(F("should appear in the library header (Adafruit_TFT.h)."));
Serial.println(F("If using the breakout board, it should NOT be #defined!"));
Serial.println(F("Also if using the breakout, double-check that all wiring"));
Serial.println(F("matches the tutorial."));
return;
}

tft.begin(identifier); 

Так как у нас драйвер ILI9341, то код, по идее, должен быть 0x9341. Как бы не так. Идентификатор устройства не хочет определяться, и поэтому весь следующий код мы меняем на:

tft.begin(0x9341); 

Отлично, теперь попробуем с помощью примера отобразить изображение с флешки. 

Код данного примера слишком длинный, поэтому я оставлю его на pastebin

Данный код уже исправлен для нашего дисплея, так что можно смело создавать изображение в формате bmp 320х240 и заливать его на флешку. Я залил следующее изображение:

И получилось у меня вот что:

 

Что ж, очень неплохо. Цвета четкие, и отображается все правильно. Пока все хорошо.

Теперь постараемся проверить наш тачпад в действии. 

Данный код тоже из образцов, но со стандартным TouchScreen.h он работать отказывался. Поэтому я заменил его на SPFD5408_TouchScreen.h из библиотеки SPFD5408

#include <stdint.h>
#include <SPFD5408_TouchScreen.h>

#define YP A2
#define XM A3
#define YM 8
#define XP 9
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
TSPoint p = ts.getPoint();
if (p.z > ts.pressureThreshhold) {
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\tPressure = "); Serial.println(p.z);
}
delay(100);
}

После того как по экрану побежали координаты моих нажатий, я понял что дело не в экране, а в библиотеке.

И я начал копаться в коде библиотеки SPFD5408 и в ее примерах.

Нашел кучу багов. Например, дисплей не отдает ширину и высоту, свой идентификатор и много разных данных. Помимо этого x почему-то был y, и наоборот. Все что только возможно было напутано и перепутано.

Короче, после нескольких часов исправления кода у меня все заработало, и я могу с чистой совестью поделиться с вами примерами на основе библиотеки SPFD5408

Так как все примеры громоздки я, опять же, залил их на PasteBin (приведенные ниже скетчи работают только с дисплеем 2.4" (320х240). Ширина и высота там захардкожены.),

Первым делом у нас идет калибровка дисплея, потому что, когда я пытался на нем что-то рисовать, то линия шла на сантиметр ниже и левее, чем то место, где я касался пальцем, так что сначала откалибруем наш дисплей с помощью данного кода

Сначала нужно коснуться 2-х точек в разных углах экрана

После чего получим данные:

Отсюда нам нужны только 4 числа. Куда их вставлять я расскажу ниже.

TS_MINX 198
TS_MINY 205
TS_MAXX 999
TS_MAXY 942

После касаемся экрана и проверяем, чтобы там, где мы касаемся экрана, появлялись синие точки.

Вот в целом и все. Запоминаем наши данные, а лучше записываем, и переходим к примеру paint. Исправленный код вы можете найти по ссылке и, единственное, что там нужно изменить, это наши калибровочные данные. Все те переменные, которые мы получили с помощью калибровки, мы вводим в строках 15-18

После запускаем, и получаем отличный paint ;)

Вот на этом мои мучения с сенсорным дисплеем TFT 2.4 дюйма закончились и, надеюсь, данная статья сэкономит кому-нибудь время.

UPD

Данная статья рассказывает как подключить к UNO. Для MEGA картинка с флешки читаться не будет из-за разной приязки портов. Все остальные примеры работают как с UNO, так и с MEGA

Теги: #Arduino, #TFT, #Сенсор, #Shield

Ваша оценка:

Рейтинг: 9.8 (Оценок: 10)

Комментарии (27):

Димон
2016-09-24 12:25
Все отлично заработало, тач и экран, как прикрутить русский язык подскажите
KblCb
2016-09-03 00:05
Проверял экран, думал сенсор неисправен.
Пэинт рисует точками и где попало.
Запускал калибровку - вообще не реагировал экран на мои нажатия, пока случайно не нажал на противоположную сторону экрана. Получается, что первая точка теста в левом верхнем углу, а я жму правый верхний угол и тест проходит.
Инвертирована X.
Подозреваю, что китайцами был неправильно припаян (приклеен) тач.

Как это правильнее лечить?
IceDiver
2016-10-06 21:08
@KblCb:Присоединяюсь к вопросу. Точно такакая же проблема, один в один. Как это можно поправить? И еще у меня не получается в самый угол попасть - сенсор не очень точный. А так конечно респект все заработало с первого раза  в отличии от  AdaFruit.
Pavell V
2016-11-19 20:00
@KblCb:пробовал поправить по моему коменту от 2016-06-29 22:36 ?
Ренат
2016-08-23 18:55
Спасибо! помогло еще добавил русский язык теперь все в комплекте!
Vyacheslav
2016-07-06 19:00
Наконец-то разобрался, может кому будет ещё полезно:
<br />В spfd5408_graphicstest вот эти строки за комментированы
<br />//   D0 connects to digital pin 8  (Notice these are
<br />//   D1 connects to digital pin 9   NOT in order!)
<br />//   D2 connects to digital pin 2
<br />//   D3 connects to digital pin 3
<br />//   D4 connects to digital pin 4
<br />//   D5 connects to digital pin 5
<br />//   D6 connects to digital pin 6
<br />//   D7 connects to digital pin 7
<br />
<br />Добавил после них
<br />#define LCD_D0 8
<br />#define LCD_D1 9
<br />#define LCD_D2 2
<br />#define LCD_D3 3
<br />#define LCD_D4 4
<br />#define LCD_D5 5
<br />#define LCD_D6 6
<br />#define LCD_D7 7
<br />
<br />И ВСЁ заработало и естественно жестко привязал ID драйвера
<br />
<br />Буду теперь разбираться с сенсором флешкой.
Vyacheslav
2016-07-06 17:15
При запуске spfd5408_graphicstest видно что на экране что-то меняется, но всегда светится белым цветом.
В мониторинге порта следующее:
TFT LCD test
Using Adafruit 2.8" TFT Breakout Board Pinout
Benchmark                Time (microseconds)
Screen fill              1785884
Text                     306012
Lines                    1795820
Horiz/Vert Lines         212724
Rectangles (outline)     157720
Rectangles (filled)      4677436
Circles (filled)         2039028
Circles (outline)        781100
Triangles (outline)      569748
Triangles (filled)       2512612
Rounded rects (outline)  353696
Rounded rects (filled)   5523208
Done!

Контроллер ID=0x9328
Valter8
2016-06-21 19:40
Тоже плохо работает1
Volk
2016-06-11 16:10
Те же точки...
Василий
2016-06-24 23:42
@Volk:if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
    if (p.y < (TS_MINY-5)) {
      Serial.println("erase");
      tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
    }
Затирает. Попробуйте закоментировать // tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
babserg
2016-06-08 18:04
Я имею такую же проблему( точки вместо линий)! Чем закончилась эта история?
DOC_tr
2016-06-08 19:38
@babserg:Пока ни чем. Мы пробовали на разных экранах и на разных Arduino и у нас не удалось воспроизвести проблему.
Гриф
2016-06-01 12:35
вот данные калибровки

#define TS_MINX 181
#define TS_MINY 862
#define TS_MAXX 986
#define TS_MAXY 88
Гриф
2016-06-01 12:19
Точки рисует в пэйнте. Все калибровки проходит нормально, но когда загружаешь последний скетч- рисует точку, не линию. замену строк на свои значения произвел.
DOC_tr
2016-06-01 13:30
@Гриф:Какой вы библиотекой пользовались?
Гриф
2016-06-01 14:43
@DOC_tr:Adafruit-GFX-Library-master
SPFD5408-master
TFTLCD-Library-master
Touch-Screen-Library-master

эти я установил. При компиляции не ругался ни разу. Все библиотеки с гитхаба
DOC_tr
2016-06-01 15:09
@Гриф:В статье написано, что SPFD5408 работает кривовато.
Попробуйте вместо нее вот эту - https://robom.ru/blog/content/uploadfile/201511/59db1448617072.zip
Гриф
2016-06-07 08:20
@DOC_tr:Особых отличий в этой библиотеке не нашел, загрузил. Все то же самое. В скетче калибровки после определения границ экрана рисует линию нормально. В скетче Пэйнт рисует мигающую точку, цвет выбирает нормально, положение точки и стилуса совпадают.
DOC_tr
2016-06-07 12:50
@Гриф:Для подключения вы используете UNO?
Гриф
2016-06-08 06:41
@DOC_tr:да, только на него экран встанет по выводам без переделок.
DOC_tr
2016-06-08 13:14
@Гриф:на Мегу он тоже встает нормально. Скиньте нам на почту ваш скетч, попробуем разобраться в чем дело.
mail@robom.ru
Гриф
2016-06-17 23:15
@DOC_tr:скинул
Pavell V
2016-06-29 22:36
@Гриф:Если рисует точки, то нужно обратить внимание, как писал Василий работать с блоком стирания, по условию вот что получается если у Вас калибровка TS_MINY>TS_MAXY: условие стирания экрана если текущая координата Y будет меньше TS_MINY-5, а в данном случае (у Грифа) 862-5 = 857, а это почти все точки на поле. Нужно просто переписать условие, например, как сделал я: вместо p.y < (TS_MINY-5) записать p.y < (TS_MAXY+5) и будет счастье!

Комментарий:

Copyright © RobOM.ru 2016 г. Все права защищены