ILI9488 все цвета отображаются в негативе

goodvin1959
Offline
Зарегистрирован: 14.10.2017

Прошу помощи.

Вот такой монитор 

  • 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, остальные на четверть экрана и все в негативе т.е. белый - черным, зеленый - красным, синий желтым  и.т.д. плюс к этому искажение в тачскрине,

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

 

slider
Offline
Зарегистрирован: 17.06.2014

goodvin1959 пишет:

....

Куплено здесь:

http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItemVersion&item=172522909064&view=all&tid=1746104416007

Нормально т.е. полноразмерно  отображает только тесты mcufriend, 

.....

Объявление об этом товаре (**********) было удалено, или товар недоступен.

    • Проверьте, правильный ли номер товара вы ввели
    • Объявления о товарах, завершенные 90 или более дней назад, недоступны для просмотра.

если  mcuriend кажет нормалько как говорите, то им и пользуйтесь.

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

одно из решений http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-93736

иль поищите: 

ili9488 инверсия

ili9488 invon

// в даташите ili9488  на 169стр     про регистр 21h   бит invon   . в ините найдите  про 21й регистр  и замените бит наоборот.

 

 

goodvin1959
Offline
Зарегистрирован: 14.10.2017

Не ту сылку дал, вот эта:

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 ничего пока не получается не могу найти где их править.

 

тест с

slider
Offline
Зарегистрирован: 17.06.2014

ну вот , теперь норм. кажет. 

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

// не прерывания а регистр 21.  На 0x9486 же запоказывал и ладно. Для других либ где искать указывал, поищите., но уже не особо актуально.

так показывал? http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=5#comment-264976

goodvin1959
Offline
Зарегистрирован: 14.10.2017

slider пишет:

ну вот , теперь норм. кажет. 

Да он так и кажет по старому в негативе если ему функцию identifier=0x9486 не вставиш, но ее не в каждый скетч и вставиш (опыта пока мало). 

Вот в этот родной его тест (MCUFRIEND.kbv \ GLUE_DEMO-480X320 )я например не смог ее вставить или нужно в какую то библиотеку его вставить?

slider
Offline
Зарегистрирован: 17.06.2014

goodvin1959 пишет:

.... если ему функцию identifier=0x9486 не вставиш, но ее не в каждый скетч и вставиш (опыта пока мало). 

....

-это  совершенно естественно , что надо выбирать identifier=0x9486  . библиотеки не могут в автомате знать распознавание всех контроллеров.

-как это не вставишь?, в любой свой скетч и вставляйте , и вызов этой библиотеки.  

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

 

другое дело если вы взяли чью-то программу и хотите переделать, так переделывайте. либо замените операторы с параметрами (при UTFT <-> adafruit ) , либо инициализацию.  прочитайте даташит ili9486 где у него инверсия. 

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

goodvin1959
Offline
Зарегистрирован: 14.10.2017

Ни как не могу победить свой тач. :(

Нашел вот такой сайт правда на аглицком 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 как указано но безе изменений, даже хуже стало линии сильно прерывистые стали. а зеркальность по обеим осям так и осталась.

Поможите люди добрые христа ради.

 

 

 

slider
Offline
Зарегистрирован: 17.06.2014

обеспечте хорошие 5в (короткий толстый качественный кабель USB, можно от какого-нибудь большого планшетника или мощного телефона).

а на русскоязычных пробовали искать? 

в яндексе если набрать  MCUFRIEND.kbv настройка тача   , MCUFRIEND.kbv настройка тачскрина   .

С изо все в порядке у вас, зеркальности нет, просто тач надо откалибровать. 

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

Непонятно на каком именно этапе у вас возникает ошибка.   Делайте все медленно и последовательно. Потом снова попробуйте пример с калибровкой, полученные значения  занесите. Можете отдельным скетчем сохранить. Оболочку IDE закрыть , заново открыть (или потом попробовать вообще другую версию IDE) и запустить сохраненный скетч.  //хоть это может показаться и бредово для этого случая, но может в итоге помочь.

И что получилось.   - все одним видео.  Думаю сами встретите где у вас была ошибка.  по видео будет и нам ясно, а то вроде все делаете правильно, а где-то что то упустили. Там все очень просто.

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

 

goodvin1959
Offline
Зарегистрирован: 14.10.2017

Кажется я все таки добил свой тач, выкладываю скеч 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);
        }
    }
}