Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas
Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas

lunes, 28 de junio de 2010

Taller de Arduino en Cholula

flyer-Arduino

Sin lugar a dudas el Arduino ha sido la plataforma de desarrollo más popular en los último años. Bien vale la pena aprender a usar esta accesible herramienta.

Arduino es una plataforma de electrónica abierta para la creación de prototipos basada en software y hardware flexibles y fáciles de usar. Se creó para artistas, diseñadores, aficionados y cualquiera interesado en crear entornos u objetos interactivos.

Arduino puede tomar información del entorno a través de sus pines de entrada de toda una gama de sensores y puede afectar aquello que le rodea controlando luces, motores y otros actuadores. El microcontrolador en la placa Arduino se programa mediante el lenguaje de programación Arduino(basasdo en Wiring) y el entorno de desarrollo Arduino (basado en Processing). Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de conectar a una computadora, si bien tienen la posibilidad de hacerlo y comunicar con diferentes tipos de software (p.ej. Flash, Processing, MaxMSP).

Por si todavía les suena en chino todo esto, les dejo unos videos de proyectos realizados con Arduino.

El primer video muestra la interacción del Arduino con Flash, hay un sensor de proximidad conectado al Arduino y el este le indica la distancia de un objeto a la animación de Flash.

El segundo video muestra la interacción del arduino con MAX/MSP

El tercer video muestra la interacción autónoma entre el Nunchuk del Wii y el Arduino, se puede ver como se usa el joystick para controlar el robot o también por medio del acelerómetro.

Si estás interesado en el taller, deja un comentario es esta entrada con tus datos. Si conoces a alguien más que le podría interesar este taller, compártelo por Facebook o Twitter.

viernes, 3 de octubre de 2008

ReleShield para Arduino

Este es un proyecto patrocinado por ElectroLabo, distribuidor de Arduino en México


Para las personas que ya están más familiarizadas con el Arduino este proyecto lo pueden encontrar interesante.
Se trata de un prototipo para el Arduino usando un protoshield y algunos otros componentes, la finalidad es simple pero muy útil. ¿Alguna vez has deseado controlar las luces de tu casa desde la computadora? O tal vez algún otro electrodoméstico de la casa. Bueno pues este proyecto va más o menos dirigido a eso. El ReleShield tiene la capacidad de activar/desactivar hasta tres dispositivos al mismo tiempo pero independientemente uno del otro, los cuales requieran estar conectado a la corriente alterna, siendo que el ReleShield es de corriente directa. ¿Cómo lo hace? El relé o relevador (del francés relais, relevo) es un dispositivo electromecánico, que funciona como un interruptor controlado por un circuito eléctrico en el que, por medio de un electroimán, se acciona un juego de uno o varios contactos que permiten abrir o cerrar otros circuitos eléctricos independientes (wikipedia), entonces con las salidas digitales del Arduino podemos controlar varios relés.

Material necesario:

1 placa ProtoShield para Arduino
3 Relés RAS-0510 (puede ser cualquier otro pero tienes que conocer sus especificaciones)
6 terminales dobles
2 sensores LM35 (opcional)
Cable el necesario para soldar y cable plano
Tira de pines (28 aprox)
5 leds (opcional)

Manos a la obra!

Anteriormente ya había hecho un circuito similar donde únicamente conectaba las terminales al relé y a un par de pines para conectarlo al Arduino, por lo tanto ya estoy un poco familiarizado en cuanto a como hay que hacer las conexiones, el funcionamiento y la programación para éstos, por ello hice algo que no tenía que hacer y que fue brincarme un paso. Monté todo como fuera cayendo y no realicé un esquemático previo a armarlo. Así que yo recomiendo altamente que hagan un esquemático para facilitar el trabajo de soldar y evitar cruzar tantos cables. De todas formas hice el mío después de terminarlo, siempre es bueno hacerlo y tenerlo a la mano para futuras referencias.


Bien, ahora empecemos a armar el ReleShield.

Primero soldamos los pines sobre el protoshield para los pines digitales y el power, únicamente.
Aprovechamos para soldar también las terminales en los lados correspondientes como se muestra en la imagen.
Después, montamos los relés, esta parte puede ser un poco difícil ya que la orientación de los pines de los relés no coinciden del todo bien con las perforaciones del protoshield, así que hay que ayudarse de una pinzas de punta para doblar un poco las patitas y lograr meterlos. Como se puede notar en la imagen, existe una separación entre cada componente que hasta ahora hemos colocado, normalmente cualquiera pudiera pensar que lo mejor es ahorrar espacio y posiblemente agregar más componentes, pero la razón de hacerlo de esta forma es porque conforme se va armando el prototipo hay que ir pensando hacia delante, es decir el siguiente paso ha realizar que es hacer todas las conexiones, soldando, por debajo de la placa (preferentemente), y el tener los componentes demasiado cerca puede complicar esa tarea.
Una vez que ya tenemos colocado los tres relés, volteamos la placa y soldamos primero el pin (2) de cada relé que tiene que ir a tierra (cable verde), después conectamos los pines (1) que van del relé a los pines digitales del Arduino (2, 3, 4), finalmente terminamos las demás conexiones de los pines (3, 4, 5) de los relés hacia las terminales, como se ve en el esquemático.


Cabe mencionar que los relevadores que se usaron en este proyecto tienen las siguientes especificaciones: Relevador 1 polo, 2 tiros, bobina de 5 VDC, contactos de 120 VAC/10 Amp., 250 VAC/7 Amp. y/o 24 VDC/10 Amp. (http://www.sunhold.com/ras2.html)
Esto quiere decir que el relevador se conmuta con señales TTL (5v) y que del lado de potencia soporta 120v a 10 amperes, 250v a 7 amperes o 24v a 10amp, prácticamente nos puede servir para casi cualquier electrodoméstico.

Listo!

Hasta este momento ya tenemos la primera parte del ReleShield terminada. Lo cual quiere decir que ya podemos montar sobre el Arduino el ReleShield y hacer las primeras pruebas.
Para hacer una pequeña prueba y ver que todo quedó bien conectado, corremos el siguiente código en el Arduino.
int Re1Pin = 2; //indicamos los pines que se van a usar
int Re2Pin = 3;
int Re3Pin = 4;

void setup(void){ //se configuran como salida para mandar las señales
pinMode(Re1Pin, OUTPUT);
pinMode(Re2Pin, OUTPUT);
pinMode(Re3Pin, OUTPUT);
}

void loop(void){

digitalWrite(Re1Pin, HIGH); //se activa el Relé 1, el 2 y 3 desactivado
digitalWrite(Re2Pin, LOW);
digitalWrite(Re3Pin, LOW);
delay(200);
digitalWrite(Re1Pin, LOW); //se activa el Relé 2, el 1 y 3 desactivado
digitalWrite(Re2Pin, HIGH);
digitalWrite(Re3Pin, LOW);
delay(200);
digitalWrite(Re1Pin, LOW); //se activa el Relé 3, el 1 y 2 desactivado
digitalWrite(Re2Pin, LOW);
digitalWrite(Re3Pin, HIGH);
delay(200);

}
Con este código, se hará que cada relé se active solo por 200 milisegundos uno tras del otro, de esta forma con el multímetro podemos checar que las conexiones en la terminales sean las correctas. Si todo sale lo correcto, entonces ya podemos empezar a usar el ReleShield.

Sin embargo, aun se puede mejorar más el proyecto, en esta segunda parte agregaremos un par de sensores de temperatura LM35 y unos cuantos LEDs. La segunda parte es totalmente opcional, ya que el ReleShield ya está 100% funcional y cumple su objetivo principal. Pero si queremos algo más robusto, agregamos algunos LEDs que nos indiquen alguna parte del proceso en el que se encuentra el Arduino. Y si además queremos hacer un control basado en la temperatura ambiente, ya sea una habitación o un electrodoméstico como un refrigerador, agregamos un sensor de temperatura LM35.

¿Para que poner un sensor de temperatura?

Bueno, la principal razón es para controlar ciertos dispositivos de acuerdo a la temperatura ambiente o artificial. En mi caso fue porque mi refrigerador se descompuso y trabaja sin apagarse, es decir, el termostato no está regulando bien, es por eso que incorporé dos sensores, uno interno (soldado en el ReleShield) y otro externo con una extensión de cable plano para conectarlo al ReleShield y colocarlo en zonas donde no conviene exponer el Arduino y el ReleShield. Igualmente, otras ideas puede ser: activar un ventilador o un aire acondicionado si hace mucho calor, o activar un calentador si hace frio, etc.
Además, el sensor externo se puede quitar y usar cualquier otro sensor que mande señales analógicas.

Finalmente así queda la configuración final:

¿Cómo crees que se pueda mejorar el ReleShield?

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.