ILI9488 все цвета отображаются в негативе
- Войдите на сайт для отправки комментариев
Пнд, 23/10/2017 - 15:38
Прошу помощи.
Вот такой монитор
- Tftlcd 3.5-inch touch screen with uno r3
- 3.5-inch LCD touch screen
- Resolution : 480x320
- Controller : ili9488
- Test code:
- ILI9327:
Куплено здесь:
http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItemVersion&item=172522909064&v...
Нормально т.е. полноразмерно отображает только тесты mcufriend, остальные на четверть экрана и все в негативе т.е. белый - черным, зеленый - красным, синий желтым и.т.д. плюс к этому искажение в тачскрине,
рисуем линию снизу вверх а линия появляется с права налево причем если цвета для выбора находятся справа то выбираются они снизу. Получается все перевернуто зеркально по оси с координатой "верх лево" - "низ право". Мучаюсь месяц, перечитал весь форум ничего подобного не нашел, может кто сталкивался с аналогичной ситуацией.
....
Куплено здесь:
http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItemVersion&item=172522909064&view=all&tid=1746104416007
Нормально т.е. полноразмерно отображает только тесты mcufriend,
.....
Объявление об этом товаре (**********) было удалено, или товар недоступен.
если mcuriend кажет нормалько как говорите, то им и пользуйтесь.
В других либах просто инициализацию выбрали не ту. Вы не первый в этой проблемке, решений всяко в инете полно.
одно из решений http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-93736
иль поищите:
ili9488 инверсия
ili9488 invon
// в даташите ili9488 на 169стр про регистр 21h бит invon . в ините найдите про 21й регистр и замените бит наоборот.
Не ту сылку дал, вот эта:
https://www.ebay.com/itm/3-5-inch-TFT-LCD-Display-Arduino-Touch-Screen-Module-UNO-R3-Board-Plug-and-Play/172522909064?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649
и насчет теста с mcufriend, он только по размеру экрана нормальный а по цветам так же в негативе идет.
Спасибо за ссылку попробую по регистрам поиграть а кстати в каком файле библиотеки нужно править 21 регистр, я просто новичек в ардуино еще не все знаю, заранее спасибо за подсказки.
Прочитал про прямую инициализацию, втавил identifier=0x9486; изображение в этом тесте (из mcufriend_kbv) стало нормальным, остальные переменные 9488,6814,9341 итд все давали негативное изображение. Цвета в тачскрине тоже нормализовались но линии отображаются так же дважды зеркально т.е. и по вертикали и по горизонтали. Вот в этом фото c тачскрином линию проводил снизу с права на лево а она нарисовалась слева сверху вниз. Квадраты с выбором цветов отображены сверху а выбираются при касании на самом деле справа.
С прерываниями 21 ничего пока не получается не могу найти где их править.
ну вот , теперь норм. кажет.
по тачу посмотрите как его в этой либе настраивать (юстировка), какие переменные она выдаст и куда их внести. Если трудности с поиском и чтением , то в ютубе должны быть рускоязычные видосы.
// не прерывания а регистр 21. На 0x9486 же запоказывал и ладно. Для других либ где искать указывал, поищите., но уже не особо актуально.
так показывал? http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=5#comment-264976
ну вот , теперь норм. кажет.
Да он так и кажет по старому в негативе если ему функцию identifier=0x9486 не вставиш, но ее не в каждый скетч и вставиш (опыта пока мало).
Вот в этот родной его тест (MCUFRIEND.kbv \ GLUE_DEMO-480X320 )я например не смог ее вставить или нужно в какую то библиотеку его вставить?
.... если ему функцию identifier=0x9486 не вставиш, но ее не в каждый скетч и вставиш (опыта пока мало).
....
-это совершенно естественно , что надо выбирать identifier=0x9486 . библиотеки не могут в автомате знать распознавание всех контроллеров.
-как это не вставишь?, в любой свой скетч и вставляйте , и вызов этой библиотеки.
или берите с нее пример, стирайте всю внутрянку и пишите свой скетч, используя команды графики этой либы.
другое дело если вы взяли чью-то программу и хотите переделать, так переделывайте. либо замените операторы с параметрами (при UTFT <-> adafruit ) , либо инициализацию. прочитайте даташит ili9486 где у него инверсия.
и , да , в UTFT тоже есть поддержка ili9486, ее тоже надо выбрать но естественно по свойму для нее . В инете много статей как пользоваться этой либой, очень досканально расписано, как и для других библиотек.
Ни как не могу победить свой тач. :(
Нашел вот такой сайт правда на аглицком https://forum.arduino.cc/index.php?topic=366304.750
пост (#752)
, проблема у товарища один в один моя и он решил ее в раз, я же со своим пардон французским и нашими "переводчиками" ничего не могу понять что где исправить, может разжуете старику?
Вот таким его тач (был) https://youtu.be/j3_DBbB2OOM
Вот таким стал https://youtu.be/sudbjvcXgZI
Несколько раз перечитывал страницу но все равно ничего ек понял как он этого добился.
И еще, хотел откалибровать тач запускал проги от mcufriend получаются вот такие результаты сильно отличающихся от товарища safari которого я в пример привел по осям X и Y противоположно, может у меня тач криво запаян. Вот мои данные:
LEFT=165 RT=919 2,35
TOP=161 BOT=929 1,61
WID=319 HT=479
пытался внести их в скетч tachpaint как указано но безе изменений, даже хуже стало линии сильно прерывистые стали. а зеркальность по обеим осям так и осталась.
Поможите люди добрые христа ради.
обеспечте хорошие 5в (короткий толстый качественный кабель USB, можно от какого-нибудь большого планшетника или мощного телефона).
а на русскоязычных пробовали искать?
в яндексе если набрать MCUFRIEND.kbv настройка тача , MCUFRIEND.kbv настройка тачскрина .
С изо все в порядке у вас, зеркальности нет, просто тач надо откалибровать.
Лучше распакуйте либу заново , с ее начальными настройками тача, и запустите пример с рисовалкой. Снимите на видео как рисуете медленно прямоугольник, и как что отображается (чтобы проверить тач, что ни по Х , ни по Y нет проблем.)
Непонятно на каком именно этапе у вас возникает ошибка. Делайте все медленно и последовательно. Потом снова попробуйте пример с калибровкой, полученные значения занесите. Можете отдельным скетчем сохранить. Оболочку IDE закрыть , заново открыть (или потом попробовать вообще другую версию IDE) и запустить сохраненный скетч. //хоть это может показаться и бредово для этого случая, но может в итоге помочь.
И что получилось. - все одним видео. Думаю сами встретите где у вас была ошибка. по видео будет и нам ясно, а то вроде все делаете правильно, а где-то что то упустили. Там все очень просто.
// как то попалась хитрая поломка - обрыв в шлейфе тача , только при определенном нажатии работал. помогло восстановление дорожек в шлефе. Ну а не пропай или залипуха - это и не вооруженному глазу видно.
Кажется я все таки добил свой тач, выкладываю скеч Touch_sheld_kbv от mMcufriend с моими корректировками может кому пригодится (изменения в коментариях в строках скетча строка 56,183,184,201,203):
PS кстати не все так хорошо как я описал, поскольку другая фишка вылезла, при рисовании на таче в поле полосы синего цвета цвет линии сам произвольно меняется на синий (и не только на синий оказывается), видео по ссылке
https://youtu.be/ERPkGuXtFGs
PS
Чудеса на чудесах. Пришел домой, включил ардуинку с записанным на работе скетчем и о чудо дома цвета самопроизвольно не меняются, что за чудеса или с напряжением какие то выкрутасы? Нужно напряжение проверить.
----------------------------------------------------------------------------------------------------------------------------------
// the regular Adafruit "TouchScreen.h" library only works on AVRs // different mcufriend shields have Touchscreen on different pins // and rotation. // Run the UTouch_calibr_kbv sketch for calibration of your shield #include <Adafruit_GFX.h> // Core graphics library //#include <Adafruit_TFTLCD.h> // Hardware-specific library //Adafruit_TFTLCD tft(A3, A2, A1, A0, A4); #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway. #include <TouchScreen.h> #if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif // These are the pins for some typical shields! // S6D0154: YP=A1, XM=A2, YM=7, XP=6 // ST7783 : YP=A2, XM=A1, YM=6, XP=7 // ILI9320: YP=A2, XM=A3, YM=8, XP=9 // ILI9325: YP=A1, XM=A2, YM=7, XP=6 // ILI9325BG: YP=A2, XM=A1, YM=6, XP=7 // ILI9341: YP=A2, XM=A1, YM=7, XP=6 // ILI9488: YP=A1, XM=A2, YM=7, XP=6 // R65109V: YP=A2, XM=A1, YM=6, XP=7 // most mcufriend shields use these pins and Portrait mode: uint8_t YP = A1; // must be an analog pin, use "An" notation! uint8_t XM = A2; // must be an analog pin, use "An" notation! uint8_t YM = 7; // can be a digital pin uint8_t XP = 6; // can be a digital pin uint8_t SwapXY = 0; uint16_t TS_LEFT = 920; uint16_t TS_RT = 150; uint16_t TS_TOP = 940; uint16_t TS_BOT = 120; char *name = "Unknown controller"; // For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); TSPoint tp; #define MINPRESSURE 20 #define MAXPRESSURE 1000 #define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;} int16_t BOXSIZE; int16_t PENRADIUS = 3; uint16_t identifier, oldcolor, currentcolor; uint8_t Orientation = 1; //PORTRAIT ========================================== был "0"============================= // Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF void show_Serial(void) { Serial.print(F("Found ")); Serial.print(name); Serial.println(F(" LCD driver")); Serial.print(F("ID=0x")); Serial.println(identifier, HEX); Serial.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); Serial.println("Calibration is: "); Serial.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); Serial.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); Serial.print("Wiring is: "); Serial.println(SwapXY ? "SWAPXY" : "PORTRAIT"); Serial.println("YP=" + String(YP) + " XM=" + String(XM)); Serial.println("YM=" + String(YM) + " XP=" + String(XP)); } void show_tft(void) { tft.setCursor(0, 0); tft.setTextSize(2); tft.print(F("Found ")); tft.print(name); tft.println(F(" LCD")); tft.setTextSize(1); tft.print(F("ID=0x")); tft.println(identifier, HEX); tft.println("Screen is " + String(tft.width()) + "x" + String(tft.height())); tft.println("Calibration is: "); tft.println("LEFT = " + String(TS_LEFT) + " RT = " + String(TS_RT)); tft.println("TOP = " + String(TS_TOP) + " BOT = " + String(TS_BOT)); tft.print("\nWiring is: "); if (SwapXY) { tft.setTextColor(CYAN); tft.setTextSize(2); } tft.println(SwapXY ? "SWAPXY" : "PORTRAIT"); tft.println("YP=" + String(YP) + " XM=" + String(XM)); tft.println("YM=" + String(YM) + " XP=" + String(XP)); tft.setTextSize(2); tft.setTextColor(RED); tft.setCursor((tft.width() - 48) / 2, (tft.height() * 2) / 4); tft.print("EXIT"); tft.setTextColor(YELLOW, BLACK); tft.setCursor(0, (tft.height() * 6) / 8); tft.print("Touch screen for loc"); while (1) { tp = ts.getPoint(); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) continue; if (tp.x > 450 && tp.x < 570 && tp.y > 450 && tp.y < 570) break; tft.setCursor(0, (tft.height() * 3) / 4); tft.print("tp.x=" + String(tp.x) + " tp.y=" + String(tp.y) + " "); } } void setup(void) { uint16_t tmp; tft.begin(9600); tft.reset(); identifier = tft.readID(); // if (identifier == 0) identifier = 0x9341; if (0) { } else if (identifier == 0x0154) { name = "S6D0154"; TS_LEFT = 914; TS_RT = 181; TS_TOP = 957; TS_BOT = 208; } else if (identifier == 0x7783) { name = "ST7781"; TS_LEFT = 865; TS_RT = 155; TS_TOP = 942; TS_BOT = 153; SwapXY = 1; } else if (identifier == 0x7789) { name = "ST7789V"; YP = A2; XM = A1; YM = 7; XP = 6; TS_LEFT = 906; TS_RT = 169; TS_TOP = 161; TS_BOT = 919; } else if (identifier == 0x9320) { name = "ILI9320"; YP = A3; XM = A2; YM = 9; XP = 8; TS_LEFT = 902; TS_RT = 137; TS_TOP = 941; TS_BOT = 134; } else if (identifier == 0x9325) { name = "ILI9325"; TS_LEFT = 900; TS_RT = 103; TS_TOP = 96; TS_BOT = 904; } else if (identifier == 0x9325) { name = "ILI9325 Green Dog"; TS_LEFT = 900; TS_RT = 130; TS_TOP = 940; TS_BOT = 130; } else if (identifier == 0x9327) { name = "ILI9327"; TS_LEFT = 899; TS_RT = 135; TS_TOP = 935; TS_BOT = 79; SwapXY = 1; } else if (identifier == 0x9329) { name = "ILI9329"; TS_LEFT = 143; TS_RT = 885; TS_TOP = 941; TS_BOT = 131; SwapXY = 1; } else if (identifier == 0x9341) { name = "ILI9341 BLUE"; TS_LEFT = 920; TS_RT = 139; TS_TOP = 944; TS_BOT = 150; SwapXY = 0; } else if (identifier == 0) { name = "ILI9341 DealExtreme"; TS_LEFT = 893; TS_RT = 145; TS_TOP = 930; TS_BOT = 135; SwapXY = 1; } else if (identifier == 0 || identifier == 0x9341) { name = "ILI9341"; TS_LEFT = 128; TS_RT = 911; TS_TOP = 105; TS_BOT = 908; SwapXY = 1; } else if (identifier == 0x9486) { name = "ILI9486"; TS_LEFT = 904; TS_RT = 170; TS_TOP = 950; TS_BOT = 158; } else if (identifier == 0x9488) { name = "ILI9488"; TS_LEFT = 168; TS_RT = 874; TS_TOP = 161; TS_BOT = 929; //======================= вставил сюда свои данные ================================= } else if (identifier == 0xB509) { //======================= после корректировки тача =================================== name = "R61509V"; TS_LEFT = 889; TS_RT = 149; TS_TOP = 106; TS_BOT = 975; SwapXY = 1; } else { name = "unknown"; } switch (0) { case 0: break; //no change, calibrated for PORTRAIT case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_BOT); break; case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; } Serial.begin(9600); ts = TouchScreen(XP, YP, XM, YM, 300); //call the constructor AGAIN with new values. tft.begin (0x9486); // =========================================== здесь ваши данные нужно вставить, у меня именно 9486 , с 9488 идет в негативе ========= show_Serial(); tft.setRotation(0); //============================================== здесь нужно "0" ========================= tft.fillScreen(BLACK); show_tft(); BOXSIZE = tft.width() / 6; tft.fillScreen(BLACK); tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); currentcolor = RED; delay(1000); } void loop() { uint16_t xpos, ypos; //screen coordinates tp = ts.getPoint(); //tp.x, tp.y are ADC values // if sharing pins, you'll need to fix the directions of the touchscreen pins pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); pinMode(XP, OUTPUT); pinMode(YM, OUTPUT); // digitalWrite(XM, HIGH); // digitalWrite(YP, HIGH); // we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing! if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) { // is controller wired for Landscape ? or are we oriented in Landscape? if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y); // scale from 0->1023 to tft.width i.e. left = 0, rt = width // most mcufriend have touch (with icons) that extends below the TFT // screens without icons need to reserve a space for "erase" // scale the ADC values from ts.getPoint() to screen values e.g. 0-239 xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width()); ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height()); // are we in top color box area ? if (ypos < BOXSIZE) { //draw white border on selected color box oldcolor = currentcolor; if (xpos < BOXSIZE) { currentcolor = RED; tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 2) { currentcolor = YELLOW; tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 3) { currentcolor = GREEN; tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 4) { currentcolor = CYAN; tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 5) { currentcolor = BLUE; tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE); } else if (xpos < BOXSIZE * 6) { currentcolor = MAGENTA; tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE); } if (oldcolor != currentcolor) { //rub out the previous white border if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN); if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN); if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE); if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA); } } // are we in drawing area ? if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) { tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor); } // are we in erase area ? if (ypos > tft.height() - 10) { // press the bottom of the screen to erase tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK); } } }