lcd4bits con diferentes pines

hola, buenas tardes, estoy intentando programar un lcd de 2 lineas. He usado la libreria lcd4bits que hay en la web, pero la placa que he hecho no utiliza los mismos pines de arduino que los que estan puestos en la libreria. Intento cambiarle los pines pero nada, no funciona el programa de ejemplo. ¿Hay que recompilar la libreria o algo para que se modifiquen las direcciones de los pines?

Un saludo.

Hola,

Tienes que eliminar el archivo *.o (LCD4Bit.o). Ya que es la libreria compilada. Al borrarla, cuando compiles tu proyecto de nuevo, se creará con la nueva configuración del archivo *.cpp y *.h (en la cual cambiaste los pines para tu aplicación).
Busca en la ruta: arduino\hardware\libraries\LCD4Bit

En dicha carpeta, tienes el archivo "readme.txt" que te explica ésto.
Lo copio aqui:

After a successful build of this library, a new file named "LCD4Bit.o" will appear
in "Arduino/lib/targets/libraries/LCD4Bit". This file is the built/compiled library
code.

If you choose to modify the code for this library (i.e. "LCD4Bit.cpp" or "LCD4Bit.h"),
then you must first 'unbuild' this library by deleting the "LCD4Bit.o" file. The
new "LCD4Bit.o" with your code will appear after the next press of "verify"

Salu2

Igor R.

de acuerdo Igor muchas gracias, por tu respuesta. He puesto los pines correctos y he recompilado. Sigue sin funcionar. ¿Los pines corespondientes a DB4, DB5, DB6 Y DB7 deben ser correlativos o es indiferente? Estoy empezando a sospechar de que el LCD está roto.

Un saludo!

Hola,

Si lees el archivo LCD4Bit, deben ser consecutivos:

//RS, RW and Enable can be set to whatever you like
int RS = 12;
int RW = 11;
int Enable = 2;
//DB should be an unseparated group of pins - because of lazy coding in pushNibble()
int DB[] = {7, 8, 9, 10}; //wire these to DB4~7 on LCD.

Este código es como lo tengo yo en una de mis aplicaciones. En mi caso, no uso el pin RW, ya que lo dejo siempre en GND, para tenerlo en Read y ahorrarme un pin.

En la función pushNibble, hace un bucle for, en la cual usa la variable i que incrementa de uno en uno, siendo el valor inicial i=DB[0] hasta i=DB[3]. Si no son consecutivos, yo creo que no funcionaría.... :o

Ponlos consecutivos, y me dices si te funciona.... :wink:

Salu2

Igor R.

Lo probaré poniendo pines consecutivos, pero ahora mismo no me es posible, se me ha hecho algo tarde... :-[ Tambien podría solucionarse el problema modificando ese bucle, que por otro lado, parece que está algo enrevesado... no se...

¿Si lo cambiamos por este otro bucle se solucionaria el problema de la necesidad de poner pines consecutivos en el array DB[]?

//Bucle original
//for (int i=DB[0]; i <= DB[3]; i++) {
//  digitalWrite(i,val_nibble & 01);
//  val_nibble >>= 1;
//}
  
  for(int i=0;i<=3;i++){
    digitalWrite(DB[i],val_nibble & 01);
    val_nibble >>= 1;
  }

Si este cambio está bien echo, ya no me quedan mas cosas, estará roto el LCD.

¿Es normal que la libreria de el siguiente warning?

LCD4Bit.cpp: In member function 'void LCD4Bit::init()':
LCD4Bit.cpp:162: warning: suggest parentheses around + or - inside shift

Yo no tengo ningun tipo de warning.

En tu programa, ¿tienes creado el objeto lcd? Me imagino que si... :o
#include <LCD4Bit.h>
LCD4Bit lcd = LCD4Bit(2);

si, el waning ese me salia nada mas descargar la libreria, sin hacer ninguna modificación, y sin modificar el programa de ejemplo. Es estraño... :o

En el readme de la libreria he leido que puede dar algun que otro warning al compilar. Ya probaré con otro LCD... :cry: Trapicheando con la libreria, le he hecho unas pequeñas modificaciones para poder modificar los pines desde el programa del usuario y para evitar tener que poner pines consecutivos, no la he podido probar en el LCD pero yo creo que está bien... Aquí os la dejo por si quereis echarle un vistazo

LCD4Bit Mod: www.vozestudiantes.es/public/LCD4Bit-mod1.rar

Un saludo

Ya he descubierto el error. En el ejemplo, llamaba a la función init() antes de especificar los pines utilizados para el LCD, por lo que no se configuraban bien como salidas. Ya está corregida la libreria y funcionando.

Las diferencias con la libreria original son:

  • Los pines especificados no tienen que ser consecutivos.
  • Se pueden modificar los pines desde el programa usuario, sin modificar la clase.

Ejemplo de configuracion:

  lcd.setE(6);
  lcd.setRW(5);
  lcd.setRS(4);
  lcd.setUsingRw(true);
  
  int BUS[4]={10,11,12,9}; //db4,db5,db6,db7
  lcd.setDB(BUS);
  
  lcd.init();

Muy bien franje!!

De todas formas, con la modificación que escribiste hace tiempo del bucle, yo creo que ya era suficiente para que te funcionara....

Ahora asi esta mejor, porque no necesitas modificar la libreria y borrar el *.o cada vez que cambias los pines.... :slight_smile:

Salu2

Igor R.