Sistema De Acceso a Parqueadero
by JcSolucines_Cali in Circuits > Arduino
11 Views, 0 Favorites, 0 Comments
Sistema De Acceso a Parqueadero
Este proyecto consiste en un sistema automatizado de ingreso para autos, diseñado para registrar y controlar la entrada y salida de vehículos utilizando un Arduino Nano. El sistema cuenta con dos sensores ultrasónicos, dos LEDs y un servomotor. Los sensores detectan la presencia del vehículo, mientras que los LEDs y el servomotor indican y controlan el acceso. Este prototipo es ideal para aplicaciones de estacionamientos o zonas de acceso restringido.
Supplies
- Arduino Nano 168
- 2 Sensores Ultrasónicos (HC-SR04): para detectar la presencia y salida de vehículos.
- Servomotor (SG90 o similar): controla una barrera que se abre y cierra.
- 2 LEDs:
- LED de activación (indica que la barrera está abierta).
- LED de cerrado (indica que la barrera está cerrada).
- Protoboard y Jumpers para conexiones.
- Fuente de alimentación de 5V para el Arduino y componentes.
Conexiones
tabla de Conexiones
Descripción Del Funcionamiento
- Detección de Vehículo: Cuando el sensor ultrasónico 1 detecta un objeto a una distancia menor o igual a DisDisparo (definida en 10 cm en el código), se asume que un vehículo se ha aproximado a la entrada.
- Apertura de la Barrera: Al detectar el vehículo, el sistema:
- Activa el LED de activación (indica que la barrera está abierta).
- Apaga el LED de cerrado.
- Mueve el servomotor a 90° para abrir la barrera.
- Esperando el Paso Completo del Vehículo:
- Después de abrir la barrera, el sistema espera que el vehículo cruce completamente.
- Si el sensor ultrasónico 2 detecta la presencia del vehículo, el sistema mantiene la barrera abierta.
- El sistema sigue verificando la presencia del vehículo a través de ambos sensores y utiliza una variable cont que cuenta un tiempo de espera en caso de que el vehículo no pase completamente.
- Si el vehículo demora más del tiempo estipulado (cont >= 200), la barrera se cierra automáticamente como medida de seguridad.
- Cierre de la Barrera:
- Una vez que el vehículo ha cruzado completamente y ya no se detecta presencia en el sensor 2, la barrera se cierra.
- El servomotor regresa a 0° y el LED de activación se apaga, mientras que el LED de cerrado se enciende, indicando que la barrera está cerrada.
- Registro de Ingreso y Salida:
- Cada vez que un vehículo ingresa o sale, el sistema actualiza las variables ContAdentro y ContSalio.
- La función Registro() muestra en el monitor serial el conteo actual de vehículos dentro y fuera del área.
Código Y Simulación
code:
#include <Servo.h> // Librería para controlar el servomotor
Servo servoMotor; // Variable de control para el servomotor
// Pines de los sensores ultrasónicos y LEDs
const int Trigger = 2;
const int Echo = 3;
const int Trigger1 = 6;
const int Echo1 = 7;
const int PinLed1 = 4; // LED de activación
const int PinLed2 = 8; // LED de cerrado
// Constantes y variables del sistema
const int DisDisparo = 10; // Distancia de disparo para activación
long Distancia1, Distancia2;
long ContAdentro = 0, ContSalio = 0, Contingreso = 0;
long TiempoEspera = 2000; // Tiempo de espera tras activación del
servo
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial
pinMode(Trigger, OUTPUT);
pinMode(Echo, INPUT);
pinMode(PinLed1, OUTPUT);
pinMode(PinLed2, OUTPUT);
digitalWrite(PinLed1, LOW);
digitalWrite(PinLed2, HIGH);
servoMotor.attach(5);
servoMotor.write(0); // Posición inicial del servo (cerrado)
pinMode(Trigger1, OUTPUT);
pinMode(Echo1, INPUT);
}
void loop() {
distanciia1();
distanciia2();
condicion(); // Compara la distancia con la constante DisDisparo
}
// Función que evalúa las condiciones de entrada y salida
void condicion() {
if (Distancia1 <= DisDisparo) {
digitalWrite(PinLed1, HIGH);
digitalWrite(PinLed2, LOW);
servoMotor.write(90); // Abre la barrera
Serial.println("Abriendo");
int cont = 0;
while (Distancia1 <= DisDisparo && cont < 200 && Distancia2 >=
DisDisparo) {
distanciia1();
distanciia2();
cont++;
}
if (cont >= 200) {
Serial.println("Tiempo agotado, vehículo no ingresó");
servoMotor.write(0);
delay(TiempoEspera);
return;
}
Serial.println("Entrando");
while (Distancia2 <= DisDisparo) { distanciia2(); }
delay(TiempoEspera);
servoMotor.write(0); // Cierra la barrera
digitalWrite(PinLed1, LOW);
digitalWrite(PinLed2, HIGH);
ContAdentro++;
Registro();
} else if (Distancia2 <= DisDisparo) {
// Similar proceso para detectar la salida del vehículo
...
} else {
delay(100); // Espera breve antes de actualizar
}
}
// Función para calcular la distancia con el sensor 1
void distanciia1() {
long t;
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
t = pulseIn(Echo, HIGH);
Distancia1 = t / 58;
}
// Función para calcular la distancia con el sensor 2
void distanciia2() {
long t;
digitalWrite(Trigger1, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger1, LOW);
t = pulseIn(Echo1, HIGH);
Distancia2 = t / 58;
}
// Función de registro de conteo de ingreso y salida
void Registro() {
Contingreso = ContAdentro - ContSalio;
Serial.println("==========================");
Serial.print("Ingreso: ");
Serial.print(ContAdentro);
Serial.print(" - Salida: ");
Serial.print(ContSalio);
Serial.print(" - Total dentro: ");
Serial.println(Contingreso);
Serial.println("==========================");
}