Πίνακας περιεχομένων:

Έξυπνο σύστημα αμαξοστοιχίας: 4 βήματα
Έξυπνο σύστημα αμαξοστοιχίας: 4 βήματα

Βίντεο: Έξυπνο σύστημα αμαξοστοιχίας: 4 βήματα

Βίντεο: Έξυπνο σύστημα αμαξοστοιχίας: 4 βήματα
Βίντεο: π.Βαρνάβας 4-12-23"Να χαθώ για να βρεθώ..." 2024, Ιούλιος
Anonim
Έξυπνο σύστημα τρένων
Έξυπνο σύστημα τρένων

Σχεδιασμένο για να αυξήσει την ασφάλεια, να αποτρέψει ατυχήματα και να αυξήσει τη θετική και παραγωγική ανταπόκριση για βοήθεια σε περίπτωση ατυχήματος.

Βήμα 1: Μέρη και υλικά

Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά
Ανταλλακτικά και Υλικά

Οι παραπάνω εικόνες τοποθετούνται με τη σειρά της Λίστας μερών παρακάτω:

Λίστα μερών

1) One Raspberry PI 3 - Model B

2) Ένα Breadboard

3) Καλώδια (από πάνω προς τα κάτω) - One Power, One Ethernet, One Adapter

4) Ένα σερβοκινητήρα

5) Μία τρισδιάστατη εκτυπωμένη πύλη σιδηροδρόμου

6) Δύο LED (κατά προτίμηση κόκκινο και πράσινο)

7) Ένα κουμπί

8) Δέκα καλώδια βραχυκυκλωτήρων

9) Τέσσερις αντιστάσεις

10) Laptop ή Desktop με MATLAB

Βήμα 2: Διαμόρφωση

Διαμόρφωση
Διαμόρφωση
Διαμόρφωση
Διαμόρφωση
Διαμόρφωση
Διαμόρφωση
Διαμόρφωση
Διαμόρφωση

Παρακάτω είναι εικόνες της διαμόρφωσης από πολλές γωνίες:

Οι θέσεις καρφιτσών (πεζά γράμματα ακολουθούμενα από αριθμό σειράς) παρατίθενται παρακάτω με τη σειρά, ακολουθώντας την τρέχουσα ροή.

Σύρματα:

j19 έως i47

j8 έως b50

b5 προς Servo

c6 προς Servo

b7 σε σερβο

a13 έως j7

a17 έως LED

LED έως a37

e40 έως j20

j53 έως j18

j7 σε LED

LED έως j6

Κουμπί:

e54 έως h51

Αντιστάσεις:

d40 έως b37

c50 έως d54

i51 έως j47

Βήμα 3: Κώδικας και λογική

Κώδικας και Λογική
Κώδικας και Λογική

Ο στόχος του συστήματος των τρένων μας είναι να αυξήσει την ασφάλεια και να μειώσει τον κίνδυνο δυνητικά θανατηφόρων ατυχημάτων στις διασταυρώσεις σιδηροδρόμων. Για να επιτευχθεί αυτό, το σύστημά μας διαθέτει σύστημα προειδοποίησης αμαξοστοιχίας για οδηγούς, φυσικό φράγμα που χαμηλώνει για να αποτρέψει τη διέλευση αυτοκινήτων από την πίστα και εφεδρικό κουμπί έκτακτης ανάγκης για να πατήσει ο αγωγός σε περίπτωση βλάβης του συστήματος έγκαιρης προειδοποίησης.

Λειτουργικό σύστημα GUI Conductor:

Το GUI, που φαίνεται παραπάνω, δημιουργήθηκε για τη χρήση του αγωγού καθώς οδηγούν το τρένο μέσα από περιοχές σιδηροτροχιών που έχουν διασταυρώσεις σιδηροδρόμων.

Στην επάνω δεξιά γωνία, υπάρχει ένα φως που ειδοποιεί τον αγωγό εάν μια επερχόμενη πύλη διέλευσης σιδηροδρόμου είναι κλειστή και επιτρέπει στον αγωγό να ανοίξει ή να κλείσει την πύλη εάν χρειαστεί. Κάτω από αυτό, εμφανίζεται η ροή από τις κάμερες που περνά το τρένο. Στην κάτω αριστερή γωνία, η θέση του τρένου απεικονίζεται συνεχώς σε ένα γράφημα και κάτω από το γράφημα, αναφέρεται ο αριθμός των γύρων που είχε ολοκληρώσει το τρένο σε μια ημέρα. Πάνω από το γράφημα θέσης, Υπάρχει κουμπί έκτακτης ανάγκης και δήλωση κατάστασης. Αυτό επιτρέπει στον αγωγό να δίνει σήμα έκτακτης ανάγκης εάν υπάρχει αυτοκίνητο στην πίστα ή η πύλη ασφαλείας δεν λειτουργεί σωστά.

Κώδικας:

classdef micro <matlab.apps. AppBase % Ιδιότητες που αντιστοιχούν σε στοιχεία εφαρμογής

ιδιότητες (Πρόσβαση = δημόσιο)

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

UndernormalconditionsLabel matlab.ui.control. Label

UIAxes2 matlab.ui.control. UIAxes

EF230Group6Label matlab.ui.control. Label

IanAllishKellyBondIanDaffronLabel matlab.ui.control. Label

LoopsCompletedLabel matlab.ui.control. Label

Ετικέτα matlab.ui.control. Label

τέλος

ιδιότητες (Πρόσβαση = ιδιωτικό)

μετρητής int16

τέλος

μέθοδοι (Πρόσβαση = δημόσια)

χρονόμετρο λειτουργίας Επιστροφή (εφαρμογή, src, συμβάν)

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

app.counter = app.counter + 1;

%καλούν όλες τις μεταβλητές που χρειάζεται το πρόγραμμα - - - - - - - - - - - - - - -

παγκόσμιο rpi

global s

παγκόσμιο ανοιχτό

παγκόσμιο κλείσιμο

παγκόσμια κάμερα

παγκόσμιο m

παγκόσμια ems

παγκόσμια t_count

%------------------------- Τμήμα βραχίονα αμαξοστοιχίας --------------------- ---------

αν ανοίξει == 0

writePosition (s, 50)

app.gateLamp. Color = 'πράσινο';

τέλος

αν κλείσει == 0

writePosition (s, 120)

app.gateLamp. Color = 'κόκκινο';

τέλος

%---------------------- Ανίχνευση κίνησης μέσω κάμερας -----------------------

ενώ ισχύει

img = στιγμιότυπο (κάμερα);

εικόνα (img)?

app. UIAxes (drawnow)

τέλος

%---------------------- Βραχίονας άνοιγμα/κλείσιμο ----------------------- --------------

αν το readDigitalPin (rpi, 20)> 1 %διαβάζει το pin 17 (κουμπί) και ελέγχει για σήμα

για i = 40:.5: 150 %ανεβάζει γέφυρα

writePosition (s, i)

τέλος

για i = 1:10 %βρόχους που αναβοσβήνουν κόκκινο φως x πολλές φορές

writeDigitalPin (rpi, 13, 1)

παύση (.5)

writeDigitalPin (rpi, 13, 0)

παύση (.5)

τέλος

writePosition (s, 50)%put gate down

τέλος

%-------------------- Υποστήριξη κινητού τηλεφώνου/Οικόπεδο ------------------------ -

m. AccelerationSensorEnabled = 1

m.logging = 1

δεδομένα = μηδενικά (200, 1); %intialize δεδομένων για κυλιόμενο οικόπεδο

σχήμα (app. UIAxes2)

p = γράφημα (δεδομένα)

άξονας ([xbounda, ybounds])

παύση (1)

σύσπαση

ενώ το toc <30 %τρέχει για 30 δευτερόλεπτα

[a, ~] = accellog (m);

αν μήκος (α)> 200

δεδομένα = α (τέλος-199: τέλος, 3);

αλλού

δεδομένα (1: μήκος (α)) = α (:, 3);

τέλος

%ανασχεδιασμός γραφήματος

p. YData = data?

τραβήξτε τώρα

τέλος

%------------------ Ξαφνική αλλαγή Pixel -------------------------------- ------

x1 = img; % διαβάζει την κάμερα απενεργοποιημένη από το pi

red_mean = μέσο (μέσος όρος (x1 (:,:, 1))); % διαβάζει τη μέση ποσότητα κόκκινων εικονοστοιχείων

green_mean = μέσο όρο (μέσος όρος (x1 (:,,, 2))); % διαβάζει τη μέση ποσότητα πράσινων εικονοστοιχείων

blue_mean = μέσος όρος (μέσος όρος (x1 (:,,, 3))); % διαβάζει τη μέση ποσότητα μπλε εικονοστοιχείων

αν red_mean> 150 && green_mean> 150 && blue_mean> 150

t_count = t_count + 1;

τέλος

app. LoopsCompletedLabel. Text = num2str (t_count)

%------------------ Προγραμματισμός κουμπιού EMS ---------------------------- ---

configurePin (rpi, 12, 'DigitalOutput'); %ορίζει τον πείρο led, τον πείρο 16, ως έξοδο

configurePin (rpi, 16, 'DigitalInput'); %ορίζει την είσοδο του κουμπιού, την καρφίτσα 24, ως είσοδο

buttonPressed = readDigitalPin (rpi, 16); % Διαβάζει την τιμή πατήματος κουμπιού στο pin 16

αν buttonPressed == 1

while buttonPressed == 1

writeDigitalPin (rpi, 12, 1)

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

τέλος % Τερματίζει τον βρόχο "while buttonPressed == 1"

τέλος

writeDigitalPin (rpi, 16, 0) %Ορίζει το led στο off όταν δεν πατάτε πλέον το κουμπί setpref («Internet», «SMTP_Server», «smtp.gmail.com»). setpref ("Διαδίκτυο", "E_mail", "[email protected]"); % λογαριασμός αλληλογραφίας προς αποστολή από το setpref ("Διαδίκτυο", "SMTP_Username", "[email protected]"). % username setpref username ('Internet', 'SMTP_Password', 'efgroup6'); % Κωδικός πρόσβασης αποστολέων

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] ',' Emergency Status! ',' Ο αγωγός έχει ενεργοποιήσει τον χειροκίνητο διακόπτη παράκαμψης, ζητώντας άμεση απάντηση! ')

app. UndernormalconditionsLabel. Text = ems

τέλος

τέλος

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

μέθοδοι (Πρόσβαση = ιδιωτικό)

% Κώδικας που εκτελείται μετά τη δημιουργία εξαρτήματος

λειτουργία startupFcn (εφαρμογή)

%---------- Όλες οι μεταβλητές που απαιτούνται για αυτήν τη συνάρτηση --------------------

παγκόσμιο rpi %arduino

rpi = raspi («169.254.0.2», «pi», «βατόμουρο»);

παγκόσμιο s %σερβο

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

παγκόσμιο ανοιχτό

άνοιγμα = 1;

παγκόσμιο κλειστό

κλειστό = 1?

παγκόσμια κάμερα

cam = κάμερα (rpi);

παγκόσμιο m

m = mobiledev;

παγκόσμια ems

ems = 'Έχει αναφερθεί έκτακτη ανάγκη, ειδοποίηση EMS';

παγκόσμια t_count

t_count = 0;

Ο σύνδεσμος στο %password είναι EFGroup6

% Λειτουργία χρονοδιακόπτη για βρόχο ------------------------------------

app.counter = 0;

t = χρονόμετρο (…

'TimerFcn', @app.timerCallback,…

«StartDelay», 1,… «Period», 1,…

'ExecutionMode', 'fixedSpacing',…

'TasksToExecute', inf);

έναρξη (t)?

τέλος

% Λειτουργία επανάκλησης

λειτουργία ManualOverrideSwitchValueChanged (εφαρμογή, συμβάν)

τέλος

% Λειτουργία ώθησης κουμπιού: OpenGateButton

λειτουργία OpenGateButtonPushed (εφαρμογή, συμβάν)

παγκόσμιο κλείσιμο

κλείσιμο = 0;

τέλος

% Λειτουργία ώθησης κουμπιού: CloseGateButton

λειτουργία CloseGateButtonPushed (εφαρμογή, συμβάν)

παγκόσμιο ανοιχτό

άνοιγμα = 0;

τέλος

τέλος

% Εκκίνηση και κατασκευή εφαρμογής

μέθοδοι (Πρόσβαση = ιδιωτικό)

% Δημιουργία UIFigure και στοιχείων

λειτουργία createComponents (εφαρμογή)

% Δημιουργία UIFigure

app. UIFigure = uifigure;

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

app. UIFigure. Name = 'Εικόνα διεπαφής χρήστη';

% Δημιουργία RailwaygatestatusLampLabel

app. RailwaygatestatusLampLabel = uilabel (app. UIFigure);

app. RailwaygatestatusLampLabel. HorizontalAlignment = 'δεξιά'; app. RailwaygatestatusLampLabel. Position = [464 422 110 22]; app. RailwaygatestatusLampLabel. Text = 'Κατάσταση πύλης σιδηροδρόμου';

% Δημιουργία gateLamp

app.gateLamp = uilamp (app. UIFigure);

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

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

% Δημιουργία κουμπιού OpenGateButton

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

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

app. OpenGateButton. Text = 'Άνοιγμα Πύλης';

% Δημιουργία CloseGateButton

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

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

app. CloseGateButton. Text = 'Κλείσιμο πύλης';

% Δημιουργία UIAxes

app. UIAxes = uiaxes (app. UIFigure);

τίτλος (app. UIAxes, 'Camera Feed')

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

% Δημιουργία EmergencyButtonStatusLampLabel

app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'δεξιά'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'Κατάσταση κουμπιού έκτακτης ανάγκης';

% Δημιουργία EmergencyButtonStatusLamp

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

% Δημιουργία ετικέτας UndernormalconditionsLabel

app. UndernormalconditionsLabel = uilabel (app. UIFigure);

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

app. UndernormalconditionsLabel. Text = 'Υπό κανονικές συνθήκες';

% Δημιουργία UIAxes2

app. UIAxes2 = uiaxes (app. UIFigure);

τίτλος (app. UIAxes2, 'Position of Train')

xlabel (app. UIAxes2, 'X Position')

ylabel (app. UIAxes2, "Y Position")

app. UIAxes2. Box = "ενεργοποιημένο";

app. UIAxes2. XGrid = "ενεργοποιημένο";

app. UIAxes2. YGrid = "ενεργοποιημένο";

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

% Δημιουργία Ετικέτας EF230Group6Label

app. EF230Group6Label = uilabel (app. UIFigure);

app. EF230Group6Label. HorizontalAlignment = 'κέντρο';

app. EF230Group6Label. FontSize = 28;

app. EF230Group6Label. FontWeight = 'έντονη';

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

app. EF230Group6Label. Text = 'Ομάδα EF 230 6';

% Δημιουργία IanAllishKellyBondIanDaffronLabel

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

% Δημιουργία LoopsCompletedLabel

app. LoopsCompletedLabel = uilabel (app. UIFigure);

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

app. LoopsCompletedLabel. Text = 'Ολοκληρώθηκαν οι βρόχοι:';

% Δημιουργία ετικέτας

app. Label = uilabel (app. UIFigure);

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

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

τέλος

τέλος

μέθοδοι (Πρόσβαση = δημόσια)

% Κατασκευή εφαρμογής

app app = micro

% Δημιουργία και διαμόρφωση στοιχείων

createComponents (εφαρμογή)

% Εγγραφή της εφαρμογής στο App Designer

registerApp (εφαρμογή, εφαρμογή. UIFigure)

% Εκτέλεση της λειτουργίας εκκίνησης

runStartupFcn (εφαρμογή, @startupFcn)

αν nargout == 0

καθαρή εφαρμογή

τέλος

τέλος

% Κωδικός που εκτελείται πριν από τη διαγραφή της εφαρμογής

διαγραφή (εφαρμογή)

% Διαγραφή UIFigure όταν διαγράφεται η εφαρμογή

διαγραφή (app. UIFigure)

τέλος

τέλος

τέλος

Βήμα 4: Τελικό βήμα

Τελικό Βήμα
Τελικό Βήμα

Μόλις γραφτεί ο κωδικός και συνδεθεί το Raspberry Pi, συνδέστε τον σερβοκινητήρα στην τρισδιάστατη εκτυπωμένη πύλη του σιδηροδρομικού σιδηροδρόμου όπως είναι προσαρτημένη στην παραπάνω εικόνα.

Τώρα, το έργο έχει ολοκληρωθεί. Συνδέστε το PI βατόμουρου στη γραμμή του τρένου και παρατηρήστε το νέο σύστημα που δημιουργεί ασφαλέστερες διαβάσεις σιδηροδρόμων τόσο για τους οδηγούς αυτοκινήτων όσο και για τους αγωγούς. Παίξτε με το σύστημα αλληλεπιδρώντας με το GUI για να ενεργοποιήσετε τα χρηματοκιβώτια αποτυχίας που έχουν δημιουργηθεί για την πρόληψη ατυχημάτων.

Αυτό είναι το τέλος του σεμιναρίου, απολαύστε το νέο σας Smart Train System!

Συνιστάται: