Sisukord:
2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Mõeldud ohutuse suurendamiseks, õnnetuste ärahoidmiseks ning positiivse ja produktiivse reageerimise suurendamiseks õnnetuste korral.
Samm: osad ja materjalid
Ülaltoodud pildid on paigutatud alltoodud osade loendi järjekorda:
Osade nimekiri
1) Üks Vaarika PI 3 - mudel B
2) Üks leivalaud
3) Kaablid (ülevalt alla) - üks toide, üks Ethernet, üks adapter
4) Üks servomootor
5) Üks 3D -trükitud raudteevärav
6) Kaks LED -i (soovitavalt punane ja roheline)
7) Üks nupp
8) Kümme hüppajajuhet
9) Neli takistit
10) Sülearvuti või töölaud koos MATLAB -iga
2. samm: seadistamine
Ülal on pildid konfigureerimisest mitme nurga alt:
Nööpnõelte asukohad (väiketäht, millele järgneb rea number) on praeguses voos järgnevas järjekorras loetletud allpool.
Juhtmed:
j19 kuni i47
j8 kuni b50
b5 servole
c6 servole
b7 servole
a13 kuni j7
a17 kuni LED
LED kuni a37
e40 kuni j20
j53 kuni j18
j7 kuni LED
LED kuni j6
Nupp:
e54 kuni h51
Takistid:
d40 kuni b37
c50 kuni d54
i51 kuni j47
Samm: kood ja loogika
Meie rongisüsteemi eesmärk on suurendada ohutust ja vähendada potentsiaalselt surmavate õnnetuste ohtu raudteeülesõitudel. Selle saavutamiseks on meie süsteemis olemas juhtidele mõeldud rongi hoiatussüsteem, füüsiline tõke, mis on langetatud, et vältida autode rööbastee ületamist, ja varajase hoiatussüsteemi rikke korral juhile vajutatav hädaabinupp.
GUI dirigendi operatsioonisüsteem:
Ülaltoodud graafiline kasutajaliides on loodud konduktori kasutamiseks, kui nad sõidavad rongiga läbi rööbastee, kus on autoliiklusega raudteeülesõidud.
Parempoolses ülanurgas on tuli, mis teavitab konduktorit, kui eesolev raudteeületusvärav on suletud, ja võimaldab juhil vajadusel värava avada või sulgeda. Allpool on näidatud rongist mööduvate kaamerate voog. Vasakus allnurgas joonistatakse rongi asukoht pidevalt graafikule ja graafiku all on märgitud rongide päeva jooksul läbitud ringide arv. Asukohagraafiku kohal on hädaabinupp ja olekuavaldus. See võimaldab konduktoril hädaolukorrast märku anda, kui rajal on auto või turvavärav ei tööta korralikult.
Kood:
classdef micro <matlab.apps. AppBase % Atribuudid, mis vastavad rakenduse komponentidele
atribuudid (juurdepääs = avalik)
UIFigure matlab.ui. Joonis
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
Ebatavalised tingimusedLabel matlab.ui.control. Label
UIAxes2 matlab.ui.control. UIAxes
EF230Group6Label matlab.ui.control. Label
IanAllishKellyBondIanDaffronLabel matlab.ui.control. Label
LoopsCompletedLabel matlab.ui.control. Label
Silt matlab.ui.control. Label
lõpp
atribuudid (juurdepääs = privaatne)
loendur int16
lõpp
meetodid (juurdepääs = avalik)
funktsiooni taimerCallback (rakendus, src, sündmus)
app. Temp. Text = int2str (rakendus.loendur);
rakendus.loendur = rakendus.loendur + 1;
%kutsub kõiki muutujaid, mida programm vajab - - - - - - - - - - - - - -
globaalne rpi
globaalne s
globaalne avatud
globaalne lähedus
globaalne nukk
globaalne m
globaalsed emid
globaalne t_count
%------------------------- Rongi käeosa --------------------- ---------
kui avatud == 0
writePosition (s, 50)
app.gateLamp. Color = 'roheline';
lõpp
kui lähedal == 0
writePosition (s, 120)
app.gateLamp. Color = 'punane';
lõpp
%---------------------- Liikumise tuvastamine kaamera kaudu -----------------------
kuigi tõsi
img = hetktõmmis (nukk);
pilt (img);
app. UIAxes (tõmmatud)
lõpp
%---------------------- Käsi lahti/kinni ----------------------- --------------
kui readDigitalPin (rpi, 20)> 1 %loeb tihvti 17 (nupp) ja kontrollib signaali
i = 40:.5: 150 %tõstab silda
writePosition (s, i)
lõpp
i = 1:10 %silmused vilguvad punase tulega x korda
writeDigitalPin (rpi, 13, 1)
paus (.5)
writeDigitalPin (rpi, 13, 0)
paus (.5)
lõpp
writePosition (s, 50)%pani värava alla
lõpp
%-------------------- Mobiiltelefonide tugi/maatükk ------------------------ -
m. AccelerationSensorEnabled = 1
m. logimine = 1
andmed = nullid (200, 1); %intialiseeri jooksva graafiku andmed
joonis (umbes. UIAxes2)
p = graafik (andmed)
telg ([xbounda, ybounds])
paus (1)
tic
samal ajal kui toc <30 %töötab 30 sekundit
[a, ~] = accellog (m);
kui pikkus (a)> 200
andmed = a (199-lõpp: lõpp, 3);
muidu
andmed (1: pikkus (a)) = a (: 3);
lõpp
%uuesti joonistada
p. YData = andmed;
tõmmatud
lõpp
%------------------ Äkiline pikslivahetus ---------------------------- ------
x1 = img; % loeb kaamera pi välja
red_mean = keskmine (keskmine (x1 (:,:, 1))); % loeb punaste pikslite keskmist kogust
roheline_mean = keskmine (keskmine (x1 (:,:, 2))); % loeb roheliste pikslite keskmist kogust
blue_mean = keskmine (keskmine (x1 (:,:, 3))); % loeb siniste pikslite keskmist kogust
kui red_mean> 150 && green_mean> 150 && blue_mean> 150
t_count = t_count + 1;
lõpp
app. LoopsCompletedLabel. Text = num2str (t_count)
%------------------ Nupp EMS programmeerimine ---------------------------- ---
configurePin (rpi, 12, 'DigitalOutput'); %määrab väljundiks LED -tihvti, tihvti 16
configurePin (rpi, 16, 'DigitalInput'); %määrab sisendiks nööpnõela, tihvti 24
buttonPressed = readDigitalPin (rpi, 16); % Loeb nupu 16 vajutamise väärtust
kui nuppu vajutatakse == 1
nupu all olles == 1
writeDigitalPin (rpi, 12, 1)
buttonunPressed = writeDigitalPin (rpi, 12, 0); %
end % Lõpeb nupu vajutamise ajal == 1 'silmus
lõpp
writeDigitalPin (rpi, 16, 0) %Lülitab LED välja, kui nuppu enam ei vajutata setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Internet', 'E_mail', '[email protected]'); % meilikonto saatmiseks aadressilt setpref ('Internet', 'SMTP_Username', '[email protected]'); % saatjate kasutajanimi setpref ('Internet', 'SMTP_Password', 'efgroup6'); % Saatjate parool
rekvisiidid = 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] ',' Emergency Status! ',' Dirigent on aktiveerinud käsitsi alistamise lüliti, paludes kohest reageerimist! ')
app. UndernormalconditionsLabel. Text = ems
lõpp
lõpp
%app. Label_4. Text = num2str (curr_temp);
meetodid (juurdepääs = privaatne)
% Kood, mis käivitatakse pärast komponentide loomist
funktsioon startupFcn (rakendus)
%---------- Kõik selle funktsiooni jaoks vajalikud muutujad --------------------
globaalne rpi %arduino
rpi = raspi ('169.254.0.2', 'pi', 'vaarikas');
globaalne s %servo
s = servo (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);
globaalne avatud
avatud = 1;
globaalne suletud
suletud = 1;
globaalne nukk
nukk = kaameralaud (rpi);
globaalne m
m = mobiledev;
globaalsed emid
ems = 'On teatatud hädaolukorrast, millest teavitatakse EMS -i';
globaalne t_count
t_count = 0;
%parooli pistik on EFGroup6
Loopi taimeri funktsioon --------------------------------
rakendus.loendur = 0;
t = taimer (…
'TimerFcn', @app.timerCallback,…
„StartDelay”, 1,… „Periood”, 1,…
'ExecutionMode', 'fixSpacing',…
'TasksToExecute', inf);
algus (t);
lõpp
% Tagasihelistamise funktsioon
funktsioon ManualOverrideSwitchValueChanged (rakendus, sündmus)
lõpp
% Nupu vajutamise funktsioon: OpenGateButton
funktsioon OpenGateButtonPushed (rakendus, sündmus)
globaalne lähedus
sule = 0;
lõpp
% Nupu vajutamise funktsioon: CloseGateButton
funktsioon CloseGateButtonPushed (rakendus, sündmus)
globaalne avatud
avatud = 0;
lõpp
lõpp
% Rakenduse initsialiseerimine ja ehitamine
meetodid (juurdepääs = privaatne)
% UIFigure'i ja komponentide loomine
function createComponents (rakendus)
% Loo UIFigure
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'Kasutajaliidese joonis';
% Loo RailwaygatestatusLampLabel
app. RailwaygatestatusLampLabel = uilabel (app. UIFigure);
app. RailwaygatestatusLampLabel. HorizontalAlignment = 'õige'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Raudteevärava olek';
% Loo gateLamp
app.gateLamp = uilamp (app. UIFigure);
app.gateLamp. Position = [589 422 20 20];
app.gateLamp. Color = [0,9412 0,9412 0,9412];
% Loo OpenGateButton
app. OpenGateButton = uibutton (app. UIFigure, 'push');
app. OpenGateButton. ButtonPushedFcn = createCallbackFcn (rakendus, @OpenGateButtonPushed, true); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'Avatud värav';
% Loo CloseGateButton
app. CloseGateButton = uibutton (app. UIFigure, 'push');
app. CloseGateButton. ButtonPushedFcn = createCallbackFcn (rakendus, @CloseGateButtonPushed, true); app. CloseGateButton. Position = [474 285 100 22];
app. CloseGateButton. Text = 'Sulge värav';
% UIAxide loomine
app. UIAxes = uiaxes (app. UIFigure);
pealkiri (app. UIAxes, 'Camera Feed')
app. UIAxes. Position = [341 43 300 185];
% Loo EmergencyButtonStatusLampLabel
app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'õige'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Hädaabinupu olek';
% Loo EmergencyButtonStatusLamp
app. EmergencyButtonStatusLamp = uilamp (app. UIFigure); app. EmergencyButtonStatusLamp. Position = [254 323 20 20];
% Loo UndernormalconditionsLabel
app. UndernormalconditionsLabel = uilabel (app. UIFigure);
app. UndernormalconditionsLabel. Position = [108 285 248 22];
app. UndernormalconditionsLabel. Text = 'Normaaltingimustes';
% Loo UIAxes2
app. UIAxes2 = uiaxes (app. UIFigure);
pealkiri (u. UIAxes2, rongi asukoht)
xlabel (umbes. UIAxes2, 'X Position')
ylabel (app. UIAxes2, 'Y Position')
app. UIAxes2. Box = 'sees';
app. UIAxes2. XGrid = 'sees';
app. UIAxes2. YGrid = 'sees';
app. UIAxes2. Position = [18 43 300 185];
% Loo EF230Group6Label
app. EF230Group6Label = uilabel (app. UIFigure);
app. EF230Group6Label. HorizontalAlignment = 'keskus';
app. EF230Group6Label. FontSize = 28;
app. EF230Group6Label. FontWeight = 'paks';
app. EF230Group6Label. Position = [-4 401 379 64];
app. EF230Group6Label. Text = 'EF 230 Group 6';
% Loo IanAllishKellyBondIanDaffronLabel
app. IanAllishKellyBondIanDaffronLabel = uilabel (app. UIFigure); app. IanAllishKellyBondIanDaffronLabel. Position = [94 380 184 22]; app. IanAllishKellyBondIanDaffronLabel. Text = 'Ian Allish, Kelly Bond, Ian Daffron';
% Loo LoopsCompletedLabel
app. LoopsCompletedLabel = uilabel (app. UIFigure);
app. LoopsCompletedLabel. Position = [18 10 103 22];
app. LoopsCompletedLabel. Text = 'Loops Completed:';
% Loo silt
app. Label = uilabel (app. UIFigure);
app. Label. Position = [120 10 178 22];
app. Label. Text = '####';
lõpp
lõpp
meetodid (juurdepääs = avalik)
Rakenda rakendus %
funktsiooni rakendus = mikro
% Komponentide loomine ja konfigureerimine
createComponents (rakendus)
% Registreerige rakendus App Designeris
registerApp (rakendus, rakendus. UIFigure)
% Käivitage käivitusfunktsioon
runStartupFcn (rakendus, @startupFcn)
kui nargout == 0
selge rakendus
lõpp
lõpp
% Kood, mis käivitatakse enne rakenduse kustutamist
kustuta (rakendus)
% Kustuta UIFigure, kui rakendus kustutatakse
kustuta (app. UIFigure)
lõpp
lõpp
lõpp
4. samm: viimane etapp
Kui kood on kirjutatud ja Raspberry Pi on ühendatud, kinnitage servomootor 3-D trükitud raudtee rööbastee värava külge, nagu see on ülaltoodud pildil.
Nüüd on projekt lõpule viidud. Ühendage vaarika PI rongirajaga ja jälgige uut süsteemi, mis loob turvalisemad raudteeületuskohad nii autojuhtidele kui ka konduktoritele. Mängige süsteemiga, suheldes GUI -ga, et käivitada õnnetuste vältimiseks seatud tõrkeseifid.
Sellega on õpetus lõppenud, nautige oma uut nutikat rongisüsteemi!