Tabla de contenido:
2025 Autor: John Day | [email protected]. Última modificación: 2025-01-13 06:57
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!