Inhaltsverzeichnis:

Intelligentes Zugsystem - Gunook
Intelligentes Zugsystem - Gunook

Video: Intelligentes Zugsystem - Gunook

Video: Intelligentes Zugsystem - Gunook
Video: Factorio [Version 0.15.13/Deutsch] Tutorial: Intelligentes Zugsystem Teil 2 2024, September
Anonim
Intelligentes Zugsystem
Intelligentes Zugsystem

Entwickelt, um die Sicherheit zu erhöhen, Unfälle zu vermeiden und die positive und produktive Reaktion zu erhöhen, um bei Unfällen zu helfen.

Schritt 1: Teile und Materialien

Teile und Materialien
Teile und Materialien
Teile und Materialien
Teile und Materialien
Teile und Materialien
Teile und Materialien
Teile und Materialien
Teile und Materialien

Die Bilder oben sind in der Reihenfolge der Teileliste unten angeordnet:

Liste der Einzelteile

1) Ein Raspberry PI 3 - Modell B

2) Ein Steckbrett

3) Kabel (von oben nach unten) - One Power, One Ethernet, One Adapter

4) Ein Servomotor

5) Ein 3D-gedrucktes Eisenbahntor

6) Zwei LEDs (vorzugsweise rot und grün)

7) Ein Druckknopf

8) Zehn Überbrückungsdrähte

9) Vier Widerstände

10) Laptop oder Desktop mit MATLAB

Schritt 2: Konfiguration

Aufbau
Aufbau
Aufbau
Aufbau
Aufbau
Aufbau
Aufbau
Aufbau

Oben sind Bilder der Konfiguration aus mehreren Blickwinkeln:

Die Pin-Positionen (Kleinbuchstabe gefolgt von einer Zeilennummer) sind unten in der Reihenfolge aufgeführt, die dem aktuellen Fluss folgt.

Drähte:

j19 bis i47

j8 bis b50

b5 zu Servo

c6 zu Servo

b7 zu Servo

a13 bis j7

a17 zu LED

LED zu a37

e40 bis j20

j53 bis j18

j7 zu LED

LED an j6

Taste:

e54 bis h51

Widerstände:

d40 bis b37

c50 bis d54

i51 bis j47

Schritt 3: Code und Logik

Code und Logik
Code und Logik

Ziel unseres Zugsystems ist es, die Sicherheit zu erhöhen und das Risiko potenziell tödlicher Unfälle an Bahnübergängen zu senken. Um dies zu erreichen, verfügt unser System über ein Zugwarnsystem für den Fahrer, eine physische Schranke, die abgesenkt wird, um das Überqueren des Gleises zu verhindern, und einen Backup-Notrufknopf, den der Schaffner bei Ausfall des Frühwarnsystems drücken kann.

GUI-Leiter-Betriebssystem:

Die oben gezeigte GUI wurde für die Verwendung des Schaffners erstellt, wenn er den Zug durch Gleisbereiche mit Autoverkehr-Bahnübergängen fährt.

In der oberen rechten Ecke befindet sich ein Licht, das den Schaffner benachrichtigt, wenn ein bevorstehendes Bahnübergangstor geschlossen ist und es dem Schaffner ermöglicht, das Tor bei Bedarf zu öffnen oder zu schließen. Darunter wird der Feed von Kameras angezeigt, an denen der Zug vorbeifährt. In der unteren linken Ecke wird der Standort des Zuges kontinuierlich in einer Grafik dargestellt und unterhalb der Grafik wird die Anzahl der Runden angegeben, die der Zug an einem Tag zurückgelegt hat. Über dem Positionsdiagramm befindet sich eine Notruftaste und eine Statusangabe. Dadurch kann der Schaffner einen Notfall signalisieren, wenn sich ein Auto auf dem Gleis befindet oder die Schutztür nicht richtig funktioniert.

Code:

classdef micro < matlab.apps. AppBase % Eigenschaften, die App-Komponenten entsprechen

Eigenschaften (Zugriff = öffentlich)

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

UnternormalbedingungenLabel 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

Ende

Eigenschaften (Zugriff = privat)

Zähler int16

Ende

Methoden (Zugriff = öffentlich)

Funktion timerCallback(app, src, event)

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

App. Zähler = App. Zähler + 1;

%rufe alle Variablen auf, die das Programm benötigt - - - - - - - - - - - - -

globale rpi

globales s

global offen

global schließen

globale Kamera

global m

globale ems

globaler t_count

%------------------------- Zugarmabschnitt --------------------- ---------

wenn offen == 0

writePosition(en, 50)

app.gateLamp. Color = 'grün';

Ende

wenn nah == 0

writePosition(en, 120)

app.gateLamp. Color = 'rot';

Ende

%--------------------- Bewegungserkennung über Kamera ----------------------

während wahr

img = Schnappschuss (Kamera);

Bild(img);

app. UIAxes(drawnow)

Ende

%--------------------- Arm öffnen/schließen ---------------------- --------------

if readDigitalPin(rpi, 20)>1 % liest Pin 17 (Taste) und prüft auf Signal

für i=40:.5:150 %hebt Brücke

writePosition(en, i)

Ende

für i= 1:10 %Schleifen blinkendes rotes Licht x oft

writeDigitalPin(rpi, 13, 1)

Pause(.5)

writeDigitalPin(rpi, 13, 0)

Pause(.5)

Ende

writePosition(s, 50)%put-Gate unten

Ende

%-------- Handy-Support/Plot ------------------------ --

m. AccelerationSensorEnabled=1

m.logging=1

Daten = Nullen (200, 1); % Daten für Rolling-Plot initialisieren

Abbildung(app. UIAxes2)

p=plot(Daten)

Achse([xbounda, ybounds])

Pause(1)

tic

während toc <30 % 30 Sekunden lang laufen

[a, ~] = acccellog(m);

wenn Länge(a) >200

Daten=a(Ende-199:Ende, 3);

anders

data(1:Länge(a))=a(:, 3);

Ende

% Plot neu zeichnen

p. YData=Daten;

gezeichnet

Ende

%------------------ Plötzliche Pixeländerung ------------------------------------ ------

x1=img; % liest die Kamera vom Pi

red_mean = mean(mean(x1(:,:, 1))); % liest die durchschnittliche Anzahl roter Pixel

green_mean = mean(mean(x1(:,:, 2))); % liest die durchschnittliche Anzahl grüner Pixel

blue_mean = mean(mean(x1(:,:, 3))); % liest die durchschnittliche Anzahl blauer Pixel

wenn rot_Mittelwert > 150 && grün_Mittelwert > 150 && blau_Mittelwert > 150

t_count = t_count + 1;

Ende

app. LoopsCompletedLabel. Text = num2str(t_count)

%------------------ Taste EMS-Programmierung -------------------------- ---

configurePin(rpi, 12, 'DigitalOutput'); % setzt den LED-Pin, Pin 16, als Ausgang

configurePin(rpi, 16, 'DigitalInput'); % setzt den Button-Pin, Pin 24, als Eingang

buttonPressed = readDigitalPin(rpi, 16); % Liest den Tastendruckwert an Pin 16

if buttonPressed == 1

während TasteGedrückt == 1

writeDigitalPin(rpi, 12, 1)

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

end % Beendet ‘While buttonPressed==1’ Schleife

Ende

writeDigitalPin(rpi, 16, 0) % Setzt die LED aus, wenn die Taste nicht mehr gedrückt wird setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref('Internet', 'E_Mail', '[email protected]'); % E-Mail-Konto zum Senden von setpref('Internet', 'SMTP_Username', '[email protected]'); % Benutzername des Absenders setpref('Internet', 'SMTP_Password', 'efgroup6'); % Absender-Passwort

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]', 'Notstatus!', 'Der Schaffner hat den manuellen Überbrückungsschalter aktiviert und fordert sofortige Reaktion!')

app. UndernormalconditionsLabel. Text = ems

Ende

Ende

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

Methoden (Zugriff = privat)

% Code, der nach der Komponentenerstellung ausgeführt wird

Funktion startFcn(app)

%------------Alle Variablen, die für diese Funktion benötigt werden--------

globale rpi %arduino

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

global s %servo

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

global offen

offen = 1;

global geschlossen

geschlossen = 1;

globale Kamera

cam = Kameraplatine (rpi);

global m

m=mobiledev;

globale ems

ems = 'Ein Notfall wurde gemeldet und EMS benachrichtigt';

globaler t_count

t_count = 0;

Connector auf %Passwort ist EFGroup6

% Timer-Funktion für Schleife --------------------------------

App. Zähler = 0;

t = Timer (…

'TimerFcn', @app.timerCallback, …

'StartVerzögerung', 1, … 'Zeitraum', 1, …

'ExecutionMode', 'fixedSpacing', …

'AufgabenzuAusführen', inf);

start(t);

Ende

% Rückruffunktion

Funktion ManualOverrideSwitchValueChanged(App, Ereignis)

Ende

% Taste gedrückt Funktion: OpenGateButton

Funktion OpenGateButtonPushed(App, Ereignis)

global schließen

schließen = 0;

Ende

% Taste gedrückt Funktion: CloseGateButton

Funktion CloseGateButtonPushed(App, Ereignis)

global offen

offen = 0;

Ende

Ende

% App-Initialisierung und -Konstruktion

Methoden (Zugriff = privat)

% UIFigure und Komponenten erstellen

Funktion createComponents(App)

% UIFigure erstellen

app. UIFigure = uifigure;

app. UIFigure. Position = [100 100 640 480];

app. UIFigure. Name = 'UI-Figur';

% Erstellen Sie ein RailwaygatestatusLampLabel

app. RailwaygatestatusLampLabel = uilabel(app. UIFigure);

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

% GateLampe erstellen

app.gateLamp = uilamp(app. UIFigure);

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

app.gateLamp. Color = [0,9412 0,9412 0,9412];

% OpenGateButton erstellen

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

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

app. OpenGateButton. Text = 'Tor öffnen';

% CloseGateButton erstellen

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

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

app. CloseGateButton. Text = 'Tor schließen';

% UIAxes erstellen

app. UIAxes = uiaxes(app. UIFigure);

title(app. UIAxes, 'Kamera-Feed')

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

% NotfallButtonStatusLampLabel erstellen

app. EmergencyButtonStatusLampLabel = uilabel(app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'rechts'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Notfallschaltflächenstatus';

% Erstellen Sie EmergencyButtonStatusLamp

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

% Unternormalbedingungen-Etikett erstellen

app. UndernormalconditionsLabel = uilabel(app. UIFigure);

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

app. UndernormalconditionsLabel. Text = 'Unter normalen Bedingungen';

% UIAxes2 erstellen

app. UIAxes2 = uiaxes(app. UIFigure);

title(app. UIAxes2, 'Position des Zuges')

xlabel(app. UIAxes2, 'X-Position')

ylabel(app. UIAxes2, 'Y-Position')

app. UIAxes2. Box = 'an';

app. UIAxes2. XGrid = 'an';

app. UIAxes2. YGrid = 'an';

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

% EF230Group6Label erstellen

app. EF230Group6Label = uilabel(app. UIFigure);

app. EF230Group6Label. HorizontalAlignment = 'center';

app. EF230Group6Label. FontSize = 28;

app. EF230Group6Label. FontWeight = 'fett';

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

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

% IanAllishKellyBondIanDaffronLabel erstellen

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

% LoopsCompletedLabel erstellen

app. LoopsCompletedLabel = uilabel(app. UIFigure);

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

app. LoopsCompletedLabel. Text = 'Schleifen abgeschlossen:';

% Label erstellen

app. Label = uilabel(app. UIFigure);

App. Label. Position = [120 10 178 22];

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

Ende

Ende

Methoden (Zugriff = öffentlich)

% App erstellen

Funktion App = Mikro

% Komponenten erstellen und konfigurieren

createComponents(App)

% Registrieren Sie die App beim App Designer

registerApp(app, app. UIFigure)

% Führen Sie die Startfunktion aus

runStartupFcn(app, @startupFcn)

wenn Nargout == 0

klare App

Ende

Ende

% Code, der vor dem Löschen der App ausgeführt wird

löschen (App)

% UIFigure löschen, wenn die App gelöscht wird

delete(app. UIFigure)

Ende

Ende

Ende

Schritt 4: Letzter Schritt

Letzter Schritt
Letzter Schritt

Sobald der Code geschrieben und der Raspberry Pi verdrahtet wurde, befestigen Sie den Servomotor an dem 3D-gedruckten Bahngleistor, wie es im Bild oben befestigt ist.

Nun ist das Projekt abgeschlossen. Verbinden Sie den Raspberry PI mit dem Gleis und beobachten Sie, wie das neue System sicherere Bahnübergänge für Autofahrer und Schaffner schafft. Spielen Sie mit dem System, indem Sie mit der GUI interagieren, um Fail-Safes auszulösen, die zur Vermeidung von Unfällen eingerichtet wurden.

Das ist das Ende des Tutorials, viel Spaß mit Ihrem neuen Smart Train System!

Empfohlen: