Hoy se me ha ocurrido hacer algo para quitarme tareas de encima, no les ha ocurrido que su mujer los llama diciendo «no funciona internet, ¿Qué le pasa?» J y nosotros a 20kilometros de distancia deberíamos saber lo que ocurre por telepatía 2.0 J
Por eso se me ocurrió un indicador que nos informe con levantar la mirada, si el problema el local o de internet, por ejemplo me ha pasado que el proveedor hace modificaciones y se corta, en esos caso es bueno saberlo para no tocar o modificar nada sin estar seguro que el problema es nuestro.
O quizás para ver el estado de la red en todo momento. Saber si nuestra conexión a internet se encuentra saturada o caída, o tenemos algún servidor de internet que nos interesa saber cuándo se cae.
He realizado un diseño con PINGÜINO un programa simple y un script en el equipo a donde conectemos el puerto serie del PINGÜINO.
Es básicamente la misma configuración del proyecto RGB wifi, que utilizando la comunicación RS232 puede ordenar a PINGÜINO que encienda uno u otro color o led.
En este caso controlaremos dos leds RGB, un BUZZER y si queremos también un servo (esto último no lo tengo terminado en cuanto a hardware, pero si el código)
El script que pongo en la fonera (pueden utilizar un linux cualquiera, corrigiendo las compatibilidades de los devices)
Lo he puesto en el directorio /sbin y lo he llamado check.sh, lo he realizado como para que cada 20 segundos controle la conexión a internet y el router de salida. Esta es la versión funcional, ahora estoy en una con controles de TTL y calidad de conexión. Para que según la congestión nos informe o no.
Este script le dice al PINGÜINO via puerto serie, que controle dos servidores y que encienda la puerta 7 cada vez que recibe mensajes, y que se vean los puertos 4 y 1 cuando los servidores se encuentran online, y 6 y 3 cuando el ICMP no regresa. O sea, cuando se cae internet.
[sourcecode language=»c»]
while [ 0 ]; do
sleep 20
internet=www.google.com
sr1=192.168.99.1
countint=$(ping -c 1 -W 2 $internet | grep ‘received’ | awk -F’,’ ‘{ print $2 }’ | awk ‘{ print $1 }’)
countsr1=$(ping -c 1 -W 2 $sr1 | grep ‘received’ | awk -F’,’ ‘{ print $2 }’ | awk ‘{ print $1 }’)
echo 7 > /dev/ttyS0
if [ "$countint" = "0" ]; then
echo "$internet PING [FAILED]"
echo 6 > /dev/ttyS0
else
echo "$internet PING [OK]"
echo 4 > /dev/ttyS0
fi
if [ "$countsr1" = "0" ]; then
echo "$sr1 PING [FAILED]"
echo 3 > /dev/ttyS0
else
echo "$sr1 PING [OK]"
echo 1 > /dev/ttyS0
fi
done
[/sourcecode]
Ahora hay que ponerlo en el inicio y que se ejecute solo cuando inicia el equipo.
Creando otro archivo en el directorio /etc/init.d con el nombre check.sh y con lo siguiente dentro, tendremos nuestro inicio automatico.
[sourcecode language="c"]
#!/bin/sh /etc/rc.common
#
START=87
start()
{
/sbin/check.sh &
}
stop()
{
killall check.sh
}
[/sourcecode]
Recordemos ejecutar "/etc/init.d/check.sh enable" para que se guarde entre los RC de inicio.
CODIGO PINGÜINO
[sourcecode language="py"]
#define PIC18F4550
#define tempo 250
#define buzer 2000
#define RUNLED PORTAbits.RA4
int counter=0;
int i;
int key;
void setup()
{
for (i=0;i<8;i++) {
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
Serial.begin(9600);
}
void loop()
{
RUNLED=1;delay(500);RUNLED=0;delay(500);
if Serial.available()
{
int count=0;
key=Serial.read();
Serial.print("Puerto serie Listo!!!\n\r");
if (key=='1') digitalWrite(2,1),digitalWrite(1,0),digitalWrite(0,0);
if (key=='2') digitalWrite(2,0),digitalWrite(1,1),digitalWrite(0,0);
if (key=='3') {for (count=0;count<10;count++){digitalWrite(1,0),digitalWrite(2,0);digitalWrite(0,1);delay(tempo);digitalWrite(0,0);delay(tempo);}}
if (key=='4') digitalWrite(5,1),digitalWrite(4,0),digitalWrite(3,0);
if (key=='5') digitalWrite(5,0),digitalWrite(4,1),digitalWrite(3,0);
if (key=='6') {for (count=0;count<10;count++){digitalWrite(4,0),digitalWrite(5,0);digitalWrite(3,1);delay(tempo);digitalWrite(3,0);delay(tempo);}}
if (key=='6') digitalWrite(6,1), delay(buzer),digitalWrite(6,0);
if (key=='7') {for (count=0;count<5;count++){digitalWrite(7,1);delay(100);digitalWrite(7,0);delay(100);}}
}
}
[/sourcecode]
Si queremos agregar un servo controlado por algún carácter solo deberíamos agregar los siguiente.
[sourcecode language="py"]
#define PIC18F4550
#define tempo 250
#define buzer 2000
#define RUNLED PORTAbits.RA4
int control_pin=0; //servo
int position=0; //posición servo
int counter=0;
int i;
int key;
int pulseWidth = 20; //pulso de servo
void setup()
{
for (i=0;i<8;i++) {
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
Serial.begin(9600);
//servo config
pinMode(control_pin,OUTPUT);
T1CON=0x01;
PIE1bits.TMR1IE=1;
INTCON|=0xA0;
}
//control de angulo del servo
void UserInterrupt()
{
if (PIR1bits.TMR1IF)
{
TMR1H=0xFF;
TMR1L=0x9C;
PIR1bits.TMR1IF=0;
counter++;
if (counter==1500) counter=0;
if (counter>position+51) PORTBbits.RB0=0;
else PORTBbits.RB0=1;
}
}
void loop()
{
RUNLED=1;delay(500);RUNLED=0;delay(500);
if Serial.available()
{
int count=0;
key=Serial.read();
Serial.print("Puerto serie Listo!!!\n\r");
if (key=='1') digitalWrite(2,1),digitalWrite(1,0),digitalWrite(0,0);
if (key=='2') digitalWrite(2,0),digitalWrite(1,1),digitalWrite(0,0);
if (key=='3') {for (count=0;count<10;count++){digitalWrite(1,0),digitalWrite(2,0);digitalWrite(0,1);delay(tempo);digitalWrite(0,0);delay(tempo);}}
if (key=='4') digitalWrite(5,1),digitalWrite(4,0),digitalWrite(3,0);
if (key=='5') digitalWrite(5,0),digitalWrite(4,1),digitalWrite(3,0);
if (key=='6') {for (count=0;count<10;count++){digitalWrite(4,0),digitalWrite(5,0);digitalWrite(3,1);delay(tempo);digitalWrite(3,0);delay(tempo);}}
if (key=='6') digitalWrite(6,1), delay(buzer),digitalWrite(6,0);
if (key=='7') {for (count=0;count<5;count++){digitalWrite(7,1);delay(100);digitalWrite(7,0);delay(100);}}
if (key=='n') position=75; //control del servo
if (key=='m') position=0; //control del servo
if (key=='b') position=150; //control del servo
}
}
[/sourcecode]
Aquí vemos el PINGÜINO 18f2550 con los 3 leds RGB conectados a los puertos 0 a 7. Solo 8 colores. El 9º puede ser de piloto.
Aquí vemos los mismos por fuera de la caja, luego les pondre una etiqueta para identificarlos.
Aquí vemos la conexión serie de la fonera (con el adaptador de voltajes) que se conecta al puerto serie del PINGUINO
Mas de cerca?!
Una vista general con la salida serie y el puerto USB conectado, este último no es necesario ya que una vez programado la alimentación la provee el puerto serie, ya que tiene una línea de 5volts, que proviene de la fonera.
found your site on del.icio.us today and really liked it.. i bookmarked it and will be back to check it out some more later