Тачскрин. Перевернута координата Х

Резидент
Offline
Зарегистрирован: 15.04.2013

Всем привет.

Господа, помогите с вопросом. Пока еще только знакомлюсь с Ардуиной, потому мой вопрос может оказаться вполне нубским. Собственно: подключил 3.2” TFT LCD с тачскрином к arduino mega 2560 через TFT LCD Mega Shield V2.0. Загружаю пробный скетч из библиотеки с кнопками. Так вот, координата Х почему-то начинается с противоположенной стороны, т.е. если нажимаю кнопку с права, то нажимается кнопка слева и на оборот. По координате Y проблем нет. Просмотрел, на сколько это возможно шлейф, - вроде всё в порядке. По даташитам посмотрел и дисплей и шилд - один в один, единственное что нумерация самих пинов идет по разному. Даже задавал 

UTouch      myTouch(6,5,48,3,2);

вместо библиотечного 

UTouch      myTouch(6,5,4,3,2);

результата нет. Подскажите в чем тут дело?

vdk
Offline
Зарегистрирован: 14.04.2013

Без шилда не пробовали подключать? (если напряжение питания на TFT и ардуине совпадает)

Еще попробуйте из examples запустить UTouch_Calibration и сравнить калибровочные коэффициенты со стандартными

(еще можно допустить, что сам тач наклеили не той стороной... но сомнительно)

Резидент
Offline
Зарегистрирован: 15.04.2013

UTouch_Calibration запускал. Поправочные коэффициенты изменил в нужной библиотеке. Результат тот же. Есть еще у кого подсказки?

vdk
Offline
Зарегистрирован: 14.04.2013

И при калибровке он все правильно распознал, а на кнопках его поведение изменилось на противоположное?

Если отправлять координаты нажатий на Serial, он их правильно (в абсолютных цифрах) выдает?

Резидент
Offline
Зарегистрирован: 15.04.2013

vdk пишет:

И при калибровке он все правильно распознал, а на кнопках его поведение изменилось на противоположное?

да. Но тут "правильно распозновал" тоже получается не совсем верно. Куда не ткни - запоминается и выдается поправочный коэффициент...

vdk пишет:

Если отправлять координаты нажатий на Serial, он их правильно (в абсолютных цифрах) выдает?

Подскажите, пожалуйста, как это сделать. У меня чёт не совсем получается

Резидент
Offline
Зарегистрирован: 15.04.2013

это дисплей

это шилд для дисплея

единственное в чем разница это нумерация пинов, хотя функции пинов правильны

vdk
Offline
Зарегистрирован: 14.04.2013

Вот что-то типа такого:

#include <UTFT.h>
#include <UTouch.h>

UTFT        myGLCD(ITDB32S, 38,39,40,41);   // Remember to change the model parameter to suit your display module!
UTouch      myTouch(6,5,4,3,2);

int x, y;

void setup()
{
// Initial setup
  myGLCD.InitLCD();
  myGLCD.clrScr();

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  
  Serial.begin(9600); // 9600 - это скорость

}

void loop()
{
    if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      Serial.print("x="); Serial.print(x); Serial.print("  y=");Serial.println(y);
    }
}

Скорость COM-порта выставлена на 9600 (но можно поставить и больше).

(Проверить скетч не на чем, так что могут быть ошибки)

Резидент
Offline
Зарегистрирован: 15.04.2013
x=276  y=54
x=268  y=112
x=271  y=195
 
  вот что выдает когда нажимаю на левый столбик кнопок. 9 кнопок  расположены 3 ряда по 3 кнопки на весь экран
vdk
Offline
Зарегистрирован: 14.04.2013

Вот это действительно странно.

А вы точно не путаете режимы Portrait и Landscape? По умолчанию тач будет работать в Landscape. А если дисплей работает в  Portrait, а тач в Landscape, то примерно такая ерунда и будет

Резидент
Offline
Зарегистрирован: 15.04.2013
#define PORTRAIT        0
#define LANDSCAPE     1
 
это из библиотеки тачскрина
 
#define PORTRAIT 0
#define LANDSCAPE 1

это из библиотеки дисплея...

Есть еще варианты? Кто-нибудь! Неужели никто не сталкивался?

vdk
Offline
Зарегистрирован: 14.04.2013

Делаем так: располагаете дисплей в LANDSCAPE (согласно картинке) и повторяете тест еще раз.

Резидент
Offline
Зарегистрирован: 15.04.2013

все три раза так и делал

 

vdk
Offline
Зарегистрирован: 14.04.2013

Странно. Пока даже и не знаю, что сказать

Но такое "отзеркаливание" хорошо подходит к ситуации, когда дисплей находится в положении Portrait, но UTouch считает, что дисплей в Landscape

Если не лень, попробуйте повертеть дисплей на 90, 180, ... градусов и найти положение, когда x и y будут нормальными. Если такое положение найдется, то проблема с настройками

Geronimo
Offline
Зарегистрирован: 06.05.2013

x = map ( x, 0, resX, resX, 0);

вот такой костыль есть)

Резидент
Offline
Зарегистрирован: 15.04.2013

А куда его вставлять, простите... Я не волшебник, я только учусь...(с)

Geronimo
Offline
Зарегистрирован: 06.05.2013

при получении кординаты х

resX - сколько точек по горизонтали

#include <UTFT.h>
02	#include <UTouch.h>
03	 
04	UTFT        myGLCD(ITDB32S, 38,39,40,41);   // Remember to change the model parameter to suit your display module!
05	UTouch      myTouch(6,5,4,3,2);
06	 
07	int x, y;
08	 
09	void setup()
10	{
11	// Initial setup
12	  myGLCD.InitLCD();
13	  myGLCD.clrScr();
14	 
15	  myTouch.InitTouch();
16	  myTouch.setPrecision(PREC_MEDIUM);
17	   
18	  Serial.begin(9600); // 9600 - это скорость
19	 
20	}
21	 
22	void loop()
23	{
24	    if (myTouch.dataAvailable())
25	    {
26	      myTouch.read();
27	      x=myTouch.getX();
28	      y=myTouch.getY();
29	      x =  map(x,0,resX,resX,0);
30	    }
31	}

 

Резидент
Offline
Зарегистрирован: 15.04.2013

Geronimo пишет:

x = map ( x, 0, resX, resX, 0);

вот такой костыль есть)

Безгранично вам благодарен. Всё заработало :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

странно это все... у меня точно такой же дисплей GEEE32 . правда без шильда, так проводками его присобачил ( не вижу смысла платить 10 баксов за кусок текстолита)... все нормально работает..

попробуйте его напрямую проводками присоединить.. без шильда.. ибо костыли конечно хорошо.. но они хряпают процесорное время.. а для меги и этого дисплея, время очень актуально... чуть с кодом затупил и начинается прыганья и дерганья :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Резидент пишет:

#define PORTRAIT        0
#define LANDSCAPE     1
 
это из библиотеки тачскрина
 
#define PORTRAIT 0
#define LANDSCAPE 1

это из библиотеки дисплея...

Есть еще варианты? Кто-нибудь! Неужели никто не сталкивался?

судя вот по этому, у вас какая то не та библиотека :) гы гы

 myTouch.InitTouch(); // обычная ориентация

 myTouch.InitTouch(PORTRAIT); // вертикальная ориентация

 

Резидент
Offline
Зарегистрирован: 15.04.2013

библиотека правильная. 

myTouch.InitTouch(); // обычная ориентация  --- так прописано у меня в коде

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Резидент пишет:

библиотека правильная. 

myTouch.InitTouch(); // обычная ориентация  --- так прописано у меня в коде

значит шильд не правильный :)

соедините просто проводами и посмотрите что происходит

для меги2560 будет выглядеть так

тач

DCLK-> D6
CS(pin30) -> D5
IN -> D4
OUT-> D3
IRQ -> D2

дисплей

LEDA -> 5V
VCC -> 5V
RD -> 3.3V
GND -> GND
DB0->DB7 to pin D37->D30
DB8->DB15 to pin D22->D29
RS -> D38
WR -> D39
CS(pin6) -> D40
RSET-> D41
tsostik
Offline
Зарегистрирован: 28.02.2013

Geronimo пишет:

x = map ( x, 0, resX, resX, 0);

вот такой костыль есть)

Ну тогда уж проще x = resX - x;

Быстрее, меньше и очевиднее.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

tsostik пишет:

Ну тогда уж проще x = resX - x;

Быстрее, меньше и очевиднее.

Мы не ищем легких путей и простых решений. мы создаем себе трудности, что бы потом их мужественно преодолевать и иметь повод для гордости!

Канечно проще. 

А откуда библиотеку качали?

просто выглядит так что над вами кто то пошутил с библиотекой... технически там нечего перепутывать. да и замучаешся перепутывать. шлейф по другому припаять не получится

родная валяется тут
http://www.henningkarlsen.com/electronics/library.php?id=55

Резидент
Offline
Зарегистрирован: 15.04.2013

Именно тут библиотеку и брал.

На данном этапе, меня, как новичка, предложенный "кастыль" вполне устраивает. Наверняка, когда мой проект будет полностью готов, мне снова придется вернуться к этой проблеме, но пока я только обучаюсь и идея созревает в голове. Всем откликнувшимся большое спасибо. Мир не без добрых людей :)

icms
Offline
Зарегистрирован: 22.03.2011

Траблу с неправильными осями править в файле UTouch.cpp 












	touch_x_left			= (CAL_X>>14) & 0x3FFF;
	touch_x_right			= CAL_X & 0x3FFF;
	touch_y_bottom			= (CAL_Y>>14) & 0x3FFF;
	touch_y_top			= CAL_Y & 0x3FFF;
	disp_x_size		        = (CAL_S>>12) & 0x0FFF;
	disp_y_size			= CAL_S & 0x0FFF;

Просто меняем touch_x_left и touch_x_right местами с У-осью соответственно также(если тоже перепутана).

Если у Вас дисплей не 3,2 то откалибровать программкой не выйдет, лажёвая она. Программулька сама использует свой же настроечный файл расчитанный на 3,2 диспелей при калибровке, соответственно выдать реальных результатов на разрешениях сильно отличающихся от 3,2 неможет, проверено.

У меня 4,3 после калибровки вообще нет ответа от тача.

Что сделал - прописал разрешение экрана жёстко там же











disp_x_size = 480;
disp_y_size = 272;

файл настроек калибровки стандартный









#define CAL_X 0x00378F66UL
#define CAL_Y 0x03C34155UL
#define CAL_S 0x000EF13FUL

 

Резидент
Offline
Зарегистрирован: 15.04.2013

спасибо, тоже дельное предложение...

vvpashkin
Offline
Зарегистрирован: 25.09.2013

Это похоже явление принимает массовый характер.. у меня таже фигня, причем когда запускаешь тач и экран в одинаковых ориентациях координаты как-то совсем по левому считает. А вот когда в разных с инверсией по оси Х - то вполне приемлемо (с поправкой на размерность экрана конечно).

Экран ITDB02-3.2WD подключен через шилд

Urri
Offline
Зарегистрирован: 22.09.2014

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