Tabla de contenido:

Sistema de tren inteligente: 4 pasos
Sistema de tren inteligente: 4 pasos

Video: Sistema de tren inteligente: 4 pasos

Video: Sistema de tren inteligente: 4 pasos
Video: Sabías esto? Cómo subirse en las nuevas sillas del aeropuerto sin romperte la falda.Que peligroso es 2024, Noviembre
Anonim
Sistema de tren inteligente
Sistema de tren inteligente

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

Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes y materiales
Partes 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

Configuración
Configuración
Configuración
Configuración
Configuración
Configuración
Configuración
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

Código y lógica
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

Último paso
Último paso

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: