Не видит CD карту (mega 2560 + TFT LCD 320X480&SDcard)

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

с вашим UTFT myGLCD(HX8357B,38,39,40,41); выдало ошибку

у меня он объявлен как UTFT myGLCD(CTE32HR, 38, 39, 40, 41);

*инфо по дисплею http://wiki.amperka.ru/продукты:tft-lcd-480x320

библиотека https://github.com/amperka/UTFT
 
видео работы вашего кода https://www.youtube.com/watch?v=u_r2GTVp-js

соответственно я объявлял как UTFT myGLCD(CTE32HR, 38, 39, 40, 41);

для пробы использовался ваш код (измененена 33 и 65 строки кода)


// UTFT_Demo_480x320 (C)2014 Henning Karlsen
// web: <a href="http://www.henningkarlsen.com/electronics" title="http://www.henningkarlsen.com/electronics" rel="nofollow">http://www.henningkarlsen.com/electronics</a>
//
// This program is a demo of how to use most of the functions
// of the library with a supported display modules.
//
// This demo was made for modules with a screen resolution 
// of 480x320 pixels.
//
// This program requires the UTFT library.
//

#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];

// Set the pins to the correct ones for your development shield
// ------------------------------------------------------------
// Arduino Uno / 2009:
// -------------------
// Standard Arduino Uno/2009 shield            : <display model>,A5,A4,A3,A2
// DisplayModule Arduino Uno TFT shield        : <display model>,A5,A4,A3,A2
//
// Arduino Mega:
// -------------------
// Standard Arduino Mega/Due shield            : <display model>,38,39,40,41
// CTE TFT LCD/SD Shield for Arduino Mega      : <display model>,38,39,40,41
//
// Remember to change the model parameter to suit your display module!

// Объявил свой дисплей!
UTFT myGLCD(CTE32HR,38,39,40,41);

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

void loop()
{
  int buf[478];
  int x, x2;
  int y, y2;
  int r;

// Clear the screen and draw the frame
  myGLCD.clrScr();

  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRect(0, 0, 479, 13);
  myGLCD.setColor(64, 64, 64);
  myGLCD.fillRect(0, 306, 479, 319);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);
  myGLCD.setBackColor(64, 64, 64);
  myGLCD.setColor(255,255,0);
  // Строку ниже пришлось закомментировать ибо выдавало ошибку компиляции!
  // myGLCD.print("<<a href="http://electronics.henningkarlsen.com" rel="nofollow">http://electronics.henningkarlsen.com</a>>", CENTER, 307);

  myGLCD.setColor(0, 0, 255);
  myGLCD.drawRect(0, 14, 479, 305);

// Draw crosshairs
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(239, 15, 239, 304);
  myGLCD.drawLine(1, 159, 478, 159);
  for (int i=9; i<470; i+=10)
    myGLCD.drawLine(i, 157, i, 161);
  for (int i=19; i<220; i+=10)
    myGLCD.drawLine(237, i, 241, i);

// Draw sin-, cos- and tan-lines  
  myGLCD.setColor(0,255,255);
  myGLCD.print("Sin", 5, 15);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(sin(((i*1.13)*3.14)/180)*95));
  }
  
  myGLCD.setColor(255,0,0);
  myGLCD.print("Cos", 5, 27);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(cos(((i*1.13)*3.14)/180)*95));
  }

  myGLCD.setColor(255,255,0);
  myGLCD.print("Tan", 5, 39);
  for (int i=1; i<478; i++)
  {
    myGLCD.drawPixel(i,159+(tan(((i*1.13)*3.14)/180)));
  }

  delay(2000);

  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);
  myGLCD.setColor(0, 0, 255);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.drawLine(239, 15, 239, 304);
  myGLCD.drawLine(1, 159, 478, 159);

// Draw a moving sinewave
  x=1;
  for (int i=1; i<(478*15); i++) 
  {
    x++;
    if (x==479)
      x=1;
    if (i>479)
    {
      if ((x==239)||(buf[x-1]==159))
        myGLCD.setColor(0,0,255);
      else
        myGLCD.setColor(0,0,0);
      myGLCD.drawPixel(x,buf[x-1]);
    }
    myGLCD.setColor(0,255,255);
    y=159+(sin(((i*0.7)*3.14)/180)*(90-(i / 100)));
    myGLCD.drawPixel(x,y);
    buf[x-1]=y;
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRect(150+(i*20), 70+(i*20), 210+(i*20), 130+(i*20));
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled, rounded rectangles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillRoundRect(270-(i*20), 70+(i*20), 330-(i*20), 130+(i*20));
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some filled circles
  for (int i=1; i<6; i++)
  {
    switch (i)
    {
      case 1:
        myGLCD.setColor(255,0,255);
        break;
      case 2:
        myGLCD.setColor(255,0,0);
        break;
      case 3:
        myGLCD.setColor(0,255,0);
        break;
      case 4:
        myGLCD.setColor(0,0,255);
        break;
      case 5:
        myGLCD.setColor(255,255,0);
        break;
    }
    myGLCD.fillCircle(180+(i*20),100+(i*20), 30);
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some lines in a pattern
  myGLCD.setColor (255,0,0);
  for (int i=15; i<304; i+=5)
  {
    myGLCD.drawLine(1, i, (i*1.6)-10, 304);
  }
  myGLCD.setColor (255,0,0);
  for (int i=304; i>15; i-=5)
  {
    myGLCD.drawLine(478, i, (i*1.6)-11, 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=304; i>15; i-=5)
  {
    myGLCD.drawLine(1, i, 491-(i*1.6), 15);
  }
  myGLCD.setColor (0,255,255);
  for (int i=15; i<304; i+=5)
  {
    myGLCD.drawLine(478, i, 490-(i*1.6), 304);
  }
  
  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random circles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=32+random(416);
    y=45+random(226);
    r=random(30);
    myGLCD.drawCircle(x, y, r);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawRect(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

// Draw some random rounded rectangles
  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawRoundRect(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

  for (int i=0; i<100; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    x=2+random(476);
    y=16+random(289);
    x2=2+random(476);
    y2=16+random(289);
    myGLCD.drawLine(x, y, x2, y2);
  }

  delay(2000);
  
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(1,15,478,304);

  for (int i=0; i<10000; i++)
  {
    myGLCD.setColor(random(255), random(255), random(255));
    myGLCD.drawPixel(2+random(476), 16+random(289));
  }

  delay(2000);

  myGLCD.fillScr(0, 0, 255);
  myGLCD.setColor(255, 0, 0);
  myGLCD.fillRoundRect(160, 70, 319, 169);
  
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(255, 0, 0);
  myGLCD.print("That's it!", CENTER, 93);
  myGLCD.print("Restarting in a", CENTER, 119);
  myGLCD.print("few seconds...", CENTER, 132);
  
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 255);
  myGLCD.print("Runtime: (msecs)", CENTER, 290);
  myGLCD.printNumI(millis(), CENTER, 305);
  
  delay (10000);
}

 

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

Спасибо! Любопытства ради попробовал поменять драйвер, но не работает. Если вам поменять драйвер на CTE32HR, то вероятно код заработает.

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

У меня строка, которую вы закомментировали прилично работает. Просто во время компиляции ругается что приходиться переводить тип string  в тип char*. Но компилирует в итоге. Чтобы не ругался, я просто организавал массив char txt[] = "My TEXT". И передавал его в параметрах.

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

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

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

Почти во всех контроллерах матриц TFT есть параметр в котором указывается порядок цветов в переданом байте RGB или BGR. Из чего видно, что меняются местами красный и синий цвета. Что делать? Берем даташит на ваш чип, в поиске вбиваем BGR, именно BGR, находимм регистр в котором устанавливается этот параметр и подставляем в файле initlcd.c тот который вы используете при инициализации в скетче. Что может быть еще, а еще есть парамтр иверсии. Делаем тоже самое, смотрим что наисано в файле инициализации и пробуем поменять на противоположное значение. Только делать надо не сразу оба изменения, а по очереди т.к. дело может быть в одном параметре инициализации.

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

diger67 был прав о присутсвии параметра инверсии, но перелистав Datasheet явного указания на этот параметр не нашел, а скорее упустил.

Но просматривая файл UTFT.h нашел описание интересной функции, о которой нет упоминания в UTFT.pdf, функция Invert(bool). 

Как все понимаете, вопрос решился сам собой. В setup{} добавляю "myGLSD.Invert(true);" и все работает так, как надо.

Потом решил покапаться в UTFT.cpp нашел Invert() и код как она работает. Все сходится, есть функции в Datasheet: Exit_inversion_mode(20h) и Enter_inversion_mode(21h). В дравере initlcd.h прописываю LCD_Write_COM(0x21); Заработало! Как я понимаю эти функции одинаковы для всех типов TFT-экранов, поскольку ни каких условий для установки и смены режима инверсии в зависимости от драйвера не было (вопрос, скорее в том как она работает на каждом экране по отдельности). Поэтому решил подробно поделиться опытом.

Спасибо всем за помощь!!!

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

Кстати пришел домой и обнаружил, что библиотеки UTFT в чем-то отличаюся, во всяком случае, что мне прислали китаезы и ту что скачал с соседней странице(разные компы, что на работе, что дома). Во всяком случае, в том что прислали китаезы нет функции Invert()(может и еще каких-то), хотя функция в 5 строчек, кто-то доработал по ходу. А в той, что Sanyaba давал даже нет нет драйвера на мой TFT (я смотрел перед скачиванием). Расшифровать бы Datasheet, можно было бы доработать библиотеку до самого необходимого, я с инглишем не очень дружу.

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

День добрый!

Полистал datasheet обнаружил что мой дисплей поддерживает функция аппаратного скроллинга. Удобная вещь, не надо думать о том как организовать прокрутку текста на экране, достаточно в нужное время вставлять новые строки. Хочу использовать это свойство для написания программы "блокнот", чтобы читала и записывала на прямую с SD-карты. А пока предлагаю на рассмотрение скрин и дополнительную библиотеку UTFTR.

Библиотека UTFTR - мое дополнение к UTFT, работает с кириллицей, содержит коды кирилических и дополнительных символов. И дополнительные функции для работы со скроллингом экрана.

В папке скрина есть readme.txt дополнительно поясняющий подробности работы со скроллингом экрана.

Не все библиотеки UTFT похожи друг на друга, кто-то в частном порядке и дорабатывает, я пользовался библиотекой которую скачал с соседней темы. Полностью Вы можете скачать тут: https://cloud.mail.ru/public/9fFV/jMhKSjHuS.

Напоминаю, что скреч проверялся на дисплее HX8357B. Может не работать на других. Для этого посмотрите Datasheet вашего экрана и уточните поддерживает ли ваше устройство скроллинг экрана и совпадают ли команды.

 

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

Всем привет!!!

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

В архиве находится модифицированная библиотека UTFTR, в ней были проведены изменнения по выводу текста на экран с цель оптимизации работы кода, добавленны функции работы с кодировками UTF-8 и CP-1251 и преобразованиями из одной кодировки в другую. Буду рад если кто-то найдет еще что-нибудь интересное для себя. Скачать архив можно тут: https://cloud.mail.ru/public/HaVC/pDDg966uj. Описание более подробное в readme.txt в каждой папке архива.

Напоминаю, что скреч проверялся на дисплее HX8357B. Может не работать на других.

Всем удачи!!!

MrAcsacal
Offline
Зарегистрирован: 18.02.2016

День добрый!!!

Подвожу итоги моей не спешной работы по изучению Arduino, а именно предлагаю на рассмотрение скетч DOS, с библиотекой DOS и обновленной версией UTFTR. Скетч использует команды MS-DOS для работы с SD-картой и выводит результаты на экран Arduino. Команды передаются через монитор порта редактора Arduino. Для правильной работы в мониторе порта надо установить признак конца строки "Новая строка". Подробное описание библиотек в архиве каждой из библиотек.

Скачать архив можно здесь: https://cloud.mail.ru/public/L5Ea/ZtjbTRyEC.

Далее в планах покорять новые горизонты по работе с Ардуино.

Удачи ВСЕМ!!!

 

Meshi74
Offline
Зарегистрирован: 22.07.2016

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

Любая SD карта, на нынешнии времена использует уровень сигнала не выше 3.3 вольта. Для того чтобы выравнить уровень сигнала с 5 вольт до 3.3 вольта, китайцы ставят эти самые резисторные сборки на 4.7-10 ком, это относится к многим конструкторам в том числе и MEGA2560, а вот для DUE которая сама по себе работает на 3.3 вольт с таким же логическим уровнем который не превышает 3.3 вольт, эти сборки по сути не нужны. Но есть 1 нюанс, просто ставить нулевой резистор это не совсем хорошо, даже скорее плохо, суть в чем, на сколько я помню у большенства контроллеров Atmel максимальное нагрузочное значения тока на вывод состовляет вроде не больше 20мА, при привышении данного значения есть большая вероятность спалить порт ввода-вывода, для этого нужно поставить ограничительный резистор, что в принцепи и сделано часто на модулях. К примеру на 3.3 вольта, сопротивление резистора не должно быть ниже 180ом (165ом по формуле) для тока 20мА и так далие по закону Ома. Есть опять НО, если сопротивление будет сильно большое то ток будет сильно маленький, что приведет к падению уровняя сигнала, что мы и видем на модулях с 10ком и ур. 3.3 вольта, ток не больше 330мкА. А если к примеру возьмем K9HCG08U1M то потребление тока на 1 порт составляет по спецификации до 400мкА, что явно больше чем есть на самом деле. При этом надо учитывать что может быть в ардуине в качестве ограничителя тока.

При этом добавлю, что ставить просто ограничительный резистор не совсем хорошее дело, видь при изменении нагрузки, у вас так же будет изменятся и уровень сигнала, который к примеру на 5 вольтах может вырасти с 3.3 до 3.6 при определенном токе, так что для этого я лично бы посоветовал именно ставить делитель из 2х резисторов. Он ограничивает верхний порог уровня сигнала не давая его привысить и тем самым привести к порче устройства. Кстати делитель напряжения нужен только если надо понизить уровень сигнала до необходимого значения, для однотипного уровня нужен только ограничительный резистор.

Ну вообщем вроде и все. Пойду свою DUE до ума доводить под SD :)