Alerta temprana de accidentes de vehículo con Arduino
Video demostración
Alumno: Pastor Nso Mangue
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 proyecto tiene la finalidad de demostrar a los alumnos la utilidad de los pequeños autómatas programables para el cuidado de las personas, cuando estos autómatas se integran con la telemática. También sirve para demostrar a los alumnos que no hay que sobrecargar los autómatas con mucha lógica, sino dejarlas para lo que están hechas, que es, por una parte, recoger información con sensores y enviarla a otros sistemas con más capacidad de cálculo para la toma de decisiones; y por otra parte, recibir instrucciones de otros sistemas y aplicarlo a los actuadores.
ODS
Los objetivos de desarrollo sostenible relacionados con este trabajo son los siguientes:
- Garantizar una vida sana y promover el bienestar para todos en todas las edades (ODS 3).
- Garantizar una educación inclusiva, equitativa y de calidad y promover oportunidades de aprendizaje durante toda la vida para todos (ODS 4.
- Construir infraestructuras resilientes, promover la industrialización sostenible y fomentar la innovación (ODS 9).
- Lograr que las ciudades sean más inclusivas, seguras, resilientes y sostenibles ( ODS 11).
El proyecto tiene dos partes diferenciadas, cuyos componentes se detallan en el apartado "Componentes":
- Arduino:
- Un botón de encendido arranca el motor del vehículo.
- Cada cinco segundos Arduino escanea los sensores y prepara una cadena de caracteres en formato JSON con los valores de los sensores y envía esa cadena al puerto serie.
- Un sensor de volteo mide la posición del vehículo. Si el vehículo voltea (sensor en posición horizontal), se notifica un accidente y se apaga el motor del vehículo.
- Un sensor de ultrasonido mide el contacto o choque, si ésto ocurre, notifica del accidente.
- Un potenciómetro mide la velocidad del vehículo, que también se envía al panel de monitoreo.
- Node-Red
- Recoge del puerto serie la cadena en formato JSON enviada por Arduino.
- Descompone la cadena JSON en parámetros individuales.
- Presenta en el panel de visualización (Dashboard) los parámetros individuales que reflejan el estado del vehículo.
Alumnos para los que está dirigido
Este proyecto está dirigido a alumnos de Grado Superior de Formación Profesional; en especial a los del ciclo de Sistema Electrotécnicos y Automatizados.
Aprendizaje Transversales
Este
proyecto abarca conocimientos transversales de electrónica, domótica, electricidad y programación. Se puede impartir en asignaturas como Técnicas y procesos en instalaciones domóticas y automáticas, así como Configuración de instalaciones domóticas y automáticas.
Componentes
Componentes Hardware:
- Placa de Arduino ELEGOO UNO R3
- Protoboard
- Botón pulsador.
- Potenciómetro de 10 K
- Diodo LED rojo
- Diodo LED Verde
- 3 resistencias 220Ω
- 1 sensor de ultrasonidos
- Cables para circuito de diferentes longitudes
- Cable puerto USB
Componentes Software:
- Entorno de desarrollo Arudiono
- Librería ArduinoJson (para manipular cadenas en formato JSON).
- Node-Red
- Paleta Node-Red Serial (para conexión a puerto serie).
- Paleta Node-Red Dashboard (para visualizar los parámetros del vehículo).
Esquema
Código
Código del Arduino
#include <ArduinoJson.h> //Librería para manipulacione de cadenas en formato JSON
// Variables globales para el sensor de ultrasonido
const int pinTrigger = 2; //Pin digital 2 para el Trigger del sensor
const int pinEcho = 3; //Pin digital 3 para el Echo del sensor
// Variables globales para el inclinometro
int tiltPin = 7;
int lectura;
int previo = LOW;
long time = 0; // Para guardar la hora de la inversion de valor
long debounce = 50; // Tiempo de rebote
// Variables arranque motor: botón
const int pinArranqueMotor = 8; // pin digital 8, para el botón de arranque del motor
//Variables globales del vehículo
String persona_contacto = "Pastor Nso Mangue";
String telefono_contacto = "682xxxxxx";
String email_contacto = "idu004695@usal.es";
String posicion_vehiculo = "Derecho"; //Puede ser "Derecho" o "Volteado"
String estado_vehiculo = "Normal"; //Puede ser "Normal" o "Chocado"
//String estado_motor = "OFF";
int velocidad_vehiculo = 0; // En kilometros/hora
int proximidad_choque = 0;
String longitud_coordenadas = "GSP inactivo"; // Para futuras aplicaciones
String latitud_coordenadas = "GPS inactivo"; // Para futuras aplicaciones
String vehiculo_accidentado = "NO"; // Estado general del vehículo
// Habilitar el documento JSON
JsonDocument payload;
/*Formato JSON de las variables globales del vehículo; una cadena de caracteres con formato interpretable
{"persona_contacto":"Pastor Nso Mangue",
"telefono_contacto":"682711196",
"email_contacto":"idu004695@usal.es",
"vehiculo_accidentado":"NO",
"posicion_vehiculo":"Derecho"
,"estado_vehiculo":"Chocado",
"velocidad_vehiculo":264,
"proximidad_choque":4,
"longitud_coordenadas":"GSP inactivo",
"latitud_coordenadas":"GPS inactivo"}
*/
// led de Arranque y Parada color amarillo, motor en funcionamiento
const int ledArranqueParada = 12;
// led indicador de accidente
const int ledAccidente = 13;
void setup() {
//Inicialización sensor ultrasonido
pinMode(pinTrigger, OUTPUT); //pin como salida
pinMode(pinEcho, INPUT); //pin como entrada
digitalWrite(pinTrigger, LOW);//Inicializamos el pin con 0
//Inicialización inclinometro
pinMode(tiltPin, INPUT_PULLUP);
//Botón de arranque
pinMode(pinArranqueMotor, INPUT_PULLUP);
//Definir los I/O de Arduino
pinMode(ledArranqueParada , OUTPUT); //definir pin como salida
pinMode(ledAccidente , OUTPUT); //definir pin como salida
//Inicializar Puerto Serie
Serial.begin(9600);
//while (!Serial)
// continue;
}
void loop() {
// Lectura sensor de ultrasonido
long t; //timepo que demora en llegar el eco
long d; //distancia en centimetros
digitalWrite(pinTrigger, HIGH);
delayMicroseconds(10); //Enviamos un pulso de 10us
digitalWrite(pinTrigger, LOW);
t = pulseIn(pinEcho, HIGH); //obtenemos el ancho del pulso
d = t/59; //escalamos el tiempo a una distancia en cm
proximidad_choque = d; //distancia del vehiculo al objeto con el que choca
if (proximidad_choque < 10) {
estado_vehiculo = "Chocado"; //Si hay contacto con el objeto, simular accidente y estado_vehículo = "Chocado"
digitalWrite (ledAccidente, HIGH);
vehiculo_accidentado = "SI";
digitalWrite(ledArranqueParada,LOW); // Apagar el motor
//estado_motor = "OFF";
} else {
estado_vehiculo = "Normal";
digitalWrite (ledAccidente, LOW);
vehiculo_accidentado = "NO";
}
// Lectura sensor de vuelco
lectura = digitalRead(tiltPin);
if (lectura != previo) time = millis(); // Si hay cambio en la lectura
if ((millis() - time) > debounce) {
if (lectura == HIGH) {
posicion_vehiculo = "Volcado"; // registrar qu el coche ha volcado
vehiculo_accidentado = "SI";
digitalWrite(ledArranqueParada,LOW); //Apagar el motor
digitalWrite (ledAccidente, HIGH);
//estado_motor = "OFF";
} else {
posicion_vehiculo = "Derecho"; // registrar que el coche sigue derecho
digitalWrite (ledAccidente, LOW);
vehiculo_accidentado = "NO";
}
}
previo = lectura ;
// Lectura del potenciómetro de velocidad
// leemos del pin A0 valor
int velocidad = analogRead(A0);
velocidad_vehiculo = map(velocidad, 0, 1023, 0, 240);velocidad; //registrar la velocidad del vehículo
//velocidad_vehiculo = velocidad;
// Indicar si el motor del vehículo está en funcionamiento o parado
int estadoMotor = digitalRead (pinArranqueMotor);
if (estadoMotor == HIGH) {
digitalWrite(ledArranqueParada,HIGH);
}
//Comunicar el estado de las variables al panel de monitorización
payload["persona_contacto"] = persona_contacto;
payload["telefono_contacto"] = telefono_contacto;
payload["email_contacto"] = email_contacto;
payload["vehiculo_accidentado"] = vehiculo_accidentado;
payload["posicion_vehiculo"] = posicion_vehiculo;
payload["estado_vehiculo"] = estado_vehiculo;
//payload["estado_motor"] = estado_motor;
payload["velocidad_vehiculo"] = velocidad_vehiculo;
payload["proximidad_choque"] = proximidad_choque;
payload["longitud_coordenadas"] = longitud_coordenadas;
payload["latitud_coordenadas"] = latitud_coordenadas;
// Generar el documento JSON con todas las variables juntas y enviarlo al puerto serie de Arduino
serializeJson(payload, Serial);
Serial.println(); //acuse de envío de mensaje desde arduino por puerto serie
delay(5000); // Dormir 5 segundos y volver a escanear el estado del vehículo
}
Node-Red (flujos)
Posibles mejoras
Este proyecto se puede mejorar incorporando una aplicación móvil (Android o iOS), que le permita al usuario conectarse mediante Bluetooth a Arduino. Dicha aplicación se programará en pseudocódigo de Mit App Inventor 2.
A través de esta aplicación el usuario podrá configurar los parámetros de la persona de contacto, en caso de percance.
La aplicación móvil también se encargará de alertar mediante voz o zumbido si el usuario excede de velocidad; así como notificar mediante SMS a un teléfono de contacto o incluso establecer una llamada al contacto en tiempo real.
Otras utilidad que se le puede dar a esta aplicación móvil es presentar al usuario su ubicación en el mapa y también incorporar la ubicación (latitud y longitud) en la notificaciones.
Si se incorpora una tarjeta de memoria SD al proyecto, éste podría servir también como una especie de "caja negra" del vehículo, donde quedan registrados los parámetros como velocidad, posición, localización, estado del motor, etc.
Aclaraciones
En el vídeo, el autor describió la velocidad en kilómetros por segundo. En realidad, debería ser en kilómetros por hora.
No hay comentarios:
Publicar un comentario