Inhoudsopgave:

Slim treinsysteem: 4 stappen
Slim treinsysteem: 4 stappen

Video: Slim treinsysteem: 4 stappen

Video: Slim treinsysteem: 4 stappen
Video: 4 Stappen 2024, November
Anonim
Slim treinsysteem
Slim treinsysteem

Ontworpen om de veiligheid te vergroten, ongevallen te voorkomen en een positieve en productieve respons te vergroten als er zich toch ongelukken voordoen.

Stap 1: Onderdelen en materialen

Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen
Onderdelen en materialen

De foto's hierboven zijn in de volgorde van de onderstaande onderdelenlijst geplaatst:

Onderdelen lijst

1) Een Raspberry PI 3 - Model B

2) Een breadboard

3) Kabels (van boven naar beneden) - één voeding, één Ethernet, één adapter

4) Eén servomotor

5) Eén 3D-geprinte spoorwegpoort

6) Twee LED's (bij voorkeur rood en groen)

7) Eén drukknop

8) Tien verbindingsdraden

9) Vier Weerstanden

10) Laptop of desktop met MATLAB

Stap 2: Configuratie

Configuratie
Configuratie
Configuratie
Configuratie
Configuratie
Configuratie
Configuratie
Configuratie

Hierboven staan foto's van de configuratie vanuit meerdere hoeken:

Pinlocaties (kleine letter gevolgd door een rijnummer) worden hieronder weergegeven in volgorde van de huidige stroom.

Draden:

j19 naar i47

j8 tot b50

b5 naar servo

c6 naar servo

b7 naar servo

a13 tot j7

a17 naar LED

LED naar a37

e40 tot j20

j53 tot j18

j7 naar LED

LED naar j6

Knop:

e54 tot h51

Weerstanden:

d40 tot b37

c50 tot d54

i51 naar j47

Stap 3: Code en logica

Code en logica
Code en logica

Het doel van ons treinsysteem is om de veiligheid te vergroten en het risico op mogelijk dodelijke ongevallen op spoorwegovergangen te verkleinen. Om dit te bereiken heeft ons systeem een treinwaarschuwingssysteem voor machinisten, een fysieke barrière die wordt neergelaten om te voorkomen dat auto's het spoor oversteken en een noodknop die de conducteur kan indrukken als het vroegtijdige waarschuwingssysteem uitvalt.

GUI dirigent besturingssysteem:

De GUI, hierboven weergegeven, is gemaakt voor gebruik door de conducteur terwijl deze de trein door spoorgebieden rijdt met spoorwegovergangen voor autoverkeer.

In de rechterbovenhoek bevindt zich een lampje dat de conducteur op de hoogte stelt als een aanstaande spoorwegovergangspoort gesloten is en de conducteur in staat stelt de poort indien nodig te openen of te sluiten. Daaronder wordt het beeld weergegeven van camera's die de trein passeert. In de linkerbenedenhoek wordt de locatie van de trein continu in een grafiek uitgezet en onder de grafiek staat het aantal ronden dat de trein op een dag heeft afgelegd. Boven de positiegrafiek is er een noodknop en een statusverklaring. Hierdoor kan de conducteur signaleren voor een noodgeval als er een auto op de baan staat of het veiligheidshek niet goed werkt.

Code:

classdef micro < matlab.apps. AppBase % Eigenschappen die overeenkomen met app-componenten

eigenschappen (Toegang = openbaar)

UIFiguur matlab.ui. Figuur

RailgatestatusLampLabel 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

NoodknopStatusLamp matlab.ui.control. Lamp

Onder normale omstandighedenLabel 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

einde

eigendommen (Toegang = privé)

teller int16

einde

methoden (Toegang = openbaar)

functie timerCallback(app, src, event)

app. Temp. Text = int2str(app.teller);

app.teller = app.teller + 1;

%roep alle variabelen aan die het programma nodig heeft - - - - - - - - - - - - -

globale rpi

globaal

globaal geopend

globaal sluiten

globale camera

globale m

globale ems

globaal t_count

%------------------------- Treinarmsectie --------------------- ---------

indien geopend == 0

schrijfPositie(s, 50)

app.gateLamp. Color = 'groen';

einde

indien dichtbij == 0

schrijfPositie(s, 120)

app.gateLamp. Color = 'rood';

einde

%---------------------- Bewegingsdetectie via camera -----------------------

terwijl het waar is

img = momentopname (camera);

afbeelding (img);

app. UIAxes(getekendeow)

einde

%---------------------- Arm open/dicht ----------------------- --------------

if readDigitalPin(rpi, 20)>1% leest pin 17(knop) en controleert op signaal

voor i=40:.5:150 %legt brug op

schrijfPositie(s, i)

einde

voor i= 1:10 % lussen knipperend rood licht x aantal keren

schrijfDigitalPin(rpi, 13, 1)

pauze (.5)

writeDigitalPin(rpi, 13, 0)

pauze (.5)

einde

writePosition(s, 50)%put gate down

einde

%-------------------- Ondersteuning/Plot mobiele telefoon ------------------------ --

m. AccelerationSensorEnabled=1

m.logging=1

data=nullen(200, 1); % gegevens initialiseren voor rollende plot

figuur(app. UIAxes2)

p=plot(gegevens)

as([xbounda, ybounds])

pauze(1)

tic

terwijl toc <30% 30 seconden loopt

[a, ~]=accellog(m);

als lengte(a) >200

data=a(eind-199:eind, 3);

anders

data(1:lengte(a))=a(:, 3);

einde

%plot opnieuw tekenen

p. YData=gegevens;

getekend

einde

%------------------ Plotselinge pixelverandering ---------------------------- ------

x1=afb; % leest de camera van de foto af

red_mean = gemiddelde(gemiddelde(x1(:,:, 1))); % leest het gemiddelde aantal rode pixels

green_mean = gemiddelde(gemiddelde(x1(:,:, 2))); % leest het gemiddelde aantal groene pixels

blue_mean = gemiddelde(gemiddelde(x1(:,:, 3))); % leest het gemiddelde aantal blauwe pixels

if red_mean > 150 && green_mean > 150 && blue_mean > 150

t_count = t_count + 1;

einde

app. LoopsCompletedLabel. Text = num2str(t_count)

%------------------ Knop EMS-programmering ---------------------------- ---

configurePin(rpi, 12, 'DigitalOutput'); %zet de led-pin, pin 16, als uitgang

configurePin(rpi, 16, 'DigitalInput'); %zet de knop pin, pin 24, als invoer

buttonPressed = readDigitalPin(rpi, 16); % Leest de druk op de knop waarde op pin 16

indien knop ingedrukt == 1

terwijl knop ingedrukt == 1

schrijfDigitalPin(rpi, 12, 1)

buttonunPressed = writeDigitalPin(rpi, 12, 0); %

einde % Eindigt ‘while buttonPressed==1’ loop

einde

writeDigitalPin(rpi, 16, 0) %Zet de led op uit wanneer de knop niet langer wordt ingedrukt setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref('Internet', 'E_mail', '[email protected]'); % e-mailaccount om te verzenden vanaf setpref('Internet', 'SMTP_Username', '[email protected]'); % afzender gebruikersnaam setpref('Internet', 'SMTP_Password', 'efgroup6'); % Afzenders wachtwoord

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]', 'Noodstatus!', 'De conducteur heeft de handmatige override-schakelaar geactiveerd en vraagt om onmiddellijke reactie!')

app. UndernormalconditionsLabel. Text = ems

einde

einde

%app. Label_4. Text = num2str(curr_temp);

methoden (Toegang = privé)

% Code die wordt uitgevoerd na het maken van een component

functie opstartenFcn(app)

%----------Alle variabelen die nodig zijn voor deze functie--------------------

wereldwijde rpi %arduino

rpi = raspi('169.254.0.2', 'pi', 'framboos');

globale %servo

s = servo(rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);

globaal open

openen = 1;

wereldwijd gesloten

gesloten = 1;

globale camera

cam = camerabord (rpi);

globale m

m=mobiledev;

globale ems

ems = 'Er is een noodgeval gemeld, EMS op de hoogte gebracht';

globaal t_count

t_telling = 0;

connector op %wachtwoord is EFGroup6

% Timerfunctie voor Loop --------------------------------

app.teller = 0;

t = timer(…

'TimerFcn', @app.timerCallback, …

'StartVertraging', 1, … 'Periode', 1, …

'ExecutionMode', 'fixedSpacing', …

'TasksToExecute', inf);

begin(t);

einde

% terugbelfunctie

functie ManualOverrideSwitchValueChanged(app, event)

einde

% Knop ingedrukt functie: OpenGateButton

functie OpenGateButtonPushed(app, gebeurtenis)

globaal sluiten

sluiten = 0;

einde

% Knop ingedrukt functie: CloseGateButton

functie CloseGateButtonPushed(app, event)

globaal geopend

openen = 0;

einde

einde

% App-initialisatie en constructie

methoden (Toegang = privé)

% UIFiguur en componenten maken

functie createComponents(app)

% Creëer UIFiguur

app. UIFiguur = uifiguur;

app. UIFiguur. Positie = [100 100 640 480];

app. UIFiguur. Name = 'UI-figuur';

% Creëer RailwaygatestatusLampLabel

app. RailwaygatestatusLampLabel = uilabel(app. UIFiguur);

app. RailwaygatestatusLampLabel. HorizontalAlignment = 'rechts'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Status spoorwegpoort';

% GateLamp maken

app.gateLamp = uilamp(app. UIFiguur);

app.gateLamp. Position = [589 422 20 20];

app.gateLamp. Color = [0.9412 0.9412 0.9412];

% OpenGateButton maken

app. OpenGateButton = uibutton(app. UIFiguur, 'push');

app. OpenGateButton. ButtonPushedFcn = createCallbackFcn(app, @OpenGateButtonPushed, true); app. OpenGateButton. Position = [474 359 100 22];

app. OpenGateButton. Text = 'Poort openen';

% Maak CloseGateButton

app. CloseGateButton = uibutton (app. UIFiguur, 'push');

app. CloseGateButton. ButtonPushedFcn = createCallbackFcn(app, @CloseGateButtonPushed, true); app. CloseGateButton. Position = [474 285 100 22];

app. CloseGateButton. Text = 'Sluit poort';

% UIAxes maken

app. UIAxes = uiaxes(app. UIFiguur);

titel (app. UIAxes, 'Camerafeed')

app. UIAxes. Position = [341 43 300 185];

% NoodknopStatusLampLabel maken

app. EmergencyButtonStatusLampLabel = uilabel(app. UIFiguur); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'rechts'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Status noodknop';

% NoodknopStatusLamp maken

app. EmergencyButtonStatusLamp = uilamp(app. UIFiguur); app. EmergencyButtonStatusLamp. Position = [254 323 20 20];

% Aanmaken OndernormaleconditiesLabel

app. UndernormalconditionsLabel = uilabel (app. UIFiguur);

app. UndernormalconditionsLabel. Position = [108 285 248 22];

app. UndernormalconditionsLabel. Text = 'Onder normale omstandigheden';

% Maak UIAxes2

app. UIAxes2 = uiaxes(app. UIFiguur);

titel (app. UIAxes2, 'Positie van trein')

xlabel(app. UIAxes2, 'X Positie')

ylabel(app. UIAxes2, 'Y Positie')

app. UIAxes2. Box = 'aan';

app. UIAxes2. XGrid = 'aan';

app. UIAxes2. YGrid = 'aan';

app. UIAxes2. Positie = [18 43 300 185];

% EF230Group6Label maken

app. EF230Group6Label = uilabel(app. UIFiguur);

app. EF230Group6Label. HorizontalAlignment = 'midden';

app. EF230Group6Label. FontSize = 28;

app. EF230Group6Label. FontWeight = 'vet';

app. EF230Group6Label. Position = [-4 401 379 64];

app. EF230Group6Label. Text = 'EF 230 Groep 6';

% Creëer IanAllishKellyBondIanDaffronLabel

app. IanAllishKellyBondIanDaffronLabel = uilabel(app. UIFiguur); app. IanAllishKellyBondIanDaffronLabel. Position = [94 380 184 22]; app. IanAllishKellyBondIanDaffronLabel. Text = 'Ian Allish, Kelly Bond, Ian Daffron';

% Maak lussenCompletedLabel

app. LoopsCompletedLabel = uilabel (app. UIFiguur);

app. LoopsCompletedLabel. Position = [18 10 103 22];

app. LoopsCompletedLabel. Text = 'Lussen voltooid:';

% Label maken

app. Label = uilabel (app. UIFiguur);

app. Label. Positie = [120 10 178 22];

app. Label. Text = '####';

einde

einde

methoden (Toegang = openbaar)

% Construct-app

functie app = micro

% Componenten maken en configureren

createComponents(app)

% Registreer de app bij App Designer

registerApp(app, app. UIFiguur)

% Voer de opstartfunctie uit

runStartupFcn(app, @startupFcn)

als nagoet == 0

app wissen

einde

einde

% Code die wordt uitgevoerd voordat de app wordt verwijderd

verwijderen(app)

% UIFiguur verwijderen wanneer app wordt verwijderd

verwijderen(app. UIFiguur)

einde

einde

einde

Stap 4: Laatste stap

Laatste stap
Laatste stap

Nadat de code is geschreven en de Raspberry Pi is bedraad, bevestigt u de servomotor aan de 3D-geprinte spoorbaanpoort zoals deze is bevestigd in de bovenstaande afbeelding.

Nu is het project voltooid. Sluit de Raspberry PI aan op het treinspoor en observeer het nieuwe systeem dat veiligere spoorwegovergangen creëert voor zowel autobestuurders als conducteurs. Speel met het systeem door interactie met de GUI om failsafes te activeren die zijn ingesteld om ongelukken te voorkomen.

Dat is het einde van de tutorial, veel plezier met je nieuwe Smart Train System!

Aanbevolen: