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.

jueves, 1 de mayo de 2008

M-Knob


Este podría ser de las primeras creaciones que hago desde cero, el M-Knob no es más que una cabeza de video montada sobre la tapa de una lata y con el scrolling de un mouse, que es lo que hace? bueno pues, exactamente eso, el scrolling de un mouse.

La idea la tomé a partir de un post del blog de Make Magazine, vi el ejemplo de como se podría hacer de forma alernativa un knob como el de Griffin.

Primero me decidí a hacerlo porque tenia los materiales necesarios para construir uno, incluso pensé en hacerlo mejor que en el ejemplo que ví. Pude ver que la cabeza que ahí usan es de una videocasetera, por lo tanto la cabeza es un poco grande y probablemente incomoda. También pude observar que la base donde está montado, es un rollo de masking tape, lo cual lo hace aún más grande y estorboso.

En mi caso, la cabeza de video la obtuve de una video cámara, lo cual es más chica que la de una video casetera. y para solucionar lo de la base se me ocurrió montarla en la tapa de una lata de galletas. Unicamente tengo (tenía) dos mouse, pero inalambricos, así que tuve que sacrificar uno para obtener el scrolling. Finalmente también, pensé en ponerle 4 leds en las ranuras de la cabeza para que aparentara tener una luce nice como la del Griffin.

Algunas fotos del proceso:

Primero desmonté la cabeza, y le quite todo lo que no servía, así dejando espacio por dentro para el circuito de los leds.

Después hice un hoyo en la tapa de lata con el Dremel, haciendo que quede a la medida de la cabeza con sus tornillos, para usar sus propios tornillosHice un circuito PCB, que en realidad son solo dos pistas de cobre para hacer contacto con los leds y que prendieran junto con la cabeza de video

lo monto en la parte inferior de la cabezaCon el taladro hice lo huecos para meter los leds en la parte superior de la cabeza de video, y con el dremel hice como un canal para cablearlos en paralelo.

Monté todo y le acomodé el scrolling del mouse, al cual le soldé los cables para hacer la conexiónAl otro mouse, le soldé también los cables en la parte correspondiente del scrolling, para hacer la conexión.
Y este es el resultado final, me hubiera gustado que el jack del mouse, quedara por dentro, pero los cálculos me fallaron y no quedó espacio suficiente por dentro del mouse.




Espero sus comentarios.

I will wait for your comments.

Mis herramientas

Si algo he aprendido muy bien de mi padre, ha sido hacer las cosas con calidad, y eso quiere decir que sean seguras, resistentes, con buen acabado y buen material. Mucho de esto empieza desde tener la herramienta adecuada y sobre todo saberla usar adecuadamente, digo, si uno no sabe ni siquiera barrer probablemente menos sabrá usar un taladro.

Aquí presento algunas de las herramientas que ocupo para realizar ... cosas

Un taladro inalambrico, muy cómodo y útil para trabajos ligeros, la batería dura lo suficiente, pierdes menos tiempo en conectar y desconectar, o encontrar una extensión.


Atril con lupa, caimanes y base para cautín.

Multímetro, pinzas de punta, punta y corte, corte, cutter, y flexómetro.

Esta es de las mejores herramientas que puede uno tener, un Dremel MultiPro, muy útil y práctico de usar.


Tal vez no sean consideradas herramientas pero para mi sí lo son: protoboards, leds, matriz de leds, pantalla lcd, baterias recargables, servos, y por supuesto el Arduino Diecimila.

Bienvenido

... a este blog, donde publicaré todas mis creaciones electrónicas y no electrónicas que haga. La idea nace a partir de ver varios blogs de otras personas, que se toman su tiempo para hacer esto mismo y eso me motivó, ojalá yo pueda motivar a alguién más no solo a hacer un blog, sino también a crear cosas. He realizado dos blogs anteriores a este, pero a diferencia de aquellos, en este sólo publicaré material propio y periódicamente, vamos, de acuerdo al avance. Otra razón es que últimamente he tenido varios proyectos en la cabeza y quiero ir llevando algunos simultáneamente y otros poco a poco.

Cualquier comentario, sugerencia, duda o reclamo, me lo puede hacer saber con un comentario en cualquiera de las entradas o con un mail a mauriciogomezp@gmail.com, te contestaré a la brevedad posible. Todo es bienvenido.

Espero que disfrutes de este blog.