TFT 3,5" и Ардуино

viki13viki
Offline
Зарегистрирован: 14.11.2016

щас гляну. я чета вообще запутался с координатами. в верху по иди должно быть х0 у0 в правом нижнем х320 у 480. 

makc014
makc014 аватар
Offline
Зарегистрирован: 18.01.2016

функция map в помощь, если не брать в руки паяльник

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

совсем запутался. щас все проверю

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

viki13viki пишет:

может нужно перепаять YN и YP местами?

2 способа:

1. правильно! перепаять начало и конец координаты местами и хватит мозг канифолить :) и форум удлинять.

2. скетч калибровка из примера ( \UTouch\examples\Arduino\UTouch_Calibration ) . он выдаст калибровочные данные , поправляя свою либу, даже если у вас все координаты наоборот. Внесите их в файл UTouchCD , закометив предыдущие. Если не поканает , то скачав с офиц. сайта Utouch ,  замените файл UTouchCD на родной, запустите скетч калибровку , и внесите данные что он выдаст в  UTouchCD.

// сфотайте потом нарисованный красивый рисунок скетчем UTouch_QuickPaint для истории. В адафруите тож рисовалка неплохая.  Инит также можете поправить для перевотрота картинки, он находится в файле Adafruit_TFTLCD  после строчки  static const uint8_t ILI9488_regValues[] PROGMEM = { 

так подозреваю, куда нить в середину надо добавить  строчку 

 0xB6,  3, 0x00, 0x22, 0x3B,  

рисовалку запускайте эту Adafruit_TFTLCD\examples\tftpaint3

viki13viki
Offline
Зарегистрирован: 14.11.2016

Slider уже ругается. заканчиваем. итог

нужно было перевернуть шлейф вот так, тоесть на 180 градусов.

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

всем огромное спасибо кто помог. особенно огромное спасибо Sliderу, без него еще бы месяц ковырялся. всем приятного дня.

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

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

так вот бывает, купил подешевше , а потом дорабатывай "напильником", так, чтоб нескучали , а по радостней потом было :) .

swarm38
Offline
Зарегистрирован: 04.10.2016

Доброго времени суток!

Приобрел дисплей TFT 3.5 для Arduino MEGA 2560 r3, вот отсюда:

https://ru.aliexpress.com/item/Free-shipping-LCD-Display-Module-TFT-3-5-...

Пока экран ехал ко мне продавец изменил страницу товара, убрал ссылки с библиотеками и примерами. Дисплей пришел в повреждением: лопнул тач(продаван сьехал с гарантий), но под мой проект он не нужен. Уже какие сутки бьюсь, не получается добиться хоть какой то реакции, белый экран и все. Продавец утверждает что стоит контроллер r61581, на просьбу поделиться софтом кидает ссылку на этот форум и все. Перепробовал все команды контроллеров инициализации дисплея. Скетча как такового нет, просто проверка заливкой экрана разными цветами. Компилится и загружается в мегу без ошибок. Библиотеку UTFT брал отсюда: http://www.rinkydinkelectronics.com/library.php?id=51 Пробовал другие отличающиеся UTFT какие под руку попадались ничего не помогает. Сбоку на шлейфе надпись fpc032mhv001rv2

viki13viki
Offline
Зарегистрирован: 14.11.2016

добрый день Swarm38. попробуйте библиотеку из этой темы http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256 это библиотека от СанСаныча. там их две одна в середине темы и другая в самом низу. на моей меге и тфт 3.95 она единственная со всего простора инета заработала.

swarm38
Offline
Зарегистрирован: 04.10.2016

viki13viki пишет:

добрый день Swarm38. попробуйте библиотеку из этой темы http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256 это библиотека от СанСаныча. там их две одна в середине темы и другая в самом низу. на моей меге и тфт 3.95 она единственная со всего простора инета заработала.

Спасибо за наводку. Перепробовал сначала один, потом другой архив, все равно ни на одну из команд инициализации экран не реагирует =(

viki13viki
Offline
Зарегистрирован: 14.11.2016

в той же теме есть скетч для проверки ID дисплея в порту. посмотрите что выдаст. если определит дисплей то будет легче, если выдаст чтото типа как у меня ID Display 0х0404, то будет сложно, только методом перебора всех возможных библиотек. мой продавац тоже утверждал что у меня R61581 и в итоге запустилась СанСаныча с драйвером ILI9327_8 инициализация UTFT myGLCD(31,38,39,40,41); где этот драйвер подменян на ILI9488. не удивляйтесь с китайцев у меня вобще шлейф тач небыл припаян. так что пробуйте определить ID. а там будет видно. если этот скетч не работает поищите на просторах другие скетчи для определения дисплея и пробуйте их

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

swarm38, если вы перепробовали все иниты UTFT  , другую IDE (1.5.8) и не помогло , то нагревайте плату  и поднимайте дисп, смотрите сколько от него и куда идут дорожки. сфотайте в одном сообщении тыльную часть платы, лицевую и дорожки под шлейфом, слегка отогнув его . Судя по многочисленным резисторным сборкам, м.б. дисп стоит на 16 бит , здесь UTFT должно помочь, а что на дисп СанСаныча делал здесь не поможет.

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

как вариант вообще напутали с битностью как здесь http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie , можете наподобе этой методы сами сделать. Прозвонить разрисовать распиновку, вывести RD и прочитать ID диспа, заодно и определится его битность. 

viki13viki , и как же вы вывели RD чтобы считать ID ? удивительно.  Если у вас есть вопрос , что же за контроллер по настоящему стоит в вашем диспе, то надо примерно разрисовать распиновку диспа, из нее можно будет понять где RD , подключить его на 42 ногу ардуины и запустить читалки. На 11.2016  читалки v3.1 https://yadi.sk/d/TdOE0H_RzTUd2 .

еще раз повторюсь - без выведенного RD (Read - чтобы дисп мог отвечать), невозможно считать ID ,  скетч выдаст всякий мусор, который  был до этого в порту. Только в других шилдах выведен RD и к тому же подписан.

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

уважаемый Slider , я не выводил RD . одна из читалок ID мне выдавала такое: ID Display 0х0404. я их перелопатил кучу. поиск по гуглу давал мало результатов и решения что это за ID не нашлось. в своем первом посте #1179 я об этом писал.

вот эта читалка

/*********************************************************************
*
* LCD_ID_Reader
*
* This sketch is meant only to attempt to read the driver ID code
* from inexpensive touchscreen LCDs found on eBay without needing to
* load any additional libraries.  The hope is to identify the most 
* common varieties and choose the best library for the screen you have.
*
* This has been successfully tested so far on 992X and 778X variety
* screens.
*
* Usage: 
*
* Compile the sketch and run it on your board with the screen
* attached.  In the serial monitor, you should see a message containing
* the driver code.  The tricky thing is that if it does not work, the
* results may be undetermined.  However, if we can compile a list,
* the difference between working and not may become more evident.
*
* Please visit http://misc.ws/lcd_information for more information.
*
* Version 1.2 - January 29th, 2015
* 
*********************************************************************/



/*********************************************************************
*
* PIN ASSIGNMENTS
*
* You can alter the pin assignments to reflect any configuration you
* wish.  I've provided the default shield configuration, which works
* on both the Arduino UNO and Mega 2560.
* 
*********************************************************************/
//-- Arduino UNO or Mega 2560 Plugged as shield
#define LCD_RST A4
#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_D0 8
#define LCD_D1 9
#define LCD_D2 2
#define LCD_D3 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7



/*********************************************************************
*
* Attempt to initialize and reset LCD, then read its Driver Code
* at register index 0.
* 
*********************************************************************/
void setup() {
  
  char hexString[7];
  uint16_t id;
  
  Serial.begin(9600);
  Serial.println("Initializing LCD...");
  lcdInit();
  lcdReset();
  
  delay(500);
  
  Serial.print("Reading ID...");
  id = lcdReadID();
  sprintf(hexString, "0x%0.4X", id); 
  Serial.println( hexString );
  
  if( id == 0x7783 ) {
    lcdRegister7783();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, then you may be able to use the library at https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code");
  } else if( id == 0x0154 ) {
    lcdRegister0154();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, please report it at http://misc.ws/lcd_information");
    Serial.println("There is currently no known working library.");
  } else {
    lcdRegisterOther();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, you may be able to use the library at http://misc.ws");
  } 
  
  //print_all_regs();
}


void print_all_regs() {
  char str[60];
  uint16_t i, val;

  for(i=0; i < 256; i++ )
  {
    delay(40);
    val = lcdReadRegister(i);
    sprintf(str, "Register 0x%0.2X : 0x%0.4X", i, val);
    Serial.println( str );
  }  
}

void loop() {
  
}

/*********************************************************************
*
*   LCD Functions - Inefficient but should be good enough 
*                   to read the ID.
*
*********************************************************************/
void lcdRegister0154() {
  lcdWriteRegister(0x000C, 0x130); 
  lcdWriteRegister(0x0080, 0x8d);
  lcdWriteRegister(0x0092, 0x10);
  lcdWriteRegister(0x0011, 0x1b);
  lcdWriteRegister(0x0012, 0x3101);
  lcdWriteRegister(0x0013, 0x105f);
  lcdWriteRegister(0x0014, 0x667f);
  lcdWriteRegister(0x0010, 0x800);
  delay(20); 
  lcdWriteRegister(0x0011, 0x11b);
  delay(20); 
  lcdWriteRegister(0x0011, 0x31b);
  delay(20); 
  lcdWriteRegister(0x0011, 0x71b);
  delay(20); 
  lcdWriteRegister(0x0011, 0xf1b);
  delay(20); 
  lcdWriteRegister(0x0011, 0xf3b);
  delay(30); 
  lcdWriteRegister(0x0001, 0x2128);
  lcdWriteRegister(0x0002, 0x100);
  lcdWriteRegister(0x0003, 0x1030);
  lcdWriteRegister(0x0007, 0); 
  lcdWriteRegister(0x0008, 0x808);
  lcdWriteRegister(0x000B, 0x1100);
  lcdWriteRegister(0x000F, 0xf01);
  lcdWriteRegister(0x0015, 0);
  lcdWriteRegister(0x0030, 0);
  lcdWriteRegister(0x0034, 319); 
  lcdWriteRegister(0x0035, 0); 
  lcdWriteRegister(0x0036, 239); 
  lcdWriteRegister(0x0037, 0); 
  lcdWriteRegister(0x0038, 319); 
  lcdWriteRegister(0x0039, 0); 
  lcdWriteRegister(0x0050, 0);
  lcdWriteRegister(0x0051, 0xf00);
  lcdWriteRegister(0x0052, 0xa03);
  lcdWriteRegister(0x0053, 0x300);
  lcdWriteRegister(0x0054, 0xc05);
  lcdWriteRegister(0x0055, 0xf00);
  lcdWriteRegister(0x0056, 0xf00);
  lcdWriteRegister(0x0057, 3);
  lcdWriteRegister(0x0058, 0x1f07);
  lcdWriteRegister(0x0059, 0x71f);
  delay(20);
  lcdWriteRegister(0x0007, 0x12);
  delay(20);
  lcdWriteRegister(0x0007, 0x13);
}

void lcdRegisterOther() {
  Serial.println("Loading LCD registers...");
  lcdWriteRegister(0x00e5,0x8000);
  lcdWriteRegister(0x0000,0x0001);
  lcdWriteRegister(0x0001,0x0100);
  lcdWriteRegister(0x0002,0x0700);
  lcdWriteRegister(0x0003,0x1030);
  lcdWriteRegister(0x0004,0x0000);
  lcdWriteRegister(0x0008,0x0202);
  lcdWriteRegister(0x0009,0x0000);
  lcdWriteRegister(0x000a,0x0000);
  lcdWriteRegister(0x000c,0x0000);
  lcdWriteRegister(0x000d,0x0000);
  lcdWriteRegister(0x000f,0x0000);
  lcdWriteRegister(0x0010,0x0000);
  lcdWriteRegister(0x0011,0x0000);
  lcdWriteRegister(0x0012,0x0000);
  lcdWriteRegister(0x0013,0x0000);
  lcdWriteRegister(0x0010,0x17b0);
  lcdWriteRegister(0x0011,0x0037);
  lcdWriteRegister(0x0012,0x0138);
  lcdWriteRegister(0x0013,0x1700);
  lcdWriteRegister(0x0029,0x000d);
  lcdWriteRegister(0x0020,0x0000);
  lcdWriteRegister(0x0021,0x0000);
  lcdWriteRegister(0x0030,0x0001);
  lcdWriteRegister(0x0031,0x0606);
  lcdWriteRegister(0x0032,0x0304);
  lcdWriteRegister(0x0033,0x0202);
  lcdWriteRegister(0x0034,0x0202);
  lcdWriteRegister(0x0035,0x0103);
  lcdWriteRegister(0x0036,0x011d);
  lcdWriteRegister(0x0037,0x0404);
  lcdWriteRegister(0x0038,0x0404);
  lcdWriteRegister(0x0039,0x0404);
  lcdWriteRegister(0x003c,0x0700);
  lcdWriteRegister(0x003d,0x0a1f);
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00ef);
  lcdWriteRegister(0x0052,0x0000);
  lcdWriteRegister(0x0053,0x013f);
  lcdWriteRegister(0x0060,0x2700);
  lcdWriteRegister(0x0061,0x0001);
  lcdWriteRegister(0x006a,0x0000);
  lcdWriteRegister(0x0090,0x0010);
  lcdWriteRegister(0x0092,0x0000);
  lcdWriteRegister(0x0093,0x0003);
  lcdWriteRegister(0x0095,0x0101);
  lcdWriteRegister(0x0097,0x0000);
  lcdWriteRegister(0x0098,0x0000);
  lcdWriteRegister(0x0007,0x0021);
  lcdWriteRegister(0x0007,0x0031);
  lcdWriteRegister(0x0007,0x0173);
}

void lcdRegister7783() {
    
  lcdWriteRegister(0x0001,0x0100);    
  lcdWriteRegister(0x0002,0x0700);    
  lcdWriteRegister(0x0003,0x1030);    
  lcdWriteRegister(0x0008,0x0302);    
  lcdWriteRegister(0x0009,0x0000);   
  lcdWriteRegister(0x000A,0x0008);    
  lcdWriteRegister(0x0010,0x0790);    
  lcdWriteRegister(0x0011,0x0005);    
  lcdWriteRegister(0x0012,0x0000);   
  lcdWriteRegister(0x0013,0x0000); 
  lcdWriteRegister(0x0010,0x12B0);    
  lcdWriteRegister(0x0011,0x0007);  
  lcdWriteRegister(0x0012,0x008C);   
  lcdWriteRegister(0x0013,0x1700);    
  lcdWriteRegister(0x0029,0x0022);    
  lcdWriteRegister(0x0030,0x0000);    
  lcdWriteRegister(0x0031,0x0505);    
  lcdWriteRegister(0x0032,0x0205);    
  lcdWriteRegister(0x0035,0x0206);    
  lcdWriteRegister(0x0036,0x0408);    
  lcdWriteRegister(0x0037,0x0000);   
  lcdWriteRegister(0x0038,0x0504);
  lcdWriteRegister(0x0039,0x0206);    
  lcdWriteRegister(0x003C,0x0206);   
  lcdWriteRegister(0x003D,0x0408);    
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00EF);   
  lcdWriteRegister(0x0052,0x0000);   
  lcdWriteRegister(0x0053,0x013F);   
  lcdWriteRegister(0x0060,0xA700);   
  lcdWriteRegister(0x0061,0x0001);   
  lcdWriteRegister(0x0090,0x0033); 
  lcdWriteRegister(0x0007,0x0133);
  lcdWriteRegister(0x0001,0x0100);
  lcdWriteRegister(0x0002,0x0700);    
  lcdWriteRegister(0x0003,0x1030);    
  lcdWriteRegister(0x0008,0x0302);    
  lcdWriteRegister(0x0009,0x0000);   
  lcdWriteRegister(0x000A,0x0008);    
  lcdWriteRegister(0x0010,0x0790);    
  lcdWriteRegister(0x0011,0x0005);    
  lcdWriteRegister(0x0012,0x0000);  
  lcdWriteRegister(0x0013,0x0000);    
  lcdWriteRegister(0x0010,0x12B0);    
  lcdWriteRegister(0x0011,0x0007);    
  lcdWriteRegister(0x0012,0x008C);    
  lcdWriteRegister(0x0013,0x1700);    
  lcdWriteRegister(0x0029,0x0022);    
  lcdWriteRegister(0x0030,0x0000);    
  lcdWriteRegister(0x0031,0x0505);    
  lcdWriteRegister(0x0032,0x0205);    
  lcdWriteRegister(0x0035,0x0206);    
  lcdWriteRegister(0x0036,0x0408);   
  lcdWriteRegister(0x0037,0x0000);    
  lcdWriteRegister(0x0038,0x0504);
  lcdWriteRegister(0x0039,0x0206);    
  lcdWriteRegister(0x003C,0x0206);    
  lcdWriteRegister(0x003D,0x0408);   
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00EF);   
  lcdWriteRegister(0x0052,0x0000);   
  lcdWriteRegister(0x0053,0x013F);   
  lcdWriteRegister(0x0060,0xA700);   
  lcdWriteRegister(0x0061,0x0001);   
  lcdWriteRegister(0x0090,0x0033);
  lcdWriteRegister(0x0007,0x0133);
}

void lcdInit() {
  pinMode(LCD_CS, OUTPUT);
  digitalWrite(LCD_CS, HIGH);
  pinMode(LCD_RS, OUTPUT);
  digitalWrite(LCD_RS, HIGH);
  pinMode(LCD_WR, OUTPUT);
  digitalWrite(LCD_WR, HIGH);
  pinMode(LCD_RD, OUTPUT);
  digitalWrite(LCD_RD, HIGH);
  pinMode(LCD_RST, OUTPUT);
  digitalWrite(LCD_RST, HIGH);  
}

void lcdReset() {
  digitalWrite(LCD_RST, LOW);
  delay(2); 
  digitalWrite(LCD_RST, HIGH);
  lcdWriteData(0);
  lcdWriteData(0);
  lcdWriteData(0);
  lcdWriteData(0);
}

void lcdWrite8(uint16_t data) {
  digitalWrite(LCD_D0, data & 1);
  digitalWrite(LCD_D1, (data & 2) >> 1);
  digitalWrite(LCD_D2, (data & 4) >> 2);
  digitalWrite(LCD_D3, (data & 8) >> 3);
  digitalWrite(LCD_D4, (data & 16) >> 4); 
  digitalWrite(LCD_D5, (data & 32) >> 5);
  digitalWrite(LCD_D6, (data & 64) >> 6);
  digitalWrite(LCD_D7, (data & 128) >> 7);  
}

uint16_t lcdRead8() {
  uint16_t result = digitalRead(LCD_D7);
  result <<= 1;
  result |= digitalRead(LCD_D6);
  result <<= 1;
  result |= digitalRead(LCD_D5);
  result <<= 1; 
  result |= digitalRead(LCD_D4); 
  result <<= 1;
  result |= digitalRead(LCD_D3);
  result <<= 1;
  result |= digitalRead(LCD_D2); 
  result <<= 1;
  result |= digitalRead(LCD_D1);
  result <<= 1;
  result |= digitalRead(LCD_D0); 
  
  return result;
}

void lcdSetWriteDir() {
  pinMode(LCD_D0, OUTPUT);
  pinMode(LCD_D1, OUTPUT);
  pinMode(LCD_D2, OUTPUT);
  pinMode(LCD_D3, OUTPUT);  
  pinMode(LCD_D4, OUTPUT);  
  pinMode(LCD_D5, OUTPUT);
  pinMode(LCD_D6, OUTPUT);
  pinMode(LCD_D7, OUTPUT);  
}


void lcdSetReadDir() {
  pinMode(LCD_D0, INPUT);
  pinMode(LCD_D1, INPUT);
  pinMode(LCD_D2, INPUT);
  pinMode(LCD_D3, INPUT);  
  pinMode(LCD_D4, INPUT);  
  pinMode(LCD_D5, INPUT);
  pinMode(LCD_D6, INPUT);
  pinMode(LCD_D7, INPUT);    
}

void lcdWriteData(uint16_t data) {
  
  lcdSetWriteDir();
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
  
  lcdWrite8(data >> 8);
  
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  
  lcdWrite8(data);
  
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  
  digitalWrite(LCD_CS, HIGH);  
}


void lcdWriteCommand(uint16_t command) {
  lcdSetWriteDir(); 
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, LOW);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);  
  lcdWrite8(command >> 8);
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  lcdWrite8(command);
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  digitalWrite(LCD_CS, HIGH);    
}


int lcdReadData() {
  uint16_t result;
  lcdSetReadDir();
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
  
  digitalWrite(LCD_RD, LOW);  
  delayMicroseconds(10);
  result = lcdRead8() << 8;
  digitalWrite(LCD_RD, HIGH);
  
  delayMicroseconds(10);
  
  digitalWrite(LCD_RD, LOW);
  delayMicroseconds(10);
  result |= lcdRead8();
  
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_CS, HIGH);
  
  return result;
}


void lcdWriteRegister(uint16_t addr, uint16_t data) {
  lcdWriteCommand(addr);
  lcdWriteData(data);
}

uint16_t lcdReadRegister(uint16_t reg) {
  lcdWriteCommand(reg);
  return lcdReadData();
}

uint16_t lcdReadID() {
  return lcdReadRegister(0x00);
}


void lcdFillScreen(uint16_t color) {
  
  Serial.println("Filling the screen...");
  
  /*lcdWriteRegister(0x0050, 0);
  lcdWriteRegister(0x0051, 219);  
  lcdWriteRegister(0x0052, 0);
  lcdWriteRegister(0x0053, 319);  
  */
  lcdWriteRegister(0x0020, 0);
  lcdWriteRegister(0x0021, 0);
  lcdWriteCommand(0x0022);
  
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
 
  lcdSetWriteDir();
  
  uint32_t i = 320;
  i *=240;

  while( i-- ) {
    lcdWrite8(color >> 8);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH); 
    lcdWrite8(color);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH); 
  }
  
  digitalWrite(LCD_CS, HIGH); 
  Serial.println("Done filling...");
  
}

вот результат

не выводил RD так как экран запустился и это было бы лишней перепайкой.

diger67
Offline
Зарегистрирован: 25.07.2015

Что касается данного шилда, он 8 битный в данном исполнении, полностью его разбирал по косточкам, отпаивал плату. Судя по шлейфу 8 из 40 контактов  не используются, они просто не разведены на шлейфе TFT. Писал в другой теме, реагирует только на ili932x. При этом где-то в серидине экрана имеется призрачное изображение, причем цветное. Пока и оставил на потом, пытался вывести RD, результата не дало. Вот в другой теме выкладывал фото http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov?page=3#comment-217715

diger67
Offline
Зарегистрирован: 25.07.2015

Вот спасибо за ссылку на товар. Мне его прислали на замену разбитого без описания. Делаем просто, берем библиотеку UTFT выбираем R61581 или CTE35IPS (что одно и тоже), в функции присвоения значений в массиве битности шины byte dtm[] меняем соответсвующее значение с 16 на 8, у меня конкретно 27 значение в массиве. Добавляем в initlcd.h инверсию LCD_Write_COM(0x21); все работает. Ща попробую фотку закачать. Еще раз спасибо за наводку на товар. Если не получится или не понимаете как сделать, могу выложить библиотеку с исправлением под даный шилд.

 

swarm38
Offline
Зарегистрирован: 04.10.2016

diger67 пишет:
в функции присвоения значений в массиве битности шины byte dtm[] меняем соответсвующее значение с 16 на 8

вот тут немного непонятно :)

лучше сразу

diger67 пишет:
выложить библиотеку с исправлением под даный шилд.

Буду премного благодарен если этот кирпич подаст признаки жизни :)

diger67
Offline
Зарегистрирован: 25.07.2015

Пробуй  http://178.130.34.198/adafruit/UTFTNEW/UTFT.rar

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

swarm38
Offline
Зарегистрирован: 04.10.2016

Заработало!)

Использовал свежескачанную IDE 1.5.8, скетч залился вот с такой ошибкой, надеюсь не кретично в будущем:

Еще раз спасибо большое за рабочую библиотеку)

PS. перезалил библиотеку к себе на ЯД https://yadi.sk/d/QXU_Mu3zzTzvM

diger67
Offline
Зарегистрирован: 25.07.2015

 Не за что. Удачи.

avgaz
Offline
Зарегистрирован: 23.09.2014

как блин отписаться от темы нодаели уже уведомления на почту ((

viki13viki
Offline
Зарегистрирован: 14.11.2016

Когда приходит уведомление то та же есть и ссылка на отключение уведомлений

viki13viki
Offline
Зарегистрирован: 14.11.2016

Тогда не знаю.

avgaz
Offline
Зарегистрирован: 23.09.2014

viki13viki пишет:
Когда приходит уведомление то та же есть и ссылка на отключение уведомлений

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

diger67
Offline
Зарегистрирован: 25.07.2015

avgaz пишет:

viki13viki пишет:
Когда приходит уведомление то та же есть и ссылка на отключение уведомлений

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

В почте пометь как спам, а потом раз в день чисти папку спам. В нее всеравно чтото кроме этих сообщений поподает.

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

эх , так и неузнал его ID :))))

в продолжение про  R61581   .  вот ещё один шилд который запустился на  UTFT myGLCD(27,38,39,40,41);

480x320 3.5 TFT LCD mega 2560 дисплей FPC-35H001A0-A 

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

если что в файле UTFT.cpp   display_transfer_mode = dtm[model];   заменить на display_transfer_mode = 8; или display_transfer_mode = 16; 

и для уменьшения занимаемого размера либы , в файле memorysaver.h раскомментить все #define DISABLE  кроме  //#define DISABLE_R61581

пример UTFT\examples\Arduino (AVR)\UTFT_Demo_480x320 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

доброе время суток.  есть mega 2560 на ней седить EF02037 CAN-BUS Shield OBD2 через провода цепляю экран 3.95 тач не работает. подключаю проводами экран на прямую на мегу без EF02037 CAN-BUS Shield, тач работает. подсоеденяю отбратно через  EF02037 CAN-BUS Shield проводами, сново тач не работает. в чем загвоздка? спасибо

viki13viki
Offline
Зарегистрирован: 14.11.2016

отвечаю сам. переместил пины с 2.3.4.5.6 на 3.4.5.6.7 и все пошло. дело в том что пин 2 в EF02037 CAN-BUS Shield занят, он занят как INT.

ge4ev
Offline
Зарегистрирован: 07.01.2017

Всем добрый вечер! Перечитал всю тему, перепробовал все, кроме пайки,нчего не получается, хотя вроде все уже разжевано. В общем предистория такова: китаец по ошибке прислал 4 шт ATMega+3,95 TFTLCD (на ili9488). В общем решил я его включить. Ну заработать то оно заработало, (спасибо вышенаписанному) но блин ЗЕРКАЛЬНО! Еще раз говорю, пробовал бблиотеку менять в разных вариантах - не идет! А так как сам в общем то ЧАЙНИК в этом деле, может кто подскажет (пошагово) как победить данную проблему (больно уж хочется)? Еще раз прошу сильно не "ругать", в общем ткните носом, где, куда и чего менять, чтоб заработало?

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

ge4ev пишет:

..... но блин ЗЕРКАЛЬНО! Еще раз говорю, пробовал бблиотеку менять в разных вариантах - не идет! А так как сам в общем то ЧАЙНИК в этом деле, может кто подскажет (пошагово) как победить данную проблему (больно уж хочется)? Еще раз прошу сильно не "ругать", в общем ткните носом, где, куда и чего менять, чтоб заработало?

изучите предыдущую 24 страницу, там все разжевал . 

поиск по форуму :   зеркалирование       ,         mirror

// непонятно и не видно что вам надо отзеркалить , но там зеркалирование и тача и экрана поднималось

 

ge4ev
Offline
Зарегистрирован: 07.01.2017

Пробовал и АДАфрут - белый экран. Переустановл, все то же.

Зеркально пшет экран. Тач работает нормально, но с UTFT, в АДАфруте не знаю.

geniusbsd
Offline
Зарегистрирован: 23.02.2016

День добрый купил красный шилд 3,95 Mega 2560

Запускается при 31 и при 27, но изображение  зеркально. менял 0X48 на 0Х88 ничего не происходит :( Подскажите как перевернуть?

diger67
Offline
Зарегистрирован: 25.07.2015

ссылку, фото выкладовайте.

mazahaker
Offline
Зарегистрирован: 02.11.2015

Тут у кого нибудь точно есть такой конфиг:

у кого есть мега 2560 и дисплей с разрешением 320х480 большая просьба проверить этот скетч

https://yadi.sk/d/UUaLcRh43Er9Ru

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

Юзаю красный шилд 3.5 на ili9488

Либа utft, когда будете тестить, проинициализируйте под свой дисплей =)

Заранее спасибо, хотелось бы узнать - у меня лыжи не едут или все же уперся в возможности железки

Vitali-71
Offline
Зарегистрирован: 25.04.2017
Добрый день! У меня просьба помочь разобраться с такой проблемой!
у меня:
+Arduino Мега 2560 R3
+ 3.2-дюймовый TFT IPS ЖК-дисплей 480 х 320 
+4 сервопривода
как управлять сервоприводами знаю, подключил. но мне надо вывести угол отклонений на дисплей.
Вот скетч для работы сервоприводов.
#include <Servo.h> 

const int servo1 = 4; // первая серва
const int servo2 = 10; // вторая серва
const int joyH = 3; // выход L/R джойстика Parallax
const int joyV = 4; // выход U/D джойстика Parallax
int servoVal; // переменная для хранения данных с аналогового пина
Servo myservo1; // создаем объект Servo для управления первой сервой
Servo myservo2; // создаем объект Servo для управления второй сервой
void setup() {

// Servo
myservo1.attach(servo1); // подключаем серву
myservo2.attach(servo2); // подключаем серву
// Инициализация серийного протокола связи

Serial.begin(9600);
}

void loop(){
// отображаем значения с джойстика с использованием серийного монитора
outputJoystick();
// считываем значение с джойстика по горизонтали (значение между 0 и 1023)
servoVal = analogRead(joyH);
servoVal = map(servoVal, 0, 1023, 0, 180); // масштабируем полученное значение для использования с серводвигателем (результат возвращается в диапазоне от 0 до 180)
myservo2.write(servoVal); // выводим ротор сервы в положение в соответствии с полученным масштабированным значением
// считываем значение джойстика вдоль вертикальной оси (значение от 0 до 1023)
servoVal = analogRead(joyV);
servoVal = map(servoVal, 0, 1023, 0, 180); //масштабируем полученное значение для использования с сервой (диапазон: от 0 до 180)
myservo1.write(servoVal); // выводим ротор второй сервы в соответствии с полученным масштабированным значением
delay(15); // ждем, пока серва обеспечит заданное положение
}
/**
* отображаем значения джойстика
*/
void outputJoystick(){

Serial.print(analogRead(joyH));
Serial.print ("---");
Serial.print(analogRead(joyV));
Serial.println ("----------------");
}

А вот для дисплея.

# <UTFT.h>

// Объявляем, какие шрифты мы будем использовать
       
extern uint8_t BigFont[];

// Не забудьте изменить параметр модели в соответствии с вашим модулем отображения!
UTFT myGLCD(CTE32HR,38,39,40,41);

void setup()
{
  randomSeed(analogRead(0));
  
// Setup the LCD
  myGLCD.InitLCD();
  myGLCD.setFont(BigFont);
}

void loop()
{
  myGLCD.clrScr();
  
  myGLCD.setColor(0, 0, 255);       //фон экрана
  myGLCD.fillRect(0, 0, 479, 319);  //границы фона

  myGLCD.setBackColor(0, 0, 255);   //цвет фона
  myGLCD.setColor(255, 255, 0);     //цвер шрифта
  myGLCD.print("UDALENOST", 285, 1);

  myGLCD.setColor(0, 150, 255);
  myGLCD.drawRect(241, 17, 479, 160);

  myGLCD.setColor(25, 25, 25);
  myGLCD.fillRect(242, 18, 478, 159);
  
  myGLCD.setBackColor(0, 0, 255); //цвет фона
  myGLCD.setColor(255, 255, 0);   //цвер шрифта
  myGLCD.print("NAKLON PO Y", 275, 161);

  myGLCD.setColor(0, 150, 255);
  myGLCD.drawRect(241, 177, 479, 319);
  
  myGLCD.setColor(25, 25, 25);
  myGLCD.fillRect(242, 178, 478, 318); 
  
  myGLCD.setBackColor(0, 0, 255); //цвет фона
  myGLCD.setColor(255, 255, 0);   //цвер шрифта
  myGLCD.print("POVOROT NA 360", 10, 1);
  
  myGLCD.setColor(0, 150, 255);
  myGLCD.drawRect(0, 17, 239, 160);

  myGLCD.setColor(25, 25, 25);
  myGLCD.fillRect(1, 18, 238, 159);

  myGLCD.setBackColor(0, 0, 255); //цвет фона
  myGLCD.setColor(255, 255, 0);   //цвер шрифта
  myGLCD.print("NAKLON PO X", 30, 161);

  myGLCD.setColor(0, 150, 255);
  myGLCD.drawRect(0, 177, 239, 319);

  myGLCD.setColor(25, 25, 25);
  myGLCD.fillRect(1, 178, 238, 318);


  while (true) {}; //от мигания
}

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

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017
   
Vlad_rx
Offline
Зарегистрирован: 26.09.2016

Пытаюсь запустить тач 3,5" (CTE35IPS).

Пробовал UTouch и URTouch.

Запустились UTouch_QuickPaint и UTouch_QuickDraw из обеих библиотек.

Но рисует не там и в зеркале.

Попробовал запустить URTouch_Calibration, появляется экран с инструкцией и дальше никакой реакции, куда не нажимай. И так в обеех библиотеках.

Направте на путь истиный.

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

Vlad_rx пишет:

Пытаюсь запустить тач 3,5" (CTE35IPS).

.....

фотки в студию

diger67
Offline
Зарегистрирован: 25.07.2015

Надо править значения ориентации TFT. Смотрите по даташиту комбинацию битов в регистре отвечающую за этот параметр и замените так что бы изображение на TFT выводилось повернутым на 180 градусов. UTF библиотека имеет такой косяк, в ней всего два варианта отображения. Вертикально и горизонтально. Сталкивался с таким явлением, пришел TFT с разбитым тачем, заменил и упс.... Провожу по экрану а линия рисуется зеркально. поменял значения в дефайнах отвечающих за ориентацию изображения и все стало на свои места. И фото выкладывать не надо, все ясно как божий день.

Vlad_rx
Offline
Зарегистрирован: 26.09.2016

Да тут больше интересно почему не работают примеры "Калибровки" и "Кнопок".

Фото только вечером.

Vlad_rx
Offline
Зарегистрирован: 26.09.2016

 

Хочу сделать кнопки на экране. Примерно такие.

 

Но не работают. Только картинка и нет реакции на нажатие.

Калибровка тоже мёртвая, картинка и нет реакции на нажатие.

 

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

 

 

Направьте в правильную сторону.

 

Извиняюсь за качество, чё могу.

AlR
Offline
Зарегистрирован: 05.09.2013

Победил тач, а то тоже ни как заставить не могу. Какую то пургу в координатах выдает.

diger67
Offline
Зарегистрирован: 25.07.2015

Не работает в том случае, когда ориентация TFT спроецированна на 180 градусов. Парень писал библитотеку под определенные модули. Сталкивался, долго думал. Пока сам не взялся и не написал библиотеку, там и решил некоторые вопросы по тачу.

AlR
Offline
Зарегистрирован: 05.09.2013

diger67 пишет:

Не работает в том случае, когда ориентация TFT спроецированна на 180 градусов. Парень писал библитотеку под определенные модули. Сталкивался, долго думал. Пока сам не взялся и не написал библиотеку, там и решил некоторые вопросы по тачу.


Аааа, т.е. когда в библиотеке забито портрет, а сам дисплей ладшафтный? Блииин, чертовы китайцы :) А что там делать? У меня дисплей кооринаты крайние выдает в основном, ну там 0/239 или 399/0 или 399/239 или -1/-1. При чем когда тыкаешь в точку одну то считывает случайные координаты.
Просто думал про ориентацию, только смущает, что координаты скачут с одной точки.

А где там ориентацию править?

diger67
Offline
Зарегистрирован: 25.07.2015

Не совсем, портрет имеет две ратации, 90 и 240 градусов. Относительно координат x0 и y0 получается что изменение сопротивления тача по осям изменяется на 180 градусов. Как следствие надо определять ориентацию не толко области памяти матрици, но и тачскрина. Бывает что не совпадает толко одна из осей, поэтому UTFT несколько ущербна в этом вопросе. Также пытался использовать его библиотеку Flashloader. Разобрал по косточкам, и нифига с помошью его проги записать не смог. Списывалс с ним, был шокирован ответом, мол писал давно, непомню, разбирайся, вобщем понятно. Но использовать как основу для понимания и немного корректируя можно запустить любой TFT.

AlR
Offline
Зарегистрирован: 05.09.2013

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

Но симптомы у меня именно от ориентации этой путанной?

diger67
Offline
Зарегистрирован: 25.07.2015

Ну да. Сами написали прогу, сами сделали модули, Какие вопросы. Хотя Nextion безнадега полная. Ограничения по элементам, закрытая библиотека. Я давно ушел от AVR в вопросах работы с TFT. В Nextion используют stm микроконтроллер, но как я понял пока в режиме FSMC, я бы на их месте перешел на LTDC. Если интересно можете посмотреть. https://www.youtube.com/watch?v=2yn_j_dLoy4&list=PLkkjxEa2qzKGh_kpzz9WezAtbcON0WFut

AlR
Offline
Зарегистрирован: 05.09.2013

diger67 пишет:

Ну да. Сами написали прогу, сами сделали модули, Какие вопросы. Хотя Nextion безнадега полная. Ограничения по элементам, закрытая библиотека. Я давно ушел от AVR в вопросах работы с TFT. В Nextion используют stm микроконтроллер, но как я понял пока в режиме FSMC, я бы на их месте перешел на LTDC.


Хотите сказать с Некстон лучше не связыватся? Просто хотелось бы меньше сюрпризов. Я так понял от китайцев можно в любом момент ждать сюрпризов.

А что посоветуете по работе с TFT у меня ардуино due используется. Как то не ожидал таких сложностей с дисплеем.

diger67
Offline
Зарегистрирован: 25.07.2015

Почему. Вы получаете своеобразную "Видеокарту". Вы создаете две программы, одну для Nextion, визуализация процессов и вторую в arduino, управляющая процессом визуализации. Имеет смысл, разгружает AVR, делает работу более производительной, основную программу. Библиотека UTFT отнюдь не китайская, если я не ошибаюсь ее написал европеец.

AlR
Offline
Зарегистрирован: 05.09.2013

diger67 пишет:

Почему. Вы получаете своеобразную "Видеокарту". Вы создаете две программы, одну для Nextion, визуализация процессов и вторую в arduino, управляющая процессом визуализации. Имеет смысл, разгружает AVR, делает работу более производительной, основную программу. Библиотека UTFT отнюдь не китайская, если я не ошибаюсь ее написал европеец.

А с этим дисплеем больше возьни получается? Ну если только для себя разобратся? Я так понял там китаезы накосячили при сборке? ПРосто когда я покупал его, даже контроллер не тот продован мне указал, разрешение, короче все характеристики :) На буржуинском форуме как то программно меняли ориентацию, попробую там поискать.

С библиотекой понятное дело, а вот с дисплеями самими :) По UTFT вообще вопросов нема, отрабатывает все нормально, а вот Urtouch косячит чего то, обидно.

diger67
Offline
Зарегистрирован: 25.07.2015

За ориентацию отвечает 36h регистр TFT. Открывайте даташит на чип TFT и смотрите какой набор битов надо активировать для нужной вам ориентации.

Logik
Offline
Зарегистрирован: 05.08.2014

Да. Именно 36h-й и отвечает.

Подключил вчера очередной экран. Такой - https://ru.aliexpress.com/item/2-8-inch-TFT-LCD-Module-without-Touch-Panel-ILI9341-Drive-IC-240-RGB-320-SPI/32764300681.html?spm=2114.10010208.1000014.2.wQImlV&traffic_analysisId=recommend_3035_null_null_null&scm=1007.13338.84300.000000000000000&pvid=d5d83a42-bab3-453f-9f50-4f3b93848529&tpp=1 . По SPI подключил. До этого подключал еще парочку других по 8-битной паралельной. И каждый раз замечаю неладное. Они то работают в принципе, но есть моменты.

Инициализация. Проходит успешно, код гуляющий по инету - чтото типа

    startWrite();

    writeCommand(0xEF);
    spiWrite(0x03);
    spiWrite(0x80);
    spiWrite(0x02);

    writeCommand(0xCF);
    spiWrite(0x00);
    spiWrite(0XC1);
    spiWrite(0X30);

    writeCommand(0xED);
    spiWrite(0x64);
    spiWrite(0x03);
    spiWrite(0X12);
    spiWrite(0X81);

    writeCommand(0xE8);
    spiWrite(0x85);
    spiWrite(0x00);
    spiWrite(0x78);

    writeCommand(0xCB);
    spiWrite(0x39);
    spiWrite(0x2C);
    spiWrite(0x00);
    spiWrite(0x34);
    spiWrite(0x02);

    writeCommand(ч0xF7);
    spiWrite(0x20);

    writeCommand(0xEA);
    spiWrite(0x00);
    spiWrite(0x00);

    writeCommand(ILI9341_PWCTR1);    //Power control
    spiWrite(0x23);   //VRH[5:0]

    writeCommand(ILI9341_PWCTR2);    //Power control
    spiWrite(0x10);   //SAP[2:0];BT[3:0]

    writeCommand(ILI9341_VMCTR1);    //VCM control
    spiWrite(0x3e);
    spiWrite(0x28);

    writeCommand(ILI9341_VMCTR2);    //VCM control2
    spiWrite(0x86);  //--

    writeCommand(ILI9341_MADCTL);    // Memory Access Control
spiWrite(0x48);

Это из фруктового ада, не суть важно, есть похожий из др. источников.  Начинается  с команды 0xEF. А вот нету такой в доке!

 

У ili9341 нету, и у других контролеров нету, штук 5 просмотрел. Как нет и других команд заданых магическими числам (наверно потому, что авторы тоже не знают что оно такое). Че за хрень с инитом?

И с остальным не так уж гладко, регистр 36h. Описан как

8.2.29. Memory Access Control (36h)
36h MADCTL (Memory Access Control)
 D/CX RDX WRX D17-8 D7 D6 D5 D4 D3 D2 D1 D0 HEX

Command 0 1 ↑ XX 0 0 1 1 0 1 1 0 36h

Parameter 1 1 ↑ XX MY MX MV ML BGR MH 0 0 00
Description
This command defines read/write scanning direction of frame memory.
This command makes no change on the other driver status.
Bit Name Description

MY Row Address Order

MX Column Address Order

MV Row / Column Exchange These 3 bits control MCU to memory write/read direction.

ML Vertical Refresh Order LCD vertical refresh direction control.
BGR RGB-BGR Order
Color selector switch control (0=RGB color filter panel, 1=BGR color filter panel)

MH Horizontal Refresh ORDER LCD horizontal refreshing direction control.
 

У остальных распостраненных контролеров вобщем так же. Но проверка показывает, что работают не все флаги. Работают BGR, MV, MX. А MH, ML, MY видимого влияния не оказывают. Прямо сейчас играюсь записываемым в 36h значением и вспоминаю что ранее была таже проблема на других экранах.

Все это наводит на мысль, что китайцы ставят урезаный чёртекакой контролер, отдаленно напоминающий ili9341.

ПС. Советчики уровня "Бери либу ххх и не парся", или "Посотри как у меня тут -ххх", просьба, просто не утруждать себя ответами. Хотелось бы услышать коментарии тех кто в курсе проблемы.