@peperfus
Es una buena noticia saber que el comando "i2cdetect -y 0" está respondiendo, porque significa que la pantalla está bien conectada al bus I2C. Una cosa menos de la que preocuparse.
El script lo escribí yo. Desafortunadamente no lo documenté. La información la saqué de distintos sitios. Los primeros documentos que leí fueron
http://www.epemag.wimborne.co.uk/lcd1.pdfhttp://www.epemag.wimborne.co.uk/lcd2.pdfSon un poco viejunos. Probablemente te venga bien leer este artículo de la wikipedia
https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller.
El script gira en torno al comando "i2set", que permite enviar información a la pantalla. Su sintaxis:
i2cset -y BUS ADDRESS INFO1 INFO2
-y obliga al comando a ejecutarse sin hacer preguntas
BUS=0
ADDRESS=0x27 (0x27 es la dirección de tu pantalla)
El comando permite enviar uno o dos bytes (INFO1 es obligatorio; INFO2 es opcional). Por simple economía, lo habitual es enviar dos bytes de una tacada. Más adelante veremos cómo.
Por otra parte, conviene puntualizar que a la pantalla se le puede enviar tanto INSTRUCCIONES como CARACTERES. Los caracteres se visualizan en pantalla, mientras que las instrucciones sirven para controlar su funcionamiento (borrar la pantalla, posicionar el cursor, hacer cursor visible, etc.)
Es importante saber que nuestra pantalla funciona en modo 4-bits, debido a que sólo las líneas D7 a D4 están físicamente conectadas a la placa expansora, quedando sin uso las líneas D3 a D0.

Trabajar en modo 4-bytes obliga a enviar cada byte en dos pasos. Por ejemplo, para enviar 0x25 hay que enviar primero el nibble alto (el 2) y luego el bajo (el 5).
Por otra parte, la pantalla tiene una forma peculiar de trabajar: hay que enviarle la info dos veces. Una para que la guarde y otra para que la procese.
Todo lo anterior se traduce en que una triste instrucción (o caracter) de 1 byte requiere el envío de 4 bytes. Lo vemos con un ejemplo: envío de la instrucción 0x01 (borrar pantalla)
i2cset -y 0 0x27 0x0C 0x08 # envío del nibble alto (el 0) en dos tiempos 0x0C para que lo guarde, 0x08 para que lo procese.
i2cset -y 0 0x27 0x1C 0x18 # envío del nibble bajo (el 1) en dos tiempos 0x1C para que lo guarde, 0x18 para que lo procese.
Es un co*azo, pero es así como hay que hacerlo. La función func_LCD() pretende simplificar el envío de datos. Utiliza dos parámetros. El primero puede ser la letra I o la letra C, según se envíe una instrucción o carácter. El segundo parámetro es el propio dato que se envía.
nibb=$(($data/0x10*0x10)); # nibble alto
i2cset -y $BUS $ADDRESS $(($nibb+$INST_SET)) $(($nibb+$INST_SEND)) # 1. guarda el dato - 2. procesa el dato
nibb=$(($data%0x10*0x10)); # nibble bajo
i2cset -y $BUS $ADDRESS $(($nibb+$INST_SET)) $(($nibb+$INST_SEND)) # 1. guarda el dato - 2. procesa el dato
Efectivamente, como bien dices, la sintaxis es
lcd_write.sh <linea> <columna> <texto>
Ya lo he corregido en el primer post. Gracias por reportarlo.
En cuanto a que me envíes la pantalla para probarla, ya llegaríamos a un acuerdo si fuera necesario.
Respecto a lo de poner una pausa entre comandos, no es necesario. Tened en cuenta que el script está escrito en un lenguaje interpretado, por lo que es su ejecución es bastante lenta.
Por último, el contraste se regula por hardware. No conozco ningún comando para hacerlo por software.