martes, 25 de enero de 2022

Barrera de coches para puerta de parking



 Alumno
: Carlos Prieto Herranz

Curso: 2021/2022

Universidad de Salamanca

Máster Universitario en Profesor de Educación Secundaria Obligatoria y Bachillerato, Formación Profesional y Enseñanza de Idiomas

Asignatura: Innovación Docente en la asignatura de Tecnología


Descripción del proyecto

 Este proyecto consiste básicamente en una barrera de un parking, que se abre y se cierra en función de diferentes entradas. Una vez que el coche llega a la puerta del parking, se detecta con un ultrasonidos su presencia, y en ese momento, se sube la barrera poco a poco, para dejarle pasar. Al mismo tiempo, la luz roja empieza a parpadear, signo de que aún no se puede pasar y además existe una señal acústica para reforzarlo. Una vez que la barrera alcanza el punto más alto, el semáforo se pone en verde y la barrera se mantiene abierta, hasta el momento en el que se asegura que el coche ha entrado por completo en el parking. Para poder cerciorarlo, se dispone una ldr en el suelo del parking, que en todo momento se encuentra iluminada por un foco, por lo que una vez que pase el coche por encima, la luminosidad que recibe la ldr, será mucho menor, y en ese momento, la barrera comenzará a bajar al mismo tiempo que el semáforo vuelve a parpadear con luz roja y suena una señal acústica. Este proyecto, podría encuadrarse dentro de la asignatura de Tecnología de 4º ESO.


Entradas: 1 ldr y 1 sensor de ultrasonidos.

Salidas: 2 led (1 roja y 1 verde), 1 servomotor y 1 zumbador.

Otros componentes: Placa de arduino, cables, protoboard y resistencias.

Vídeo explicativo

Esquema  de conexiones con Tinkercad


Código

//Se incluyen las liberías a utilizar

#include "SR04.h"

#include "Servo.h"


//Se introduce el número del pin de cada elemento como variables enteras

int ldr=A0;

int ledroja=4;

int ledverde=2;

int timbre=12;


//Se define la variable luz, que se utilizará en la LDR

int luz;


//La librería del ultrasonidos permite asignar directamente trig y echo a los pines correspondientes

#define TRIG_PIN 9

#define ECHO_PIN 8

//Se obtiene una salida para la entrada de los dos pines del ultrasonidos

SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);

//Se define la variable a, que será la distancia que detecta el ultrasonidos

long a;


//Con la librería del servo, se define la variable del servo, en este caso motor, y se define también su posición inicial

Servo motor;

int position=45;


//Se inicializa el setup

void setup() {

  

   Serial.begin(9600); //Se conecta la consola

   delay(1000);   //Se retrasa 1 s

   motor.attach(10);  //Con la librería del servo, se conecta al pin correspondiente

   

   //Las variables enteras asignadas previamente se definen como entradas o salidas

   pinMode(ldr,INPUT);

   pinMode(ledroja,OUTPUT);

   pinMode(ledverde,OUTPUT);

   pinMode(timbre,OUTPUT);

   

   //Se establece la posición inicial del motor

   motor.write(position);

   

}  

//Se inicializa el loop, que se repetirá de manera cíclica cuando se cargue a la placa

void loop() {


  //Medida de la distancia del ultrasonidos

   a=sr04.Distance(); //La variable a, será la distancia que mide el ultrasonidos

   Serial.print(a); //Se imprime en la consola la distancia

   Serial.println("cm"); //Se imprime en la consola cm y se pide que se de un salto de línea

    

    //Medida de la luminosidad con la ldr

   luz=analogRead(A0);  //Se guarda en luz, la lectura del ldr

    Serial.println(luz); //Se imprime la lectura del ldr


   //Situación del servo

   Serial.print(position); //Se imprime la posición de la barrera

   Serial.println("grados"); //Se imprime después del número, la palabra "grados"

   

   delay(500); //Se retrasa 0,5 s entre lecturas de posición  

   digitalWrite(ledroja,HIGH); //La luz roja estará activada

   digitalWrite(ledverde,LOW); //La luz verde estará desactivada

   

   if (a<=10){    //Se pone un condicional, si la distancia es menor de 10 cm, detecta la presencia de un coche

    for (position=45; position<135;)  //Se introduce un ciclo for, que va desde 45, que es la posición inicial a la posición final de la barrera

    {

    digitalWrite(ledroja,HIGH); 

    delay(500);

    digitalWrite(ledroja,LOW); //Con estas tres últimas sentencias, se permite que la luz roja parpadee

    tone(timbre,260,2000); //Al mismo tiempo que parpadea la luz, suena un timbre

    delay(500); //Se introduce un retardo de 0,5s

    

    position=position+10; //A la variable posición se le suma en cada vuelta 10 grados

    motor.write(position); //Con la variable position que va cambiando, se permite mover el motor

    delay(50);

    }

    //En este punto, la barrera está ya arriba

    digitalWrite(ledroja,LOW); //La luz roja se apaga

    digitalWrite(ledverde,HIGH); //La luz verde se enciende

    while(luz>150){  //Con un while conseguimos que mientras la luz sea mayor que un valor de 150, no se baje la barrera, dado que el coche aún no ha pasado por encima de la ldr

      luz=analogRead(A0); //Hacemos una lectura de la luminosidad con la ldr

      Serial.println(luz); //Imprimimos el valor en la consola

      delay(10);} //Dejamos un breve tiempo para evitar que el coche pase por encima y no detectemos que se oscurece

      

      //Cuando salimos del while, implica que la luminosidad ha bajado, y que el coche ha pasado por encima, por lo que 

      //hay que bajar la barrera

      delay(2000); //Dejamos 2 s para asegurar que el coche haya pasado completamente

      digitalWrite(ledverde,LOW); //Apagamos la luz verde

    for (position=134; position>45;) //Para el rango de posiciones desde 134 a 45:

    {

    digitalWrite(ledroja,HIGH);

    delay(500);

    digitalWrite(ledroja,LOW); //Volvemos a hacer que la luz roja parpadee

    tone(timbre,260,2000); //Al mismo tiempo hacemos que el timbre suene

    delay(500);

    position=position-10; //En cada vuelta, le restamos 10 grados a la posición    

    motor.write(position); //Movemos el motor a la nueva posición

    Serial.print(position); //Se imprime la posición de la barrera

    Serial.println("grados"); //Se imprime después del número, la palabra "grados"

    delay(50);

    }  

    }

   }

No hay comentarios:

Publicar un comentario