lunes, 5 de mayo de 2008

Arduino Flush-O-Matic

Este fin de semana, se me ocurrió hacer un dispositivo que jalara la palanca del excusado, o en otras palabras, que tirara de la cadena del WC (water closet). Como el sistema iba a necesitar de alguna parte mecánica, para jalar la palanca, lo más indicado fue usar un servomotor.
A continuación les mostraré paso a paso como lo hice, de igual forma puede servir como tutorial.

Material:
  • Arduino Diecimila
  • Protoboard
  • Servo HS-311
  • 2 Leds (rojo y verde)
  • Sumbador
  • Pushbutton
  • Display LCD Hitachi
  • 2 resitencias: una de 4.7k a 10 kohms (para el pushbutton) y otra de 1 kohm(para el sumbador)
  • Cable, el necesario para hacer las conecxiones en el protoboard (20 aprox)
  • Eliminador de corriente de pared
  • Alambre, el necesario para montar el servo al excusado
Primero, lo que hice fue un pequeña estructura con el alambre para sostener el servo al tanque del excusado, lo dibujé antes para darme una idea de como moldear el alambre.
Lo monté en el tanque para revisar que quedara bien y si nó hacer pequeñis ajustes con las pinzas
Después, monte en el protoboard el Arduino (sujetado por una liga) y el display LCD con la finalidad de ver que pines digitales me quedaban libres. El objetivo del display es mostrar un mensaje de acuerdo al proceso en el que se encontrara el sistema. Para el display usé la librería LCD4bit, de este modo usaria menos pines que la libreria LiquidCrystal. Los mensajes que se mostrarán los siguientes:
  • Ready (Listo)
  • Flushing... (Jalando...)
  • Well done! (Bien hecho!)
loading, please wait... (cargando, por favor espere...)
  • almost ready... (casi listo...)

Noten que los leds prenden de acuerdo al mensaje, en el caso del loading prende el rojo, y mientras eso sucede no se puede accionar el sistema nuevamente, hasta que el mensaje de Ready aparezca.

Una vez que probé el display con un pequeño programa para ver que el ciclo de los mensajes funcionara, intenté conectar el servo. Usé la librería ServoTimer1, pero aquí fue donde tuve el mayor problema. Yo pensaba que el servo lo podía conectar a cualquier pin digital, y despues de algunas horas de pelearme con el circuito y no lograr que funcionara el servo, se me ocurrió revisar los archivos del la librería de ServoTimer1, hasta que por fin me topé en el Header la parte donde decía: // Only works for 9 and 10, supuse que se refería a los pines, pero el problema en realidad fue que el display estaba utilizando esos pines, lo cual me llevó necesariamente a modificar la libreria del display.

Busqué en el archivo cpp de la librería hasta encontrar la parte:

//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.

justo ahi se encontraba la parte de los pines, asi que como el pin 6 no lo estaba ocupando, recorrí todo un número, quedando de la siguiente forma:

//DB should be an unseparated group of pins - because of lazy coding in pushNibble()
int DB[] = {6, 7, 8, 9}; //wire these to DB4~7 on LCD.

guardé el archivo y abrí el software Arduino, para ver si ya funcionaba, pero no fue así. Busqué en internet cual podría ser el error, y me dí cuenta que solo tenia que borrar el archivo LCD4bit.o y volverlo a compilar en el software de Arduino. Finalmente funcionó el servo, pude haber recorrido más los pines del display, para usar los dos pines de ServoTimer1, pero como solo ocupé uno, no fue necesario.

Monté el servo en el tanque para medir la distancia entre el servo y mecanismo del excusado, y con el alambre "conecté" el servo con el mecanismo, para que el servo jalara la palanca. Hice algunas pruebas con el Arduino, para ver cuantos grados tenia que hacer girar el servo y de donde a donde, finalmente ví que, en la posición que lo coloqué, necesitaba hacerlo girar de 180° a 30°.
Si tú piensas realizar este proyecto, asegúrate de cerrar la llave de paso de agua del excusado, para no desperdiciar agua en pruebas.

Después de todo esto lo que quedaba era solo programación. A continuación pongo el codigo que escribí, para que cualquiera pueda usarlo o modificarlo a su gusto.

/*
Arduino Flush-O-Matic
por Mauricio Gomez
toolex.blogspot.com
mauriciogomezp@gmail.com
www.udlap.mx
*/
#include
#include

LCD4Bit lcd = LCD4Bit(2);
ServoTimer1 servo1;
int ledPing = 4;
int ledPinr = 3;
int buttonPin = 5;
int valor = 0;
int val = 0;
int bitPin = 13;

void setup()
{
Serial.begin(96000);
Serial.println("Ready");
servo1.attach(10);
lcd.init();
pinMode(ledPing, OUTPUT);
pinMode(ledPinr, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(bitPin, OUTPUT);
}

void loop()
{
val = digitalRead(buttonPin);
digitalWrite(ledPinr, LOW);
digitalWrite(ledPing, HIGH);
servo1.write(170);
lcd.clear();
lcd.printIn("Ready");
lcd.cursorTo(2, 0);
lcd.printIn(" ");
if (val == LOW){
digitalWrite(ledPing, LOW);
digitalWrite(ledPinr, HIGH);
lcd.clear();
lcd.printIn("Flushing...");
servo1.write(0);
digitalWrite(bitPin, HIGH);
delay(4200);
digitalWrite(bitPin, LOW);
digitalWrite(ledPinr, LOW);
digitalWrite(ledPing, HIGH);
lcd.clear();
lcd.printIn("Well done!!");
servo1.write(170);
delay(1500);
lcd.clear();
lcd.printIn("Loading...");
lcd.cursorTo(2, 0);
lcd.printIn("Please Wait");
digitalWrite(ledPing, LOW);
digitalWrite(ledPinr, HIGH);
delay(22000);
lcd.clear();
lcd.printIn("Almost Ready...");
delay(19000);
digitalWrite(ledPinr, LOW);
digitalWrite(bitPin, LOW);
delay(250);
digitalWrite(ledPinr, HIGH);
digitalWrite(bitPin, HIGH);
delay(250);
digitalWrite(ledPinr, LOW);
digitalWrite(bitPin, LOW);
delay(250);
digitalWrite(ledPinr, HIGH);
digitalWrite(bitPin, HIGH);
delay(250);
digitalWrite(bitPin, LOW);
}
}

la lógica de la programación no se me da mucho, así que si lo quieren criticar, sientanse en completa libertad.

Los leds, le pushbutton y el sumbador los coloqué de la siguiente forma:

pin2 = LCD
pin3 = led rojo
pin4 = led verde
pin5 = pushbutton con una resitencia de 4.7k a 10k conectada a Vcc, y del otro lado del pushbutton a tierra (GND). Yo le pegué una moneda (10 centavos) al pushbutton para que fuera más fácil de presionar
pin6 = LCD
pin7 = LCD
pin8 = LCD
pin9 = LCD
pin10 = data servo
pin12 = LCD
pin13 = + sumbador, del otro lado a tierra con una resitencia de 1k, esto es para que no suene tan fuerte el sumbador

todo los pines usados son los digitales y sólo fueron usados los mencionados anteriormente.

La configuración del display que yo tengo (genérico Hitachi 44780u) queda de la siguiente forma:

pin1 = GND
pin2 = Vcc
pin3 = GND
pin4 = Arduino pin12
pin5 = GND
pin6 = Arduino pin2
pin11 = Arduino pin6
pin12 = Arduino pin7
pin13 = Arduino pin8
pin14 = Arduino pin9

En general, el único problema que tuve fue el del servo y el lcd, fuera de eso fue un proyecto que pude hacer en un solo día. La idea original era poner un sensor de aproximación, en lugar del pushbutton, y que el dispositivo fuera automático, pero desgraciadamente no cuento con un sensor de ese tipo. En cuanto lo tenga haré la actualización. Además, este pretende ser una solución económica para el hogar en comparación con un fluxometro electrico de Helvex como los que hemos visto en los centros comerciales.

Lo he tenido instalado desde el fin de semana y ha funcionado perfectamente. Mi rommie se sorprendió al verlo, diciendo entre risa: esta muy chido! (vacano!/copado!/cool!)

Finalmente les dejo un video para que vean su funcionamiento




Cualquier duda, comentario o sugerencia serán siempre bien recibidas.

8 comentarios:

Arjan dijo...

No puede ser. Eres increible....

Abrazo,

Arjan

Anónimo dijo...

ya bajale el cierre...

Anónimo dijo...

Muy bueno ! Aprender arduino con proyectos asi, me gusta.
Quizas el proximo sera par distribuir el papel :-)

Tan lejos tan cerca dijo...

maravilloso, da gusto el detalle de la explicacion por que al ser paso a paso realmente es entendible.

Gracias por el ejemplo y cualquier cosa que hagas por favor publicala para aprender un poco mas.

saludos

pato

Adrián Santuario dijo...

es bueno encontrar que el arduino ya inunda en méxico.


saludos.

mariano dijo...

ummm.... tedrias que hacer algo para abrir la canilla algo luz o sonido,,,taria bueno......

NOE dijo...

NOOO MAAAANCHES MAU PORZO!! ESTA BIEN CHINGON!! VOY A IR A TU BAÑO MAS SEGUIDO!!!

Anónimo dijo...

Please check the video. Apparently EMI thinks they own toilets.