VictorJAM.zapto.org
Arduino  Tutorial 

2023-01-21

Simulando display gráficos en Proteus

En esta entrada vamos a ver como podemos simular unos cuantos displays que podemos conectar a nuestros Arduino y así experimentar con ellos sin peligro de quemarlos al hacer conexiones y sobre todo para probar código.

Veremos como insertarlos, ajustarlos y las librerías que podemos usar para que la simulación sea correcta.

Todos los display están disponibles en la versión 8 de proteus.

ILI9341

Para poder simular correctamente el ILI9341 debemos realizar las siguientes conexiones:

El ILI9341 irá conectado en el bus SPI de forma tal que solo usaremos las líneas MOSI y SCK que irán a los pins SDI/SDA y D/C/SCL respectivamente. La línea MISO no se usa.

Recuerda que en el UNO el pin SCK es el 13 y el pin MOSI es el 11. En otros Arduino pueden ser diferentes.

Los pines de control RES (reset), CS (chip select) y WR/D/C (write) podrán ir conectados a cualquier pin digital de nuestro Arduino.

Los pines LEDK, IM0 debemos ponerlos a GND.

SDO y TE no se conectaran.

El resto de pines irán todos a VCC.

Ahora necesitamos las librerías para hacerlo funcionar, para mostrar la imagen yo he optado por las librería ILI9341_fast la cual para poder funcionar correctamente necesita de la librería Adafruit_GFX. Para poder usar la fuentes RRE debemos usar la librería RREFont.

Hay que tener en cuenta que esto es una simulación, y por lo tanto hay lo que veamos en pantalla será lento, dependiendo de la potencia del ordenador. Además en la vida real el SSD1306 trabaja a 3V3 con lo cual es conveniente colocar un adaptador de niveles del Arduino a la pantalla para evitar problemas.


SSD1306

Este modelo es más fácil de usar, dado que tiene conexión por I2C y no existe ningún pin adicional de control.

Para la conexión solo debemos unir los pines del bus SCL/SDA a los pines equivalentes del microcontrolador. Y luego hacer las conexiones de la alimentación VCC/GND.

A la hora programar tenemos que tener en cuenta que aunque en el ejemplo de la librería Adrafruit_SSD1306 elegida para probar cambia las direcciones del bus. Para una pantalla de 128x64 la dirección debería ser 0x3D, mientras que en proteus es 0x3C.

Ejemplo:

/*
 * EJEMPLO DE USO DE LA LIBRERíA SSD_1306 Y PROPFONTS.
 */
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PropFont.h>
#include <small4x5_font.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);
PropFont fnt;

// Estas funciones sirven para que la fuente sepa como debe dibujar los 
// caracteres en pantalla.
void customPixel(int x, int y, int c) {
  display.drawPixel(x,y,c);
}

void customRect(int x, int y, int w, int h, int c) {
  display.fillRect(x, y, w, h, c);
}

void setup() {
  Serial.begin(9600);
  // Aunque la dirección 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // 
  }
  fnt.init(customPixel, customRect, 128, 64);
  fnt.setFont(Small4x5PL);
  // Clear the buffer
  display.clearDisplay();
  // Draw a single pixel in white
  fnt.printStr(0, 0, "Hello World!");
  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);
}

void loop() {

}

De igual manera que con el ILI9341 este dispositivo es de 3.3V, con lo que hay que tener cuidado de como lo conectamos. Generalmente estas pantallas pequeñas llevan en la parte posterior un regulador de 3.3V que nos permite alimentarlo de 5V. También posee adaptadores de nivel para las señales SDA y SCL.


Nokia 5110

Las pantallas de los teléfonos Nokia siguen dando mucho juego, tanto que proteus ha incluido varios modelos para poder simular en el programa.

En este caso los pines VCC y GND son los de aliemtanción.

Los pines DIN y SCLK son los equivalentes del bus SPI MOSI y SCK. Tenemos tres señales de control SCE (chip select), RST (reset) y D/C (data) que podremos conectar a cualquier pin digital de Arduino.

La librería N5110_SPI es una librería realmente pequeña que nos permite controlar la pantalla mediante SPI, pero si simulamos el código con ella nos dará muchos errores de simulación.

Para obtener los mejores resultados, debemos abrir el archivo "N5110_SPI.h" de la librería y renombrar la línea que dice:

// #define USESPI 1	

Esto hará que en vez de usar el puerto SPI, la librería trabaje por software, eliminando los errores.

Este chip también trabaja con 3.3V y tampoco es tolerante a 5V, en la simulación podemos conectar tranquilamente pero en la vida real conviene usar un adaptador de niveles.

st7920

El ST7920 es un display LCD gráfico de 128x64 pixeles monocromo, generalmente de fondo azul y pixeles blancos, soporta programación en paralelo y programación mediante puerto SPI.

Proteus no dispone de un modelo para esta pantalla por lo tanto hemos de recurrir a terceros para tenerlo disponible. En GitHub podemos encontrar el modelo creado por cdhigh

Este modelo funciona bien en versiones anteriores a la 8 de proteus, pero no funciona del todo en las versiones superiores.

Hemos de copiar el contenido de las carpetas MODELS y LIBRARY en la de proteus para que esta funciona correctamente.

Para usar este display la mejor librería que he encontrado ha sido la de cbm80amiga que esta disponible en GitHub

Esta pantalla es la que se uso en el proyecto Automatización del limpiarreja.


Librerías usadas:

RREFont

Adafruit_GFX

Adafruit_SSD1306

ILI9341_Fast

PropFonts

Modelo proteus ST7920