Taula de continguts:
Vídeo: Sistema de tren intel·ligent: 4 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
Dissenyat per augmentar la seguretat, prevenir accidents i augmentar la resposta positiva i productiva per ajudar si es produeixen accidents.
Pas 1: peces i materials
Les imatges anteriors es col·loquen en l'ordre de la llista de parts següent:
Llista de peces
1) One Raspberry PI 3 - Model B.
2) Un tauler de pa
3) Cables (de dalt a baix): una alimentació, un Ethernet, un adaptador
4) Un servomotor
5) Una porta de ferrocarril impresa en 3D
6) Dos LED (preferiblement vermell i verd)
7) Un polsador
8) Deu cables de pont
9) Quatre resistències
10) Ordinador portàtil o escriptori amb MATLAB
Pas 2: Configuració
A la part superior es mostren imatges de la configuració des de diversos angles:
A continuació es mostren les ubicacions dels pins (lletra minúscula seguida d’un número de fila) seguint el flux actual.
Filferros:
j19 a i47
j8 a b50
b5 a Servo
c6 a Servo
b7 a servo
a13 a j7
a17 a LED
LED a a37
e40 a j20
j53 a j18
j7 a LED
LED a j6
Botó:
e54 a h51
Resistències:
d40 a b37
c50 a d54
i51 a j47
Pas 3: Codi i lògica
L’objectiu del nostre sistema de trens és augmentar la seguretat i reduir el risc d’accidents potencialment mortals als passos de ferrocarril. Per aconseguir-ho, el nostre sistema té un sistema d’alerta de trens per als conductors, una barrera física que es baixa per evitar que els cotxes creuin la via i un botó d’emergència de seguretat perquè el conductor pugui prémer si el sistema d’alerta primerenca falla.
Sistema operatiu del conductor GUI:
La interfície gràfica d’usuari, que es mostra més amunt, es va crear per a l’ús del conductor ja que condueix el tren a través de zones de vies que tenen passos de ferrocarril amb trànsit de cotxes.
A la cantonada superior dreta, hi ha un llum que avisa el conductor si una porta de pas de ferrocarril està tancada i permet al conductor obrir o tancar la porta si és necessari. A sota d'això, es mostra l'alimentació de les càmeres per les quals passa el tren. A l'extrem inferior esquerre, la ubicació del tren es dibuixa contínuament en un gràfic i, a sota del gràfic, s'indica el nombre de voltes que el tren havia completat en un dia. A sobre del gràfic de posició, hi ha un botó d'emergència i una declaració d'estat. Això permet al conductor indicar una emergència si hi ha un cotxe a la via o la porta de seguretat no funciona correctament.
Codi:
classdef micro <matlab.apps. AppBase% Propietats que corresponen als components de l'aplicació
propietats (Accés = públic)
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
SubnormalconditionsLabel 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
final
propietats (Accés = privat)
comptador int16
final
mètodes (Accés = públic)
funció temporitzador Callback (aplicació, src, esdeveniment)
app. Temp. Text = int2str (app.counter);
app.counter = app.counter + 1;
% crida a totes les variables que necessita el programa - - - - - - - - - - - - - -
rpi global
global s
obert global
tancament global
càmera global
global m
ems global
t_count global
% ------------------------- Secció del braç del tren --------------------- ---------
si està obert == 0
writePosition (s, 50)
app.gateLamp. Color = 'verd';
final
si és a prop == 0
writePosition (s, 120)
app.gateLamp. Color = 'vermell';
final
% ---------------------- Detecció de moviment mitjançant càmera -----------------------
tot i que és cert
img = instantània (càmera);
imatge (img);
app. UIAxes (dibuixat)
final
% ---------------------- Braç obert / tancat ----------------------- --------------
si readDigitalPin (rpi, 20)> 1% llegeix el pin 17 (botó) i comprova si hi ha senyal
per a i = 40:.5: 150% augmenta el pont
writePosition (s, i)
final
per a i = 1:10% bucles parpellejant llum vermella x quantitat de vegades
writeDigitalPin (rpi, 13, 1)
pausa (.5)
writeDigitalPin (rpi, 13, 0)
pausa (.5)
final
writePosition (s, 50)% posa la porta a sota
final
% -------------------- Assistència / trama del telèfon mòbil ------------------------ -
m. AccelerationSensorEnabled = 1
m.logging = 1
dades = zeros (200, 1); % d'intialitzar les dades per a la parcel·la rodant
figura (app. UIAxes2)
p = trama (dades)
eix ([xbounda, ybounds])
pausa (1)
tic
mentre que el toc <30% s’executa durant 30 segons
[a, ~] = accellog (m);
si longitud (a)> 200
dades = a (final-199: final, 3);
en cas contrari
dades (1: longitud (a)) = a (:, 3);
final
% redibuixa la trama
p. YData = dades;
dibuix
final
% ------------------ Canvi sobtat de píxel ---------------------------- ------
x1 = img; % llegeix la càmera fora del pi
vermell_mig = mitjana (mitjana (x1 (:,:, 1)))); % llegeix la quantitat mitjana de píxels vermells
green_mean = mitjana (mitjana (x1 (:,:, 2))); % llegeix la quantitat mitjana de píxels verds
blue_mean = mitjana (mitjana (x1 (:,:, 3)))); % llegeix la quantitat mitjana de píxels blaus
si vermell_mean> 150 && green_mean> 150 && blue_mean> 150
t_count = t_count + 1;
final
app. LoopsCompletedLabel. Text = num2str (t_count)
% ------------------ Botó Programació EMS ---------------------------- ---
configurePin (rpi, 12, 'DigitalOutput'); % defineix el pin led, el pin 16, com a sortida
configurePin (rpi, 16, 'DigitalInput'); % estableix el pin del botó, pin 24, com a entrada
buttonPressed = readDigitalPin (rpi, 16); % Llegeix el valor de premut botó al pin 16
si es prem el botó == 1
mentre es prem el botó == 1
writeDigitalPin (rpi, 12, 1)
buttonunPressed = writeDigitalPin (rpi, 12, 0); %
final% Acaba el bucle 'while buttonPressed == 1'
final
writeDigitalPin (rpi, 16, 0)% Estableix el led desactivat quan ja no es prem el botó setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Internet', 'E_mail', '[email protected]'); % compte de correu per enviar des de setpref ('Internet', 'SMTP_Username', '[email protected]'); % senders username setpref ('Internet', 'SMTP_Password', 'efgroup6'); % Contrasenya dels remitents
atrezzo = 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] ',' Estat d'emergència! ',' El conductor ha activat l'interruptor de substitució manual, sol·licitant una resposta immediata! ')
app. UndernormalconditionsLabel. Text = ems
final
final
% app. Label_4. Text = num2str (curr_temp);
mètodes (Accés = privat)
% Codi que s'executa després de la creació del component
funció startupFcn (aplicació)
% ---------- Totes les variables necessàries per a aquesta funció --------------------
global rpi% arduino
rpi = raspi ('169.254.0.2', 'pi', 'gerd');
global s% servo
s = servo (rpi, 17, "MinPulseDuration", 5e-4, "MaxPulseDuration", 2.5e-3);
obert global
obert = 1;
global tancat
tancat = 1;
càmera global
cam = cameraboard (rpi);
global m
m = mobiledev;
ems global
ems = 'S'ha informat d'una emergència, notificant-ho a EMS';
t_count global
t_count = 0;
el connector de% password és EFGroup6
% Funció de temporitzador per a bucle --------------------------------
app.counter = 0;
t = temporitzador (…
"TimerFcn", @ app.timerCallback, …
"StartDelay", 1, … "Període", 1, …
"ExecutionMode", "fixedSpacing", …
'TasksToExecute', inf);
inici (t);
final
Funció de devolució de trucada
funció ManualOverrideSwitchValueChanged (aplicació, esdeveniment)
final
% Funció de botó: OpenGateButton
funció OpenGateButtonPush (aplicació, esdeveniment)
tancament global
tancar = 0;
final
Funció de botó%: CloseGateButton
funció CloseGateButtonPush (aplicació, esdeveniment)
obert global
obert = 0;
final
final
% Inicialització i construcció d'aplicacions
mètodes (Accés = privat)
% Creeu UIFigure i components
funció createComponents (aplicació)
% Crea UIFigure
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'Figura UI';
% Crea RailwaygatestatusLampLabel
app. RailwaygatestatusLampLabel = uilabel (app. UIFigure);
app. RailwaygatestatusLampLabel. HorizontalAlignment = 'dreta'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Estat de la porta de ferrocarril';
% Crea gateLamp
app.gateLamp = uilamp (app. UIFigure);
app.gateLamp. Position = [589 422 20 20];
app.gateLamp. Color = [0,9412 0,9412 0,9412];
% Crea OpenGateButton
app. OpenGateButton = uibutton (app. UIFigure, 'push');
app. OpenGateButton. ButtonPushedFcn = createCallbackFcn (app, @OpenGateButtonPushed, true); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'Porta oberta';
% Crea CloseGateButton
app. CloseGateButton = uibutton (app. UIFigure, 'push');
app. CloseGateButton. ButtonPushedFcn = createCallbackFcn (app, @CloseGateButtonPushed, true); app. CloseGateButton. Position = [474 285 100 22];
app. CloseGateButton. Text = 'Tanca la porta';
% Creeu UIAxes
app. UIAxes = uiaxes (app. UIFigure);
title (app. UIAxes, "Feed de càmera")
app. UIAxes. Position = [341 43 300 185];
% Crea EmergencyButtonStatusLampLabel
app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'dreta'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Estat del botó d'emergència';
% Crea EmergencyButtonStatusLamp
app. EmergencyButtonStatusLamp = uilamp (app. UIFigure); app. EmergencyButtonStatusLamp. Position = [254 323 20 20];
% Crea UndernormalconditionsLabel
app. UndernormalconditionsLabel = uilabel (app. UIFigure);
app. UndernormalconditionsLabel. Position = [108 285 248 22];
app. UndernormalconditionsLabel. Text = 'En condicions normals';
% Creeu UIAxes2
app. UIAxes2 = uiaxes (app. UIFigure);
title (app. UIAxes2, 'Posició del tren')
xlabel (app. UIAxes2, 'Posició X')
ylabel (app. UIAxes2, 'Posició Y')
app. UIAxes2. Box = 'activat';
app. UIAxes2. XGrid = 'activat';
app. UIAxes2. YGrid = 'activat';
app. UIAxes2. Position = [18 43 300 185];
% Crea EF230Group6Label
app. EF230Group6Label = uilabel (app. UIFigure);
app. EF230Group6Label. HorizontalAlignment = 'centre';
app. EF230Group6Label. FontSize = 28;
app. EF230Group6Label. FontWeight = 'negreta';
app. EF230Group6Label. Position = [-4 401 379 64];
app. EF230Group6Label. Text = 'EF 230 Grup 6';
% Crea IanAllishKellyBondIanDaffronLabel
app. IanAllishKellyBondIanDaffronLabel = uilabel (app. UIFigure); app. IanAllishKellyBondIanDaffronLabel. Position = [94 380 184 22]; app. IanAllishKellyBondIanDaffronLabel. Text = 'Ian Allish, Kelly Bond, Ian Daffron';
% Crea LoopsCompletedLabel
app. LoopsCompletedLabel = uilabel (app. UIFigure);
app. LoopsCompletedLabel. Position = [18 10 103 22];
app. LoopsCompletedLabel. Text = 'Bucles completats:';
% Crea una etiqueta
app. Label = uilabel (app. UIFigure);
app. Label. Position = [120 10 178 22];
app. Label. Text = '####';
final
final
mètodes (Accés = públic)
% Construeix l'aplicació
funció app = micro
% Creeu i configureu components
createComponents (aplicació)
% Registreu l'aplicació amb App Designer
registerApp (app, app. UIFigure)
% Executeu la funció d'inici
runStartupFcn (aplicació, @startupFcn)
si nargout == 0
aplicació clara
final
final
% Codi que s'executa abans de suprimir l'aplicació
suprimir (aplicació)
% Suprimeix UIFigureu quan se suprimeixi l'aplicació
esborrar (app. UIFigure)
final
final
final
Pas 4: pas final
Un cop escrit el codi i connectat el Raspberry Pi, connecteu el servomotor a la porta de la via del ferrocarril impresa en 3D tal com s’adjunta a la imatge superior.
Ara, el projecte ha finalitzat. Connecteu el raspberry PI a la via del tren i observeu el nou sistema creant passos de ferrocarril més segurs tant per als conductors com per als conductors. Juga amb el sistema interactuant amb la interfície gràfica d’usuari per activar caixes fortes establertes per evitar accidents.
Aquest és el final del tutorial, gaudiu del vostre nou sistema de trens intel·ligents.
Recomanat:
Llum LED d'escriptori intel·ligent - Il·luminació intel·ligent amb Arduino - Espai de treball Neopixels: 10 passos (amb imatges)
Llum LED d'escriptori intel·ligent | Il·luminació intel·ligent amb Arduino | Espai de treball de Neopixels: ara passem molt de temps a casa estudiant i treballant virtualment, per què no fer que el nostre espai de treball sigui més gran amb un sistema d’il·luminació personalitzat i intel·ligent basat en els LEDs Arduino i Ws2812b. Aquí us mostro com construir el vostre Smart Llum LED d'escriptori que
Converteix un telèfon intel·ligent no utilitzat en una pantalla intel·ligent: 6 passos (amb imatges)
Converteix un telèfon intel·ligent no utilitzat en una pantalla intel·ligent: el tutorial de Deze es troba a Engels, per a la versió del clàssic espanyol. Teniu un telèfon intel·ligent (antic) sense utilitzar? Convertiu-lo en una pantalla intel·ligent amb Fulls de càlcul de Google i paper i llapis seguint aquest senzill tutorial pas a pas. Quan hagis acabat
Làmpada LED intel·ligent controlada per telèfon intel·ligent Bluetooth: 7 passos
Làmpada LED intel·ligent controlada per telèfon intel·ligent Bluetooth: sempre somio amb controlar els meus aparells d’il·luminació. Aleshores algú va fabricar una increïble llum LED de colors. Fa poc em vaig trobar amb una làmpada LED de Joseph Casha a Youtube. Inspirant-me en ell, vaig decidir afegir diverses funcions mantenint la comoditat
Rellotge despertador intel·ligent: un despertador intel·ligent fabricat amb Raspberry Pi: 10 passos (amb imatges)
Rellotge despertador intel·ligent: un rellotge despertador intel·ligent fet amb Raspberry Pi: Heu volgut mai un rellotge intel·ligent? Si és així, aquesta és la solució per a vosaltres. He creat Smart Alarm Clock (Rellotge despertador intel·ligent), aquest és un rellotge que permet canviar l’hora de l’alarma segons el lloc web. Quan l’alarma s’activi, hi haurà un so (brunzidor) i 2 llums
Jardineria intel·ligent i agricultura intel·ligent basades en IoT mitjançant ESP32: 7 passos
Jardineria intel·ligent i agricultura intel·ligent basades en l’IoT que utilitzen ESP32: el món canvia a mesura que l’agricultura passa. Avui en dia, la gent integra electrònica en tots els camps i l’agricultura no n’és una excepció. Aquesta fusió d'electrònica a l'agricultura està ajudant els agricultors i les persones que gestionen els jardins