3.5" TFT LCD красный меговский + mega 2560 R3 . РЕШЕНО ! + как решить другие !
- Войдите на сайт для отправки комментариев
Вс, 29/11/2015 - 18:41
эта тема задумывалась как решение в запуске этого шилда тем кто приобрел этот дисплей и закинул его в дальний угол. Чтоб могли его запустить.
И как методика , чтобы сами могли разобраться в похожих случаях.
Дабы эта проделанная работа не затерялась среди тысячи сообщений соседней ветки, создал новую тему.
Форумчанин с этого форума попросил помочь и прислал мне для изучения и запуска этого шилда TFT LCD shield 3.5" arduino mega ili9488 480x320. дисплей FPC-A35242N01QI-A
Дисплей выдавал такую вот билиберду, каракули , на всевозможных инициализациях :
по опыту могу сказать что это из-за неправильной битности или цветности. //опыт в своей ветке http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov
пересылка транспортной компанией на удивление составила всего то около 100руб (против почтой в 250р). Никто видимо так и не захотел уделять времени и сил, хотя, что и как, всё было до нельзя разжёвано и посоветовано. Просто это требовало много времени для реализации. Пришлось делать что советовал, самому.
1. первое что надо выяснить - это модель контроллера. (мало ли, закончились одни дисплеи, китайцы сунули другие, и нифига не проверили). Нагреваем феном низ шилда, отклеиваем аккуратно экран. Сначала был изучен предполагаемый даташит и провода от кристалла(контроллера) в шлейф. 27стр. PDF:
Рисуем распиновку:
Выводим RD (он оказался не разведен на шилде)
оказался под шлейфом подключен на +3.3в, режем доржку (пометил синим крестиком), и через резистор 10ком на 42пин ардуины. Чтоб в будущих скетчах не выводить лог1 на 42пин, а просто его не использовать, добавим ещё 10ком от +5в на 42пин ардуины.
пишем и оттачиваем скетч подачи управляющих сигналов и считывания командой 3Dh , ID дисплея согласно его даташиту стр.42:
Reset - сброс дисплея (лог1-сброс , лог0-нормальная работа)
CS - ChipSelect - выбор кристалла (лог1-отключение выводов, 0-включение), отключать желательно на случай переходных процессов чтения-записи, чтоб лог.0и1 с дисплея не упирались в лог.1и0 ардуино. Или на случай подключения параллельно несколько дисплеев. Если дисплей один, и всегда как принимающий данные (на RD всегда лог1) , то в принципе можно отказаться от этого вывода, подав на него лог.0 . К тому же благодаря последовательно 10ком резисторам, если встретятся сильные сигналы с дисплея и ардуины. то ничто не выйдет из строя.
RD - Read (чтение данных дисплеем, лог1-дисплей считывает, лог0-передает данные) , можно отказаться от этого вывода, если с дисплея ничего считывать не надо, а только отсылать ему команды и данные, подав на него лог.1 , что и делают производители в многих шилдах.
CD (RS) - Command (CommandData) - КомандаДанные - лог1-когда передаем команду(или адрес регистра в памяти) , лог.0 когда данные (данные в регистре памяти)
WR - Write - Запись лог1-строб записи в дисплей.
скетч для считывания ID дисплеев был составлен и отстроен на нескольких шилдах и дисплеях, выложил здесь:
скетч выдал ID=9488 это и есть ili9488
Замечу что у большинства дисплеев ID лежит по нулевому адресу. и может не иметь числа схожие с названием контроллера. Есть некоторые дисплеи у которых ID в ______ адресах(регистрах), всё это смотрится в предполагаемых даташитах.
Проще всего было подменить в UTFT инициализацию от ILI9486, в папке ...\libraries\UTFT\tft_drivers\ili9486\initlcd.h , он в UTFT такого же разрешения 320х480 .
В файле UTFT.cpp 28 место из 31го , разрешение 319х 479
word dsx[] = {............., 319, 799, 127, 127};
word dsy[] = {............., 479, 479, 159, 159};
В файле UTFT.h под номером 28 ILI9486 , оставляем закоментированным только его
//#define ILI9486 28
в скетче пишем
UTFT myGLCD(ILI9486,38,39,40,41); или UTFT myGLCD(28,38,39,40,41);
Скармливая разные инициализации и переработанные под UTFT от ili9488 , дисплей не завёлся, и предположив что по ошибке производителей шилда он 8 битный, для этого в UTFT.cpp меняем битность на 8 (UTFT будет передавать 16бит двумя 8битными с дополнительным сигналом WR )
было
byte dtm[] = {......., 16, 16, SERIAL_5PIN, SERIAL_5PIN};
стало
byte dtm[] = {......., 8, 16, SERIAL_5PIN, SERIAL_5PIN};
и пробуем в \Arduino\libraries\UTFT\hardware\avr\HW_ATmega1280.h
заменить выдачу младшего байта в портС , ведь во многих дисплеях включенных на 8 бит шина данных с DB8-DB15 для этого и заточен UTFT, приходит на пины ардуины 22-29, а в ili 9488 при 8-бит используются DB0-7 которые скомутированы 30-37пины ардуины (PORTC микроконтроллера)
для этого меняем в UTFT портА на портС
было:
#else
PORTA = VH;
pulse_low(P_WR, B_WR);
PORTA = VL;
pulse_low(P_WR, B_WR);
стало:
#else
PORTC= VH;
pulse_low(P_WR, B_WR);
PORTC = VL;
pulse_low(P_WR, B_WR);
белый экран, дисплей не завелся, значит он не 8 бит, возвращаем всё на место.
2. второе что надо выяснить - его настоящую битность.
значит конкретно с ней напутано. Исследуем дальше... согласно схеме выводов кристалла и выходов со стекла в шлейф , предположительно IM2,1 - следующие от вывода RESX замкнуты на GND . вывод IM0 выведен в шлейф. (на фотках выше) Также доказывает это вывод всех 18бит в шлейфе, (а не как обычно 16), что значит один режим это точно 18бит, а второй видимо 9 бит. Также доказывает то, что если остановить скетч на выдаче данных (порт сконфить на вход. включить подтягив. резисторы), на выходе шлейфа с DB0-DB8 дисплей пересиливает слабые сигналы с 10ком резисторов, четко видны уровни лог0 и лог1 от дисплея,.а DB9-DB17 в Z-состоянии. - значит дисплей был настроен на 9 бит. поэтому UTFT и не справлялись с ним.
! IM0 (пин2) на шилде идёт на +3,3в (пин3) прям под шлейфом. Чтобы перерезать дорожку, надо хотябы половину шлейфа отпаять. Поэтому простое решение паяльник и наточенная плоско и остро зубочистка под пин IM0 , воткнутая с обратной стороны под прогретый вывод паяльником. Проверяем чтоб он потерял контакт с 3им пином. И замыкаем на рядом GND (пин1):
Решение:
Теперь при считывании данных , лог0 и 1 наблюдаются на всех 18бит шлейфа. 16битный режим и 18битный немного схожи при определенной передачи цветности. (не буду загружать картинками из даташита, кто хочет может сам глянуть со стр.123) Запускаем UTFT на 16бит как было и о чудо !!! Переворачиваем в регистре 36h
получаем в итоге УРА !!!
UTFT\examples\Arduino (AVR)\UTFT_Demo_480x320
проверяем цветность
#include <UTFT.h> int i; UTFT myGLCD(28,38,39,40,41); void setup() { myGLCD.InitLCD(); myGLCD.clrScr(); for (i=0; i<255; i++) { myGLCD.setColor(i,0,0); myGLCD.drawLine(i,0 ,i,50); myGLCD.setColor(0,i,0); myGLCD.drawLine(i,50 ,i,100); myGLCD.setColor(0,0,i); myGLCD.drawLine(i,100 ,i,150); // белый myGLCD.setColor(i,i,i); myGLCD.drawLine(i,150 ,i,200); myGLCD.setColor(i,i,0); myGLCD.drawLine(i,200 ,i,210); myGLCD.setColor(i,0,i); myGLCD.drawLine(i,210 ,i,220); myGLCD.setColor(0,i,i); myGLCD.drawLine(i,220 ,i,230); } } void loop() { // put your main code here, to run repeatedly: }
сравнение с зененым шилдом для УНО 400х240 ili9327
Все цвета присутствуют. значит 18битный режим ili9488 в нужной цветности подошёл для 16ти битного режима адресации в UTFT .
Тач кстати то работал, то нет (перелом шлейфа в месте пайки), пришлось оторвать его шлейф от платы, зачистить и снова припаять.
UTouch\examples\Arduino\UTouch_QuickDraw
видно, что нажатия по периметру стремятся отобразиться к правее центра, значит там тач немного продавлен. Но ничего страшного , при хороших нажатиях, библиотека UTouch более менее справляется
UTouch\examples\Arduino\UTouch_QuickPaint :
собственно это всё.
Пожалуйста. Шилд был отправлен обратно его хозяину.
"Спасибо" благодарность за проделанные исследования, сил и время можно отправить на карту Сбербанка 4276 4500 1754 7783 или скинуть на тлф. 8-951-ЧОЧ-71O9 или на яндекс кошелек 410013695938113 .
архив UTFT 2.79 c подмененой (добавленной) инициализацией для ILI9488 , +разные найденные инициализации init code ili9488 в папке \UTFT\tft_drivers\ili9486 +проверенный тач (изменен в юстировке portrait на ladscape, отюстированные данные подставлены), т.е. готово к использованию:
В примерах уже подставлены 28 или ili9486 ( UTFT myGLCD(ILI9486,38,39,40,41); ) - это всё для этого шилда ili9488 (смотрим внимательней на первые фото, шилды ili9488 бывают не такие же). Ещё раз!, в своих в скетчах пишем
Для новичков, надо стереть предыдущие библиотеки utft и utouch из C:\Users\...\Documents\Arduino\libraries и заменить этими. Чтобы старый мусор от них не мешал.
Тех кто хочет считать ID с него (или пользоваться его видеопамятью) - надо задействовать RD, можно обойтись теми резисторами что на нём есть.
1. режем дорожку как говорил ранее (или также плоско наточенной зубочисткой поднимаем 32й пин дисплея )
2. подключаем так
10к на +5v с U2 , необходимо чтоб в скетчах не конфить 42й пин на выход и уст. лог.1 ( pinMode(42,OUTPUT); digitalWrite(42,HIGH); ). . А просто не использовать его. Тогда он по умолчанию будет как вход, и через 10к, на нём будет лог1, которая и будет включать дисплей в ваших скетчах на приём команд и данных от Ардуино.
Проверить, такого дисплея у меня нет. проверяйте. (я заводил с лицевой части шилда отдельным резистором 42й пин с Ардуино и 32й пин дисплея)
//П.С. поправка, в первом сообщении правильней: Reset - сброс дисплея (лог0-сброс , лог1-нормальная работа).
На других ранних шилдах где питание к дисплею бралось с +3,3в ардуины, а со стабилизатора только на подсветку, этой лог1 на RESET и лог. уровней с других выводов хватало для запитки дисплея с лихвой. Можно было обойтись без +3,3в с ардуино. И довольно таки с лихвой, что питание дисплея пересиливалось лог.1 уровнями (с ардуино) и было аж выше 4в (а дисплею максимум можно 3,3в) , поэтому и придумали китайцы соеденить вместе +3,3в и подсветку. Белые светодиоды в ней выступают в роли стабилитронов, и не дают напряженю питания дисплея подняться выше +3...+3,2 вольт. Такое решение имеет и "-", на который можно не особо обращать внимания. Это если стоят вместо резисторов , 2х сторонние "преобразователи уровней" , то лог.1 +5в с Ардуино, через ""преобразователи уровней"" (внутренние диоды от входа на питание) упирается в +3в , тес самым Ардуинка напрягается, ну и больше кушает.
Уважаемый Slider. Как старый электронщик, с интересом прочитал эту заметку. Просто поразительно, отличное знание темы. Но вот вопрос. У меня подобная же игрушка из китайского интернет магазина. Подобная, но не один в один. 3,95", но вообщем всё тоже самое, ни один драйвер не подходит.
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
И вот чудо с вашим драйвером выробляе як и трэба. Великий дякуй вам паважаны Slider.
Мой 3,95'' (ili 9488) завёлся тоже не сразу, пришлось искать и ковырять библиотеку, чтоб избавиться от зеркальности изображения ( the display is mirror inverted, if there is made no correction in initlcd.h (COM(0x36): DATA(0x8A) instead of DATA(0x0A).), чтоб синхронизировать LCD и Touch (сейчас точно не вспомню, но вроде в том же initlcd.h менял значения с portrait на landscape то ли в строке LCD то ли в Touch). Завёлся с библиотекой UTFT и строками инициализации:
UTFT myGLCD(CTE32HR,38,39,40,41);
UTouch myTouch( 6, 5, 4, 3, 2);
Возни и поисков было на три дня, но... результат есть и он вполне приемлимый. С этим скетчем всё работает:
Мой 3,95'' (ili 9488) завёлся тоже не сразу, пришлось искать и ковырять библиотеку, чтоб избавиться от зеркальности изображения ( the display is mirror inverted, if there is made no correction in initlcd.h (COM(0x36): DATA(0x8A) instead of DATA(0x0A).)
Здравствуйте pankotskiy! Скажите, какой именно надо менять initlcd.h, у меня их много в libraries\UTFT\tft_drivers\, я не знаю какой точно используется.
В первую очередь пробовал:
c:\Arduino\libraries\UTFT\tft_drivers\r61581\
c:\Arduino\libraries\UTFT\tft_drivers\ili9486\
и т.п.
И можно ли исправляемую строку привести? Железо анологичное что и у вас.
Пробовал по совету slider, перебирал много, не нашел решение...
PS. Колеги, снимаю вопрос! Благодаря супер профессионалу slider, с его супер постами что выше, ответил на свой вопрос!
Добавлю сюда про ещё один меговский шилд , любезно предоставленный СанСанычем
надпись на плате 3.95" TFT LCD for arduino mega 2560(ili9488) , на дисплее FW-TFT040-V08A
По результатам решения сразу скажу что контроллер диспа действительно ili9488 , что на адафруите не хотел запускаться потому как автоматом там не определялся, на UTFT не запускался потому как шина дисплея 8бит и к тому же заведена на PORTA (по умолчанию в либе всё с точностью наоборот).
А теперь всё по порядку:
Плюсы этого шилда что самый дешёвый из 480x320 3.95" , свободен портС (пины 30-37 ) . И для тача стоит спецмикруха XPT2046 , шина SPI но подключена как софтовый , либа сродни УТФТ - UTouch , инит стандартный UTouch myTouch( 6, 5, 4, 3, 2); . Скорость вывода общей инфы на дисп, не кардинально отличается от 16бит ili9488 ибо команды по пересылке теже 8бит, разве что цветность передается в 2 шага, но это не долго в сравнении с другими процессами. // можете сравнить у кого есть меговский 16битный ili9488 480x320 на UTFT и черкнуть сюда за сколько времени стандартный тест выполнился. Время теста данного шилда(8бит ili9488 480x320 ) - 47,5сек ! - это достаточно быстро из-за доработанной либы turbo. Полагаю что время 16бит гдето совсем рядом, так что эти 8бит шилды можно брать.
для чтения ID вывел RD, вам нечего паять не нужно. Картинки кликабельны.
читалка портаА ID_display_read_to_serial_monitor_universal_v3_1_PORTA выдала
Решающие D3h 00 00 94 88 , остальные 04h 00 54 80 66 00 00 00 00 , DA - 00 54 , DB - 00 80 , DC - 00 66
И так, в архиве всё собрано и настроено к пользованию, опишу что уже там сделал и что к чему, распаковать всё в мои документы ...\Arduino\libraries , похожих либ что в архиве там не должно быть , иначе IDE будет ругаться на повторные библиотеки. Сопротивление тача 700 и 240 Ом (отклеился 2й пин шлейфа от стекла, помог прогрев , через скользкую бумагу, его на стекле и удержание пару сек чтоб остыл и прикрепился)
1. на основе библиотек henningkarlsen
- графика UTFT . за основу взят UTFT_v2.77b2_uno_ili9327_8bit_turbo , 1. добавил много разных инитов на ili9488 в UTFT\tft_drivers\ili9327_8 и не стесняйтесь заглядывать в их initlcd.h там закоментированы переворачивания и т.д.; 2. в либе заменил разрешение на disp_x_size = 319; disp_y_size = 479; display_transfer_mode = 8; и заменил _delay_ms на delay; переписал LCD_Write_DATA(char VH,char VL) для тработы tinyFAT 3. в примере UTFT\examples\Arduino (AVR)\UTFT_Demo_480x320 заменил вызов на №31 ; 4. в UTFT\hardware\avr\HW_ATmega1280.h заменил портС на портА , и также регистр DDRC на DDRA .
используем пример UTFT_Demo_480x320
- тач UTouch на базе UTouch v1.30.zip , изменил вызовы в примерах, PORTRAIT на LANDSCAPE в калибровке , сделал калибровку и записал ее данные в файл библиотеки. Напомню , функция myTouch.setPrecision(...); позволяет установить точность нажатия.
- tinyFAT с UTFT_tinyFAT работа с microSD . изменен тип экрана на №31 . флэшка 2 или 4 Gb форматировать на FAT (16), пример UTFT_tinyFAT\examples\Demo_Landscape , картинки на флэху закинуть из папки UTFT_tinyFAT\Image-files . Качество и красочность картинок порадуют. Если свои фотки , то в UTFT\Tools есть конвертер в RAW - ImageConverter565.exe . // 10ком резисторы на меньшие не перепаивал, и так всё считывало, ибо либа использует софтовый SPI.
2. на основе Adafruit
графика Adafruit ( либы Adafruit_TFTLCD + Adafruit_GFX ) либа одна из последних, где присутствуют много всяких контроллеров. в примерах включил принудительно ili9488 , изменил распиновку на
Попытаюсь воскресить тему!
Кто-нибудь загружал скетч во всеми "вкраплениями" размером больше 90 К? Всё работает?
конкретней.
на atmega2560 , atmega128 ограничение памяти progmem 65кбайт , иначе глюк
http://arduino.ru/forum/programmirovanie/avr-ogranichenie-na-obem-dannykh-razmeshchennykh-v-flash-pamyati-programy
,
ежели речь о файле с микросд , то максимум не пробовал. В инете должно полно инфы на это.
Все понимают что не работает но никто не понимает почему.
Я ничего не путаю?
В меге 2560 и 1280 - 256К и 128К соответственно, можно использовать только 64?
Только мне кажеться что тут что то не то?
привет товарищ
У меня также есть FPC-A35242N01QI-A, я хочу управлять им с помощью stm32, но я не знаю определения контакта,Каково определение контакта?
Все понимают что не работает но никто не понимает почему.
Я ничего не путаю?
В меге 2560 и 1280 - 256К и 128К соответственно, можно использовать только 64?
Только мне кажеться что тут что то не то?
Для адресации за пределами 64К нужны far-указатели.