Ayuda al aparcamiento

Autores: Diego Carrera Hernando, Miguel Delgado Amador y Álvaro Durán Villa – Grupo 2 de la asignatura Sistemas Empotrados y de Tiempo Real de Móstoles.

Introducción

El proyecto realizado consiste en un sensor de aparcamiento como el que podemos encontrar en muchos coches. Para ello, hemos empleado un coche de radiocontrol al cual hemos acoplado una caja, en la que hemos instalado toda la circuitería necesaria. Este circuito se basa, de forma resumida, en un Arduino, un sensor de ultrasonidos, una pantalla LCD, tres leds y un zumbador.

Implementación

Para implementar la parte hardware hemos empleado los componentes previamente mencionados, de los cuales explicaremos su utilidad a continuación:

  • Placa Arduino UNO: será la encargada de controlar los eventos que tengan lugar en el sistema.
  • Zumbador: emitirá pitidos con distinta duración e intervalo según la distancia a los objetos.
  • Sensor ultrasónico: gracias a las ondas de sonido que produce nos permitirá detectar la distancia a otros objetos.
  • Pantalla LCD: será empleada para mostrar la distancia a los objetos y mensajes personalizados en función de esta distancia.
  • Tres leds: se encenderán alternativamente en función de la distancia a los objetos.
  • Potenciómetro: regulará el contraste de la pantalla LCD.
  • 3 resistencias de 220 ohmios: se usarán para proteger los leds.
  • 2 resistencias de 100 ohmios: controlarán la retroiluminación de la pantalla.
  • Protoboard.
  • Múltiples cables.

El coste total del proyecto ha sido de 0€, dado que hemos empleado todo lo que nos proporcionaba el kit de la universidad, además de ya tener en posesión el resto de cosas, como el coche.

Todos estos componentes han sido conectados de la siguiente forma:

La implementación real es la siguiente:

El código que hemos implementado para que este circuito funcione es el siguiente:

// Librería para la pantalla LCD
#include <LiquidCrystal.h>

// Pines
#define LEDAZUL 2
#define LEDAMARILLO 3
#define LEDROJO 4
#define TRIGGER 5
#define ECHO 6
#define BUZZER 9

// Filas y columnas del LCD
#define COLUMNAS 16
#define FILAS 2

// Constantes
const float sonido = 34300.0; // Velocidad del sonido en cm/s
const float umbral1 = 70.0; // Umbral más lejano
const float umbral2 = 45.0; // Umbral medio-lejano
const float umbral3 = 30.0; // Umbral medio-cercano
const float umbral4 = 10.0; // Umbral más cercano

// Seteamos los pines de la interfaz
LiquidCrystal lcd(7, 8, 13, 12, 11, 10);


void setup() {
  // Iniciamos el monitor serie
  Serial.begin(9600);

  // Configuramos el LCD
  lcd.begin(COLUMNAS, FILAS);

  // Configuración de los pines
  pinMode(LEDAZUL, OUTPUT);
  pinMode(LEDAMARILLO, OUTPUT);
  pinMode(LEDROJO, OUTPUT);
  pinMode(ECHO, INPUT);
  pinMode(TRIGGER, OUTPUT);
  pinMode(BUZZER, OUTPUT);
 
  // Apagamos los LEDs al iniciar el programa
  digitalWrite(LEDAZUL, LOW);
  digitalWrite(LEDAMARILLO, LOW);
  digitalWrite(LEDROJO, LOW);
 
}

void loop() {
  // Ponemos el trigger en low y esperamos 2 ms
  digitalWrite(TRIGGER, LOW);
  delayMicroseconds(2);
 
  // Ponemos el trigger en high y esperamos 10 ms
  digitalWrite(TRIGGER, HIGH);
  delayMicroseconds(10);
 
  // Ponemos el trigger en low para comenzar
  digitalWrite(TRIGGER, LOW);
 
  // Comprobamos la distancia
  float distancia = comprobarDistancia();
 
  // Apagamos los LEDs
  digitalWrite(LEDAZUL, LOW);
  digitalWrite(LEDAMARILLO, LOW);
  digitalWrite(LEDROJO, LOW);
 
  // Avisamos si se está en el rango más cercano
  if (distancia<umbral1){
    aviso(distancia);
  }
  else {
    noTone(BUZZER);
    lcd.clear();
  }
}


// Método para comprobar la distancia a los objetos
float comprobarDistancia(){
  // Con pulseIn obtenemos el tiempo que tarda en cambiar entre estados
  unsigned long tiempo = pulseIn(ECHO, HIGH);
 
  // Obtenemos la distancia en cm y la convertimos de ms a s
  float distancia = tiempo * 0.000001 * sonido / 2.0;
  delay(500);
 
  return distancia;
}


// Método para comprobar si hay que lanzar algún aviso
void aviso(float distancia){
  if (distancia<umbral1 && distancia>=umbral2){
    // Encendemos el LED azul y activamos el sonido correspondiente
    delay(1000);
    digitalWrite(LEDAZUL, HIGH);
    tone(BUZZER, 3000, 500);

    // Limpiamos el LCD
    lcd.clear();
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(1,0);
    // Escribimos un aviso
    lcd.print("NO HAY PELIGRO");
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(4,1);
    // Escribimos la distancia
    lcd.print(distancia);
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(10,1);
    // Escribimos la unidad de medida
    lcd.print("CM");
  }
  else if (distancia<umbral2 && distancia>umbral3){
    // Encendemos el LED amarillo y activamos el sonido correspondiente
    digitalWrite(LEDAMARILLO, HIGH);
    tone(BUZZER, 3000, 400);

    // Limpiamos el LCD
    lcd.clear();
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(3,0);
    // Escribimos un aviso
    lcd.print("ACERCANDOSE");
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(4,1);
    // Escribimos la distancia
    lcd.print(distancia);
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(10,1);
    // Escribimos la unidad de medida
    lcd.print("CM");
  }
  else if (distancia<umbral3 && distancia>umbral4){
    // Encendemos el LED rojo y activamos el sonido correspondiente
    digitalWrite(LEDROJO, HIGH);
    tone(BUZZER, 3500, 100);

    // Limpiamos el LCD
    lcd.clear();
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(5,0);
    // Escribimos un aviso
    lcd.print("PELIGRO");
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(4,1);
    // Escribimos la distancia
    lcd.print(distancia);
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(10,1);
    // Escribimos la unidad de medida
    lcd.print("CM");
  }
  else if (distancia<=umbral4){
    // Encendemos el LED rojo y activamos el sonido correspondiente
    digitalWrite(LEDROJO, HIGH);
    tone(BUZZER, 5000);

    // Limpiamos el LCD
    lcd.clear();
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(0,0);
    // Escribimos un aviso
    lcd.print("CHOQUE INMINENTE");
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(4,1);
    // Escribimos la distancia
    lcd.print(distancia);
    // Nos posicionamos donde nos gustaría escribir
    lcd.setCursor(10,1);
    // Escribimos la unidad de medida
    lcd.print("CM");
  }
}

Pasos dados

Primero hemos comenzado implementando la parte de hardware, siendo la pantalla LCD lo último que incorporamos al proyecto. Tras conectar la primera parte desarrollamos su código para probar el funcionamiento y, una vez visto que funcionaba correctamente, procedimos a conectar la pantalla e implementamos su código. Tras comprobar que todo funcionaba adecuadamente incorporamos el circuito al vehículo. Para ello, lo guardamos en una caja, de forma que quedase más vistoso y recogido, la cual acoplamos posteriormente al coche.

Casos de uso

En esta sección vamos a describir todos los casos de uso que se aplican a nuestro proyecto.

  • Cuando el coche se encuentra a una distancia superior a 70 cm: la pantalla, los leds y el zumbador permanecen apagados.
  • Cuando el coche se encuentra entre 70 y 45 cm: se enciende el led azul de forma intermitente, el zumbador emite sonido a 3000 Hz con 500 ms de distancia y la pantalla muestra un mensaje de “NO HAY PELIGRO” y la distancia al objeto.
  • Cuando el coche se encuentra entre 45 y 30 cm: se enciende el led amarillo de forma fija, el zumbador emite sonido a 3000 Hz con 400 ms de distancia y la pantalla muestra un mensaje de “ACERCANDOSE” y la distancia al objeto.
  • Cuando el coche se encuentra entre 30 y 10 cm: se enciende el led rojo de forma fija, el zumbador emite sonido a 3000 Hz con 100 ms de distancia y la pantalla muestra un mensaje de “PELIGRO” y la distancia al objeto.
  • Cuando el coche se encuentra entre 10 y 0 cm: se enciende el led rojo de forma fija, el zumbador emite sonido a 3000 Hz constantemente y la pantalla muestra un mensaje de “CHOQUE INMINENTE y la distancia al objeto.

Otros datos

Para la realización del proyecto hemos aprovechado el tiempo ofrecido durante las clases y lo hemos llevado a cabo todos juntos, por lo que no ha habido asignación de tareas como tal. Por otra parte, el único problema que hemos encontrado es relativo a la pantalla LCD. Cuando inicialmente la probamos ésta tenía un alto nivel de brillo; sin embargo, tras un tiempo, ese brillo se redujo considerablemente, aunque siendo todavía perfectamente visible. Hemos comprobado múltiples veces las conexiones, y todas son correctas. Tampoco es un problema de la pila, puesto que, al conectar el Arduino al ordenador, el problema persiste.

Memoria del proyecto

En el siguiente enlace es posible visualizar la memoria de este proyecto en formato PDF, la cual contiene información muy similar a la encontrada en este blog.

https://www.dropbox.com/s/aeejirjxvusgia2/Memoria%20Grupo%202.pdf?dl=0

Vídeo del proyecto

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 *