Загрузка raw файлов с SD карты на IBOARD PRO, библиотека UTFT_tinyFA

Тема в разделе "Arduino & Shields", создана пользователем reachim, 8 апр 2015.

  1. reachim

    reachim Нуб

    Здравствуйте, Ардуинщики!
    Помогите разобраться новичку!!! Не могу загрузить с SD карты изображение в raw формате на дисплей, пользуюсь библиотекой UTFT_tinyFAT.h , используя примеры, после загрузки скетча - экран дисплея черный. Примеры библиотек UTFT.h и библиотека UTouch.h - работают исправно!
    Теперь по-порядку:
    Ардуинка - IBOARD PRO (http://imall.iteadstudio.com/iboard-pro.html) в комплекте с дисплеем (http://wiki.iteadstudio.com/ITDB02-4.3)
    Изучив схему платы я понял, что в примерах надо как-то изменить пины шины COMMON SPI

    MOSI ---------------- (D51)
    MISO ---------------- (D50)
    SCK ------------------ (D52) до этого все совпадает
    CS_CD --------------- ( D4) а это для моей платы , если я правильно понял, именно D4
    Но где это менять понятия не имею, все форумы перелопатил, даже разработчику библиотеки письмо отправил, но без ответа. П-о-м-о-г-и-т-е ! ! !
    На всякий случай выкладываю принципиальные схемы
     

    Вложения:

  2. reachim

    reachim Нуб

    1) Процессор файл видит, когда пользуюсь примером cardinfo и примером files из библиотеки SD.h, я же там пины подправил (const int chipSelect = 4), но выводит не на экран, а на SERIAL
    2) В библиотеке UTFT все прекрасно работает все примеры, но они же не на SD.

    Как же мне с библиотекой UTFT_tinyFAT.h разобраться!?
    Или с любой другой или без них, лишь бы считать с SD рисунок и вывести на дисплей! Но там всего одна команда - myFiles.loadBitmap(х, y, picsis_x, picsize_y, filenem);

    Вроде все просто, а нет же, библиотека UTFT_tinyFAT.h опирается на tinyFAT.h , а та в свою очередь на UTFT.h , а та наверно на SD.h ! Вот такой змей Горыныч получается! И ни кто его не одолеет! И как подправить один пин CS_CD и где, только Иван Царевич и знает, но молчит!
     
  3. AlexVS

    AlexVS Гик

    Я пользуюсь этими библиотеками, правда в связке с Мегой и 3,5" Дисплеем.
    Вот что написано у меня в коде:
    Код (Text):
    #include <UTFT.h>
    #include <UTouch.h>
    #include <tinyFAT.h>
    #include <UTFT_tinyFAT.h>
    .............................
    ///////////////////////////////////
    // Настройки дисплея
    UTFT myGLCD (SSD1289,38,39,40,41);
    UTouch  myTouch( 6, 5, 4, 3, 2);
    UTFT_tinyFAT myFiles(&myGLCD);
    //////////////////////////////////////////////////
    // Default SD chip select is SS pin
    const uint8_t chipSelect = SS;
    //////////////////////////////////////////////////
    void setup(void)
    {
    ................................................
      file.setSSpin(chipSelect);
      file.initFAT();
    ................................................
    }
    //Рисуем иконку, размещенную на  CD card
    void icon2display(int x, int y, char fname[12])
    {
        myGLCD.setColor(255, 255, 255);
        myGLCD.fillRoundRect (x-1, y-1, x+51, y+51);
        myFiles.loadBitmap(x, y, 50,50, fname);
    }
    Все работает замечательно.
     
  4. reachim

    reachim Нуб

    Спасибо, сегодня обязательно попробую!
    Скажите AlexVS, а размер файла имеет значение? В вашем случае она 50х50 пикселей.
     
  5. AlexVS

    AlexVS Гик

    Я с помощью утилиты "ImageConverter565", которая идет вместе с библиотекой, конвертил файл с типом ico в raw, поэтому над размером файла не думал.
     
  6. reachim

    reachim Нуб

    Я то же ее использую и при загрузке если RAW файл больше или равен 128х128 пикселей загружать с памяти меги 2560 не получалось, а с SD попробую по вашему совету. Если есть возможность попробуйте загрузить файлик с размером вашего дисплея. Я хочу стартовую страничку менюшки так загружать(в моем случае 480х272 пикселей)
     
  7. reachim

    reachim Нуб

    AlexVS, здравствуйте!
    Попробовал ваш пример скетча - при компиляции ругается на фигурные скобки функции: void icon2display
    Может что не так делаю? Упростил - убрал рисование белого прямоугольника.
    Записал на SD карту предварительно raw файл - pic101
    Загружаю следующий скетч:
    Код (Text):

    #include <tinyFAT.h>
    #include <UTFT.h>
    #include <UTFT_tinyFAT.h>
    const uint8_t chipSelect = SS;
    void setup() {
      file.setSSpin(chipSelect);
      file.initFAT();
      //Рисуем иконку, размещенную на  CD card
      void icon2display (int x, int y, char pic101[12])
    {
        myFiles.loadBitmap (0, 0, 50, 50, pic101);
    }
    }
    void loop() {
    }
     
    Ругается при компилировании на фигурные скобки, но они должны быть! Подскажите, пожалуйста, ошибку.
     
  8. geher

    geher Гуру

    Ошибка в том, что функция icon2display помещена внутрь setup, что в языке C недопустимо. Это вам не паскаль.
    Для исправления достаточно переместить закрывающую фигурную скобку, которая непосредственно перед loop в позицию перед icon2display.
     
  9. AlexVS

    AlexVS Гик

    В оригинале, ну т.е. у меня :), setup - отдельно, icon2display - отдельно (см. код выше).
    3 параметр функции icon2display(int x, int y, char fname[12]) - это переменная, в которой передается имя файла. У вас имя файла (pic101) и переменной (pic101) просто совпали? Или как?
     
  10. reachim

    reachim Нуб

    Извиняюсь за задержку, на работе.
    Да, за скобочку GEHER, спасибо! Подправил(т.е. вывел функцию из setup), но теперь компилятор ругается на myFiles, может дело в библиотеках?
    Убрал и функцию, во общем все, кроме команды из библиотеки - myFiles.loadBitmap (0, 0, 50, 50, file);
    Добавил инициализацию моего дисплея.
    Объявил переменную - файл, который собираюсь считать - char* file="pic101.raw"
    Получилось следующее:
    Код (Text):

    #include <UTFT.h>
    #include <UTouch.h>
    #include <tinyFAT.h>
    #include <UTFT_tinyFAT.h>
    UTFT myGLCD(ITDB43, 38,39,40,41);
    UTFT_tinyFAT myFiles(&myGLCD);
    const uint8_t chipSelect = SS;
    char* file="pic101.raw"
    void setup() {
      file.setSSpin(chipSelect);
      file.initFAT();
    //Рисуем иконку, размещенную на  CD card
      myFiles.loadBitmap (0, 0, 50, 50, file);
    }
    void loop() {
    }
     
    Компилятор ругается на - char* file="pic101.raw", скажите пожалуйста, что не так я объявляю?
     
  11. AlexVS

    AlexVS Гик

    Я не особо в Си силен, но вам точно надо подтянуться, т.к. char* file - это указатель на переменную file, которая может содержать всего 1 символ, а не массив, как вы пытаетесь туда засунуть.
     
  12. reachim

    reachim Нуб

    Пожалуйста, AlexVS, если не трудно можно короткий работающий скетч для примера для считывания и передачи на диспелей одного файла с использованием библиотеки UTFT_tinyFAT.h
     
  13. reachim

    reachim Нуб

    AlexVS, дело в том, что с этой библиотекой идет только один пример и он у меня не работает. Я не знаю почему, то ли железо то ли руки кривые. Вот этот пример, помогите мне с ним разобраться:
    Код (Text):

    // Demo_Landscape
    // Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
    // web: http://www.RinkyDinkElectronics.com/
    //
    // This program is a demo of the loadBitmap()-function.
    //
    // This program requires UTFT_tinyFAT, UTFT v2.41 or higher,
    // as well as tinyFAT v3.0 or higher.
    //
    // The image files must be present in the root folder
    // of a FAT16 formatted SDcard in the module cardslot.
    //
    // Please note that this demo only supports the following
    // display sizes:
    //      220x176
    //      320x240
    //      400x240
    //      480x272
    //      800x480

    #include <tinyFAT.h>
    #include <UTFT.h>
    #include <UTFT_tinyFAT.h>

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

    UTFT        myGLCD(ITDB32S, 38, 39, 40, 41);  // Remember to change the model parameter to suit your display module!
    UTFT_tinyFAT myFiles(&myGLCD);

    // List of filenames for pictures to display.
    char* files320[]={"PIC301.RAW", "PIC302.RAW", "PIC303.RAW", "PIC304.RAW", "PIC305.RAW", "PIC306.RAW", "PIC307.RAW", "PIC308.RAW", "PIC309.RAW", "PIC310.RAW"}; // 320x240
    char* files400[]={"PIC401.RAW", "PIC402.RAW", "PIC403.RAW", "PIC404.RAW", "PIC405.RAW", "PIC406.RAW", "PIC407.RAW", "PIC408.RAW", "PIC409.RAW", "PIC410.RAW"}; // 400x240
    char* files220[]={"PIC601.RAW", "PIC602.RAW", "PIC603.RAW", "PIC604.RAW", "PIC605.RAW", "PIC606.RAW", "PIC607.RAW", "PIC608.RAW", "PIC609.RAW", "PIC610.RAW"}; // 220x176
    char* files480[]={"PIC701.RAW", "PIC702.RAW", "PIC703.RAW", "PIC704.RAW", "PIC705.RAW", "", "", "", "", ""}; // 480x272
    char* files800[]={"PIC801.RAW", "PIC802.RAW", "PIC803.RAW", "PIC804.RAW", "PIC805.RAW", "", "", "", "", ""}; // 800x480
    char* files[10];

    int picsize_x, picsize_y;
    boolean display_rendertime=false;  // Set this to true if you want the rendertime to be displayed after a picture is loaded
    boolean display_filename=true;  // Set this to false to disable showing of filename

    word res;
    long sm, em;

    void setup()
    {
      myGLCD.InitLCD();
      myGLCD.clrScr();
      file.initFAT();
      myGLCD.setColor(255,255,255);
      myGLCD.setFont(SmallFont);
      picsize_x=myGLCD.getDisplayXSize();
      picsize_y=myGLCD.getDisplayYSize();
      switch (picsize_x)
      {
        case 220:
          for (int z=0; z<sizeof(files220)/sizeof(*files220);z++)
            files[z] = files220[z];
          break;
        case 320:
          for (int z=0; z<sizeof(files320)/sizeof(*files320);z++)
            files[z] = files320[z];
          break;
        case 400:
          for (int z=0; z<sizeof(files400)/sizeof(*files400);z++)
            files[z] = files400[z];
          break;
        case 480:
          for (int z=0; z<sizeof(files480)/sizeof(*files480);z++)
            files[z] = files480[z];
          break;
        case 800:
          for (int z=0; z<sizeof(files800)/sizeof(*files800);z++)
            files[z] = files800[z];
          break;
      }
    }

    void loop()
    {
     
      for (int i=0; i<(sizeof(files)/sizeof(*files)); i++)
      {
        if (files[i]!="")
        {
          sm=millis();
          res=myFiles.loadBitmap(0, 0, picsize_x, picsize_y, files[i]);
          em=millis();
          if (res!=0)
          {
            if (res==0x10)
            {
              myGLCD.print("File not found...", 0, 0);
              myGLCD.print(files[i], 0, 14);
            }
            else
            {
              myGLCD.print("ERROR: ", 0, 0);
              myGLCD.printNumI(res, 56, 0);
            }
            delay(3000);
            myGLCD.clrScr();
          }
          else
          {
            if (display_rendertime==true)
            {
              myGLCD.print("Rendertime (secs):", 0, 0);
              myGLCD.printNumF(float((em-sm)/1000.0), 2, 160,0);
            }
            if (display_filename==true)
            {
              myGLCD.print(files[i], CENTER, myGLCD.getDisplayYSize()-12);
            }
            delay(3000);
          }
        }
      }
    }
     
    Код при компиляции ошибок не дает, однако на экран ни одного файла не выводит. Экран моргнет и потухнет, однако скетч загружается, видно по светодиодам порта.
     
  14. reachim

    reachim Нуб

    Да, забыл сказать, что строку: UTFT myGLCD(ITDB32S, 38, 39, 40, 41), я изменяю для своего дисплея на UTFT myGLCD(ITDB43, 38,39,40,41);
     
  15. AlexVS

    AlexVS Гик

    Еще раз повторюсь, что я не крут в Си, но постараюсь помочь.
    Начнем с того, что написано в комменте данного примера:
    Код (Text):
    // The image files must be present in the root folder
    // of a FAT16 formatted SDcard in the module cardslot.
    У вас это условие выполняется? Флэшка отформатирована под FAT16?
     
  16. AlexVS

    AlexVS Гик

    Работу с дисплеем я начал с прочтения пары статей на хабре: http://habrahabr.ru/post/196600/
    С начало добился что бы работали все примеры касающиеся самого дисплея, потом уже перешел к работе с флэшкой.
     
  17. reachim

    reachim Нуб

    AlexVS, спасибо за ссылку! Изучаю!
     
  18. reachim

    reachim Нуб

    AlexVS, изучил вашу ссылку. Информация оказалась очень полезной. Попробовал примеры идущие с библиотекой UTFT - все работают. Загружал примеры UTouch и UTFT_Geometry - то же все работают. Но эта информация так и не приблизила меня к загрузке с карты памяти, т.к. я не нашел информации по работе с библиотекой UTFT_tinyFAT. Вы наверно используете библиотеку UTFT_SPIflash? У вас флэшка, да !?

    Ниже на фото главное меню моего дисплея, однако программная память скоро закончится, вот и возникла идея загружать менюшки с карты памяти расположенной на борту TFT дисплея. А это библиотека UTFT_tinyFAT, пример которой (выложен выше) не хочет у меня работать.
    Может еще что посоветуете или дадите ссылки на литературу.
     

    Вложения:

    • DSCF3805.JPG
      DSCF3805.JPG
      Размер файла:
      685,2 КБ
      Просмотров:
      953
  19. AlexVS

    AlexVS Гик

    Карта памяти на борту дисплея, как я понимаю, это ничто иное как - Secure Digital Memory Card, вставленная в слот на борту дисплея. У меня точно такая же конструкция!
    Еще раз повторю вопрос, какую SD вы используете, вернее какой объем? Она отформатирована под FAT16?
     
  20. reachim

    reachim Нуб

    Карта памяти на 2 Гбайта, отформатирована FAT 16. Примеры библиотеки SD.h все работают.