SENSOR DE PUERTAS

Grupo 6:

  • Pablo Gámir de Llama
  • Diego López Zamora
  • Aitor Martínez Aragón

1. Introducción y objetivos 

Nuestro objetivo es construir una puerta que se abra con una tarjeta según el color de esta misma. Si el color es el correcto la puerta se abrirá y aparecerá un mensaje de “acceso concedido”, sin embargo, si el color es incorrecto la puerta permanecerá cerrada. Tras cruzar la puerta, habrá un sensor de movimiento que, cuando cruce la persona, hará que la puerta se cierre automáticamente.

Como objetivo secundario, nuestra puerta también sirve para ahorrar energía ya que siempre se va a cerrar cuando cruce alguien. Esta medida ya está implementada, como por ejemplo en los centros comerciales para utilizar menos energía del aire acondicionado/calefacción. 

A la hora de pensar sobre este proyecto, el uso más parecido que tiene en la vida cotidiana sería por ejemplo las puertas de la entrada al metro, o el acceso privado de un restaurante solo para los empleados del local.

2. Coste de los materiales

Placa Arduino UnoYa venía en el kit
LCD 16×2 I2C6 €
Sensor de Color2,81 €
Sensor PIR4 €
Motor CC4,10 €
Placa de PruebasYa venía en el kit
CablesYa venía en el kit
Tablas de Madera5,25 €
Servo Motor2,96 €

Suma de todos los componentes: 25,12 €

3. Funcionamiento

Para elaborar la forma de cómo montar el proyecto, hemos utilizado un programa de diseño 3D llamado “Sketchup 3D”, utilizando la modalidad online de la aplicación, hemos ido poco a poco dándole forma a este proyecto, una vez íbamos colocando los componentes veíamos si necesitábamos más o menos componentes, o si había que mejorar alguna cosa, de esta forma, el resultado ha sido el siguiente:

Cabe recalcar que las líneas que salen del sensor PIR son como hemos pensado que sea la zona donde, en caso de detectar algún movimiento, la puerta se cierre. Y las otras líneas que van a la placa de pruebas serían los cables correspondientes para hacernos una idea de por donde pasarán.

También dejamos el link del proyecto en caso de querer echarle un ojo de forma libre:
https://app.sketchup.com/share/tc/europe/QHVojJcLTkU?stoken=fvd3AOA2e1nqiL9l0B1C4fa1xorEKQUTgjjpLD_9cd7GNK72teI-Go3wdAQRsPy9&source=web

También para montar la maqueta dibujamos algún que otro plano para hacernos una idea de como cortar las maderas de forma que cuadre todo:

4. Desarrollo del proyecto

Una vez acabado el modelado de la maqueta, lo primero que hicimos al montar el proyecto fue probar que las rotaciones del servo motor funcionaran como queríamos, lo cual nos acabó dando unos poco problemas, ya que estuvimos casi 1 hora para darnos cuenta de que el servo motor solo giraba en 180 grados, y como se le podía sacar el brazo, cada vez que le cambiábamos la orientación, ya no giraba en el mismo sentido, pero ya nos dimos cuenta del problema y lo resolvimos enseguida.

Después estuvimos mirando el funcionamiento del sensor de color y con esta foto nos orientamos para poder conectar correctamente el sensor a la placa:

Hicimos lo mismo con el LCD I2C 16×2 y el sensor PIR, y ya que no pusimos ninguna resistencia en el circuito, lo acabamos de montar en relativamente poco tiempo, y quedó de la siguiente forma:

Al final no nos quedó acorde con la maqueta que hicimos en Sketchup 3D ya que cambiamos de opinión, pero sigue siendo un modelo funcional.

5. Problemas y soluciones

Problema 1: Nuestra primera idea para hacer que la puerta se abriera y se cerrara, fue utilizar el motor DC que nos proporcionaron en los materiales de la universidad. Sin embargo, pensamos que este era muy pequeño y tuvimos que comprar uno de un tamaño más grande. A la hora de intentar hacerlo funcionar en la maqueta, nos dimos cuenta que quizás era mejor utilizar un servo motor para que la puerta se abriera hacia arriba y hacia abajo como una valla. Finalmente nos decantamos por esta última solución.

Problema 2: Como nuestra puerta se abre con un sensor de color, pensamos en importar la librería Adafruit, pero al descargarla nos daba error en Arduino. Por lo tanto, tuvimos que cambiar de idea, midiendo la intensidad de luz roja con la función “pulseIn” y calculando la proporción de luz roja que recibía el sensor de color. 

Aquí surgió un nuevo problema, ya que la puerta se abría con objetos de color rojo, pero también con objetos de cualquier otro color. Para solucionar este problema, aumentamos el valor de proporción de luz roja que debe recibir el sensor y también se nos ocurrió añadir que detectara que los colores verde y azul sean bajos para asegurarse de que se trate de un rojo intenso. Esto último lo hicimos porque el amarillo o el naranja se podían detectar como rojo, ya que tienen parte de rojo, verde y azul.

6. Código

Parte 1: Inclusión de bibliotecas y definición de pines.

#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define SERVO_PIN 9
#define MOTION_SENSOR_PIN 2

LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del LCD 16x2
Servo doorServo;
const int s0 = 4;
const int s1 = 5;
const int s2 = 6;
const int s3 = 7;
const int out = 8;
const int led_c = 10;

En esta parte incluimos las bibliotecas necesarias para nuestro proyecto y declaramos el pin del servomotor (9), el pin del sensor de movimiento (2) y los pines que se corresponden al sensor de luz (4,5,6,7,8,10), aparte de inicializar el LCD.

Parte 2: Función setup() e inicialización.

void setup() {

  Serial.begin(9600);
  doorServo.attach(SERVO_PIN);
  pinMode(MOTION_SENSOR_PIN, INPUT);
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);

  //Mostrar al comienzo del proyecto y limpiar
  lcd.init();   
  lcd.backlight();      
  lcd.clear();                    
  lcd.setCursor(0,0);
  lcd.print("Proyecto Puerta");
  lcd.setCursor(0,1);
  lcd.print("Automatizada");
  delay(2000);
  lcd.clear();                 
}

En el setup(), configuramos los pines e inicializamos el LCD. Concretamente, establecemos el pin del sensor de movimiento como entrada y los pines del sensor de color como salidas, aparte de configurar el LCD.

Parte 3: Función loop().

//——————–Loop principal————————-/

void loop() {
  lcd.setCursor(0, 0);
  lcd.print("Esperando color");
  if (checkForRed()) {
    doorServo.write(0);
    delay(3000);
    lcd.print("Puerta abierta");
    while (!digitalRead(MOTION_SENSOR_PIN)) {
    }
    if (digitalRead(MOTION_SENSOR_PIN)) {
      doorServo.write(90);
      delay(3000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Puerta cerrada");
      delay(1000);
      lcd.clear();
    }
  }
}

En la función loop(), esperamos la validación del color rojo y describimos su funcionalidad. Imprimimos en el LCD un mensaje donde indica que se debe pasar una tarjeta por el sensor, si el color detectado es el rojo, el programa se mete en el if y se abre la puerta girando el servomotor a 0 grados. Cuando se cruza la puerta, se detectará movimiento y el sensor de movimiento hará que la puerta se cierre, girando el servomotor a 90 grados.

Parte 4: Función checkForRed().

//——————–Funcion detectar rojo——————/

bool checkForRed() {
  digitalWrite(s0, LOW);
  digitalWrite(s1, HIGH);

  int redValue = pulseIn(out, LOW);
  float redRatio = redValue / 1024.0; 

  if (redRatio > 0.95) { 
    if (analogRead(s2) < 100 && analogRead(s3) < 100) { 
      return true;
    }
  } else {
    return false;
  }
}

Esta función es a la que se llama en el loop() en el if. Configuramos los pines del sensor de luz, medimos la intensidad de luz roja con la función pulseIn y almacenamos la proporción de luz roja en el float redRatio. Si la luz roja es lo suficientemente intensa se meterá en el if y si los valores de los pines s2 y s3 (verde y azul) son bajos devolverá true (se ha detectado color rojo), en caso contrario devolverá false.

7. Conclusión y mejoras

Como conclusiones finales, podemos decir que hemos aprendido a trabajar más a fondo con Arduino y a integrar la programación con el diseño de la maqueta y su funcionalidad. Además, también hemos mejorado nuestra capacidad para resolver los problemas que nos han ido surgiendo durante la implementación.

Finalmente, como mejoras podríamos cambiar el sensor de color por un NFC (Near Field Communication), reconocimiento facial o por voz. Esto último haría que la complejidad del código y del proyecto en general aumentase, pero también haría que este fuera válido para más aplicaciones como seguridad en el hogar o en una empresa.

8. Vídeo

Ponemos el enlace a Drive ya que no nos deja subirlo por el tamaño del vídeo.

https://drive.google.com/file/d/1Z59jv2TSM8TKP7BVs4yQbTc-mOm8uFXX/view?usp=sharing

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *