miercuri, 16 iulie 2014

Afisaj grafic color QVGA de 2,2" cu integrat ILI9341 conectat la Arduino

pus poze pierdute in 08.07.2015

   Am achizitionat un afisaj grafic color cu rezolutie de 320x240 (QVGA) cu diagonala de 2,2" (5,6cm) care are integratul de control de tip ILI9341.
   El se alimenteaza la maxim 3,3V si se poate comanda pe 5 sau 6 fire. Dupa cateva cautari pe net am aflat ca as putea folosi solutia aplicata la afisajul grafic monocrom utilizat la telefonele Nokia 3310 (5110), care au integratul de comanda PCD8544, in care inseriasem rezistente de 10k pe pinii de comanda, cum am prezentat in articolul Afisajul folosit la telefoanele Nokia 5110/3310 si Arduino
   Montajul practic arata asa, unde nu folosesc pinul MISO, dupa cum am gasit in libraria grafica ucglib:
Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8);
   Dupa ce am descarcat libraria ucglib, care seamana, cel putin la prima vedere cu libraria u8glib pe care am folosit-o la afisajul de Nokia 3410 si la afisajul grafic monocrom cu ST7920.
   Mai multe despre aceasta librarie se gasesc la adresa https://code.google.com/p/ucglib/.
   Dupa incarcarea skech-urilor din exemple cu test de grafica, am obtinut:
   Am facut si un filmulet numit test afisaj 2,2" cu ILI9341 si libraria ucglib
apoi am mai umblat la sketch-uri, pentru a mari cifrele si am constatat ca se misca foarte greu, dupa cum se vede in filmuletul test afisaj 2,2" cu ILI9341 si libraria ucglib (2)
asa ca o sa trebuiasca sa modific partea de interfatare, cu CD4050, cum e prezentat pe site-ul Gordons Projects
   Integratul CMOS CD4050 contine 6 buffer-e neinversoare, ce permit tensiuni mai marei la intrare decat cele de alimentare, de aceea este folosit drept convertizor de nivel logic de la 5V cat are placa Arduino la 3,3V cat are afisajul.
PS: Se poate folosi o schema simplificata cu rezistente, prin eliminarea celor 3 diode, alimentand direct din conectorul de 3,3V de pe placa Arduino:
PS2: Schema inspirata de pe site-ul Gordons projects ar fi:
17.7.2014
   Pana sa realizeze partea de interfata cu 4050, m-am mai "jucat" cu afisajul, de fapt cu sketch-urile, reusind sa modific unul care arata un secundar de ceas si era facut pentru a fi utilizat cu libraria u8glib:
 
   Am facut si 2 filmulete:
   Am cumparat un CD4050 si am realizat interfata:
si am testat mai multe librarii, dupa cum am prezentat in filmuletul testare librarii pentru afisajul grafic color de 2,2" cu ILI9341.

   Pun si sketch-ul cu configuratia de la Gordons projects, care mi-a mers si mie bine (vezi schema cu CD4050)
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4);
/*
// original sketch by niq_ro from http://nicuflorica.blogspot.com for analog clock using ucglib library
// version for 2.2" TFT with ILI9341  - 2014.07.16, Craiova - Romania

Universal uC Color Graphics Library
  Copyright (c) 2014, olikraus@gmail.com
  All rights reserved.
*/
#include <SPI.h>
#include "Ucglib.h"
//Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8); // clasic ucglib
// Ucglib_ILI9341_18x240x320_SWSPI ucg(/*sclk=*/ 13, /*data=*/ 11, /*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); //gordons
//Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 9 , /*cs=*/ 10, /*reset=*/ 8); original ucglib
Ucglib_ILI9341_18x240x320_HWSPI ucg(/*cd=*/ 6 , /*cs=*/ 5, /*reset=*/ 4); // gordons

/*
http://gordonsprojects.blogspot.ro/2014/04/arduino-tft-serial-spi-22-ili9341.html
D4  : RESET
D5  : CS
D6  : D/C
D7  : LED (Via 2222 transistor)
D11 : MOSI
D12 : MISO
D13 : SCK
*/


int xmax=320; // lungime maxima pe axa x (ILI9341 QVGA)
int ymax=240; // lungime maxima pe axa y (ILI9341 QVGA)
int xcenter=xmax/2; // centrul ecranului pe axa x
int ycenter=ymax/2; // centrul ecranului pe axa y
int raza=ymax/2-2; // raza cercului
int unghi=0;


// for LCD12864 with ST7920:
 float kx = 2;
 float ky = 2;
 float kt = 5;
 float xt=15;


void subrutina(void) {
  ucg.setRotate90();
  // graphic commands to redraw the complete screen should be placed here  
  ucg.setFont(ucg_font_courB24);
  int bx=3*kt+xt;
  int by=22*ky;
  ucg.setPrintPos(3*kt+xt+30,22*ky);
  ucg.print("Salut Nicu!");
  // pictez un chenar
  ucg.drawFrame(1,1,xmax-1,ymax-1);
  
  //ucg.setFont(ucg_font_osb21);
  ucg.setPrintPos(3*kt+xt-20,40*ky);
  ucg.print("afisez mesaj pe");
  ucg.setPrintPos(6*kt+xt,50*ky+25);
  ucg.print("ecran grafic");
 // ucg.setPrintPos(14*kt-kt*xt,60*ky+10);
  ucg.setPrintPos(80,160);
  ucg.print("320x240");
 
}

void subrutina1(void) {
  // desenez cercul principal
// ucg.drawCircle(xcenter,ycenter,raza, UCG_DRAW_ALL);

/*  
  // un font si mai mic
  u8g.setFont(u8g_font_4x6);
  u8g.drawStr(40, 60, "3410");
 */ 
 ucg.setColor(225, 255, 0);
 ucg.drawCircle(xcenter,ycenter,raza, UCG_DRAW_ALL);
  // trag o linie din centrul cercului la cifra 0/12
   ucg.drawLine(xcenter, ycenter, xcenter, ycenter-raza);
 //  delay(500);
   ucg.drawLine(xcenter, ycenter, xcenter+raza, ycenter);
 //  delay(500);
   ucg.drawLine(xcenter, ycenter, xcenter, raza+ycenter);
 //  delay(500);
   ucg.drawLine(xcenter, ycenter, xcenter-raza, ycenter);
 //  delay(500);
   
}

void subrutina2(uint8_t unghi) {
 ucg.setColor(0, 0, 255);
 ucg.drawCircle(xcenter,ycenter,raza, UCG_DRAW_ALL);
// desenez cercul principal
//  ucg.drawCircle(xcenter,ycenter,raza);
//  ucg.drawDisc(xcenter,ycenter,raza, UCG_DRAW_ALL);
//  for (unghi=0; unghi<60; unghi+=1);
float x1=sin(6*unghi*2*3.14/360);
float y1=cos(6*unghi*2*3.14/360);
 ucg.setColor(0, 255, 0);
   ucg.drawLine(xcenter, ycenter, xcenter+raza*x1, ycenter-raza*y1);  
    // folosesc un font mititel
 // ucg.setFont(ucg_font_6x12);
  if (unghi <15 || unghi>45)  
 { 
   ucg.setColor(255, 0, 0);
   ucg.setPrintPos(100, 115);
 ucg.print("niq_ro"); 
 }
 else  
 { 
   ucg.setColor(255, 125, 255);
   ucg.setPrintPos(100, 115);
   ucg.print("niq_ro");
 }

//ucg.setColor(0, 0, 0);
// ucg.drawLine(xcenter, ycenter, xcenter+raza*x1, ycenter-raza*y1);  
for (int qy = 0; qy < 20; qy++) 
{
  ucg.setColor(0, 0, 0);
  ucg.drawHLine(0, qy , 40);
}  
ucg.setColor(0, 255, 0);
char s[2] = " ";
 if (unghi<10)
 {
   // see http://www.asciitable.com/
s[0]=unghi+48; // transform cifrele in caractere ASCII
  ucg.setPrintPos(12*kx, 10*ky);
  ucg.print(s);
 
 }
 else
{
s[0]=int(unghi/10)+48;
  ucg.setPrintPos(4*kx, 10*ky);
  ucg.print(s);

}
s[0]=unghi-10*int(unghi/10)+48;
  ucg.setPrintPos(12*kx, 10*ky);
  ucg.print(s);

}

void subrutina21(uint8_t unghi) {
float x1=sin(6*unghi*2*3.14/360);
float y1=cos(6*unghi*2*3.14/360);  
ucg.setColor(0, 0, 0);
ucg.drawLine(xcenter, ycenter, xcenter+raza*x1, ycenter-raza*y1);  
 

}




void subrutina3(void) {
ucg.setColor(255, 0, 0);
  // pun font si apoi scriu mesaj de sfarsit...
//  u8g.setFont(u8g_font_gdr25);
 // ucg.setFont(ucg_font_6x12);
//  ucg.setPrintPos(20*kx*kt, 30*ky);
  ucg.setPrintPos(50, 100);
  ucg.print("Sfarsit!");
 }





void setup(void) {
 
  delay(1000);
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);
//  ucg.begin(UCG_FONT_MODE_SOLID);
  ucg.clearScreen();

// ucg_uint_t xx=0;

}

void loop(void) {

  ucg.clearScreen(); 
  ucg.setFont(ucg_font_ncenR14r);
 // ucg.setColor(255, 255, 255);
  ucg.setColor(255, 0, 255);
  //ucg.setColor(0, 255, 0);
  ucg.setColor(1, 255, 0,0);

//ucg.setFont(ucg_font_ncenR14r);
  subrutina(); // unde e mesajul de intampinare
  delay(5000);
    ucg.clearScreen(); 

// a doua reprezentare grafica
    subrutina1(); // unde desenez ceva pana ma prind cum se face
  delay(5000);
    ucg.clearScreen(); 
  // rebuild the picture after some delay
  delay(150);
    ucg.clearScreen(); 

 
 // fac ceasu' cu secundar
for (int xx = 0; xx < 60; xx++) // aici ar fi secundele
{
  subrutina2(xx); // munceste la ce e in subrutina2
//ucg.setColor(255, 255, 255);
//ucg.drawBox(0, 0, 320, 240);
  //  ucg.clearScreen(); 
  delay(1000); // sta o secunda
 
 subrutina21(xx); // sterge ce a muncita inainte 
  
}
 int xx=0; // readuce cronometrul la zero

 delay(2000); // sta 2 secunde

  ucg.clearScreen(); 
    subrutina3(); // unde scriu ca s-a terminat demonstratia...
  delay(10000); // sta 10 secunde
  
} // final de program, se revine de la inceput

5 comentarii:

  1. Buna
    Am cumparat si eu doua dispaly-uri de 2,2 inch ( chinezarii, nu de firma ) dar nu reusesc sa le incerc . Se aprinde doar led-ul altceva nimic. Pot cumva sa verific varianta de controler grafic ( sa fiu sigur ca e ILI 9341 ) ?
    La compilare nu a dat nici eroare, am rulat cateva exemple din ucglib , am validat varianta lui ili9431 , dar nimic.
    Multumesc

    RăspundețiȘtergere
    Răspunsuri
    1. intreaba chinezu'ce driver sa folosesti... de exemplu, eu am luat un afisaj care si partea tactila si avea un animit chip trecut acolo, dar altii au primit altceva, vezi: http://arduinotehniq.blogspot.ro/2014/11/24-touch-tft-lcd-shield.html

      Ștergere
    2. Ce crezi, sunt defecte display-urile ( chiar ambele ? ) sau nu folosesc libraria corecta ?

      Ștergere
  2. reusesti cu libraria corecta... incearca cu mai multe tipuri de librarii, dar streseaza-l si pe chinez sa-ti dea link cu driver-e

    RăspundețiȘtergere
  3. Am reusit sa pornesc diplay-urile , dar cu libraria TFTv2.
    Acum ma chinui cu sd-cardul.

    RăspundețiȘtergere