Tabla de contenido:
Video: Sistema de tren inteligente: 4 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
Diseñado para aumentar la seguridad, prevenir accidentes y aumentar la respuesta positiva y productiva para ayudar si ocurren accidentes.
Paso 1: Piezas y materiales
Las imágenes de arriba están colocadas en el orden de la Lista de piezas a continuación:
Lista de partes
1) Una frambuesa PI 3 - Modelo B
2) una placa de pruebas
3) Cables (de arriba a abajo): una alimentación, una Ethernet, un adaptador
4) Un servomotor
5) Una puerta de ferrocarril impresa en 3D
6) Dos LED (preferiblemente rojo y verde)
7) Un botón
8) Diez cables de puente
9) Cuatro resistencias
10) Computadora portátil o de escritorio con MATLAB
Paso 2: configuración
Arriba hay imágenes de la configuración desde múltiples ángulos:
Las ubicaciones de los pines (letra minúscula seguida de un número de fila) se enumeran a continuación en orden siguiendo el flujo actual.
Alambres:
j19 a i47
j8 a b50
b5 a Servo
c6 a Servo
b7 al servo
a13 a j7
a17 a LED
LED a a37
e40 a j20
j53 a j18
j7 a LED
LED a j6
Botón:
e54 a h51
Resistencias:
d40 a b37
c50 a d54
i51 a j47
Paso 3: código y lógica
El objetivo de nuestro sistema de trenes es aumentar la seguridad y reducir el riesgo de accidentes potencialmente mortales en los cruces ferroviarios. Para lograr esto, nuestro sistema cuenta con un sistema de alerta de trenes para conductores, una barrera física que se baja para evitar que los autos crucen la vía y un botón de emergencia de respaldo para que el conductor presione si falla el sistema de alerta temprana.
Sistema operativo GUI Conductor:
La GUI, que se muestra arriba, fue creada para el uso del conductor mientras conduce el tren a través de áreas de vías que tienen cruces de ferrocarril de tráfico de automóviles.
En la esquina superior derecha, hay una luz que notifica al conductor si se cierra una puerta de cruce de ferrocarril próxima y le permite al conductor abrir o cerrar la puerta si es necesario. Debajo, se muestra la transmisión de las cámaras por las que pasa el tren. En la esquina inferior izquierda, la ubicación del tren se traza continuamente en un gráfico y debajo del gráfico, se indica el número de vueltas que el tren ha completado en un día. Sobre el gráfico de posición, hay un botón de emergencia y una declaración de estado. Esto le permite al conductor señalar una emergencia si hay un automóvil en la vía o si la puerta de seguridad no funciona correctamente.
Código:
classdef micro <matlab.apps. AppBase% Propiedades que corresponden a los componentes de la aplicación
propiedades (Acceso = público)
UIFigure matlab.ui. Figura
RailwaygatestatusLampLabel matlab.ui.control. Label
gateLamp matlab.ui.control. Lamp
OpenGateButton matlab.ui.control. Button
CloseGateButton matlab.ui.control. Button
UIAxes matlab.ui.control. UIAxes
EmergencyButtonStatusLampLabel matlab.ui.control. Label
EmergencyButtonStatusLamp matlab.ui.control. Lamp
UndernormalconditionsLabel matlab.ui.control. Label
UIAxes2 matlab.ui.control. UIAxes
EF230Group6Label matlab.ui.control. Label
IanAllishKellyBondIanDaffronLabel matlab.ui.control. Label
LoopsCompletedLabel matlab.ui.control. Label
Etiqueta matlab.ui.control. Label
fin
propiedades (Acceso = privado)
contador int16
fin
métodos (Acceso = público)
función timerCallback (aplicación, src, evento)
app. Temp. Text = int2str (app.counter);
contador de aplicaciones = contador de aplicaciones + 1;
% llamar a todas las variables que necesita el programa - - - - - - - - - - - - -
rpi global
global s
abierto global
cierre global
cámara global
m global
EMS global
t_count global
% ------------------------- Sección del brazo del tren --------------------- ---------
si está abierto == 0
writePosition (s, 50)
app.gateLamp. Color = 'verde';
fin
si cerca == 0
writePosition (s, 120)
app.gateLamp. Color = 'rojo';
fin
% ---------------------- Detección de movimiento a través de la cámara -----------------------
si bien es cierto
img = instantánea (cámara);
imagen (img);
app. UIAxes (dibujar ahora)
fin
% ---------------------- Brazo abierto / cerrado ----------------------- --------------
si readDigitalPin (rpi, 20)> 1% lee el pin 17 (botón) y comprueba la señal
para i = 40:.5: 150% eleva el puente
writePosition (s, i)
fin
para i = 1:10% bucles luz roja parpadeante x cantidad de veces
writeDigitalPin (rpi, 13, 1)
pausa (.5)
writeDigitalPin (rpi, 13, 0)
pausa (.5)
fin
writePosition (s, 50)% bajó la puerta
fin
% -------------------- Soporte de teléfono móvil / Parcela ------------------------ -
m. AccelerationSensorEnabled = 1
m.logging = 1
datos = ceros (200, 1); % inicializar datos para la gráfica móvil
figura (aplicación UIAxes2)
p = plot (datos)
eje ([xbounda, ybounds])
pausa (1)
tic
mientras toc <30% se ejecuta durante 30 segundos
[a, ~] = accellog (m);
si la longitud (a)> 200
data = a (end-199: end, 3);
demás
datos (1: longitud (a)) = a (:, 3);
fin
% redibujar gráfico
p. YData = datos;
sacar ahora
fin
% ------------------ Cambio repentino de píxeles ---------------------------- ------
x1 = img; % lee la cámara fuera del pi
red_mean = mean (mean (x1 (:,:, 1))); % lee la cantidad media de píxeles rojos
green_mean = mean (mean (x1 (:,:, 2))); % lee la cantidad media de píxeles verdes
blue_mean = mean (mean (x1 (:,:, 3))); % lee la cantidad media de píxeles azules
if red_mean> 150 && green_mean> 150 && blue_mean> 150
t_count = t_count + 1;
fin
app. LoopsCompletedLabel. Text = num2str (t_count)
% ------------------ Programación EMS del botón ---------------------------- ---
configurePin (rpi, 12, 'DigitalOutput'); % establece el pin led, pin 16, como salida
configurePin (rpi, 16, 'Entrada digital'); % establece el pin del botón, pin 24, como entrada
buttonPressed = readDigitalPin (rpi, 16); % Lee el valor de pulsación del botón en el pin 16
si buttonPressed == 1
while buttonPressed == 1
writeDigitalPin (rpi, 12, 1)
buttonunPressed = writeDigitalPin (rpi, 12, 0); %
end% Termina el bucle "while buttonPressed == 1"
fin
writeDigitalPin (rpi, 16, 0)% Apaga el LED cuando ya no se presiona el botón setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Internet', 'Correo electrónico', '[email protected]'); % cuenta de correo para enviar desde setpref ('Internet', 'SMTP_Username', '[email protected]'); % de usuario del remitente setpref ('Internet', 'SMTP_Password', 'efgroup6'); % Contraseña de remitentes
props = java.lang. System.getProperties;
props.setProperty ('mail.smtp.auth', 'verdadero'); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.port', '465');
sendmail ('[email protected] ',' ¡Estado de emergencia! ',' ¡El conductor ha activado el interruptor de anulación manual, solicitando una respuesta inmediata! ')
app. UndernormalconditionsLabel. Text = ems
fin
fin
% app. Label_4. Text = num2str (curr_temp);
métodos (Acceso = privado)
% Código que se ejecuta después de la creación del componente
función startupFcn (aplicación)
% ---------- Todas las variables necesarias para esta función --------------------
rpi global% arduino
rpi = raspi ('169.254.0.2', 'pi', 'frambuesa');
s% servo global
s = servo (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);
abierto global
abierto = 1;
global cerrado
cerrado = 1;
cámara global
cam = tablero de la cámara (rpi);
m global
m = mobiledev;
EMS global
ems = 'Se ha informado de una emergencia, notificando al EMS';
t_count global
t_count = 0;
conector en% contraseña es EFGroup6
% Función de temporizador para bucle --------------------------------
app.counter = 0;
t = temporizador (…
'TimerFcn', @ app.timerCallback,…
'StartDelay', 1, … 'Period', 1, …
'ExecutionMode', 'fixedSpacing',…
'TasksToExecute', inf);
inicio (t);
fin
% Función de devolución de llamada
función ManualOverrideSwitchValueChanged (aplicación, evento)
fin
% Función de botón pulsado: OpenGateButton
función OpenGateButtonPushed (aplicación, evento)
cierre global
cerrar = 0;
fin
% Función de botón pulsado: CloseGateButton
función CloseGateButtonPushed (aplicación, evento)
abierto global
abierto = 0;
fin
fin
% De inicialización y construcción de la aplicación
métodos (acceso = privado)
% Crear UIFigure y componentes
función createComponents (aplicación)
% Crear UIFigure
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'Figura de interfaz de usuario';
% Create RailwaygatestatusLampLabel
app. RailwaygatestatusLampLabel = uilabel (app. UIFigure);
app. RailwaygatestatusLampLabel. HorizontalAlignment = 'derecha'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Estado de la puerta de ferrocarril';
% Crear gateLamp
app.gateLamp = uilamp (app. UIFigure);
app.gateLamp. Position = [589 422 20 20];
app.gateLamp. Color = [0.9412 0.9412 0.9412];
% Crear OpenGateButton
app. OpenGateButton = uibutton (app. UIFigure, 'empujar');
app. OpenGateButton. ButtonPushedFcn = createCallbackFcn (aplicación, @OpenGateButtonPushed, verdadero); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'Puerta abierta';
% Crear CloseGateButton
app. CloseGateButton = uibutton (app. UIFigure, 'empujar');
app. CloseGateButton. ButtonPushedFcn = createCallbackFcn (aplicación, @CloseGateButtonPushed, verdadero); app. CloseGateButton. Position = [474 285 100 22];
app. CloseGateButton. Text = 'Cerrar puerta';
% Crear UIAxes
app. UIAxes = uiaxes (app. UIFigure);
título (app. UIAxes, 'Camera Feed')
app. UIAxes. Position = [341 43 300 185];
% Crear EmergencyButtonStatusLampLabel
app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'derecha'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Estado del botón de emergencia';
% Crear EmergencyButtonStatusLamp
app. EmergencyButtonStatusLamp = uilamp (app. UIFigure); app. EmergencyButtonStatusLamp. Position = [254 323 20 20];
% Crear etiqueta de condiciones anormales
app. UndernormalconditionsLabel = uilabel (app. UIFigure);
app. UndernormalconditionsLabel. Position = [108 285 248 22];
app. UndernormalconditionsLabel. Text = 'En condiciones normales';
% Crear UIAxes2
app. UIAxes2 = uiaxes (app. UIFigure);
título (aplicación UIAxes2, 'Posición del tren')
xlabel (aplicación UIAxes2, 'Posición X')
ylabel (aplicación UIAxes2, 'Posición Y')
app. UIAxes2. Box = 'encendido';
app. UIAxes2. XGrid = 'encendido';
app. UIAxes2. YGrid = 'encendido';
app. UIAxes2. Position = [18 43 300 185];
% Crear EF230Group6Label
app. EF230Group6Label = uilabel (app. UIFigure);
app. EF230Group6Label. HorizontalAlignment = 'centro';
app. EF230Group6Label. FontSize = 28;
app. EF230Group6Label. FontWeight = 'negrita';
app. EF230Group6Label. Position = [-4 401 379 64];
app. EF230Group6Label. Text = 'EF 230 Grupo 6';
% Crear IanAllishKellyBondIanDaffronLabel
app. IanAllishKellyBondIanDaffronLabel = uilabel (app. UIFigure); app. IanAllishKellyBondIanDaffronLabel. Position = [94 380 184 22]; app. IanAllishKellyBondIanDaffronLabel. Text = 'Ian Allish, Kelly Bond, Ian Daffron';
% Create LoopsCompletedLabel
app. LoopsCompletedLabel = uilabel (app. UIFigure);
app. LoopsCompletedLabel. Position = [18 10 103 22];
app. LoopsCompletedLabel. Text = 'Bucles completados:';
% Crear etiqueta
app. Label = uilabel (app. UIFigure);
app. Label. Position = [120 10 178 22];
app. Label. Text = '####';
fin
fin
métodos (Acceso = público)
% Construir aplicación
función aplicación = micro
% Crear y configurar componentes
createComponents (aplicación)
% Registre la aplicación con App Designer
registerApp (aplicación, aplicación. UIFigure)
% Ejecutar la función de inicio
runStartupFcn (aplicación, @startupFcn)
si nargout == 0
aplicación clara
fin
fin
% Código que se ejecuta antes de la eliminación de la aplicación
eliminar (aplicación)
% Eliminar UIFigure cuando se elimina la aplicación
eliminar (app. UIFigure)
fin
fin
fin
Paso 4: Paso final
Una vez que se haya escrito el código y se haya cableado la Raspberry Pi, conecte el servomotor a la puerta de la vía del ferrocarril impresa en 3-D como se adjunta en la imagen de arriba.
Ahora, el proyecto está completo. Conecte el Raspberry PI a la vía del tren y observe el nuevo sistema que crea cruces ferroviarios más seguros tanto para los conductores de automóviles como para los conductores. Juegue con el sistema interactuando con la GUI para activar las cajas de seguridad instaladas para evitar accidentes.
Ese es el final del tutorial, ¡disfruta de tu nuevo sistema de tren inteligente!
Recomendado:
Luz LED de escritorio inteligente - Iluminación inteligente con Arduino - Espacio de trabajo de Neopixels: 10 pasos (con imágenes)
Luz LED de escritorio inteligente | Iluminación inteligente con Arduino | Espacio de trabajo de Neopixels: Hoy en día pasamos mucho tiempo en casa, estudiando y trabajando virtualmente, así que ¿por qué no ampliar nuestro espacio de trabajo con un sistema de iluminación personalizado e inteligente basado en Arduino y LEDs Ws2812b? Aquí te muestro cómo construir tu Smart Luz LED de escritorio que
Convierta un teléfono inteligente sin usar en una pantalla inteligente: 6 pasos (con imágenes)
Convierta un teléfono inteligente sin usar en una pantalla inteligente: el tutorial de Deze está en het Engels, voor de Nederlandse versie klik hier. ¿Tiene un teléfono inteligente (antiguo) sin usar? Conviértalo en una pantalla inteligente usando Google Sheets y algo de lápiz y papel, siguiendo este sencillo tutorial paso a paso. Cuando hayas terminado
Lámpara LED inteligente controlada por teléfono inteligente Bluetooth: 7 pasos
Lámpara LED inteligente controlada por teléfono inteligente Bluetooth: siempre sueño con controlar mis aparatos de iluminación. Entonces alguien hizo una lámpara LED increíblemente colorida. Recientemente me encontré con una lámpara LED de Joseph Casha en Youtube. Inspirándome, decidí agregar varias funciones manteniendo la estafa
Reloj despertador inteligente: un reloj despertador inteligente hecho con Raspberry Pi: 10 pasos (con imágenes)
Reloj despertador inteligente: un reloj despertador inteligente hecho con Raspberry Pi: ¿Alguna vez has querido un reloj inteligente? Si es así, ¡esta es la solución para usted! Hice Smart Alarm Clock, este es un reloj que puede cambiar la hora de la alarma de acuerdo con el sitio web. Cuando suene la alarma, habrá un sonido (zumbador) y 2 luces
Jardinería inteligente basada en IoT y agricultura inteligente con ESP32: 7 pasos
Jardinería inteligente basada en IoT y agricultura inteligente utilizando ESP32: el mundo está cambiando con el tiempo y también la agricultura. Hoy en día, la gente está integrando la electrónica en todos los campos y la agricultura no es una excepción para esto. Esta fusión de la electrónica en la agricultura está ayudando a los agricultores y a las personas que administran los jardines. En esto