Published using Google Docs
Pantallas LCD y TFT en Arduino
Updated automatically every 5 minutes

Error en ejemplos de la librería de LCD Liquidcrystal

En algunos ejemplos que vienen con la librería dan error: HelloWorld_4bit:8: error: 'BACKLIGH_PIN' was not declared in this scope.

Para resolverlo basta con borrar la variable BACKLIGHT_PIN de la declaración :

LiquidCrystal lcd(12, 11, 5, 4, 3, 2, BACKLIGH_PIN, POSITIVE );

Tarjetas serie I2C

Las tarjetas I2C pueden tener distintas asignaciones tanto de su dirección como de los pines.

La dirección (address) se puede cambiar soldando los pines señalados en la imagen:

En la foto de arriba, se aprecian los contactos (en el circulo rojo) habilitados para direccionar el PCF8574, A0, A1 y A2, vea la tabla de direccionamiento de más arriba, para seleccionar la dirección necesaria para su caso. En principio, estos pines están al aire, es decir, los tres son uno lógico, por tanto, la dirección es 0x27 en hexadecimal (39 decimal), según la tabla, si ponemos todos a 0 lógico, tendremos 0x20 en hexadecimal. Usted puede elegir la dirección que tenga libre, si es que usa más de un PCF8574. Mi dispositivo está puesto en: A0=1, A1=0 y A2=0, le corresponde (21h).

http://hispavila.com/3ds/atmega/displaylcd.html

Dependiendo de los valores asignados a los tres pines A0, A1 y A2, permite que utilicemos hasta 8 dispositivos PCF8574, para controlar un LCD, un teclado u otro dispositivo con E/S.

NOTA: Tener presente que, los fabricantes producen dos variantes de este IC: PCF8574 y PCF8574A. La única diferencia es la dirección de llamada a I2C. Esto permite conectar hasta 16 dispositivos (8 de 8574 y otros 8 de 8574A). El PCF8574T es equivalente al PFC8574.

ID             Addr.         PIN's
   PCF8574   b0100000
0  0x20h    A2A1A0
   PCF8574A  b0111000
0  0x38h    A2A1A0

Hay gente que, está teniendo conclusiones erróneas en su PCB (de compra), con las hoja de datos PCF8574 y la lista de direcciones. Para utilizar el PCF8574 en sus dos versiones, es la siguiente:

        Para el PCF8574A.                        Para el PCF8574.
pin3        pin2        pin1         PCF8574A   |        pin3        pin2        pin1         PCF8574
A2        A1        A0        Hex        Dec |        A2        A1        A0        Hex        Dec
L        L        L        0x38        56  |        L        L        L        0x20        32
L        L        H        0x39        57  |        L        L        H        0x21        33
L        H        L        0x40        64  |        L        H        L        0x22        34
L        H        H        0x4A        74  |        L        H        H        0x23        35
H        L        L        0x4B        75  |        H        L        L        0x24        36
H        L        H        0x4C        76  |        H        L        H        0x25        37
H        H        L        0x4D        77  |        H        H        L        0x26        38
H        H        H        0x4E        78  |        H        H        H        0x27        39

En cuanto a la conexión de la tarjeta I2C al Arduino tenemos que distinguir entre el Arduino Mega y el resto:

I2C

Arduino

Arduino Mega

VCC

5V

5V

GND

GND

GND

SCL

A5

D21

SDA

A4

D20

Quedando en un Arduino Uno así:

Esta pequeña tarjeta viene provista de un conector de 4 pines (ver foto), de arriba a abajo:

Conector LCD5

   GND = GND o masa < Negro >.
 
VCC = +Vcc de 5 Voltios < Rojo >.
 
SDA = Pin analógico 4 de Arduino o TX, línea de datos < Blanco > .
 
SCL = Pin analógico 5 de Arduino o RX, línea de reloj < Amarillo >.

Nota. Para recordar con facilidad, asocie SDA con el 4, es decir SDA = pin4, el otro pin (pin5) se corresponde con SCL.

Configuración de la librería Liquidcrystal de fmalpartida

La librería para usar los LCD 16x2 es la de fmalpartida (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads).

Para usarla hay que descomprimirla en la carpeta libraries del IDE, borrando previamente la carpeta “Liquidcrystal” existente.

Para determinar la dirección de la tarjeta IC2 usamos el sketch de la web:

http://playground.arduino.cc/Main/I2cScanner

Nuestra tarjeta es:

Marca

YwRobot o DFRobot

Dirección I2C

0x27

Asignación pines

RS                P0
RW                P1
E                P2
D4                P4
D5                P5
D6                P6
D7 -                 P7
Backlight -         P3
Bl Polarity        POSITIVE

https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics

Para configurar nuestra tarjeta y que funcione hay que cambiar la asignación de los pines en los sketches. Tenemos dos formas:

  1. Sustituir o comentar las línea de configuración del LCD que empiezan por LiquidCrystal_I2C lcd(xxx)  por:

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

  1. Sustituir o comentar las línea de configuración del LCD que empiezan por LiquidCrystal_I2C lcd(xxx)  por el siguiente código:

 /*-----( Declaración de constantes )-----*/

  // Dirección I2C del LCD

#define I2C_ADDR    0x27

  // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T)

#define BACKLIGHT_PIN  3

#define En_pin  2

#define Rw_pin  1

#define Rs_pin  0

#define D4_pin  4

#define D5_pin  5

#define D6_pin  6

#define D7_pin  7

  // Iluminación ON/OFF

#define  LIGHT_OFF  LOW

#define  LIGHT_ON  HIGH

/*----- Configurar LCD -----*/  

LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

Variantes del código

Podemos usar la primera forma vista en el apartado anterior en los ejemplos en los que estén definidas las variables como la segunda forma. El código quedaría así (comentando las líneas innecesarias).

///*-----( Declaración de constantes )-----*/

//  // Dirección I2C del LCD

//#define I2C_ADDR    0x27

//

//  // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T)

#define BACKLIGHT_PIN  3

//#define En_pin  2

//#define Rw_pin  1

//#define Rs_pin  0

//#define D4_pin  4

//#define D5_pin  5

//#define D6_pin  6

//#define D7_pin  7

//

  // Iluminación ON/OFF

//#define  LIGHT_OFF  HIGH

#define  LIGHT_ON  HIGH

//

///*----- Configurar LCD -----*/  

//LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

Como se ve es necesario declarar el pin BLACKLIGHT_PIN y la retroiluminación poniendo el LIGHT_ON en HIGH (en LOW estaría apagado el fondo de pantalla).

También se pueden comentar estas dos líneas y dejar sólo la declaración de la configuración de la LCD a cambio de comentar también las líneas del setup() en las que se activa la iluminación:

///*-----( Declaración de constantes )-----*/

//  // Dirección I2C del LCD

//#define I2C_ADDR    0x27

//

//  // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T)

//#define BACKLIGHT_PIN  3

//#define En_pin  2

//#define Rw_pin  1

//#define Rs_pin  0

//#define D4_pin  4

//#define D5_pin  5

//#define D6_pin  6

//#define D7_pin  7

//

  // Iluminación ON/OFF

//#define  LIGHT_OFF  HIGH

//#define  LIGHT_ON  HIGH

//

///*----- Configurar LCD -----*/  

//LiquidCrystal_I2C  lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

void setup()   /*----( SETUP: RUNS ONCE )----*/

{

 lcd.begin (16,2);  // Inicializar LCD

// Definir configuración iluminación LCD

// lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);

// Iluminar LCD

// lcd.setBacklight(LIGHT_ON);

}// END Setup

Ajuste del contraste del LCD

El potenciómetro de la tarjeta I2C , permite el ajuste del contraste. Para ajustarlo, arranque un sketch , gire la pantalla y ajuste hasta que vea los caracteres brillantes y no los bloques de fondo que los contienen.

Soldar LCD y tarjeta I2C

Se unen las dos tarjetas por la parte posterior, haciendo coincidir las patillas 1, que están marcadas en la LCD con un 1 y en la I2C con un cuadrado.

2.4" TFT LCD Shield Touch Panel Module SD For Arduino UNO R3

Tenemos dos modelos de 2 fabricantes (womarts y mcufriend), son iguales externamente, pero funcionan con dos librerías distintas.

  1. Womarts: misc.ws/2013/11/08/touch-screen-shield-for-arduino-uno/TFTLCD.zip
  2. Mcufriend: www.smokeandwires.co.nz/blog/a-2-4-tft-touchscreen-shield-for-arduino/

IMG_20141221_210139.jpgIMG_20141221_210314.jpg

Arduino Pin Connections

Arduino Pin

LCD Shield Pin

Use

3.3V

3.3V

Power

5V

5V

Power

GND

GND

Power

A0

LCD_RD

LCD Control

A1

LCD_WR   TOUCH_YP

LCD Control / Touch Data

A2

LCD_RS         TOUCH_XM

LCD Control / Touch Data

A3

LCD_CS

LCD Control

A4

LCD_RST

LCD Reset

D2

LCD_D2

LCD Data

D3

LCD_D3

LCD Data

D4

LCD_D4

LCD Data

D5

LCD_D5

LCD Data

D6

LCD_D6 / TOUCH XP

LCD Data/ Touch Data

D7

LCD_D7 / TOUCH YM

LCD Data / Touch Data

D8

LCD_D0

LCD Data

D9

LCD_D1

LCD Data

D10

SD_CS

SD Select

D11

SD_DI

SD Data

D12

SD_DO

SD Data

D13

SD_SCK

SD Clock

 Pantalla 2.4” comprada en Aliexpress. Mcufriends

http://www.aliexpress.com/item/2-4-pulgadas-de-2-4-TFT-LCD-Panel-Module-Escudo-t-ctil-TF-Micro-SD/1954323517.html

Sólo muestra franjas de colores al poner el ejemplo tftpaint de la librería TFTLCD.h, con la línea 94 editada: cambiando Point por TSPoint.

Si descomentamos línea 55 a 66 la pantallla se pone blanca pero por el monitor serie indica el chip desconocido 7783

Funciona con la librería:

 http://www.smokeandwires.co.nz/blog/a-2-4-tft-touchscreen-shield-for-arduino/

Descargar la librería (https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code) y descomprimir la carpeta  “SWTFT-Shield”  en la carpeta libraries del IDE- También tendremos que instalar las siguientes librerías:

Para que funcione con el Arduino mega es necesario editar el archivo SWTFT.cpp, comentar línea 16 y descomentar la 15.

En el ejemplo graphictest los resultados devueltos por el monitor serie son:

(muestra los tiempos que dura cada una de las pruebas que hace en microsegundos)

TFT LCD test

LCD driver chip: 0

Benchmark                Time (microseconds)

Screen fill              1321524

Text                     191456

Lines                    1075824

Horiz/Vert Lines         137028

Rectangles (outline)     99828

Rectangles (filled)      3068544

Circles (filled)         1211164

Circles (outline)        463832

Triangles (outline)      342404

Triangles (filled)       1663360

Rounded rects (outline)  221344

Rounded rects (filled)   3585636

Done!

Si al compilar da error “PORTH  was not declared in this scope” el problema puede estar en que se ha seleccionado la placa Mega en el .cpp y en el IDE esté seleccionada la placa UNO.

Librería con la que funciona el modelo womarts

http://misc.ws/2013/11/08/touch-screen-shield-for-arduino-uno/

Librería: TFTLCD.zip

Instalar la librería y ejecutar el ejemplo graphitest, muestra distintos gráficos por pantalla, pero no los botones táctiles. El botón principal reinicia la secuencia gráfica.

Con esta librería hace lo mismo pero invirtiendo la imagen

http://www.airspayce.com/mikem/TFTLCD-mikem.zip

Ver p.249 del Curso practico de formación de Arduino

Ver: https://sites.google.com/a/uniboyaca.edu.co/ingjulianvelasco/lcd-shield-arduino

En el TFTLCD.h (linea 71) están definidas las funciones de dibujo:

// drawing primitives!

  void drawPixel(uint16_t x, uint16_t y, uint16_t color);

  void fillScreen(uint16_t color);

  void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);

  void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag);

  void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);

  void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color);

  void drawTriangle(uint16_t x0, uint16_t y0,

                          uint16_t x1, uint16_t y1,

                          uint16_t x2, uint16_t y2, uint16_t color);

  void fillTriangle(int32_t x0, int32_t y0,

                          int32_t x1, int32_t y1,

                    int32_t x2, int32_t y2,

                    uint16_t color);

  void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);

  void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);

  void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);

  void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);

  void drawCircle(uint16_t x0, uint16_t y0, uint16_t r,        uint16_t color);

  void fillCircle(uint16_t x0, uint16_t y0, uint16_t r,        uint16_t color);

  void setCursor(uint16_t x, uint16_t y);

  void setTextColor(uint16_t c);

  void setTextSize(uint8_t s);

  virtual size_t write(uint8_t);

  void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1);

  void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1);

  // commands

  void initDisplay(void);

  void goHome(void);

  void goTo(uint16_t x, uint16_t y);

  void reset(void);

  void setRotation(uint8_t x);

  uint8_t getRotation();

  /* low level */

  void writeData(uint16_t d);

  void writeCommand(uint16_t c);

  uint16_t readData(void);

  uint16_t readRegister(uint16_t addr);

  void writeRegister(uint16_t addr, uint16_t data);

Si quiero dibujar una línea p.e., en el sketch (ejemplo graphictest) tengo que copiar la función drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);, para eso inserto en void setup () si quiero que no se repita o en void loop() si quiero que sí  se repita:

tft.drawLine(0, 0, 100, 200, RED);

el tft porque es una función definida en la librería, los 0 son las coordenadas XY del punto inicio y el 100,200 las del punto final, el RED es el color de la línea (que se puede poner en letra pq están definidas en el ejemplo, si no los incluyera habría que ponerlo en su código numérico de 16bits en RGB).

En el ejemplo myBitmapExperiment se visualizan 3 bitmaps que vienen en la carpeta de la librería (vienen 3 imagenes, con extensión bmp  y lcd), hay que copiarlos en la raiz de la sd para q funcione.

El ejemplo tftpaint da error pq dice que no está definida la función Point. Hay que instalar la librería TouchScreen, en el TouchScreen,h la clase que aparece es TSPoint (linea 10), no la Point, por lo que cambiando Point por TSPoint en la línea 94, se arregla el problema y funciona el ejemplo con pantalla táctil.

Graficar una señal analógica

http://blog.bricogeek.com/noticias/electronica/video-osciloscopio-con-arduino-y-pantalla-grafica-lcd/

Como usar la librería UTFT

https://code.google.com/p/itdb02/

http://forum.arduino.cc/index.php?PHPSESSID=q9cms1v0c16bpadshnltqd8bd2&topic=281512.0

Librería para TFT con documentación

http://www.henningkarlsen.com/electronics/library.php?id=52

Descargado el archivo UTFT.zip se descomprime en la carpeta de librerías y se ejecuta alguno de los ejemplos que trae. No da error al compilar pero no funcionan, se queda la pantalla en blanco.

Advertencia: Debido al tamaño de la librería no recomienda usarla con ATmega328 (Arduino 2009/Uno) yATmega32U4 (Arduino Leonardo) porque solo tienen 32KB de memoria flash.

Funcionará, pero estaremos severamente limitados en la memoria flash disponible para nuestra aplicación.

Librería para TFT touch con documentación

http://www.henningkarlsen.com/electronics/library.php?id=55