Autolavado
Autores: Iván Fallos Mora, Javier Sánchez Almansa, Manuel Torralba Cepeda (GRUPO 3 – Ingeniería Informática (Móstoles)
MATERIALES UTILIZADOS:
Del maletín proporcionado por la universidad, pudimos aprovechar la placa Arduino, el servomotor, y algunos cables y LEDs.
Reutilizamos algunos materiales: De una impresora obtuvimos una varilla metálica con reductora y varios motores de 5V. De un aparato que dejó de funcionar extrajimos el ventilador, y, de un juguete, el depósito de pilas. Además, reutilizamos otros materiales que teníamos por casa: un cilindro de cartón, varias tablas y una lámina de papel lija.
Además, tuvimos que adquirir 2 relés de 5v (2,40€), una lámina de goma eva negra (0,50€), unos mini rodillos de pintura (0,90€), algunas escuadras metálicas (0,75€) y unas arandelas (0,60€).
CONSTRUCCIÓN
Esta fase consistía en el trabajo físico: cortar madera, hacer agujeros con brocas (y sin taladro)… Entre otras labores que requerían destreza, maña y fuerza. Así pues, disponiendo de todos los materiales, las herramientas y las maderas recién cortadas y taladradas, comenzamos el montaje. Nuestro autolavado se compone de una gran plancha de madera, que sostiene toda la estructura así como todo el circuito: motores, placas, cables, etc. Esta estructura está formada por una plancha de madera, delimitada por otras dos planchas de menor anchura y con agujeros en a sus extremos. Por dichos agujeros pasan las barras de metal con los tubos (que anteriormente revestimos con papel de lija para que agarrase la cinta), los cuales harán girar la cinta transportadora, formada por goma eva. Todas las uniones de materiales las hemos hecho con silicona caliente (con una pistola termofusible) y cola.
FUNCIONAMIENTO
-Fases de enjabonado y aclarado: se representan con un led azul, simulando agua, y un led blanco simulando jabón. Ambos pegados en el lateral interior de las dos planchas con agujeros.
-Fase de limpiado: consta de dos rodillos limpiadores, para los que hemos usado dos rodillos de pintura. Están unidos a un motor cada uno.
-Fase de secado: encima de la cinta se encuentra un ventilador, colocado mediante dos tablillas de madera. A su salo aparece un led rojo simulando el calor del secado.
-Fase de salida: se representa con un led de color verde, para hacer ver al usuario que el proceso ha finalizado y puede recoger su coche.
PROGRAMACIÓN
El código del proyecto se realizó en paralelo a la construcción del modelo a escala. En un principio pensamos en usar sensores que, por cada fase del ciclo de lavado, detectaran la posición del vehículo para parar el movimiento de la cinta en el momento justo. Desechamos la idea debido a múltiples problemas técnicos. Entre ellos escasez de pines en la placa y falta de espacio en el prototipo para colocar los sensores.
Decidimos implementar el funcionamiento con tiempos. Para ello primero se escribió todo el código que activaba las diferentes fases (agua, rodillos, secado) en el orden adecuado. Una vez terminada la maqueta y verificado que todo se encendiese correctamente (al principio los motores no funcionaban, y tuvimos que comprar relés), usamos un coche de juguete para medir los distintos tiempos que tenía que estar la cinta en movimiento y los tiempos de cada fase para que el resultado fuera realista.
La barrera sí hace uso de un sensor de distancias que detecta los nuevos clientes. Si ya hay un coche haciendo uso del autolavado esta no se abre hasta que el proceso de lavado acaba. Por el contrario, si no hay nadie haciendo uso del servicio, la barrera se levanta para dejar acceso al nuevo cliente. Una vez el coche deja de ser detectado por el sensor se espera 4 segundos para asegurarse que haya pasado completamente y evitar dañar así el vehículo o la barrera.
#include
const float sonido = 34300.0; // Velocidad del sonido en cm/s
// Variables para el control de la barrera
// Sensor de distancia
const int pinTrigger = 3;
const int pinEcho = 4;
float distancia;
float umbralActivacion = 10; // Distancia en cm a la que la barrera se activa
// Servo de la barrera
Servo barrera;
const int pinBarrera = 2;
const int gradosAbierto = 90;
const int gradosCerrado = 0;
const int pinCinta = 12;
const int pinAguaInicio = 5;
const int pinRodillos = 10;
const int pinAguaFin = 6;
const int pinVentilador = 7;
const int pinLedVerde = 8;
void setup()
{
pinMode(pinCinta, OUTPUT);
pinMode(pinRodillos, OUTPUT);
pinMode(pinTrigger, OUTPUT);
pinMode(pinEcho, INPUT);
pinMode(pinAguaInicio, OUTPUT);
pinMode(pinAguaFin, OUTPUT);
pinMode(pinVentilador, OUTPUT);
pinMode(pinLedVerde, OUTPUT);
barrera.attach(pinBarrera);
Serial.begin(9600);
barrera.write(gradosCerrado);
}
void loop()
{
iniciarTrigger(pinTrigger);
distancia = calcularDistancia(pinEcho);
Serial.println(distancia);
if (distancia < umbralActivacion) { // Si la distancia es menor de 20 centimetros
// Abre la barrera, detecta cuando el coche pasa y la cierra
barrera.write(gradosAbierto);
while (distancia < umbralActivacion) {
iniciarTrigger(pinTrigger);
distancia = calcularDistancia(pinEcho);
}
delay(4000);
barrera.write(gradosCerrado);
cicloLavado();
}
}
void desplazarCinta(int tiempo) {
digitalWrite(pinCinta, HIGH);
delay(tiempo);
digitalWrite(pinCinta, LOW);
}
void cicloLavado() {
delay(2000);
// AGUA INICIO
Serial.println("Agua de inicio");
digitalWrite(pinAguaInicio, HIGH);
delay(2000);
desplazarCinta(200);
delay(2000);
digitalWrite(pinAguaInicio, LOW);
delay(500);
desplazarCinta(200);
// RODILLOS
Serial.println("Rodillos");
delay(500);
digitalWrite(pinRodillos, HIGH);
delay(1000);
desplazarCinta(100); // Durante rodillos
delay(1000);
desplazarCinta(100); // Durante rodillos
delay(1000);
desplazarCinta(100);
delay(200);
digitalWrite(pinRodillos, LOW);
desplazarCinta(100);
// AGUA ENJUAGADO
delay(500);
Serial.println("Agua de enjuage");
digitalWrite(pinAguaFin, HIGH);
delay(2000);
desplazarCinta(100);
delay(2000);
desplazarCinta(100);
delay(2000);
digitalWrite(pinAguaFin, LOW);
delay(500);
desplazarCinta(300);
// SECADO
Serial.println("Secado");
digitalWrite(pinVentilador, HIGH);
delay(3000);
desplazarCinta(150);
delay(3000);
digitalWrite(pinVentilador, LOW);
Serial.println("Fin de secado");
delay(1000);
digitalWrite(pinLedVerde, HIGH);
desplazarCinta(600); // Sacar coche
delay(5000);
Serial.println("FIN");
digitalWrite(pinLedVerde, LOW);
}
// Funciones para detector de distancia
void iniciarTrigger(int pinTrigger)
{
// Ponemos el Triiger en estado bajo y esperamos 2 ms
digitalWrite(pinTrigger, LOW);
delayMicroseconds(2);
// Ponemos el pin Trigger a estado alto y esperamos 10 ms
digitalWrite(pinTrigger, HIGH);
delayMicroseconds(10);
// Comenzamos poniendo el pin Trigger en estado bajo
digitalWrite(pinTrigger, LOW);
}
float calcularDistancia(int pinEcho)
{
// La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
unsigned long tiempo = pulseIn(pinEcho, HIGH);
DIFICULTADES Y PUNTOS PARA RESEÑAR
A lo largo de todo el desarrollo del proyecto nos hemos encontrado varias dificultades y aspectos a señalar. Algunos de dichos puntos son:
– En un principio valoramos la posibilidad de introducir agua real en el proyecto. Sin embargo, descartamos está opción puesto que resultaría difícil proteger con seguridad todos los contactos y cables.
– Algunos cables del maletín venían defectuosos. Tardamos tiempo en darnos cuenta de ello, puesto que pensábamos que los errores vendrían de otra parte (componentes, la protoboard…).
– Necesitamos introducir relés, ya que el voltaje proporcionado por la placa no resultaba suficiente para mover los componentes. Al introducirlos, se solucionó el problema para el ventilador y la cinta, aunque para los rodillos fue necesario aportar alimentación externa (con un depósito de pilas).
CASO DE USO
CONCLUSIÓN
Como visión global, hay que destacar los conceptos aprendidos; cada uno de nosotros ya había programado en Arduino, pero esta práctica nos ha servido para afianzar esos conocimientos, a la par que nos ha ayudado a mejoras nuestras capacidades a la hora de diseñar y construir estructuras, así como el trabajo en equipo, que siempre es importante, dentro y fuera de la Universidad.