Inhaltsverzeichnis:
- Schritt 1: Teile und Materialien
- Schritt 2: Konfiguration
- Schritt 3: Code und Logik
- Schritt 4: Letzter Schritt
Video: Intelligentes Zugsystem - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:19
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
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
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
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
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:
Intelligentes Kissen: 3 Schritte
Intelligentes Kissen: Dieses Instructable beschreibt, wie man ein intelligentes Kissen herstellt, das empfindlich auf Schnarchen ist! Das intelligente Kissen verlässt sich auf Vibration, um dem Schläfer anzuzeigen, wenn er beim Schlafen schnarcht. Es funktioniert automatisch, wenn eine Person den Kopf auf das Kissen legt. Sn