Go Down

Topic: [SOLUCIONADO] Problemas con SSD1306 LCD OLED y libreria U8glib (Read 6702 times) previous topic - next topic

ahernandovalbuena

Jan 31, 2015, 02:17 pm Last Edit: Jan 31, 2015, 05:52 pm by ahernandovalbuena
Buenos días chicos/as,

Actualmente estoy desarrollando el final de un proyecto más complejo en el cual me surge la necesidad de mostrar por pantalla algunos parámetros. Para todo esto, he reutilizado un display LCD OLED que tenía en el baúl de 0.96''. Nunca había probado su funcionamiento por que hasta el momento no había tenido la necesidad. La cuestión es que por más que lo intento no consigo hacer nada con él, nisiquiera muestra síntomas de estar vivo, tales cómo algún parpadeo.

He revisado el foro de manera exhaustiva y lo único que he encontrado es a otra persona que le pasaba exactamente lo mismo que a mí y termina dándolo por perdido ( Justificando que pudiera ser que el módulo cómo tal este roto):

http://forum.arduino.cc/index.php?topic=219419.15

Además, he revisado la documentación oficial de SSD1306 y nada:

http://www.adafruit.com/datasheets/SSD1306.pdf


Adjunto circuito con alguna fotos ( He probado con dos tipos de microcontroladores: UNO y NANO ATMMega):



Adjunto también código de ejemplo de la propia librería que no termina haciendo nada:

Code: [Select]

#include "U8glib.h"

// use this serial interface
#define PRINTER_SERIAL Serial
// #define PRINTER_SERIAL Serial1


uint8_t u8g_com_uart(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) {
  switch(msg) {
    case U8G_COM_MSG_WRITE_BYTE:
      PRINTER_SERIAL.write(arg_val);
      break;
  }
  return 1;
}

// setup u8g object, please remove comment from one of the following constructor calls

// half resolution
//U8GLIB u8g(&u8g_dev_a2_micro_printer_192x120_ds, (u8g_com_fnptr)u8g_com_uart);

// full resolution, requires to uncomment U8G_16BIT in u8g.h
//U8GLIB u8g(&u8g_dev_a2_micro_printer_384x240, (u8g_com_fnptr)u8g_com_uart);

// half resolution, extra log, requires to uncomment U8G_16BIT in u8g.h
//U8GLIB u8g(&u8g_dev_a2_micro_printer_192x360_ds, (u8g_com_fnptr)u8g_com_uart);
U8GLIB u8g(&u8g_dev_a2_micro_printer_192x720_ds, (u8g_com_fnptr)u8g_com_uart);



void drawLogo(uint8_t d) {
  u8g.setFont(u8g_font_gdr25r);
  u8g.drawStr(0+d, 30+d, "U");
  u8g.setFont(u8g_font_gdr30n);
  u8g.drawStr90(23+d,10+d,"8");
  u8g.setFont(u8g_font_gdr25r);
  u8g.drawStr(53+d,30+d,"g");
 
  u8g.drawHLine(2+d, 35+d, 47);
  u8g.drawVLine(45+d, 32+d, 12);
}

void drawURL(void) {
  u8g.setFont(u8g_font_4x6);
  if ( u8g.getHeight() < 59 ) {
    u8g.drawStr(53,9,"code.google.com");
    u8g.drawStr(77,18,"/p/u8glib");
  }
  else {
    u8g.drawStr(1,54,"code.google.com/p/u8glib");
  }
}

void draw(void) {
  // graphic commands to redraw the complete screen should be placed here 
 
  drawLogo(0);
  drawURL();
  u8g.drawFrame(0,0,u8g.getWidth(), u8g.getHeight());
 
  u8g.setFont(u8g_font_helvR24r);
  u8g.setPrintPos(0, 100);
  u8g.print(u8g.getWidth(), DEC);
  u8g.print("x");
  u8g.print(u8g.getHeight(), DEC);
}

void setup(void) {
  PRINTER_SERIAL.begin(19200);
 
  // flip screen, if required
  // u8g.setRot180();
 
  // assign default color value
  u8g.setColorIndex(1);         // pixel on
}

void loop(void) {
 
  // picture loop: This will print the picture 
  u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );

  // send manual CR to the printer
  PRINTER_SERIAL.write('\n');
 
  // reprint the picture after 10 seconds
  delay(10000);
}


¿Se os ocurre que puede esta pasando? ¿Existe alguna manera de comprobar ( En el caso de que el módulo LCD ) estuviera roto ?

Muchas gracias por todo y buen fin de semana!

Un saludo.
Alvaro Hernando Valbuena

surbyte

#1
Jan 31, 2015, 03:29 pm Last Edit: Jan 31, 2015, 03:51 pm by surbyte
Todo lo que va con la libreria U8glib.h debe configurarse especialmente.
Este link tal vez apunte mejor a todos los problemas que se presenten. Desde ya veo que la definicón del objeto que usas no es el apropiado.

Code: [Select]
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); 
tal vez este sea tu inicialización del controlador.


Leiste el tutorial oficial

Ahi dice como setear cada display.

Otras librerías incluso mejoradas por Nick Gammon

ahernandovalbuena

Todo lo que va con la libreria U8glib.h debe configurarse especialmente.
Este link tal vez apunte mejor a todos los problemas que se presenten. Desde ya veo que la definicón del objeto que usas no es el apropiado.

Code: [Select]
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); 
tal vez este sea tu inicialización del controlador.


Leiste el tutorial oficial

Ahi dice como setear cada display.

Otras librerías incluso mejoradas por Nick Gammon

¡Genial! Voy a revisar toda la información :) Os comento si consigo hacerla funcionar ;)

Un saludo.
Alvaro Hernando Valbuena

ahernandovalbuena

#3
Jan 31, 2015, 05:51 pm Last Edit: Jan 31, 2015, 05:52 pm by ahernandovalbuena
¡Por fín! he empleado la librería de ArdaFruit que me has sugerido @SurByte y ha sido aparecer la luz. Adjunto repositorios de dichas librerías:

https://github.com/adafruit/Adafruit_SSD1306/archive/master.zip
https://github.com/adafruit/Adafruit-GFX-Library/archive/master.zip

Adjunto el esquema del circuito y conexiones que he realizado para el ejemplo por si fuera de ayuda para otra persona que lo lea (Con un ejemplillo también):




Por lo demás, muchísimas gracias por la colaboración @surByte.

Cambio el titulo del post a SOLUCIONADO.

Un saludo.

Alvaro Hernando Valbuena

Go Up