cat /sys/class/gpio/gpiochip*/base | head -n1
480
El valor devuelto (480) es la base, un valor que se suma al GPIO para obtener su valore real. El GPIO9 es en realidad el 489 y el GPIO10, el 490.echo "489" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio489/direction
echo "490" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio490/direction
#SDA (GPIO9) a 3.3V y a 0V.
echo "1" > /sys/class/gpio/gpio489/value
echo "0" > /sys/class/gpio/gpio489/value
#SCL (GPIO10) a 3.3V y a 0V.
echo "1" > /sys/class/gpio/gpio490/value
echo "0" > /sys/class/gpio/gpio490/value
opkg update
opkg install kmod-i2c-gpio-custom
opkg install kmod-gpio-pcf857x
echo "i2c-gpio-custom bus0=0,489,490" > /etc/modules.d/59-i2c-gpio-custom
echo "i2c-gpio" > /etc/modules.d/60-i2c-gpio
reboot
dmesg | grep -E 'i2c|I2C'
[ 14.092000] i2c /dev entries driver
[ 14.112000] Custom GPIO-based I2C driver version 0.1.1
[ 14.120000] i2c-gpio i2c-gpio.0: using pins 489 (SDA) and 490 (SCL)
ls /dev/i2c*
/dev/i2c-0
cd /tmp
wget http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/libi2c_2013-12-15-1_brcm63xx.ipk
wget http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/i2c-tools_2013-12-15-1_brcm63xx.ipk
opkg install libi2c_2013-12-15-1_brcm63xx.ipk i2c-tools_2013-12-15-1_brcm63xx.ipk
i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3f
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
OpenWrt detecta un dispositivo en la dirección hexadecimal 0x3F.#!/bin/sh
# 2016 :p raphik
# Comando para LCD HD44780 + expansor I2C PCF8574T
# Sintaxis 1: se utiliza para inicializar el LCD una sola vez, antes de enviar cualquier texto
# lcd_write <init>
# Sintaxis 2: se utiliza para enviar texto. La primera fila es la 0. La primera columna es la 0.
# lcd_write <fila> <columna> <texto>
#
func_init()
{
# Inicializa el display para modo 4-bit, 16x2 caracteres:
func_LCD I 0x33; func_LCD I 0x32; func_LCD I 0x28; func_LCD I 0x0C; func_LCD I 0x01
}
func_LCD()
{
local nibb; local data
if [ $1 == "I" ]; then
data=$2
nibb=$(($data/0x10*0x10)); i2cset -y $BUS $ADDRESS $(($nibb+$INST_SET)) $(($nibb+$INST_SEND))
nibb=$(($data%0x10*0x10)); i2cset -y $BUS $ADDRESS $(($nibb+$INST_SET)) $(($nibb+$INST_SEND))
fi
if [ $1 == "C" ]; then
data=$(printf "0x%02x" "'$2")
nibb=$(($data/0x10*0x10)); i2cset -y $BUS $ADDRESS $(($nibb+$CHAR_SET)) $(($nibb+$CHAR_SEND))
nibb=$(($data%0x10*0x10)); i2cset -y $BUS $ADDRESS $(($nibb+$CHAR_SET)) $(($nibb+$CHAR_SEND))
fi
}
func_row_col() # esta función posiciona el cursor tanto en pantallas de 2x16 como de 4x20
{
local base ;
if [ $1 == 0 ]; then base=0x00; fi
if [ $1 == 1 ]; then base=0x40; fi
if [ $1 == 2 ]; then base=0x14; fi
if [ $1 == 3 ]; then base=0x54; fi
func_LCD I $((0x80+$base+$2))
}
func_print_string() # escribir una cadena
{
local i=0
while [ $i -lt ${#1} ]; do
func_LCD C "${1:$i:1}"
let i++
done
}
# SCRIPT
if [ "$#" -eq 0 ]; then
printf "\n lcd_write ver. 1.01 2016 :p raphik\n"
printf "Sintaxis 1: lcd_write <init>\n"
printf "Sintaxis 2: lcd_write <fila> <columna> <texto>\n\n"
return
fi
BUS=0
ADDRESS=0x3F
INST_SET=0x0C
INST_SEND=0x08
CHAR_SET=0x0D
CHAR_SEND=0x09
if [ $1 == "init" ]; then
func_init
return
fi
func_row_col $1 $2
func_print_string "$3"
return
# SCRIPT
./lcd_write.sh init
./lcd_write.sh 0 2 "Quality Link"
./lcd_write.sh 1 5 "$(cat /proc/net/wireless | awk 'NR==3 {printf "%0.2f %% \n", $3/70*100}')"
Yo alucino, esto de los proyectos con los GPIO'S está siendo exponencial, ...pedazo de aportazo. Para mi al menos acabas de abrir nuevos horizontes (la pantalla LCD), ....y q pa colmo q con 2 GPIO's controlar 64 relés, elimina limitaciones x completo en ese ámbito.
Lo has descrito y documentado magníficamente, con sus fotos, códigos, vaya, todo hecho. Remesa de sombreros.
>:( ¡¡¡Enhorabuena!!! >:(
Aprovecho para preguntar: ¿Es posible de alguna forma dotar a los routers con OpenWRT de entrada y salida de audio? Vaya, una tarjeta de sonido de alguna forma (la cual desconozco) para funciones básicas: grabar sonidos u oír en directo por un micrófono (me parece más fácil esto, pero no sé si es posible) y/o el hecho de q le conectemos un speaker de PC (para pitidos o sonidos de baja calidad) o si se pudiera adaptar un Jack para conectarle unos altavoces..... Es algo q se me ha pasado x la cabeza hace un mes, ... ¿se os ocurre si es posible con alguna interfaz intermedia? En vista de lo conseguido x raphik, ya no veo sino la falta de conocimientos o la limitación de la imaginación, q suele estar ahí.
Hacéis q esto esté cogiendo formas y opciones muy superiores a Raspberry, Arduino, etc ... Sobretodo a nivel reutilización y a el bajo coste. Ya los routers cuentan con muchas interfaces extras: WiFi, Repetidor WiFi, 7 USB's en el caso del HG556a, etc ...
Saludos a todos
¡Gracias por vuestros comentarios!
El bus I²C de Philips se diseñó para facilitar la comunicación entre componentes alojados en televisores y reproductores de DVD. Está claro que también se puede utilizar para conectar dispositivos por cable. Pero... ¿implementa un protocolo fiable? Me refiero a si es o no es redundante, a si detecta y corrige o no errores de transmisión... Supongo que para ponerle una pantallita al router está bien, pero no sabría deciros si es prudente utilizarlo en proyectos más críticos.
Saludos.
El problema de SPI es que no admite direccionamiento por software: cuando hay más de un dispositivo esclavo hay que ensanchar el bus una línea por dispositivo.Por eso es más sencillo implementarlo a bajo nivel. Cuantas menos líneas utilicemos, más complejo es el protocolo.
@ eludi https://foro.seguridadwireless.net/openwrt/te-habla-tu-router/
Saludos.
@ eludi https://foro.seguridadwireless.net/openwrt/te-habla-tu-router/
Saludos.
Yosss, que bueno, me acabas de dar la solución al proyecto que tengo entre manos con esto de que "hable el Router":
Quiero montar un sistema de videovigilancia con 2 webcams con detección de movimiento (con el Motion y unas PS2 y PS3 EyeToy ya probadas), unos altavoces a modo de mensajes de voz para asustar, jajaja, un Zumbador (altavoz de alarma) activado por 1 GPIO y si el micro también me funciona mejor que mejor, todo esto visionable y controlable desde fuera de casa con el móvil y teniendo avisos por correo, y en breve por wasap (va a salir una SIM de no sé que compañía en Sept. que es gratuita con 200MB y 200 minutos de voz "suficiente para este uso". Si quieres más hay que pagar, pero imagino que serán precios competitivos a más no poder). ¿Quien regala a día de hoy un 2º número de Tlfno con 200 MB y 200 minutos de voz?
La parte del micro me es bastante vital para poder oir también lo que hay en el ambiente (ya que estoy fuera de la finca 6 días) o para si se detectan sonidos bruscos o cambiantes dentro de la casa: se activaría mediante una programación básica a modo de "sonido sospechoso" y guarde esos momentos, los cuales se suben a un FTP. Por último trataría de que fuera en streaming el audio IN del micro, para si quiero ver las cámaras en algún momento en concreto y oir tb el sonido si lo deseo ...puede parecer una bobería, pero no lo es en mi caso al menos. No hay nada como saber cuando está pasando el camión del pescado o el de los helados, jeje. No ahora en serio, mi familia tiene una cueva en el sur que no vamos sino los fines de semana, con sus 2 placas solares, 2 bancos de baterías y sus reguladores (las baterías son AGM y GEL de ahí que sean 2 circuitos independientes) y todo está orientado a ese fin (la única pega que le veo es que se conecta a la wifi del pueblo "que es libre y gratuita" y no sé como acceder a los puertos para acceder/manejar todo esto, ...aun no he indagado sobre esto de los puertos aquí).
También como extra quiero añadir el uso de unos sensores infrarrojos (si alguien pasa/corta activa la alarma) y ultrasonidos (para cambios o movimientos en el habitáculo). Tengo los esquemas, archivos de los circuitos impresos y componentes de las PCB's dando un 1 ó un 0 probadas y funcionando, tendría que volver a imprimirlas y comprar sus componentes o buscar algo en China semejante (lo hicimos en el proyecto de fin de ciclo), los cuales irían como entradas a 2 GPIO's para aumentar el número de sistemas de seguridad.
Bueno, más que agradecido de todos estos aportes. Saludos a todos, sois muy buenos tanto en lo que hacéis como en lo que compartís. Si alguien necesita los esquemas de las PCB's para los ultrasonidos e infrarrojos que lo diga y lo subo aquí, eso si son a escala muy pequeña, pero bueno, todo es escalable.
PD: raphik, ....soy edudi no eludi, jajaj....me sentí eludido.
opkg update
opkg install http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/listener_1.7.2-1_brcm63xx.ipk
Hola edudi...
Con este programa (https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/listener_1.7.2-1_brcm63xx.ipk) , puedes estar a la escucha desde una tarjeta de sonido con entrada de micrófono se encuentra en los repositorios de oldpackages en BB.
Si quieres pruébalo y dinos como va...Código: [Seleccionar]opkg update
opkg install http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/listener_1.7.2-1_brcm63xx.ipk
;)
Por la parte de detrás de la pantalla hay un expansor de bus I²C, un Philips PCF8574T, que permite su conexión con el router con sólo cuatro cables (GND, VCC, SDA y SCL).Dos de los cables (GND y VCC) son para dar energía eléctrica al conjunto y los otros dos (SDA y SCL) para su manejo mediante conexión a sendas GPIOs libres del router.
Gracias por las respuestas.
Ya lo tengo casitodo bastante claro. Las pantallas las tengo encargadas (me he pedido 2) y tengo un 5387 aquí y otro de camino también. Lo he pedido todo por duplicado por si me cargo alguno, o si los dos me quedan bien, pues olé, jejeje.
La mayor dificultad va a ser la soldadura. Veo que los GPIOS son puntos muy pequeños y me da un pelín de pánico soldar un cable ahí. ¿Podrías explicar brevemente los pasos?
He soldado cable con cable, eso es lo más fácil del mundo, pero soldar un cable a un punto tan enano no sé cómo hacerlo. Voy a suponer que:
1) Se estaña el cable.
y 2) se aplica el soldador al punto y enseguida se toca con el cable el punto.
¿Es así? ¿Es necesario flux?
GRACIAS
Igual me animo hoy a intentarlo.
--------------------------------
Edito (añado):
Joder, que bajón... acabo de abrir el router para ver la placa y los GPIOs.... y no son pequeños... son diminutos. Esto para mí va a ser enormemente difícil :-\
Y eso que tengo estación de soldadura con varias puntas, y 3er brazo con lupa...
En fin; ya veremos, pero lo dicho... más que soldar un cable ahí, parece que lo que haya que soldar sea un hilo finito y para soldarlo.... vaya tela.
Raphik, por favor, consejos. Aún soy virgen ^-^ en este tipo de soldadura.
... Veo que los GPIOS son puntos muy pequeños y me da un pelín de pánico soldar un cable ahí. ¿Podrías explicar brevemente los pasos?...Raphik, por favor, consejos...
root@OpenWrt:~# dmesg | grep -E 'i2c|I2C'
[ 13.520000] i2c /dev entries driver
[ 13.540000] Custom GPIO-based I2C driver version 0.1.1
[ 13.544000] i2c-gpio i2c-gpio.0: using pins 489 (SDA) and 490 (SCL)
root@OpenWrt:~# ls /dev/i2c*
/dev/i2c-0
root@OpenWrt:~# i2cdetect -y 0:'(
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
echo "489" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio489/direction
echo "490" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio490/direction
root@OpenWrt:~# ls /sys/class/gpio/Ahí están.
export gpio489 gpio490 gpiochip480 unexport
root@OpenWrt:~# ls /sys/class/gpio/Desaparecen.
export gpiochip480 unexport
write error: Device or resource busy
Unknown package 'libi2c'.(y las i2ctools, lo mismo)
Collected errors:
* pkg_hash_fetch_best_installation_candidate: Packages for libi2c found, but in compatible with the architectures configured
* opkg_install_cmd: Cannot install package libi2c.
Algunas veces el bus I2C, necesita tener las señales con resistencias pullups a 3.3v.
¿Has probado a ponerlas?
Edito.
Aquí puedes ver un ejemplo. Es para 5v, pero tú necesitarías 3.3v: http://www.robot-electronics.co.uk/i2c-tutorial (http://www.robot-electronics.co.uk/i2c-tutorial)
...
..Hola, En cada reinicio hay que exportar y declarar la dirección de los gpio, no queda guardado, lo que yo hago es incluir los comandos en /etc/rc.local
(Además, tengo que hacerlo antes de reiniciar, porque en cuanto reinicio....)
..
value (sda/scl) | SDA | SCL |
0/0 | 3,31 | 2,63 |
0/1 | 3,31 | 3,32 |
1/0 | 3,31 | 2,58 |
1/1 | 3,31 | 3,31 |
echo "489" > /sys/class/gpio/export
sh: write error: Device or resource busy
Ya, pero es que ni siquiera me deja volver a exportarlos y declararlos. Me da el error de resource busy.
raphik, seny.... ¿vosotros habéis usado resistencias pull-up?
En caso afirmativo, ¿de qué valor/es? y ¿conectadas de dónde a dónde?
Me imagino que raphik, las habrás usado de cada línea (SDA y SCL) a VCC (5V en tu caso)...
Es lo que voy a probar. Voy a pillar unas de 1800 Ohm, como recomienda el tutorial comentado por Tki2000 (http://www.robot-electronics.co.uk/i2c-tutorial). Por cierto.... ¿con las de 1/4 de watio es suficiente? (Creo que eso se refiere a la cantidad de electricidad que soportan, ¿correcto? De electrónica no controlo)
Y las colocaré entre SDA y 5V y SCL y 5V respectivamente.
raphik, seny.... ¿vosotros habéis usado resistencias pull-up?Como digo en el primer post, alimento la pantalla con 5 Voltios.
En caso afirmativo, ¿de qué valor/es? y ¿conectadas de dónde a dónde?
Me imagino que raphik, las habrás usado de cada línea (SDA y SCL) a VCC (5V en tu caso)...
... la (pantalla) que tengo ahora mismo es ésta.
(http://i.imgur.com/d7vlyno.jpg)
Bueno, en realidad no es la de la imagen.
Se ve que esa es la imagen que puso el vendedor en la página del artículo, pero el artículo en sí es ligeramente distinto:
De hecho, si se va a las características, en la descripción del artículo:
Características:
Pantalla LCD, 16 caracteres y 2 líneas
Alimentación 5V
Controlador compatible HD44780
Adaptador II2C PCF8574T
Fondo azul retroiluminado, letras en blanco
Incluir un pin de contraste ajustable
Dimensiones (mm): 80 x 36 x 19
Esta es la foto del adaptador que viene en cuestión:
(https://s26.postimg.org/azo3dxa3p/i2c.jpg) (https://postimg.org/image/azo3dxa3p/)
He visto otro tuto (http://www.instructables.com/id/Using-PCF8574-backpacks-with-LCD-modules-and-Ardui/) por ahí y supuestamente también va directo sin resistencias y a 5V.
(Edito: en el tuto que he visto usaban el modelo PCF8574, sin la T)
(Aquí otro tuto (https://www.luisllamas.es/arduino-lcd-i2c/) con el mismo controlador)
Lo cual no hace más que aumentar la duda sobre qué es lo que me está fallando.
Está la diferencia de que tú lo tienes soldado con estaño y yo lo tengo con pegamento conductor, pero me parece muy raro que sea ese el problema. Parece que este pegamento da buen resultado con estos voltajes. Por cierto, por si a alguien le interesa, es este (http://www.ebay.es/itm/Pegamento-Conductor-de-Electricidad-WIRE-GLUE/142469826448).
Lo único que se me ocurre ahora es que pueda haber habido un cortocircuito al haber contactado ligeramente el pegamento con el polo politivo y/o negativo de las bases para led (sin leds) que hay alrededor y aún habiéndolo limpiado después, ya se haya/n estropeado el/los gpios.
No me queda prácticamente más remedio que probar el otro router.
(Edito: en el tuto que he visto usaban el modelo PCF8574, sin la T)
No me queda prácticamente más remedio que probar el otro router.
Gracias. En cuanto tenga algo de tiempo libre (ahora vuelvo a estar bastante liado), lo intentaré.Cuando te pongas a ello, primero controla el GPIO y luego cuando veas que funciona, ya sigues con los cables y circuitos, así cuando algo de problema podrás descartar más fácil donde puede estar el fallo.
Es una oportunidad muy buena para hacer pruebas y ayudar a despejar dudas.
root@OpenWrt:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
func_init() # inicializar display
{
func_LCD I 0x33;
func_LCD I 0x32; # ?
func_LCD I 0x28; # ?
func_LCD I 0x0C; # OCULTA EL CURSOR
func_LCD I 0x01; # BORRA PANTALLA
}
// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80
// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00
// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
// flags for backlight control
#define LCD_BACKLIGHT 0x08
#define LCD_NOBACKLIGHT 0x00
#define En B00000100 // Enable bit
#define Rw B00000010 // Read/Write bit
#define Rs B00000001 // Register select bit
Gracias por la sugerencia. Yo de esto no tengo prácticamente ni idea. Me he limitado a seguir el tutorial de raphik.
El Santo Grial está en que hay distinto para que a él le salga el texto brillante después de hacer el init, pero a mí me sale súper tenue, casi invisible.
Acabo de probar a poner un sleep 10 (para estar seguro de que no me quedaba corto) entre comandos de init y tampoco; nada.
Cuando pruebe lo de soldar los cables... ya veré si consigo algo distinto. Me gustaría quemar todos los cartuchos antes de tirar la toalla.
He preguntado en un foro de arduino a ver qué me dicen.No será falta de corriente o mala masa?
Para mí: O son estas pantallas mías, que son defectuosas (o distintas), aunque parecen ser las mismas que usa raphik, mismo chip y tal.
O bien, falla algo en los comandos esos de inicialización, esas secuencias que se le envían de valores en hexadecimal...
Seguiré investigando hasta que me harte o se me acaben las opciones y lo deje en un expediente X, o bien hasta que dé en el clavo del problema.
Lo del contraste dudo mucho que tenga algo que ver. Se maneja igual que el de raphik, con un potenciómetro a modo de "tornillo" de estrella. Aunque sí que es raro, que el mío al máximo sale más tenue que el suyo, pero aún así, no parece tener nada que ver; ya que en el primer ejemplo que pongo, cuando muestro texto en la pantalla, SIN inicializar, salen caracteres raros, pero en un brillo PERFECTO. En cambio, cuando inicializo la pantalla, sale ya el texto correcto, pero es como si ese brillo se apagara y ya casi no se ve el texto. Este finde probaré con otro router idéntico y soldando los cables. Todo lo demás lo haré exactamente igual, para respetar las condiciones iniciales del experimento. Aunque una prueba ideal sería yo probar la pantalla de raphik o bien, él probar la mía (o ambas opciones). Eso nos daría más pistas sobre cuál puede ser el problema.
He preguntado en un foro de arduino a ver qué me dicen.
Para mí: O son estas pantallas mías, que son defectuosas (o distintas), aunque parecen ser las mismas que usa raphik, mismo chip y tal.
O bien, falla algo en los comandos esos de inicialización, esas secuencias que se le envían de valores en hexadecimal...
Seguiré investigando hasta que me harte o se me acaben las opciones y lo deje en un expediente X, o bien hasta que dé en el clavo del problema.
Lo del contraste dudo mucho que tenga algo que ver. Se maneja igual que el de raphik, con un potenciómetro a modo de "tornillo" de estrella. Aunque sí que es raro, que el mío al máximo sale más tenue que el suyo, pero aún así, no parece tener nada que ver; ya que en el primer ejemplo que pongo, cuando muestro texto en la pantalla, SIN inicializar, salen caracteres raros, pero en un brillo PERFECTO. En cambio, cuando inicializo la pantalla, sale ya el texto correcto, pero es como si ese brillo se apagara y ya casi no se ve el texto. Este finde probaré con otro router idéntico y soldando los cables. Todo lo demás lo haré exactamente igual, para respetar las condiciones iniciales del experimento. Aunque una prueba ideal sería yo probar la pantalla de raphik o bien, él probar la mía (o ambas opciones). Eso nos daría más pistas sobre cuál puede ser el problema.
i2cset -y BUS ADDRESS INFO1 INFO2
-y obliga al comando a ejecutarse sin hacer preguntasi2cset -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
lcd_write.sh <linea> <columna> <texto>
Ya lo he corregido en el primer post. Gracias por reportarlo.raphik, gracias por aclarar lo que hace el código. Seguro que puede despejar más de una duda.Iré introduciendo comentarios explicativos en el script del primer post. Incluso para mí es duro entenderlo después de más de un año de haberlo escrito.
Con respecto a lo que le pasa a peperfus, si sin inicializar el LCD, el texto sale con contraste, y después de inicializar, no tiene contraste, yo apostaría a que algo hay en la inicialización, que trastoca al LCD.Es posible, pero te aseguro que no trastoca para nada mi LCD.
# SCRIPT
# Si la llamada al script no contiene parámetros, se visualiza su sintaxis
if [ "$#" -eq 0 ]; then
printf "\n lcd_write ver. 1.01 2016 :p raphik\n"
printf "Sintaxis 1: lcd_write <init>\n"
printf "Sintaxis 2: lcd_write <fila> <columna> <texto>\n\n"
return
fi
# Variables globales. La única que hay que cambiar es ADDRESS, en la que se pone la dirección
# hexadecimal del módulo LCD. Lo demás se deja como está.
BUS=0
ADDRESS=0x3F
INST_SET=0x0C
INST_SEND=0x08
CHAR_SET=0x0D
CHAR_SEND=0x09
# Si la llamada al script contiene como primer parámetro la cadena "init", se ejecuta la función
# func_init, que pone al módulo en modo 4-bits, elimina el cursor y borra la pantalla.
if [ $1 == "init" ]; then
func_init
return
fi
# Para escribir texto en el LCD, se invoca el script pasándole tres parámetros: fila, columna y texto.
func_row_col $1 $2
func_print_string "$3"
return
# SCRIPT
Mil Gracias, raphik por tus aclaraciones.
La regla de oro de cualquier programador: Documentar, documentar, documentar.
Una cosa que he observado.... tu pantalla dices que sólo tiene 4 bit soldados a la placa expansorat?.
Buscando el chip de la mía: PCF8457T, me pone por ahí 8 bits.... y yo veo que parece ser... que están todos los pines soldados. ¿No es así en la tuya?
http://pdf1.alldatasheet.com/datasheet-pdf/view/18215/PHILIPS/PCF8574T.html (http://pdf1.alldatasheet.com/datasheet-pdf/view/18215/PHILIPS/PCF8574T.html)
Una cosa que he observado.... tu pantalla dices que sólo tiene 4 bit soldados a la placa expansora?
Buscando el chip de la mía: PCF8457T, me pone por ahí 8 bits.... y yo veo que parece ser... que están todos los pines soldados. ¿No es así en la tuya?
Yo este finde tengo planeado soldar cables.
La estrategia que voy a seguir es la que me comentó alguien hace unas semanas....
Primero estañar los puntos gpios, luego estañar los cables y finalmente, juntarlos y darles un toque con el soldador para que queden unidos.
Me he comprado bastante material y haré algo de práctica con una placa vieja antes. Tengo hasta gafas-lupa con led que van de maravilla. A ver si puedo hacer unas fotos.
Creo que es una buena idea, después de soldar los cables, pegarlos con silicona caliente a la placa. De esa manera, cualquier tirón se lo lleva antes la silicona y protege la soldadura.
Si pretendéis soldar y desoldar mucho, y con puntos muy pequeños, lo mejor es invertir en estaño en pasta y una pistola de aire caliente. No tiene nada que ver con soldar con soldador.
Y he dicho invertir, no gastar, porque a la larga conviene para no estar estropeando cosas.
O si seguís empecinados en la agujita, un buen flux también facilita mucho las cosas, ya que hace que la temperatura para derretir el estaño baje mucho, y no se dañen tanto las pistas. Lo peor de las soldaduras en placas de ahora, es que están hechas con estaño sin plomo, y hay que subir mucho más la temperatura.
Conclusión clara: Algo había mal a nivel de mal contacto eléctrico en el router anterior; o bien el pegamento conductor no es lo suficientemente bueno para esto.
Muchas gracias a todos por la ayuda, ideas y comentarios.
raphik, te mereces un monumomento.
Y ahora, lo primerísimo que hay que hacer es asegurar todas las soldaduras y los puntos débiles bien con silicona para que no sufran tirones que puedan partir las uniones.
#!/bin/sh
# Script que muestra la fecha completa y la hora en pantalla LCD 1604.
# Utiliza (requiere) el script lcd_write.sh de raphik.
# Sintaxis: fechayhora.sh
# Se recomienda dejarlo en ejecucion en segundo plano.
# Opcionalmente puede mostrar informacion extra cada minuto y cada hora.
# Empieza en modo demo, mostrando una prueba cada minuto y hora.
# Programado por Peperfus
VERSION=1.6;
RUTA_lcd_write=/root;
FIL=0;
COL=0;
COLANYO=0;
DIAMES=99;
DIASEM=99;
DIASEMANA=99;
MES=99;
MESELEG=99;
ANYO=99;
ANYOELEG=9999;
HORA=99;
MINUTOS=99;
SEGUNDOS=99;
limpiaFil()
{
# 16 caracteres blanco "1234567890123456"
$RUTA_lcd_write/lcd_write.sh $FIL 0 " ";
}
calculaHora()
{
HORA=$(date | cut -d : -f 1 | tail -c 3);
}
calculaMinutos()
{
MINUTOS=$(date -Iminute | cut -d : -f 2 | head -c 2);
}
calculaSegundos()
{
SEGUNDOS=$(date -Isecond | cut -d : -f 3 | head -c 2);
}
calculaDiaMes()
{
DIAMES=$(date -I | cut -d - -f 3);
}
calculaDiaSem()
{
calculaDiaSemana;
DIASEM=$(echo $DIASEMANA | head -c 3);
}
calculaDiaSemana()
{
DIAWEEK=$(date | head -c 3);
case "$DIAWEEK" in
Sun)
DIASEMANA="Domingo";
;;
Mon)
DIASEMANA="Lunes";
;;
Tue)
DIASEMANA="Martes";
;;
Wed)
DIASEMANA="Miercoles";
;;
Thu)
DIASEMANA="Jueves";
;;
Fri)
DIASEMANA="Viernes";
;;
Sat)
DIASEMANA="Sabado";
;;
esac
}
calculaMes()
{
MES=$(date -I | cut -d - -f 2);
}
calculaMesEleg()
{
# Para los meses demasiado largos COLANYO se desplaza a la derecha y se usa el anyo corto
COLANYO=12;
calculaMes;
case "$MES" in
01)
MESELEG="Enero";
;;
02)
MESELEG="Febrero";
;;
03)
MESELEG="Marzo";
;;
04)
MESELEG="Abril";
;;
05)
MESELEG="Mayo";
;;
06)
MESELEG="Junio";
;;
07)
MESELEG="Julio";
;;
08)
MESELEG="Agosto";
;;
09)
MESELEG="Septiembre";
COLANYO=14;
;;
10)
MESELEG="Octubre";
;;
11)
MESELEG="Noviembre";
COLANYO=14;
;;
12)
MESELEG="Diciembre";
COLANYO=14;
;;
esac
}
calculaAnyo()
{
calculaAnyoEleg;
ANYO=$(echo $ANYOELEG | tail -c 3);
}
calculaAnyoEleg()
{
ANYOELEG=$(date | tail -c 5);
}
muestraHoras()
{
calculaHora;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$HORA";
}
muestraMinutos()
{
calculaMinutos;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$MINUTOS";
}
muestraSegundos()
{
calculaSegundos;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$SEGUNDOS";
}
muestraHoraCompelta()
{
muestraHoraCorta;
calculaSegundos;
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+5)) ":";
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+6)) "$SEGUNDOS";
}
muestraHoraCorta()
{
calculaHora;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$HORA";
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+2)) ":";
calculaMinutos;
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MINUTOS";
}
muestraZonaHoraria()
{
$RUTA_lcd_write/lcd_write.sh 0 0 "Zona horaria:";
$RUTA_lcd_write/lcd_write.sh 1 0 "$(cat /etc/config/system | grep zonename | cut -d \' -f 2)";
}
muestraDiaSemana()
{
calculaDiaSemana;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIASEMANA";
}
muestraDiaSem()
{
calculaDiaSem;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIASEM";
}
muestraFechaCompleta()
{
muestraFechaCorta;
# ANYO
calculaAnyo;
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+5)) "/";
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+6)) "$ANYOELEG";
}
muestraFechaCorta()
{
$RUTA_lcd_write/lcd_write.sh $FIL $COL " ";
# DIA
calculaDiaMes;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIAMES";
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+2)) "/";
# MES
calculaMes;
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MES";
}
muestraFechaElegante()
{
# DIA
calculaDiaMes;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIAMES";
calculaMesEleg;
$RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MESELEG";
calculaAnyo;
# Si el mes es demasiado largo, se usa anyo corto
if [ $COLANYO -eq 14 ]; then ANYOELEG=$ANYO; fi
$RUTA_lcd_write/lcd_write.sh $FIL $COLANYO "$ANYOELEG";
}
refrescar()
{
# Actualiza toda la pantalla.
# Se suele invocar en la hora 00, cuando cambia el dia
# O bien, tras una informacion por minuto u hora.
$RUTA_lcd_write/lcd_write.sh init;
FIL=0;
COL=0;
muestraDiaSemana;
COL=11;
muestraHoraCorta;
FIL=1;
COL=0;
muestraFechaElegante;
}
infoXMinuto()
{
# Informacion extra para mostrar cada minuto
# DEBE limpiar lo que escribe
FIL=1;
COL=0;
limpiaFil;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "Ha pasado 1 min"
sleep 2;
limpiaFil;
muestraFechaElegante;
}
infoXHora()
{
# Informacion extra para mostrar cada hora
# DEBE limpiar lo que escribe
FIL=1;
COL=0;
limpiaFil;
$RUTA_lcd_write/lcd_write.sh $FIL $COL "Ha pasado 1hora"
sleep 5;
limpiaFil;
muestraFechaElegante;
}
presentacion()
{
# Mis 3 segundos de gloria xD
$RUTA_lcd_write/lcd_write.sh init;
$RUTA_lcd_write/lcd_write.sh 0 0 "SMART CLOCK v$VERSION";
$RUTA_lcd_write/lcd_write.sh 1 0 "Por Peperfus";
sleep 3;
}
muestraDatos()
{
$RUTA_lcd_write/lcd_write.sh init;
# IPS del router: 1234567890123456
$RUTA_lcd_write/lcd_write.sh 0 0 "Las IPS de mis "
$RUTA_lcd_write/lcd_write.sh 1 0 "interfaces son:"
sleep 1;
$RUTA_lcd_write/lcd_write.sh init;
FIL=0;
for IP in $(ifconfig | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1)
do
# echo $IP;
$RUTA_lcd_write/lcd_write.sh $FIL 0 $IP;
if [ $FIL -eq 0 ]; then FIL=1;
else FIL=0;
fi
sleep 1
done
sleep 2
# ZONA HORARIA
# Es para asegurarnos de que la ZH
# esta bien configurada y la hora
# visualizada es fiable;
muestraZonaHoraria;
sleep 2;
$RUTA_lcd_write/lcd_write.sh init;
$RUTA_lcd_write/lcd_write.sh 0 0 "Cliente NTP:";
NTP="Parado";
pidof ntpd > /dev/null;
if [ $? -eq 0 ]; then NTP="En marcha"; fi
$RUTA_lcd_write/lcd_write.sh 1 0 "$NTP";
sleep 2;
$RUTA_lcd_write/lcd_write.sh init
$RUTA_lcd_write/lcd_write.sh 0 0 "Conex. INTERNET:";
$RUTA_lcd_write/lcd_write.sh 1 0 "Intentando...";
sleep 1;
INTERNET=KO;
wget -qs http://google.com;
if [[ $? -eq 0 ]]; then INTERNET=OK; fi
$RUTA_lcd_write/lcd_write.sh 1 0 "$INTERNET ";
sleep 3;
if [ "$INTERNET" == "OK" ]; then
$RUTA_lcd_write/lcd_write.sh 0 0 "Sincronizando ";
$RUTA_lcd_write/lcd_write.sh 1 0 "con Internet ...";
# Sincronizar reloj de la pantalla con Internet.
calculaMinutos;
calculaHora;
# Si la hora es 0 es posible
# que no haya podido coger la hora de Internet.
# Asi que esperamos un tiempo hasta cogerla
# o agotar un timeour; A no ser... que se encienda
# el router a las 00 horas, que la hora seria
# correcta.
TIMEOUT=20;
while [ $HORA -eq 0 ] && [ $TIMEOUT -ge 0 ]; do
sleep 1;
calculaHora;
TIMEOUT=$((($TIMEOUT)-1));
#echo $TIMEOUT;
done
else #1234567890123456
$RUTA_lcd_write/lcd_write.sh 0 0 "Imposible sin- ";
$RUTA_lcd_write/lcd_write.sh 1 0 "cronizar reloj ";
sleep 2
$RUTA_lcd_write/lcd_write.sh 0 0 "con Internet ";
$RUTA_lcd_write/lcd_write.sh 1 0 "actualmente. ";
sleep 2
$RUTA_lcd_write/lcd_write.sh 0 0 "Se seguira in- ";
$RUTA_lcd_write/lcd_write.sh 1 0 "intentando. ";
sleep 2
$RUTA_lcd_write/lcd_write.sh 0 0 "AVISO: ";
$RUTA_lcd_write/lcd_write.sh 1 0 "La hora puede ";
sleep 2
$RUTA_lcd_write/lcd_write.sh 0 0 "ser incorrecta. ";
$RUTA_lcd_write/lcd_write.sh 1 0 "Se corregira en ";
sleep 2
$RUTA_lcd_write/lcd_write.sh 0 0 "cuanto sea ";
$RUTA_lcd_write/lcd_write.sh 1 0 "posible. ";
sleep 2
fi
}
############
## SCRIPT ##
############
$RUTA_lcd_write/lcd_write.sh init;
presentacion;
muestraDatos;
refrescar;
while [ true ]; do
while [ "$MINUTOS" != "00" ]; do
FIL=0;
COL=14;
sleep 60;
muestraMinutos;
# infoXMinuto;
done
FIL=0;
COL=11;
muestraHoras;
# infoXHora;
# Para que vuelva a entrar en bucle minutos
# actualizar pantalla una vez al dia:
if [ "$HORA" == "00" ]; then refrescar; sleep 1; fi
MINUTOS=-1;
done;
Graicas ;D ;D ;D ;D
Ahora se me ocurren varias aplicaciones chulas para utilizar la pantalllita. La más inmediata, un simple reloj que informe de la fecha y hora.
raphik, ¿te parece bien que publique aquí en este mismo hilo los scripts que se me vayan ocurriendo para darle utilidad a la pantallita?
Si no lo ves adecuado, lo borro; pero yo creo que estaría bien tenerlo aquí mismo, por si alguien más se anima y quiere utilizar estos scripts, además de, por supuesto, mejorarlos, optimizarlos, corregirlos, modificarlos.... al antojo de quien quiera = Software libre.
"RELOJ" que muestra fecha y hora:Código: [Seleccionar]#!/bin/sh
./lcd_write.sh init;
./lcd_write.sh 0 0 "SMART CLOCK v1.0";
sleep 3
./lcd_write.sh init;
SEGUNDOS=0;
MINUTOS=0;
cd /root;
./lcd_write.sh init;
# ZONA HORARIA
./lcd_write.sh 0 0 "Zona horaria:"
./lcd_write.sh 1 0 "$(cat /etc/config/system | grep zonename | cut -d \' -f 2)";
sleep 4;
# FECHA COMPLETA CON ANYO
#./lcd_write.sh init;
./lcd_write.sh 0 0 " ";
# DIA
./lcd_write.sh 0 0 "$(date -I | cut -d - -f 3)";
./lcd_write.sh 0 2 "/";
# MES
./lcd_write.sh 0 3 "$(date -I | cut -d - -f 2)";
./lcd_write.sh 0 5 "/";
# ANYO
./lcd_write.sh 0 6 "$(date | tail -c 3)";
DIAWEEK=$(date | head -c 3);
case "$DIAWEEK" in
Sun)
DIASEMANA="Domingo";
;;
Mon)
DIASEMANA="Lunes";
;;
Tue)
DIASEMANA="Martes";
;;
Wed)
DIASEMANA="Mierco.";
;;
Thu)
DIASEMANA="Jueves";
;;
Fri)
DIASEMANA="Viernes";
;;
Sat)
DIASEMANA="Sabado";
;;
esac
# DIA SEMANA
./lcd_write.sh 0 9 "$DIASEMANA" ;
sleep 5;
# REDUCIMOS FECHA A DIA/MES PORQUE NO CABE TODO
while true
do
#./lcd_write.sh init;
./lcd_write.sh 0 0 " ";
# DIA
./lcd_write.sh 0 0 "$(date -I | cut -d - -f 3)";
./lcd_write.sh 0 2 "/";
# MES
./lcd_write.sh 0 3 "$(date -I | cut -d - -f 2)";
# HORA
./lcd_write.sh 0 8 "$(date | cut -d : -f 1 | tail -c 3)"
./lcd_write.sh 0 10 ":";
# DIA SEMANA 2a linea:
./lcd_write.sh 1 0 " "
if [ "$DIASEMANA" == "Mierco." ]; then DIASEMANA=Miercoles; fi
./lcd_write.sh 1 0 "$DIASEMANA";
MINUTOS=-1;
while [ "$MINUTOS" -ne "00" ]; do
MINUTOS=$(date -Iminute | cut -d : -f 2 | head -c 2);
./lcd_write.sh 0 11 "$MINUTOS";
./lcd_write.sh 0 13 ":";
SEGUNDOS=-1;
while [ "$SEGUNDOS" -ne "00" ]; do
SEGUNDOS=$(date -Isecond | cut -d : -f 3 | head -c 2);
./lcd_write.sh 0 14 "$SEGUNDOS";
done;
done;
done;
Queda así:
...
... Ahora se me ocurren varias aplicaciones chulas para utilizar la pantalllita. La más inmediata, un simple reloj que informe de la fecha y hora.
raphik, ¿te parece bien que publique aquí en este mismo hilo los scripts que se me vayan ocurriendo para darle utilidad a la pantallita?...
Supongo que después de tener el cableado correctamente, ya puedes usar kmod-i2c-gpio-custom, para que aparezca el dispositivo en /dev, y usar lcd4linux para poner en la pantalla lo que quieras. Hay un driver para HD44780-I2C.
https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/lcd4linux-custom_r1187-1_brcm63xx.ipk
https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/lcd4linux-full_r1187-1_brcm63xx.ipk
date +"%d/%m/%y %T"
Fuente: http://www.elmundoenbits.com/2013/04/date-format-bash-linux.html#.WdJwYuZrzcuset -- "lunes" "martes" "miércoles" "jueves" "viernes" "sábado" "domingo"
eval "echo \$$(date +%u)"
func_LCD I $((0x80+0x1B))
func_LCD C "W"
func_row_col()
{
local base ;
if [ $1 == 0 ]; then base=0x00; fi
if [ $1 == 1 ]; then base=0x40; fi
if [ $1 == 2 ]; then base=0x14; fi
if [ $1 == 3 ]; then base=0x54; fi
func_LCD I $((0x80+$base+$2))
}
root@LCD:~# ./lcd_write.sh 3 0 "Hola"
./lcd_write.sh: local: line 79: 0x00: bad variable name
./lcd_write.sh: line 79: : bad variable name
local base;
base=0x00;
i2cset -y 0 0x27 0x80
prevState=$((i2cget -y 0 0x27)) # lectura del estado actual
newState=$(($prevState | 0x80)) #cálculo del nuevo valor respetando el estado previo
i2cset -y 0 0x27 $newState # escritura del nuevo estado
@Fitch
Para manejar relés vía I²C se suele utiliza un expansor de bus tipo PCF8574.
(https://i.imgur.com/8Vyn15Q.jpg)
El módulo de la foto no incorpora relés, pero vale perfectamente para entender cómo se controla este tipo de dispositivos.
El cable I²C del router se enchufa al conector dupont macho de la izquierda. A la derecha hay otro conector dupont hembra al que se podría conectar a su vez un segundo módulo expansor, y a éste un tercero... y así sucesivamente hasta un total de ocho módulos.
Cuando se conecta más de un módulo a mismo bus, hay que asignar una dirección física distinta a cada uno de ellos. Esto se consigue modificando la posición de los tres jumpers de color naranja.
En la parte superior hay un conector amarillo. El pin de más a la izquierda es 0V. El resto son 8 salidas digitales que pueden tomar los valores 0 o +5V, en función los valores binarios 0 o 1 que les asignemos.
Las 8 salidas digitales se pueden controlar desde una consola de OpenWRT o desde un script. Para establecer el valor de las salidas se usa el comando "i2cset" y para conocer su estado previo "i2cget".
Para entender lo que sigue ahora, hay que estar un poco familiarizado con los sistemas de numeración binario, hexadecimal y su aritmética.
Supongamos que queremos poner la patilla P7 de la tarjeta expansora a +5V y el resto a 0V. Bastará con enviar a la placa el valor binario 0b10000000. El problema es que los scripts no trabajan con binarios. Sólo se puede utilizar decimal y hexadecimal. Sabiendo que el valor decimal 0b10000000 equivale al valor hexadecimal 0x80 y suponiendo que el módulo estuviera conectado en la dirección 0x27 del bus 0, el código a enviar seráCódigo: [Seleccionar]i2cset -y 0 0x27 0x80
Si lo que queremos en realidad es activar una o más patillas dejando invariable el resto, no queda otra que tirar del operador binario OR. Primero habría que conocer el estado previo de todas las patillas, luego habría que calcular el valor a enviar y por último enviarlo.
Lo vemos con un ejemplo: activar P7 preservando el estado de las demás salidas. Sabiendo que 0x10000000 equivale a 0x80,Código: [Seleccionar]prevState=$((i2cget -y 0 0x27)) # lectura del estado actual
newState=$(($prevState | 0x80)) #cálculo del nuevo valor respetando el estado previo
i2cset -y 0 0x27 $newState # escritura del nuevo estado
Como esto se está poniendo un poco tocho lo dejo ya. Si de verdad interesa, podemos ver cómo desactivar determinadas patillas, respetando los valores previos, en una próxima entrega.
Lo de sumar $2 a $base lo entiendo, porque le sumas la columna al principio de cada fila, pero no entiendo lo del 0x80 del principio. Si puedes explicarlo.... gracias.
Para entender lo que sigue ahora, hay que estar un poco familiarizado con los sistemas de numeración binario, hexadecimal y su aritmética.
Si lo que queremos en realidad es activar una o más patillas dejando invariable el resto, no queda otra que tirar del operador binario OR. Primero habría que conocer el estado previo de todas las patillas, luego habría que calcular el valor a enviar y por último enviarlo.
echo pcf8574 0x39 > /sys/bus/i2c/devices/i2c-0/new_device
echo pcf8574 0x38 > /sys/bus/i2c/devices/i2c-0/new_device
find /sys/class/gpio/gpio*
/sys/class/gpio/gpio481
/sys/class/gpio/gpio483
/sys/class/gpio/gpiochip458
/sys/class/gpio/gpiochip466
/sys/class/gpio/gpiochip474
/sys/class/gpio/gpiochip506
i2c 0-0039: uevent
<7>[ 268.825591] pcf857x 0-0039: probe
<7>[ 268.825666] i2c i2c-0: master_xfer[0] R, addr=0x39, len=1
<6>[ 268.826457] pcf857x 0-0039: probed
<7>[ 268.830081] i2c i2c-0: client [pcf8574] registered with bus id 0-0039
<6>[ 268.830133] i2c i2c-0: new_device: Instantiated device pcf8574 at 0x39
<7>[ 281.481288] i2c 0-0038: uevent
<7>[ 281.481799] pcf857x 0-0038: probe
<7>[ 281.481875] i2c i2c-0: master_xfer[0] R, addr=0x38, len=1
<6>[ 281.482559] pcf857x 0-0038: probed
<7>[ 281.486199] i2c i2c-0: client [pcf8574] registered with bus id 0-0038
<6>[ 281.486263] i2c i2c-0: new_device: Instantiated device pcf8574 at 0x38
---------- Y la carga de todo el Mapeado...
i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 745.166910] i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 752.678994] i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 752.680005] i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 765.262345] i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 765.263334] i2c i2c-0: master_xfer[0] W, addr=0x39, len=1
<7>[ 1737.932554] i2c i2c-0: ioctl, cmd=0x705, arg=0x7fbbe8f8
<7>[ 1737.932745] i2c i2c-0: ioctl, cmd=0x703, arg=0x03
<7>[ 1737.932793] i2c i2c-0: ioctl, cmd=0x720, arg=0x7fbbe8fc
<7>[ 1737.932834] i2c i2c-0: master_xfer[0] W, addr=0x03, len=0
<7>[ 1737.933647] i2c i2c-0: NAK from device addr 0x03 msg #0
<7>[ 1737.933746] i2c i2c-0: ioctl, cmd=0x703, arg=0x04
<7>[ 1737.933790] i2c i2c-0: ioctl, cmd=0x720, arg=0x7fbbe8fc
<7>[ 1737.933826] i2c i2c-0: master_xfer[0] W, addr=0x04, len=0
<7>[ 1737.934612] i2c i2c-0: NAK from device addr 0x04 msg #0
<7>[ 1737.934702] i2c i2c-0: ioctl, cmd=0x703, arg=0x05
<7>[ 1737.934742] i2c i2c-0: ioctl, cmd=0x720, arg=0x7fbbe8fc
<7>[ 1737.934777] i2c i2c-0: master_xfer[0] W, addr=0x05, len=0
<7>[ 1737.935708] i2c i2c-0: NAK from device addr 0x05 msg #0
<7>[ 1737.935936] i2c i2c-0: ioctl, cmd=0x703, arg=0x06
<7>[ 1737.935981] i2c i2c-0: ioctl, cmd=0x720, arg=0x7fbbe8fc
<7>[ 1737.936028] i2c i2c-0: master_xfer[0] W, addr=0x06, len=0
<7>[ 1737.936809] i2c i2c-0: NAK from device addr 0x06 msg #0
<7>[ 1737.936886] i2c i2c-0: ioctl, cmd=0x703, arg=0x07
<7>[ 1737.936919] i2c i2c-0: ioctl, cmd=0x720, arg=0x7fbbe8fc
Lo vemos con un ejemplo: activar P7 preservando el estado de las demás salidas. Sabiendo que 0x10000000 equivale a 0x80,
Código:
prevState=$((i2cget -y 0 0x27)) # lectura del estado actual
newState=$(($prevState | 0x80)) #cálculo del nuevo valor respetando el estado previo
i2cset -y 0 0x27 $newState # escritura del nuevo estado
Si, estuve pensando en abrir otro hilo dedicado antes de postear, pero me da palo, no estoy a la altura como para iniciarlo... (Yo voy siempre por el camino largo de ensayo y error) Wink
CitarSi, estuve pensando en abrir otro hilo dedicado antes de postear, pero me da palo, no estoy a la altura como para iniciarlo... (Yo voy siempre por el camino largo de ensayo y error) Wink
No digas eso, hombre.... Si yo hiciera lo mismo, no habría posteado prácticamente nada. Te habla uno de los más ignorantes del foro y he aprendido muchísimo gracias a él; además, cuanta más experiencia y conocimiento compartamos, mejor: tanto de lo correcto como de lo incorrecto. Cuando hacemos algo mal aprendemos; y si lo compartimos, los demás también aprenden. Yo doy bastante caña; soy muy cabezota....
Bueno, lo dicho: Mañana o pasado... iniciaré un hilo con la movida esa de los relés. Me parece MUY interesante ese tema. Así que haré un "tuto" al mismo tiempo que lo aprendo. Me mola mucho la idea esa de usar la placa expansora para poder controlar varios relés; pero eso es lo que menos controlo; qué "comandos" tengo que enviar a la plaquita para abrir uno u otro relé, etc... Ya me he pedido un par de relés; aunque seguramente pediré una plaquita de esas de 4 como las tuyas; y un módulo de esos expansor, como el que usan las pantallitas LCD. Mi idea es ponerlo por ejemplo para controlar la iluminación del acuario y alguna cosilla más.
Ya que dices que no tienes nivel para iniciar un hilo, lo iniciaré yo con mucho menos nivel >:D ^-^ :P ;D ;D. Sé sabedor de que tus ayudas y comentarios serán honorablemente bienvenidos, Ficht.
..... La patilla P3 enciende o apaga el led que ilumina el fondo de la pantalla.
(http://i.imgur.com/gFdFOAA.jpg)
.....
Cita de: raphik..... La patilla P3 enciende o apaga el led que ilumina el fondo de la pantalla.
(http://i.imgur.com/gFdFOAA.jpg)
.....
¿Esa patilla P3...? ¿No está en la PCF8574? Estaría guay poder encender y apagar el led de iluminación de la pantalla por software.
i2cset -y 0 0x27 0x0
O sea, enviando un 0 a la patilla 0Rula !! :)Has probado 0x10 ??
Lo he probado con el comando:Código: [Seleccionar]i2cset -y 0 0x27 0x0
O sea, enviando un 0 a la patilla 0
De hecho, lo acabo de probar y vale con activar cualquier patilla de la 0 a la 3, (0x0 a 0x7).
(https://s1.postimg.org/1gcpvdx6nz/LCD.jpg)
Mola :)
Ahora sólo falta la señal hexadecimal para encender / apagar la pantallita sin alterar su contenido. Si la encuentro la pongo.
PD: No sé por qué mi móvil no enfoca bien la consola, la pantalla del ordenador. Es algo que nunca se me ha dado bien y me jode mucho, porque tengo un buen móvil con buena cámara, un Galaxy S5 y debería verse genial, pero no sé cómo coj... se hace para que enfoque bien la pantalla.
...Has probado 0x10 ??...
Cita de: Ficht...Has probado 0x10 ??...
Qué curioso... Pues ahora que me fijo,
4 bits pueden representar hasta un total de 16 valores (desde el 0000 hasta el 1111), sin embargo, sólo me funciona desde el 0000 (0x0) hasta el 0111 (0x7).
Acabo de probar el 0x10 que comentas y también apaga la pantallita.
Ni los valores
0x8
0x9
0xA
0xB
0xC
0xD
0xE
0xF
La apagan, en cambio el 0x10 sí. ???
Me falta el valor para volver a encender la pantallita. (No es que no me atreva, valor y coraje tengo de sobra, lo que me falta es el numerito hexadecimal ;D )
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
0x8f: nada
0x2f: nada
0x4f: nada
0xcf: nada
0xf: nada (este ya lo había probado)
¿Qué estás intentando, darme otro susto como el de los relés ;D?
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
0x8f: nada
0x2f: nada
0x4f: nada
0xcf: nada
0xf: nada (este ya lo había probado)
¿Qué estás intentando, darme otro susto como el de los relés ;D?
0xff y luego 0xef ??
Estoy envidiando no tener la panallita ;D
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
0x8f: nada
0x2f: nada
0x4f: nada
0xcf: nada
0xf: nada (este ya lo había probado)
¿Qué estás intentando, darme otro susto como el de los relés ;D?
0xff y luego 0xef ??
Estoy envidiando no tener la panallita ;D
Agua. Nada de nada.
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
0x8f: nada
0x2f: nada
0x4f: nada
0xcf: nada
0xf: nada (este ya lo había probado)
¿Qué estás intentando, darme otro susto como el de los relés ;D?
0xff y luego 0xef ??
Estoy envidiando no tener la panallita ;D
Agua. Nada de nada.
Imagino que al reconectar la pantalla se inicia encendida verdad?
si en ese caso haces un i2cget => a la dirección de esta, que estado revela?
...
Hola, has probado por ejemplo 0x8f ?
luego probaría también 0x2f ; 0x4f ; 0xcf ; 0xf
Sigue comentando a ver que sale...
0x8f: nada
0x2f: nada
0x4f: nada
0xcf: nada
0xf: nada (este ya lo había probado)
¿Qué estás intentando, darme otro susto como el de los relés ;D?
0xff y luego 0xef ??
Estoy envidiando no tener la panallita ;D
Agua. Nada de nada.
Imagino que al reconectar la pantalla se inicia encendida verdad?
si en ese caso haces un i2cget => a la dirección de esta, que estado revela?
Sí, se inicia encendida. Me devuelve su propia dirección: 0x27
No lo termino de entenderLíneas de datos: D7 D6 D5 D4, controlada por los cuatro primeros bits.
¿Cuál es la correspondencia de cada bit con cada linea de control?
Como ya dije en otro post, hace unos días freí las pistas de mi AR-5387un.
(https://i.imgur.com/kUQ7qFm.png)
Desde entonces he estado buscando la manera de conectar el LCD al puerto serie o al USB del router. Finalmente, he optado por una solución económica y facilona que pasa por utilizar un arduino nano de puente entre el router y el módulo LCD.
Es un proyecto interesante, pero que no tiene cabida en este hilo, dado que no utiliza GPIOs ni bus i2c.
Como ya dije en otro post, hace unos días freí las pistas de mi AR-5387un.Yo creo que "al menos los mortales" no podemos subir vídeos al foro... Yo lo que hago es buscar un alojamiento online o Youtube y poner el link...
(https://i.imgur.com/kUQ7qFm.png)
Desde entonces he estado buscando la manera de conectar el LCD al puerto serie o al USB del router. Finalmente, he optado por una solución económica y facilona que pasa por utilizar un arduino nano de puente entre el router y el módulo LCD.
Es un proyecto interesante, pero que no tiene cabida en este hilo, dado que no utiliza GPIOs ni bus i2c.
PREGUNTA: Quisiera subir un vídeo en otro hilo. ¿Cómo se hace?
Con las fotos lo que normalmente hago es subirla a un recurso de red (p.e., imgur) y publicar el enlace entre dos etiquetas [ img] y [ /img]Si, es verdad, pero hay una forma, si subes de nivel (saliendo de openwrt) en el foro, hay una entrada que se explica cómo subir vídeos de YouTube...
Con el vídeo, lo he subido a YouTube, pero no he podido publicarlo. Supongo que hago algo mal, porque peperfus sí ha podido publicar vídeos. (Ver mensaje https://foro.seguridadwireless.net/openwrt/proyecto-gpio-manejo-de-una-pantalla-lcd-via-bus-i2c/msg360114/#msg360114)
Por cierto, el vídeo de peperfus puedo verlo con M. Edge, pero no con IE.
[youtube]EYPsCChMwfk[/youtube]
Ok, ya lo he visto. Hay que poner sólo el "código" del vídeo youtube. Es decir, si la url del vídeo es, hay que poner únicamente lo que va detrás del signo igual:Código: [Seleccionar][youtube]EYPsCChMwfk[/youtube]
root@LEDE:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77
Hola.
Aquí estoy peleando con un LCD que ya no se por donde...
El comando i2cdetect da una salida un poco loca ¿a que puede deberse =así a priori=?Citarroot@LEDE:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77
Hola.
Aquí estoy peleando con un LCD que ya no se por donde...
El comando i2cdetect da una salida un poco loca ¿a que puede deberse =así a priori=?Citarroot@LEDE:~# i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
70: 70 71 72 73 74 75 76 77
A mí me suena a parasitismo en el cableado.
¿Has mirado si poniendo las resistencias pull-up se mejora la señal?
Comprueba que los pines estén bien soldados.
...
...
El problema debe ser ese, parasitismo, es posible que tenga que ver con algún relé interno de la placa (o diodos) en esos GPIO's, la pantalla la mudé al bus=0-I2C y ahí si le gusta, funciona bien.
Del cableado... jajaja ni me hables, por suerte tenía dos LCD iguales (mismo problema) y una de ellas la despiecé buscándole la música... el bus=1-I2C si me trabaja con un sensor de temperatura BMP280 correctamente, por eso buscaba el error en la pantalla (por tonto que suene... llevándome bien ^-^ )
Ahora me pelearé para que el script suelte " ºC " y "mbar" ;)
...
...
El problema debe ser ese, parasitismo, es posible que tenga que ver con algún relé interno de la placa (o diodos) en esos GPIO's, la pantalla la mudé al bus=0-I2C y ahí si le gusta, funciona bien.
Del cableado... jajaja ni me hables, por suerte tenía dos LCD iguales (mismo problema) y una de ellas la despiecé buscándole la música... el bus=1-I2C si me trabaja con un sensor de temperatura BMP280 correctamente, por eso buscaba el error en la pantalla (por tonto que suene... llevándome bien ^-^ )
Ahora me pelearé para que el script suelte " ºC " y "mbar" ;)
Eso es muy pero que muy interesante. ¡¡ Documentación y tutorial para seguir por favor !!
Esto es una droga !
;D
Precisamente hace unos días hice un "detector de tormentas casero", por menos de 2...3 € con una simple botellita de agua y un cuentagotas, siguiendo un videotutorial (https://www.youtube.com/watch?v=2k61W7fVkOs) que encontré en youtube. Lo del medidor de mbar me vendría de lujo para saber la presión exacta a la que funciona el "inventillo".
echo "bmp280 0x76" > /sys/bus/i2c/devices/i2c-0/new_device
root@LEDE:~# echo "scale=2; $(cat /sys/bus/iio/devices/iio:device0/in_temp_input)/1000" | bc
18.88 #valor en ºC
root@LEDE:~# echo "scale=2; $(cat /sys/bus/iio/devices/iio:device0/in_pressure_input)*10/1" | bc
1013.61 #valor llevado a mbar
#!/bin/sh
./lcd init
while true; do
./lcd 0 0 "$(echo "scale=2; $(cat /sys/bus/iio/devices/iio:device0/in_temp_input)/1000" | bc)*C "
sleep 0.5
./lcd 0 11 $(date +"%d-%m")
sleep 0.5
./lcd 1 0 "$(echo "scale=2; $(cat /sys/bus/iio/devices/iio:device0/in_pressure_input)*10/1" | bc)mbr "
sleep 0.5
./lcd 1 11 $(date +"%H:%M")
sleep 9
done
./lcd 0 0 "▀C"
Sólo hay que copiar y pegar.El mapa de caracteres de estos LCDs es:
(https://i.imgur.com/FQa8FDK.png)
El carácter que más se aproxima a º es el bx1101111 (223 en decimal y 0xDF en hexadecimal). Actualmente no tengo ninguna pantalla conectada al router y no puedo hacer pruebas, pero si te apetece podrías probar tú mismo si este código:Código: [Seleccionar]./lcd 0 0 "▀C"
Sólo hay que copiar y pegar.
Saludos.
./lcd 0 0 "Temperatura 19\337C"
@Fitch
El truco para escribir el carácter º consiste en pasarle al script su valor octal (que es \337).Código: [Seleccionar]./lcd 0 0 "Temperatura 19\337C"
(https://i.imgur.com/EcJS4z8.png)
Solución encontrada en http://todomarino.com/forum/temas/como-poner-el-s%C3%ADmbolo-de-%C2%BA-grados-en-la-temperatura.88667/
Saludos.
Temperatura 19¥337CNo se si el camino sería algo así
./lcd 0 0"Temperatura 19 $printf("%c" 0xdf)C" #esto está mal expresado, pero probaré a ver que saco
./lcd2 0 0 "Temperatura $(printf "%p" 0xdf ) "
pero no, no funciona este formato. ademas, ahora creo que usar printf es una redundancia con el propio script que ya lo haceecho "w,0,Texto que sale por pantalla haciendo scrolling " > /dev/ttyUSB0
echo "m,1,300" > /dev/ttyUSB0
@ Fitch
Lo intenté hace tiempo añadiendo código. El problema de los scripts es que no permiten manejar intervalos inferiores a un segundo. Al final opté por controlar la pantalla indirectamente, a través de un arduino. Tiene la ventaja de no soldar dentro del router y de no sobrecargarlo de código.
Se maneja enviando cadenas de texto al puerto serie.Código: [Seleccionar]echo "w,0,Texto que sale por pantalla haciendo scrolling " > /dev/ttyUSB0
La velocidad de cada línea se ajusta independientemente. (Si te fijas en el vídeo, la línea de arriba es más lenta que la de abajo).Código: [Seleccionar]echo "m,1,300" > /dev/ttyUSB0
Saludos.
@ eludi https://foro.seguridadwireless.net/openwrt/te-habla-tu-router/
Saludos.
@ eludi https://foro.seguridadwireless.net/openwrt/te-habla-tu-router/
Saludos.
Por favor, algún admin puede reparar el enlace? no va.
Gracias y perdón por la molestia.
Incluso estaría guay añadirlo al hilo de hilos relevantes.
Buenas... tengo unas dudillas
Le he ppuesto a un comtrend una pantalla LCD 2004, pero también quiero añadirle 4 relés. Lo tengo prácticamente hecho y funciona "bien". El problema es que creo que los 5V que saqué del router, no dan abasto para alimentar a los dos aparatitos a la vez y la pantalla pierde brillo, quedando prácticamente ilegible, o bien los relés empiezan a "temblar". Como no tengo demasiada idea de electricidad, pregunto: ¿es debido a que esos 5V no dan los suficientes miliAmperios para ambos a la vez? (Eso es lo que creo).
¿Podría sacar otros 5V de otro punto de la placa del router o todos comparten los mismos mA y estaría en las mismas?
¿Puedo alimentar por ejemplo, los relés con el router y la LCD con un USB de un cargador de móvil, que también da 5V?
En caso afirmativo.... ¿puedo darle los 5V del rojo del usb y devolver la parte negativa al negro (GND) del router o debo devolverlo también por el negro del mismo USB del cargador?
Y otra cosa más: quiero ponerle también tarjeta de sonido USB, así que me imagino que eso también le restará "fuerza" a los 5V del router.... ¿afectará también a la pérdida de tensión / intensidad para los relés...?
Gracias x 1000.
PD: si eso cuando lo termine pondré una foto, que lo voy a poner anclado a un tablón de madera. Me molaría mucho también ponerle lo que he visto por ahí que hay sensor de temperatura y de presión atmosférica, pero no sé si es tan "fácil" como lo de la LCD o hay que liarse mucho más. También tengo una plaquita con numeritos y unos pines, no sé si será también relativamente fácil como conectarla a la expansora de bus I2C y leer qué numerito se ha tocado. Raphik, creo que tenías algo de esto también. Sabes más o menos el nivel que tengo. ¿Lo ves muy chungo para mí o me animas a intentarlo?
Lo que pasa es que tengo una placa de 4 relés también conectada y cuando los voy encendiendo, los caracteres en la pantalla LCD se atenúan.Dices que cuando vas encendiendo relés, los caracteres del visor LCD se atenúan. Da la impresión de que la fuente de alimentación no proporciona toda la energía que los relés necesitan. Y, efectivamente, el positivo a VCC y el negativo a GND.
Dices que debo alimentar la plaquita de relés con un transformador aparte? ya tengo uno preparado.
Lo que se me había ocurrido es conectarle el negativo a tierra y el positivo al VCC (5V). ¿Es correcto?
¿Por qué dices que tengo que conectar la tierra de la plaquita de relés a la tierra del router? ???Las placas de relés son distintas unas de otras, dependiendo del fabricante. En realidad no podría decirte cómo va conectada la tuya. No hagas mucho caso de lo que dije.
Te refieres a.... sólo conectar los 5V (el positivo) del trafo a la plaquita, dejando el negativo sin conectar
Y conectar el negativo de la plaquita de relés al GND del router ??
El problema que comentaba.... la electricidad para los relés se la doy del router, y para la pantallita le he conectado electricidad desde un cargador de móvil, que saca 5 V.
La pantalla se enciende perfectamente, pero no funciona, no muestra nada de nada.
Cuando le pongo lcd_write me da: "Error: Write failed"