Índice:
Vídeo: Sistema de trem inteligente: 4 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:37
Projetado para aumentar a segurança, prevenir acidentes e aumentar a resposta positiva e produtiva para ajudar na ocorrência de acidentes.
Etapa 1: peças e materiais
As imagens acima são colocadas na ordem da Lista de Peças abaixo:
Lista de Peças
1) Uma framboesa PI 3 - Modelo B
2) Uma placa de ensaio
3) Cabos (de cima para baixo) - Uma alimentação, uma Ethernet, um adaptador
4) Um servo motor
5) Um portão de ferrovia impresso em 3D
6) Dois LEDs (de preferência vermelho e verde)
7) Um botão de pressão
8) Dez fios de ligação
9) Quatro resistores
10) Laptop ou Desktop com MATLAB
Etapa 2: Configuração
Acima estão as fotos da configuração de vários ângulos:
Os locais dos pinos (letra minúscula seguida por um número de linha) estão listados abaixo em ordem de acordo com o fluxo atual.
Fios:
j19 a i47
J8 a B50
b5 para servo
c6 para servo
b7 para servo
a13 a j7
a17 para LED
LED para a37
e40 a j20
j53 a j18
j7 para LED
LED para j6
Botão:
e54 a h51
Resistores:
d40 a b37
c50 a d54
i51 a j47
Etapa 3: Código e lógica
O objetivo de nosso sistema de trem é aumentar a segurança e diminuir o risco de acidentes potencialmente fatais em cruzamentos de ferrovias. Para isso, nosso sistema possui um sistema de alerta de trens para os motoristas, uma barreira física que é baixada para evitar que os carros cruzem a pista e um botão de emergência de backup para o condutor apertar se o sistema de alerta precoce falhar.
Sistema operacional do condutor GUI:
A GUI, mostrada acima, foi criada para o uso do condutor enquanto ele dirige o trem por áreas de trilhos que têm cruzamentos de ferrovias para tráfego de automóveis.
No canto superior direito, há uma luz que notifica o condutor se um próximo portão de cruzamento da ferrovia está fechado e permite que o condutor abra ou feche o portão, se necessário. Abaixo disso, é mostrado o feed das câmeras pelas quais o trem passa. No canto inferior esquerdo, a localização do trem é continuamente traçada em um gráfico e abaixo do gráfico, o número de voltas que o trem completou em um dia é indicado. Acima do gráfico de posição, há um botão de emergência e uma declaração de status. Isso permite que o condutor sinalize para uma emergência se houver um carro na pista ou se o portão de segurança não estiver funcionando corretamente.
Código:
classdef micro <matlab.apps. AppBase% Propriedades que correspondem aos componentes do aplicativo
propriedades (acesso = público)
UIFigure matlab.ui. Figure
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
Label matlab.ui.control. Label
fim
propriedades (acesso = privado)
contador int16
fim
métodos (acesso = público)
função timerCallback (app, src, evento)
app. Temp. Text = int2str (app.counter);
app.counter = app.counter + 1;
% chama todas as variáveis de que o programa precisa - - - - - - - - - - - - -
rpi global
global s
aberto global
fechamento global
câmera global
m global
ems globais
t_count global
% ------------------------- Seção do braço do trem --------------------- ---------
se aberto == 0
WritePosition (s, 50)
app.gateLamp. Color = 'green';
fim
se fechar == 0
WritePosition (s, 120)
app.gateLamp. Color = 'red';
fim
% ---------------------- Detecção de movimento via câmera -----------------------
enquanto verdadeiro
img = instantâneo (cam);
imagem (img);
app. UIAxes (drawnow)
fim
% ---------------------- Armar abrir / fechar ----------------------- --------------
se readDigitalPin (rpi, 20)> 1% lê o pino 17 (botão) e verifica o sinal
para i = 40: 0,5: 150% aumenta a ponte
WritePosition (s, i)
fim
para i = 1:10% loops piscando luz vermelha x quantidade de vezes
writeDigitalPin (rpi, 13, 1)
pausa (.5)
writeDigitalPin (rpi, 13, 0)
pausa (.5)
fim
writePosition (s, 50)% colocou a porta para baixo
fim
% -------------------- Suporte / plotagem por telefone celular ------------------------ -
m. AccelerationSensorEnabled = 1
m.logging = 1
dados = zeros (200, 1); % inicializar dados para gráfico rotativo
figura (app. UIAxes2)
p = plot (dados)
eixo ([xbounda, ybounds])
pausa (1)
tique
enquanto toc <30% executado por 30 segundos
[a, ~] = aceleração (m);
se comprimento (a)> 200
dados = a (fim-199: fim, 3);
outro
dados (1: comprimento (a)) = a (:, 3);
fim
% redesenhar o gráfico
p. YData = dados;
desenhar agora
fim
% ------------------ Mudança repentina de pixel ---------------------------- ------
x1 = img; % lê a câmera do pi
média_ vermelha = média (média (x1 (:,:, 1))); % lê a quantidade média de pixels vermelhos
média_verde = média (média (x1 (:,:, 2))); % lê a quantidade média de pixels verdes
média_ azul = média (média (x1 (:,:, 3))); % lê a quantidade média de pixels azuis
if red_mean> 150 && green_mean> 150 && blue_mean> 150
t_count = t_count + 1;
fim
app. LoopsCompletedLabel. Text = num2str (t_count)
% ------------------ Programação do botão EMS ---------------------------- ---
configurePin (rpi, 12, 'DigitalOutput'); % define o pino led, pino 16, como uma saída
configurePin (rpi, 16, 'DigitalInput'); % define o pino do botão, pino 24, como uma entrada
buttonPressed = readDigitalPin (rpi, 16); % Lê o valor de pressão do botão no pino 16
if buttonPressed == 1
enquanto o botão pressionado == 1
writeDigitalPin (rpi, 12, 1)
buttonunPressed = writeDigitalPin (rpi, 12, 0); %
fim% Termina ‘enquanto o botão pressionado == 1’ loop
fim
writeDigitalPin (rpi, 16, 0)% Desliga o led quando o botão não é mais pressionado setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Internet', 'E_mail', '[email protected]'); % conta de e-mail para enviar de setpref ('Internet', 'SMTP_Usuário', '[email protected]'); % senders username setpref ('Internet', 'SMTP_Password', 'efgroup6'); % Senha do remetente
props = java.lang. System.getProperties;
props.setProperty ('mail.smtp.auth', 'true'); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.port', '465');
sendmail ('[email protected] ',' Status de emergência! ',' O condutor ativou o interruptor de cancelamento manual, solicitando resposta imediata! ')
app. UndernormalconditionsLabel. Text = ems
fim
fim
% app. Label_4. Text = num2str (curr_temp);
métodos (acesso = privado)
% Código que é executado após a criação do componente
função startupFcn (app)
% ---------- Todas as variáveis necessárias para esta função --------------------
rpi% arduino global
rpi = raspi ('169.254.0.2', 'pi', 'framboesa');
global s% servo
s = servo (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2,5e-3);
aberto global
aberto = 1;
global fechado
fechado = 1;
câmera global
came = cameraboard (rpi);
m global
m = mobiledev;
ems globais
ems = 'Foi reportada uma emergência, notificando EMS';
t_count global
t_count = 0;
o conector em% senha é EFGroup6
% Função Timer para Loop --------------------------------
app.counter = 0;
t = temporizador (…
'TimerFcn', @ app.timerCallback,…
'StartDelay', 1, … 'Period', 1, …
'ExecutionMode', 'fixedSpacing', …
'TasksToExecute', inf);
start (t);
fim
% Função de retorno de chamada
função ManualOverrideSwitchValueChanged (app, evento)
fim
% Função pressionada de botão: OpenGateButton
função OpenGateButtonPushed (app, evento)
fechamento global
fechar = 0;
fim
% Função pressionada de botão: CloseGateButton
função CloseGateButtonPushed (app, evento)
aberto global
aberto = 0;
fim
fim
% Inicialização e construção do aplicativo
métodos (acesso = privado)
% Criar UIFigure e componentes
função createComponents (app)
% Criar UIFigure
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'Figura da interface do usuário';
% Create RailwaygatestatusLampLabel
app. RailwaygatestatusLampLabel = uilabel (app. UIFigure);
app. RailwaygatestatusLampLabel. HorizontalAlignment = 'direito'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Status do portão da ferrovia';
% Criar gateLamp
app.gateLamp = uilamp (app. UIFigure);
app.gateLamp. Position = [589 422 20 20];
app.gateLamp. Color = [0,9412 0,9412 0,9412];
% Criar OpenGateButton
app. OpenGateButton = uibutton (app. UIFigure, 'push');
app. OpenGateButton. ButtonPushedFcn = createCallbackFcn (app, @OpenGateButtonPushed, true); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'Open Gate';
% Criar CloseGateButton
app. CloseGateButton = uibutton (app. UIFigure, 'push');
app. CloseGateButton. ButtonPushedFcn = createCallbackFcn (app, @CloseGateButtonPushed, true); app. CloseGateButton. Position = [474 285 100 22];
app. CloseGateButton. Text = 'Fechar portão';
% Criar UIAxes
app. UIAxes = uiaxes (app. UIFigure);
título (app. UIAxes, 'Feed da câmera')
app. UIAxes. Position = [341 43 300 185];
% Criar EmergencyButtonStatusLampLabel
app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'direito'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Status do botão de emergência';
% Criar EmergencyButtonStatusLamp
app. EmergencyButtonStatusLamp = uilamp (app. UIFigure); app. EmergencyButtonStatusLamp. Position = [254 323 20 20];
% Criar UndernormalconditionsLabel
app. UndernormalconditionsLabel = uilabel (app. UIFigure);
app. UndernormalconditionsLabel. Position = [108 285 248 22];
app. UndernormalconditionsLabel. Text = 'Em condições normais';
% Criar UIAxes2
app. UIAxes2 = uiaxes (app. UIFigure);
título (app. UIAxes2, 'Posição do trem')
xlabel (app. UIAxes2, 'Posição X')
ylabel (app. UIAxes2, 'Posição Y')
app. UIAxes2. Box = 'ligado';
app. UIAxes2. XGrid = 'ligado';
app. UIAxes2. YGrid = 'ligado';
app. UIAxes2. Position = [18 43 300 185];
% Criar EF230Group6Label
app. EF230Group6Label = uilabel (app. UIFigure);
app. EF230Group6Label. HorizontalAlignment = 'centro';
app. EF230Group6Label. FontSize = 28;
app. EF230Group6Label. FontWeight = 'negrito';
app. EF230Group6Label. Position = [-4 401 379 64];
app. EF230Group6Label. Text = 'EF 230 Grupo 6';
% Criar IanAllishKellyBondIanDaffronLabel
app. IanAllishKellyBondIanDaffronLabel = uilabel (app. UIFigure); app. IanAllishKellyBondIanDaffronLabel. Position = [94 380 184 22]; app. IanAllishKellyBondIanDaffronLabel. Text = 'Ian Allish, Kelly Bond, Ian Daffron';
% Criar LoopsCompletedLabel
app. LoopsCompletedLabel = uilabel (app. UIFigure);
app. LoopsCompletedLabel. Position = [18 10 103 22];
app. LoopsCompletedLabel. Text = 'Loops concluídos:';
% Criar etiqueta
app. Label = uilabel (app. UIFigure);
app. Label. Position = [120 10 178 22];
app. Label. Text = '####';
fim
fim
métodos (acesso = público)
% Construir aplicativo
função app = micro
% Criar e configurar componentes
createComponents (app)
% Registre o aplicativo com o App Designer
registerApp (app, app. UIFigure)
% Execute a função de inicialização
runStartupFcn (app, @startupFcn)
se nargout == 0
aplicativo claro
fim
fim
% Código que é executado antes da exclusão do aplicativo
excluir (aplicativo)
% Excluir UIFigure quando o aplicativo for excluído
excluir (app. UIFigure)
fim
fim
fim
Etapa 4: Etapa final
Uma vez que o código foi escrito e o Raspberry Pi foi conectado, conecte o servo motor ao portão da ferrovia impresso em 3-D como está anexado na imagem acima.
Agora, o projeto está concluído. Conecte o raspberry PI aos trilhos do trem e observe o novo sistema, criando travessias de ferrovia mais seguras para motoristas e condutores de automóveis. Brinque com o sistema interagindo com a GUI para acionar cofres contra falhas instalados para evitar acidentes.
Fim do tutorial, aproveite seu novo sistema Smart Train!
Recomendado:
Switch-Adapt Toys: um brinquedo de trem a vapor tornou-se acessível !: 7 etapas (com fotos)
Switch-Adapt Toys: um brinquedo de trem a vapor tornou-se acessível !: A adaptação do brinquedo abre novos caminhos e soluções personalizadas para permitir que crianças com habilidades motoras limitadas ou deficiências de desenvolvimento interajam com os brinquedos de forma independente. Em muitos casos, as crianças que precisam dos brinquedos adaptados não conseguem entender
HACKED! Servo motor como maquinista do trem !: 17 etapas
HACKED! Servo motor como maquinista de trem !: Começando com modelos de ferrovias? Não tem orçamento suficiente para comprar todos aqueles controladores de trem caros? Não se preocupe! Neste instrutível, mostrarei como você pode fazer seu próprio controlador de trem de baixo orçamento hackeando um servo motor. Então, vamos
Trem Steampunk: 5 etapas (com fotos)
Trem Steampunk: Tive a sorte de receber uma base para cadeiras de rodas usada de um amigo. Eu precisei substituir as duas baterias para colocá-las em operação, mas esse foi um preço pequeno a pagar por uma plataforma de construção de hélice tão versátil. Eu decidi
Sistema de assento do trem: 4 etapas (com fotos)
Sistema de Assentos de Trem: Hoje fizemos um sistema que pode ser implementado em assentos de trem. Tínhamos que encontrar um incômodo e encontrar uma solução para ele. Decidimos que faríamos um sistema que informa se um assento está disponível no carrinho de trem em que você está no momento. Nada é mais
Sistema de Informação de Disponibilidade de Assentos de Trem - FGC: 8 etapas
Sistema de Informação de Disponibilidade de Assentos de Trem - FGC: Este projeto tem como base a implantação, em escala, de um trem que permite às pessoas que estão na estação saber quais assentos estão livres. Para realizar o protótipo, o software Arduino UNO é usado junto com o Processing for the