miércoles, 24 de enero de 2024

Sistema de medición de velocidad

Video demostración



Alumno: Victor Fagúndez Poyo
Asignatura: Innovación Docente de la Especialidad de Tecnología.
Máster: Máster Universitario en Profesor de Educación Secundaria Obligatoria y Bachillerato, Formación Profesional y Enseñanza de Idiomas
Centro: Universidad de Salamanca.
Curso: 2023/24

Descripción del proyecto

Este prototipo tiene la finalidad de simular el funcionamiento de un sensor de velocidad o radar de tramo.


El sistema consiste principalmente en dos sensores de ultrasonidos utilizados como detectores de paso. Cuando el coche pasa a menos de 50 centimetros del primer sensor se activa un led indicando que ha detectado el paso y activa un cronometro que se detiene cuando el segundo sensor detecta el paso del coche a menos de 50 centimetros de distancia. 

Una vez que conocemos el tiempo que ha tardado en recorrer los 14 cm que separan ambos sensores podemos calcular mediante la ecuación vista en la clase de Fisica y Quimica de velocidad es igual a espacio entre tiempo.

Y una vez calculada la velocidad la mostramos por la pantalla LCD 16x2.


Alumnos para los que está dirigido

Este proyecto se puede adaptar perfectamente para las asignaturas de Tecnología y Tecnología y Digitalización de 3º y 4º de ESO.

Aprendizaje Transversales

Este proyecto puede utilizarse para el aprendizaje transversal con asignaturas como Educación Fisica en la que los alumnos pueden medir su velocidad corriendo y con la asignatura de Fisica y Quimica para el calculo de velocidades.

Componentes

  • Placa de Arduino ELEGOO UNO R3 
  • Protoboard
  • Pantalla LCD 16x2
  • Potenciómetro de 10 K
  • Diodo LED rojo
  • Diodo LED azul          
  • 3 resistencias 220Ω
  • 2 sensores de ultrasonidos
  • Cables para circuito de diferentes longitudes
  • Cable puerto USB


Esquema 




Código

// include the library code:
#include <LiquidCrystal.h>
// Definición de pines para los sensores de ultrasonidos
const int triggerPinInicial = 3;
const int echoPinInicial = 2;
const int LedPasoInicial = 4;

const int triggerPinFinal = 13;
const int echoPinFinal = 12;
const int LedPasoFinal = 11;
// pines pantalla
const int rs = 10, en = 9, d4 = 8, d5 = 7, d6 = 6, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Variables para el cronómetro
unsigned long startTime = 0;
unsigned long endTime = 0;
unsigned long elapsedTime;

//variables para medir distancia
boolean pasoInicial=false;
boolean pasoFinal=false;

float distanciaInicial;
float distanciaFinal;
float speed;

// Constante para la distancia de activación del cronómetro (en centímetros)
const int activationDistance = 50;

// Constante para la distancia entre los sensores (en centímetros)
const int sensorSeparation = 14;

void setup() {
  // Inicializar los pines de los sensores de ultrasonidos
  pinMode(triggerPinInicial, OUTPUT);
  pinMode(echoPinInicial, INPUT);
  pinMode(triggerPinFinal, OUTPUT);
  pinMode(echoPinFinal, INPUT);

  // Inicializar el puerto serie
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:

  lcd.begin(16, 2);

  // Print a message to the LCD.

  lcd.print("Velocidad:");
}

void loop() {
  //Si no se ha detectado el primer paso
  if(pasoInicial==false){
    // Medir la distancia con el primer sensor
    distanciaInicial = measureDistance(triggerPinInicial, echoPinInicial);
    Serial.print("La distanciaInicial es: ");
    Serial.print(distanciaInicial);
    Serial.print("\n");
    //Si la distancia Inicial es menor que la distancia de activación
    if (distanciaInicial <= activationDistance) {
      digitalWrite(LedPasoInicial, HIGH); //encendmos el Led de paso inicial
      pasoInicial = true; //activamos la variable de paso inicial
      //activamos el reloj
      if (startTime == 0) {
        startTime = millis();
        Serial.println("Cronómetro activado");
      }
    }else{
      digitalWrite(LedPasoInicial, LOW); //apagamos el Led de paso inicial
    }
  }
  //Si no se ha detectado el segundo paso
  if(pasoInicial==true && pasoFinal==false){
    // Medir la distancia con el segundo sensor si no se ha registrado el segundo paso
    distanciaFinal = measureDistance(triggerPinFinal, echoPinFinal);
    Serial.print("La distanciaFinal es: ");
    Serial.print(distanciaFinal);
    Serial.print("\n");
    //Si la distancia Final es menor que la distancia de activación
    if (distanciaFinal <= activationDistance) {
      digitalWrite(LedPasoFinal, HIGH); //encendmos el Led de paso Final
      pasoFinal = true; //activamos la variable de paso Final
      //detenemos el reloj
      if (startTime != 0) {
        endTime = millis();
        elapsedTime = endTime - startTime;
        speed = calculateSpeed(elapsedTime);
        Serial.print("Velocidad: ");
        Serial.print(speed);
        Serial.println(" km/h");
        // set the cursor to column 0, line 1
        // (note: line 1 is the second row, since counting begins with 0):
        lcd.setCursor(0, 1);
        // print the number of seconds since reset:
        lcd.print(speed);
        lcd.print(" km/h    ");
        // Reiniciar el cronómetro
        startTime = 0;
        endTime=0;
        speed= 0;
        pasoInicial = false;
        pasoFinal = false;
        digitalWrite(LedPasoInicial, LOW);
        digitalWrite(LedPasoFinal, LOW);
        delay(5000);
        lcd.setCursor(0, 1);
        lcd.print("Esperando...");
      }
    }else{
      digitalWrite(LedPasoInicial, LOW); //apagamos el Led de paso inicial
    }
  }
 
}

float measureDistance(int triggerPin, int echoPin) {
  // Generar un pulso corto para activar el sensor
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  // Medir la duración del pulso de eco
  float duration = pulseIn(echoPin, HIGH);

  // Calcular la distancia en centímetros
  float distance = duration * 0.034 / 2;

  return distance;
}

float calculateSpeed(unsigned long elapsedTime) {
  // Calcular la velocidad en cm/s
  Serial.println("El tiempo es");
  Serial.println(elapsedTime);
  float speed = (sensorSeparation) / (elapsedTime / 1000.0);
  speed= speed *0.036; //velocidad en km/h
  return speed;
}

 

No hay comentarios:

Publicar un comentario