por Guido Socher (homepage)
Sobre el autor:
Guido ama Linux, no solo porque es divertido descubrir las grandes
posibilidades de estos sistemas, sinó también por la gente involucrada
en su diseño.
Taducido al español por:
Alberto Clifton Goldney <sauronx00(at)yahoo.com>
Contenidos:
|
Un panel de control LCD para tu servidor Linux
Resumen:
En este artículo vamos a diseñar un panel de control LCD basado en un
visor LCD Hitachi HD44780 y el Microcontrolador RISC AT90S4433 AVR 8-Bit
de Atmel. Ambos componentes son muy comunes y baratos. El panel de control
incluye un dispositivo de vigilancia que supervisa la computadora y tiene
dos botones para facilitar el diálogo con el usuario.
Puedes setear direcciones IP, mascaras de red, direcciones de pueras de
enlace, apagar la computadora, leer estadísticas, básicamente cualquier
cosa que quiera, porque la mayoría de la lógica es implementada con un
conjunto de instrucciones (script) en perl y puede ser modificado facilmente.
El panel está conectado a la computadora a través de una linea serie RS232.
Para este artículo necesitará por lo menos una instalación parcial del entorno
de desarrollo para Linux AVR. La configuración de esto está descripto en este
artículo: Programando el Microcontrolador
AVR con GCC.
Introducción
Este dispositivo básicamente combina funcionalidades de hardware que
fueron utilizadas en artículos anteriores:
Nuestro nuevo diseño sin embargo va mucho mas allá de eso. Incluye botones para
interactuar con el usuario e incluye un dispositivo de vigilancia por hardware
para supervisar al servidor. Como ampliación, el hardware provee una línea de
ingreso analógica. No la utilizaremos aquí, pero usted puede conectarle por ej.:
un sensor de temperatura.
Para diseñarlo, necesitará algunos elementos de hobby electrónico. Los elementos que
utilizaremos son baratos, y el costo total, será menor a 40 euros.
La idea detrás de este panel es que va a permitirle controlar un servidor sin monitor
ni teclado. Linux es un sistema operativo servidor muy confiable y puede ser facilmente
controlado remotamente. Sin embargo cuando uno se conecta por primera vez a una red,
necesitará configurar la dirección IP, puerta de enlace, y la mascara de red. Este panel
de control permite configurar estas direcciones. Brinda igualmente la posibilidad de
apagar el servidor mientras se está dentro del cuarto de servidores.
El diseño de este panel es muy genérico. Todas las partes "especificas del servidor"
están implementadas en un conjunto de instrucciones (script) en perl. El hardware completo,
el estado de los botones, el texto en la pantalla, LEDs ..., pueden ser controlados a través
de comandos ASCII. Por eso usted puede usar el diseño para construir un reproductor mp3, o
para controlar su grabadora de CD, o cualquier cosa que quiera.
Qué necesita?
Para contruir esto usted necesita los siguientes componentes:
1 x Atmel At90S4433 Microcontrolador
1 x 28pin 7.25 mm IC zócalo
1 x 16pin IC zócalo
1 x MAX232
1 x small 5V relé
1 x 4MHz cristal
2 x LEDs (verde y rojo)
1 x BC547 NPN transistor
1 x BC557 PNP transistor
4 x 1uF capacitor (común o polarizado)
2 x 27pF capacitor cerámico
1 x 10nF capacitor
1 x 100nF capacitor
3 x resistencia 4k7
2 x resistencia 2k2
1 x resistencia 10K
1 x resistencia 3k3
2 x resistencia 100 Ohm
3 x resistencia 470 Ohm
3 x resistencia 1k
1 x resistencia 220 Ohm
1 x 4K7 potenciómetro (lo más pequeño posible)
1 x Z-diodo 4.3V
2 x botones al tacto pequeños
1 x diodo standard pequeño (e.g 1N4148, cualquier diodo barato)
1 x 2 lineas de 20 carácteres LCD pantalla con HD44780 interface compatible.
Todas las pantallas LCD que he visto con 14 o 16 pins en el conector eran compatibles
con el HD44780. Igualmente usted puede utilizar una pantalla de 3 o 4 lineas pero luego
necesitará modificar un poco el software.
Además de eso usted necesitará algunos cables y conectores para la fuente de poder y el
RS232. Si tiene una pantalla de 2 líneas entonces usted puede montarla en una fina hoja
de metal de aluminio y encajarla en una bahía de 5.25" en el servidor.
Esquema y placa
Utilicé "eagle" para Linux para diseñar el esquema y la placa. Es un software excelente
pero necesitará algún tiempo para aprender como utilizarlo. Puede obtener la versión
gratis para uso particular en cadsoftusa.com.
El esquema (haga click para una imagen mayor):
La placa (haga click para una imagen mayor):
Distribución de la placa con fondo blanco para una mejor impresión:
placa con fondo blanco (Nota: Este no es el archivo que
necesita para realizar la placa del circuito impreso.)
Los archivos de "Eagle" (comprimidos con gzip, algunos navegadores inteligentes
los descomprimiran durante la bajada):
El circuito
Voy a explicar brevemente el siguiente diagrama del circuito. El AT90s4433 tiene
3 puertos: PB, PC y PD. PC puede ser utilizado como un puerto de ingreso tanto
analógico como digital. Todos los puertos pueden ser utilizados como líneas
digitales de ingreso o de salida. Esto es controlado por programa vía la DDR
(Registro de dirección de datos). Utilizaremos todos los pines para líneas
digitales (0 o 5 voltios), excepto la 23. El Max232 es un convertidor de nivel
de voltaje. La interface RS232 utiliza +-10V y el Max232 convierte esto a 0-5V.
En la pin 1 (pin de reset) del AT90S4433 encontrará algo denominado circuito
de "apagado parcial". Este circuito mantiene el reset bajo (activo) durante los
momentos de insuficiente carga electrica para prevenir a la CPU de ejecutar intrucciones
erroneas o mal funcionamiento general. Esto puede suceder por unos pocos milisegunodos
durante el encendido y el apagado. Asegura basicamente que el programa en el
Microcontrolador es inicializado correctamente.
Algunos de ustedes se preguntaran porqué hay un diodo en paralelo a la bobina
del relé y porque la polaridad tal como se vé, nunca va a tener nada que hacer. Este
diodo es muy importante! Cuando apaga el relé, luego la bobina genera un voltaje muy
grande. Este puede destruir al Microcontrolador. Este voltaje tiene una polaridad
opuesta al voltaje suministrado en la bobina. El diodo puede ser cualquier diodo pequeño
y barato, nada especial, pero es importante tener el diodo.
Como hacer la placa del circuito impreso
Para grabar la placa del circuito impreso necesitará primero imprimir este archivo postscript (linuxlcdpanel.ps.gz)
en una lámina transparente. En negocios para arquitectos puede obtener algunos láminas
plasticas semi-transparentes plastic denominadas Sinolit. Es producido por "Regulus" y es
utilizado normalmente para impresión en offset. Otra buena alternativa es papel de 60 grs.
+ aerosol transparente (pausklar 21 de Química Kontakt). La ventaja del papel y el Sinolit es
que el toner de las impresoras Laser realmente se pega en el papel/lámina y provee un buen
contraste.
He convertido el archivo postscript a PDF
en caso de que no tenga un sistema de impresión postscript. La calidad sin embargo es bastante
pobre.
El tiempo de exposición para las placas fotograficas recubriertas de cobre depende de la fuente
de luz. Una exposición casera normal está entre 1 y 2 Minutos.
Usted puede igualmente utilizar luz dia pero intente evitar luz solar directa (es muy fuerte).
Debe experimentar un poco con pequeñas tiras de placas fotograficas para obtener el mejor
tiempo de exposición antes de utilizar la verdadera placa.
|
La placa expuesta y revelada antes de grabar. |
La placa expuesta necesita luego ser revelada por varios minutos en
NaOH (hidróxido de sodio - soda cáustica). Después deberá comprobar
cuidadosamente el resultado y hacer las correcciones con un marcador
Edding 780 negro (no los marcadores permanentes para gastos generales,
es un marcador con real pensamiento pintura). Usualmente realizo los
placas un poco más grande porque encontré que los placas de Eagle son
muy pequeños para utilizar en hobbys.
|
La plaqueta confeccionada antes de realizar las orificios |
Nota: De algún modo parece imposible para los fabricantes ponerse de acuerdo
en y convenciones de nombres para relés. Yo utilicé un pequeño relé de 5V
fabricado por Matsushita. Vuestro relé puede tener distinta distribución de
pines por eso cambie la plaqueta según necesite. (con un marcador de pintura
resistente a la grabación - grabado -). (with an etch resistant paint marker).
Cuando usted esté satisfecho puede grabar la placa en cloruro férrico (FeCl3).
FeCl3 tiene buena velocidad de grabación a temperatura ambiente. Es muy fácil
de usar y por eso bueno para usar en casa. Usted obtendrá los mejores resultados
si la placa está en posición vertical en un recipiente alto. Los iones de cobres
son más pesados que los iones de hierro y si usted derrama el FeCl3 dentro de un
tubo delgado y plano, luego los iones de cobre se acumularán en el fondo, donde
está la placa.
Cuando la placa este lista, limpie la tinta del marcador Edding con trementina.
Puede dejarle la "tinta" foto resistente. Esta se evaporará cuando suelde y proteja
el cobre.
El software para el Microcontrolador
El software para el Microcontrolador está organizado en los siguientes archivos.
- lcd.c, lcd.h,
lcd_hw.h: Esta es la librería avr LCD genérica. Y está basado en el trabajo
de Peter Fleury (http://jump.to/fleury). Esta versión está un poco modificada y
más flexible. Le permitirá conectar el hardware LCD a cualquiera de los pines en
el Microcontrolador. Usted necesitará cambiar la definición en el archivo lcd_hw.h.
- avr-util.c,
avr-util.h: funciones para obtener diferentes tiempos de demora.
- uart.c, uart.h:
Esta es una librería para la interface RS232. Utiliza interrupciones por
hardware. Cada vez un caracter es recibido desde la computadora,
la función SIGNAL(SIG_UART_RECV) es ejecutada y los datos copiados desde
el búfer de recepción a un búfer de cadena. El lenguaje de comando para
nuestro panel LCD es diseñado tal que cada comando finalice con un caracter
de nueva línea. Cuando una nueva línea es encontrada luego una indicador,
(uart_rx_linecomplete) es establecido y los datos quedan disponibles. Igualmente
esto significa que usted no debe enviar comandos a la pantalla muy rápidamente,
sino que debe esperar un poco (un milisegundo), luego de cada línea. Cada comando
va a ser confirmado por un resultado, ok, o err (por error). El programa conductor
(en perl)puede, por eso utilizar el resultado como un disparador para enviar el
siguiente comando.
- analog.c,
analog.h: Código para el convertidor analógico digital. Es otra vez el manejo
de interrupciones (It's again interrupt driven.) Una simple conversión análoga a
digital es comenzada, y luego el programa aguarda por la interrupcion SIG_ADC para
leer el resultado desde el registro ADC.
- hardwarewd.c,
hardwarewd.h: Este es el dispositivo de vigilancia. Utilizamos el divisor interno
(divide por 1024) para arrancar al temporizador (timer). El temporizador es un registro
de 16 bit, cuando obtenemos un "overflow" disminuimos una variable de 8 bit.
Con un cristal de 4MHz disminuiremos nuestra variable aproximadamente cada 16 segundos.
El programa en perl señala que la computadora todavia esta "viva", ajustando la variable
periódicamente a un valor alto. Si falla al hacer esto (porque la coputadora se "cuelga")
porque el valor de la variable disminuye todo el tiempo y cuando alcanza cero, el relé va
a realizar un "click-clack" y restablecerá el hardware del servidor.
- linuxlcdpanel.c:
Este es el programa principal. Va a verificar continuamente por comandos de la interface
RS232 y eventos del boton.
Para comprender el software en detalle, recomiendo que usted lea la hoja de datos del
Microcontrolador. Está disponible en la sección de referencia al final del artículo
(o en www.atmel.com)
Sin embargo para utilizar este panel usted no necesita comprender el software, usted
solo necesita desempaquetar el archivo del código fuente (tomar el linuxlcdpanel-0.7.tar.gz
desde página para bajarlo) y escribir:
make
make load
O usted igualmente puede utilizar el software pre-compilado y cargarlo con el comando:
make "cargarpreconstruido"
Muy simple. Encontrará una descripción de como programar el Micontrolador en el primer
artículo:Programando el Microcontrolador con GCC.
Comrobando el panel LCD
El panel LCD es diseñado para trabajar con la fuente de poder interna de 5V del servidor
(cable rojo=5V, cable negro=tierra). Sin embargo no debe conectarlo desde el primer
momento a la fuente de poder. Usted pudo hacer cometido un pequeño error durante la
soldadura y en el proceso de montaje. La fuente de poder de la computadora es muy fuerte
y ambos, tu computadora y la plaqueta pueden ingresar en una nobe de humo si cometes un
error. Primero pruébala con una fuente de poder externa, electrónicamente limitada y
estabilizada !. Ahora debe bajar el software a la EEPROM como se describió arriba.
Luego de eso deberá ver en la pantalla LCD un banner que diga "linuxfocus.org".
Ahora conecte la interface RS232.
MAX232 pin 14 to CTS (DB-9 pin 8)
MAX232 pin 7 to RXD (DB-9 pin 2)
MAX232 pin 13 to TXD (DB-9 pin 3)
Necesita igualmente conectar DTR, DSR y CD con cada una (DB-9
pin 4, 6 and 1)
Esto igualmente está bien documentado arriba en el diagrama del circuito.
Para utilizar la línea serie usted necesita inicializarla.
El archivo del código fuente linuxlcdpanel-0.7.tar.gz contiene un programa
denominado ttydevinit el cual realiza exactamente esta inicialización.
Vamos a decir que hemos conectado el panel al COM2 (ttyS1) luego necesitará
ejecutar una vez el comando:
./ttydevinit /dev/ttyS1
Ahora el controlador de la linea serie es inicializado para utilizar 9600 baudios
y usted puede comenzar a "hablar" con el panel LCD. Abra 2 pantallas Xterm.
En una tipee "cat /dev/ttyS1" y en la otra tipee "cat > /dev/ttyS1". Ahora
puede por ejemplo tipear el comando l=11 (enciende LED 1) or l=10 (apaga LED 1).
Puede ver en la primera sesión (xterm), que el panel LCD reconoce los comandos
con un "ok".
Todos los comandos disponibles están explicados en el archivo
README.commands .
El archivo del código fuente contiene un script perl denominado ttytest.pl
que no hace más que encender y apagar el led rojo a intervalos. Esto quiere
decir que es para ser utilizado como un simple programa de ejemplo que muestra
como manejar el panel LCD. Puede utilizarlo como base para tu propio programa.
Revise el código fuente. Esto requiere algún conocimiento de perl, pero es
más bien un programa corto.
Conectando el dispositivo de vigilancia
El dispositivo de vigilancia por defecto está apagado. Puede encenderlo con el
comando w=1 y se establece el tiempo de espera con s=x donde x es un valor entre
1 y 255. Ejemplo: s=10 permitirá que el tiempo de espera del dispositivo de
vigilancia sea 10*16 seg. = 160 seg.
El programa controlador necesita establecer el tiempo de espera periodicamente
para evitar que el dispositivo de vigilancia se dispare. Si el servidor alguna
vez se bloqueara, entonces el programa controlador no va a reestablecer el tiempo
de espera y el dispositivo de vigilancia se disparará. Yo conozco servidores
Linux que casi nunca se han colgado. Sin embargo si ellos se cuelgan y quedan
trabados, usualmente no hay nadie en el sitio para presionar el boton de reset o
nadie conoce donde esta el servidor puesto que no hubo problemas con el en los
ultimos 2 años.
El dispositivo de vigilancia esta diseñado de tal modo que solo se dispará una vez.
Esto es para evitar que se dispare nuevamente durante el chequeo del sistema de
archivos que probablemente seguira luego del reseteo. Cuando un servidor levante,
el programa controlador necesita estar listo nuevamente.
Para conectar físicamente el dispositivo de vigilancia necesitara encontrar los 2
cables que van al boton de reset del servidor. Necesita conectar este boton de reset
en paralelo con el relé desde el dispositivo de vigilancia.
Cómo utilizar el dispositivo de vigilancia
El dispositivo de vigilancia garantiza que el sistema está siempre disponible para
ejecutar programas. Esto no garantiza que un Servidor Web o una aplicación de base
de datos va a continuar corriendo y respondiendo. Para verificar tal cosa deberá
utilizar una entrada en la tabla de tareas programadas del "cron" u otro programa.
Puede estar realmente seguro que la tabla de cron probablemente esté trabajando
porque el dispositivo de vigilancia asegura que el software en general está todavía
ejecutándose.
Usted por ejemplo puede diseñar un "script" que sea activado por un "cronjob" y baje
una página Web del servidor cada 15 minutos, pero tiene que ser cauteloso con eso:
Un servidor Web puede ponerse pesado por muchas solicitudes y luego es normal que no
responda a todas ellas. Por eso debe contar que tan frecuentemente el servidor Web no
responde y si por ejemplo no responde ni una vez entre las 10 comprobaciones se
restaurará el servidor Web o lanzar un reboot normal (no un reset a través del
dispositivo de vigilancia).
Aparte de la aplicación usted debe igualmente monitorear la utilización del disco.
Los siguientes comandos shell van a retornar algo sí una de las particiones del disco
llegara a estar lleno más del 80%:
df | egrep ' (8.%|9.%|100%) '
Esto (nuevamente) puede utilizarse en combinación con una entrada en la tabla de tareas
programadas del "cron", como una comprobación regular del uso del disco.
Los scripts en el Servidor
Casi toda la lógica de nuestro panel LCD est implementada en un script en perl
denominado llp.pl, copiar este archivo en /usr/sbin/. Después copie el programa
ttydevinit a /usr/bin y el archivo ifconfig_llp.txt (del directorio etc del archivo
del código fuente) a /etc. Ahora edite el ifconfig_llp.txt y cambie las direcciones
como necesite:
NETMASK=255.255.255.0
IPADDR=10.0.0.4
GATEWAY=10.0.0.2
Ahora realice un backup del script original /etc/rc.d/init.d/network
y copie el script de etc/network del archivo del código fuente a
/etc/rc.d/init.d/network. Este script y los nombres de directorios son
sólo válidos para Redhat y Mandrake. El script etc/network_all_distributions
es más básico y va a funcionar con cualquier distribución Linux pero
necesitará averiguar donde tiene su distribución Linux los directorios init-rc.
Es ligeramente diferente de distribución a distribución.
Edite el archivo /etc/rc.d/init.d/network y cambie la línea
/usr/sbin/llp.pl /dev/ttyS1&
si no utiliza el COM2.
Ahora puede correr
/etc/rc.d/init.d/network start
y verá su panel LCD en acción. Nota: es más seguro tocar alrededor y
modificar la dirección IP. Los cambios sólo tendrán efecto luego del
próximo reboot. Por eso pruébelo y luego cambielo nuevamente, antes
de apagar el servidor (igualmente puede editar /etc/ifconfig_llp.txt
para deshacer los cambios).
Archivos de Log
El script llp.lp escribe un archivo de log /var/log/llp.log. Este log
crecerá lentamente. Normalmente no habrá necesidad de rotarlo automáticamente.
Puede rotarlo con un programa como "logrotate" si desea.
No hay necesidad de avisar cuando hubo una rotación.
Una línea del archivo config para el logrotate puede verse como esto:
/var/log/llp.log {
nocompress
monthly
}
El log contendrá entradas cuando el sistema fue apagado manualmente,
una dirección IP fue modificada (IP, GW, netmask) o cuando el hardware del
dispositivo de control disparó un reset. Naturalmente puede loggear el tiempo
de espera del dispositivo de vigilancia cuando esto suceda (porque el sistema
se cuelga) pero en su lugar se va a registrar en el proximo encendido)
El panel en operacion
Aqui hay algunas capturas de pantallas del panel LCD en operacion.
Estas no son todas las funciones ofrecidas por este panel. Hay mas y usted
puede incluir las suyas.
La pantalla principal. Mostrando algun nombre (linuxfocus en este caso),
el tiempo de operacion y de carga. Esto se actualiza periodicamente.
Menu de configuracin de la direccion IP
Ejemplo de una direccion IP que esta siendo modificada
Como modificar la direccion del gateway (ruta por defecto)
Conclusion
Para construir este panel LCD requiere algunas habilidades de hobby
electronico pero no es un circuito muy complejo. Nuestro panel LCD
Linux ofrece mas funcionalidad que otros paneles de control que cualquier
otro que haya visto, y es muy generico y barato.
Feliz soldadura :-)
References
Formulario de "talkback" para este artículo
Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
2002-08-26, generated by lfparser version 2.21