lunes, 26 de marzo de 2018

Módulo shield pantalla LCD TFT LCD 2.4'' Arduino




Este  módulo  consta de una pantalla LCD que nos permitirá desplegar imágenes y agregar funciones de visualización a nuestros proyectos con Arduino. El módulo está diseñado como un shield para ser montado sobre tu placa de Arduino de tal suerte que son poco probables los errores en la conexión y cuenta también con un espacio para instalar una memoria micro SD, desde la cual podrás leer imágenes y desplegarlas también en la pantalla.

Esta módulo LCD puede presentarse con diferentes chips controladores (9320, 9325, 9341,etc.), para los cuales te verás obligado a usar diferentes librerías, este tutorial se centra en las pantallas con chips 9320 y 9325 disponibles en nuestra tienda, para las cuales te facilitamos la descarga de la librería.

Una vez descargada e instalada la librería, podrás usarla para controlar tu pantalla. A continuación te presentamos un pequeño proyecto basado en el ejemplo de la librería, donde luego de calibrar el touch de la pantalla por medio de la librería Touch, que también debes instalar, usamos la pantalla como un tablero de dibujo.

Esquema de conexión

Sólo monta el shield sobre tu placa, es muy simple! 




Código Arduino

#include <Adafruit_GFX.h> 
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft; 
#include <TouchScreen.h>

#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif

uint8_t YP = A2; 
uint8_t XM = A1;
uint8_t YM = 6;
uint8_t XP = 7;
uint8_t SwapXY = 0;

uint16_t TS_LEFT = 137;
uint16_t TS_RT  = 902;
uint16_t TS_TOP = 134;
uint16_t TS_BOT = 941;

char *name = "Unknown controller";

TouchScreen ts = TouchScreen(XM, YM, XP, YP, 400);// el último numero es la resistencia entre los pines A1 y 7
TSPoint tp;                                       // puedes medir y modificar para más precisión

#define MINPRESSURE 20
#define MAXPRESSURE 1000

#define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;}

int16_t BOXSIZE;
int16_t PENRADIUS = 3;
uint16_t identifier, oldcolor, currentcolor;
uint8_t Orientation = 0;    // Orientación vertical


#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF


void setup(void)
{
    uint16_t tmp;
    Serial.begin(9600);

    tft.reset();
    identifier = tft.readID();

    if (identifier == 0x9320) {
        name = "ILI9320";
        TS_LEFT = 137; TS_RT = 902; TS_TOP = 134; TS_BOT = 941;
    } else if (identifier == 0x9325) {
        name = "ILI9325";
        TS_LEFT = 201; TS_RT = 871; TS_TOP = 168; TS_BOT = 897;
    } else {
        name = "unknown";
    }
    
    Serial.begin(9600);
    ts = TouchScreen(XP, YP, XM, YM, 400); 
    tft.begin(identifier);
    tft.setRotation(Orientation);
    tft.fillScreen(BLACK);
    BOXSIZE = tft.width() / 6;
    tft.fillScreen(BLACK);

    tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
    tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
    tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
    tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
    tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
    tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);

    tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
    currentcolor = RED;
    delay(1000);
}

void loop()
{
    uint16_t xpos, ypos;
    tp = ts.getPoint();

    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
    pinMode(XP, OUTPUT);
    pinMode(YM, OUTPUT);

    if (tp.z > MINPRESSURE && tp.z < MAXPRESSURE) {
        if (SwapXY != (Orientation & 1)) SWAP(tp.x, tp.y);
        xpos = map(tp.x, TS_LEFT, TS_RT, 0, tft.width());
        ypos = map(tp.y, TS_TOP, TS_BOT, 0, tft.height());

        if (ypos < BOXSIZE) {    
            oldcolor = currentcolor;

            if (xpos < BOXSIZE) {
                currentcolor = RED;
                tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 2) {
                currentcolor = YELLOW;
                tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 3) {
                currentcolor = GREEN;
                tft.drawRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 4) {
                currentcolor = CYAN;
                tft.drawRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 5) {
                currentcolor = BLUE;
                tft.drawRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, WHITE);
            } else if (xpos < BOXSIZE * 6) {
                currentcolor = MAGENTA;
                tft.drawRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, WHITE);
            }

            if (oldcolor != currentcolor) { 
                if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
                if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW);
                if (oldcolor == GREEN) tft.fillRect(BOXSIZE * 2, 0, BOXSIZE, BOXSIZE, GREEN);
                if (oldcolor == CYAN) tft.fillRect(BOXSIZE * 3, 0, BOXSIZE, BOXSIZE, CYAN);
                if (oldcolor == BLUE) tft.fillRect(BOXSIZE * 4, 0, BOXSIZE, BOXSIZE, BLUE);
                if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE * 5, 0, BOXSIZE, BOXSIZE, MAGENTA);
            }
        }
        if (((ypos - PENRADIUS) > BOXSIZE) && ((ypos + PENRADIUS) < tft.height())) {
            tft.fillCircle(xpos, ypos, PENRADIUS, currentcolor);
        }
        if (ypos > tft.height() - 10) {
            tft.fillRect(0, BOXSIZE, tft.width(), tft.height() - BOXSIZE, BLACK);
        }
    }
}

Una vez subido el código y montado el shield sobre la placa de Arduino UNO podrás dibujar sobre la pantalla, acá una foto de lo que puedes hacer utilizando la paleta de colores:




La librería trae múltiples comandos de dibujo, con los cuales serás capaz de dibujar cualquier figura de una forma relativamente fácil, puedes aprender estos comandos mirando los múltiples ejemplos de la librería, pero el principio es básicamente el mismo.



FIN DEL POST




0 comentarios:

Publicar un comentario

Display matricial 8x8 con Arduino SPI y MAX7219

La matrices led de 8x8 son elementos extremadamente útiles para desplegar mensajes que puedan ser visibles desde la distancia. ...