
Мазмұны:
2025 Автор: John Day | day@howwhatproduce.com. Соңғы өзгертілген: 2025-01-23 14:51

Қауіпсіздікті күшейтуге, жазатайым оқиғалардың алдын алуға және апат болған жағдайда көмектесу үшін оң және өнімді әрекетті арттыруға арналған.
1 -қадам: Бөлшектер мен материалдар




Жоғарыдағы суреттер төмендегі бөліктер тізімінің ретімен орналастырылған:
Бөлшектер тізімі
1) Бір таңқурай PI 3 - В үлгісі
2) Бір нан тақтасы
3) Кабельдер (жоғарыдан төменге қарай) - Бір қуат, бір Ethernet, бір адаптер
4) бір серво моторы
5) 3D басып шығарылған бір теміржол қақпасы
6) екі светодиод (жақсырақ қызыл және жасыл)
7) Бір басу түймесі
8) Он секіргіш сым
9) Төрт резистор
10) MATLAB қосылған ноутбук немесе жұмыс үстелі
2 -қадам: конфигурация




Жоғарыда конфигурацияның бірнеше қырынан суреттері берілген:
Істеуші орындар (кіші әріптен кейін жол нөмірі) ағымдағы ағымға сәйкес ретімен төменде келтірілген.
Сымдар:
j19 - i47
j8 -ден b50 -ге дейін
b5 Сервоға
c6 сервиске
b7 сервоға
a13 - j7
a17 светодиодқа
A37 жарықдиодты
e40 - j20
j53 - j18
j7 жарық диодына
Жарықдиодты j6
Түйме:
e54 - h51
Резисторлар:
d40 - b37
c50 - d54
i51 - j47
3 -қадам: код және логика

Біздің пойыз жүйесінің мақсаты - қауіпсіздікті арттыру және теміржол өткелдерінде адам өліміне әкелетін апаттардың қаупін азайту. Бұған жету үшін біздің жүйеде жүргізушілерге арналған пойыздарды ескерту жүйесі, вагондардың жолдан өтуіне жол бермеу үшін төмендетілген физикалық тосқауыл, ал егер ертерек ескерту жүйесі істен шыққан жағдайда кондуктордың басу үшін резервтік авариялық түймесі бар.
GUI өткізгіш операциялық жүйесі:
Жоғарыда көрсетілген GUI кондукторды пайдалану үшін құрылған, себебі олар пойызды вагондық теміржол өткелдері бар жол учаскелері арқылы жүргізеді.
Оң жақ жоғарғы бұрышта алдағы теміржол өткелінің қақпасы жабылған жағдайда өткізгішке хабар беретін және қажет болған жағдайда кондукторға қақпаны ашуға немесе жабуға мүмкіндік беретін шам бар. Төменде поезд өтетін камералардан көрсетілген. Төменгі сол жақ бұрышта пойыздың орналасқан жері графикке үздіксіз сызылады және графиктің астында пойыздың бір күнде қанша рет өткені көрсетілген. Позиция графигінің үстінде төтенше жағдай түймесі мен күй туралы мәлімдеме бар. Бұл жолда автокөлік болса немесе қауіпсіздік қақпасы дұрыс жұмыс істемесе, өткізгішке төтенше жағдай туралы сигнал беруге мүмкіндік береді.
Код:
classdef micro <matlab.apps. AppBase % бағдарлама компоненттеріне сәйкес келетін қасиеттер
қасиеттер (Access = жалпыға қолжетімді)
UIFigure matlab.ui.сурет
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
Қалыпты емес шарттар Label 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 белгісі
Соңы
қасиеттер (Access = жеке)
есептегіш int16
Соңы
әдістер (Access = public)
timerCallback функциясы (қолданба, src, оқиға)
app. Temp. Text = int2str (app.counter);
app.counter = app.counter + 1;
%бағдарлама қажет барлық айнымалыларды шақырады - - - - - - - - - - - - - -
жаһандық rpi
жаһандық с
жаһандық ашық
жаһандық жабу
жаһандық камера
жаһандық м
жаһандық эмс
жаһандық t_count
%------------------------- Пойыз қару-жарақ бөлімі --------------------- ---------
егер ашық болса == 0
writePosition (лар, 50)
app.gateLamp. Color = 'жасыл';
Соңы
жақын болса == 0
writePosition (лар, 120)
app.gateLamp. Color = 'қызыл';
Соңы
%---------------------- Камера арқылы қозғалысты анықтау -----------------------
рас болса
img = суретке түсіру (камера);
сурет (img);
app. UIAxes (сызылған)
Соңы
%---------------------- Қолды ашу/жабу ----------------------- --------------
егер readDigitalPin (rpi, 20)> 1 %17 түйреуішті (түймені) оқиды және сигналды тексереді
i = 40:.5: 150 %көпірді көтереді
WritePosition (s, i)
Соңы
i = 1:10 %ілмектер үшін қызыл шам x рет жыпылықтайды
writeDigitalPin (rpi, 13, 1)
кідірту (.5)
writeDigitalPin (rpi, 13, 0)
кідірту (.5)
Соңы
writePosition (лар, 50)%қақпаны қояды
Соңы
%-------------------- Ұялы телефонды қолдау/сюжет ------------------------ -
m. AccelerationSensorEnabled = 1
м.логинг = 1
деректер = нөлдер (200, 1); %сюжетті жылжыту үшін деректерді енгізеді
сурет (app. UIAxes2)
p = сюжет (деректер)
ось ([xbounda, ybounds])
кідірту (1)
тик
toc <30 %30 секунд жұмыс істейді
[a, ~] = accellog (m);
егер ұзындығы (а)> 200 болса
деректер = а (соңы-199: соңы, 3);
басқа
деректер (1: ұзындық (а)) = а (:, 3);
Соңы
%сызбасын қайта сызу
p. YData = деректер;
сызылған
Соңы
%------------------ Пикселдің кенеттен өзгеруі ---------------------------- ------
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'); %шығыс ретінде істікшені, штырьді 16 орнатады
configurePin (rpi, 16, 'DigitalInput'); %түйме түйреуішін, 24 түйреуішті кіріс ретінде орнатады
buttonPressed = readDigitalPin (rpi, 16); % 16 түйреуішіндегі түймені басу мәнін оқиды
егер түймешік басылса == 1
түймесін басқанда == 1
writeDigitalPin (rpi, 12, 1)
buttonunPressed = writeDigitalPin (rpi, 12, 0); %
end % «whilePressPressed == 1» циклін аяқтайды
Соңы
writeDigitalPin (rpi, 16, 0) %setpref ('Интернет', 'SMTP_Server', 'smtp.gmail.com') түймесі бұдан былай басылмаған кезде жарық диодты өшіреді; setpref ('Интернет', 'E_mail', 'ef230roomba2019@gmail.com'); setpref жіберілетін % пошта тіркелгісі ('Интернет', 'SMTP_Username', 'ef230roomba2019@gmail.com'); % жіберушілердің пайдаланушы аты setpref ('Интернет', 'SMTP_Password', 'efgroup6'); % Жіберушілер құпия сөзі
реквизиттер = 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 ('iallish@vols.utk.edu ',' Төтенше жағдай! ',' Дирижер тез арада жауап беруді талап ететін қолмен ауыстыру қосқышын іске қосты! ')
app. UndernormalconditionsLabel. Text = ems
Соңы
Соңы
%app. Label_4. Text = num2str (Curr_temp);
әдістер (Access = жеке)
% Компоненттер жасалғаннан кейін орындалатын код
startupFcn функциясы (қолданба)
%---------- Бұл функция үшін қажет барлық айнымалылар --------------------
жаһандық rpi %arduino
rpi = raspi ('169.254.0.2', 'pi', 'таңқурай');
жаһандық s %servo
s = servo (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);
жаһандық ашық
ашық = 1;
жаһандық жабық
жабық = 1;
жаһандық камера
камера = камералық тақта (rpi);
жаһандық м
m = ұялы телефон;
жаһандық эмс
ems = 'ТЖ туралы хабарланған төтенше жағдай туралы хабарланды';
жаһандық t_count
t_count = 0;
%құпия сөзіндегі қосқыш - EFGroup6
Цикл үшін % таймер функциясы --------------------------------
app.counter = 0;
t = таймер (…
'TimerFcn', @app.timerCallback,…
'StartDelay', 1,… 'Period', 1,…
'ExecutionMode', 'fixedSpacing',…
'TasksToExecute', inf);
бастау (t);
Соңы
% Қайта қоңырау шалу функциясы
ManualOverrideSwitchValueChanged функциясы (қолданба, оқиға)
Соңы
% Батырманы басатын функция: OpenGateButton
OpenGateButtonPushed функциясы (қолданба, оқиға)
жаһандық жабу
жабу = 0;
Соңы
% Батырмасы басылатын функция: CloseGateButton
CloseGateButtonPushed функциясы (қолданба, оқиға)
жаһандық ашық
ашық = 0;
Соңы
Соңы
% Қолданбаның инициализациясы мен құрылысы
әдістер (Access = жеке)
% UIFigure мен компоненттерді жасаңыз
createComponents (қолданба) функциясы
% UIFigure жасаңыз
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'UI суреті';
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 (қолданба, @OpenGateButtonPushed, шын); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'Есікті ашу';
% CloseGateButton жасаңыз
app. CloseGateButton = uibutton (app. UIFigure, 'push');
app. CloseGateButton. ButtonPushedFcn = createCallbackFcn (қолданба, @CloseGateButtonPushed, шын); 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];
% Қалыпты емес шарттар белгісін жасаңыз
app. UndernormalconditionsLabel = uilabel (app. UIFigure);
app. UnderormalconditionsLabel. Position = [108 285 248 22];
app. UndernormalconditionsLabel. Text = 'Қалыпты жағдайда';
% UIAxes2 жасаңыз
app. UIAxes2 = uiaxes (app. UIFigure);
атауы (app. UIAxes2, «Пойыздың орны»)
xlabel (app. UIAxes2, 'X Position')
ylabel (app. UIAxes2, 'Y позициясы')
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 = 'Ян Аллиш, Келли Бонд, Ян Даффрон';
% 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 = '####';
Соңы
Соңы
әдістер (Access = public)
% Қолданба құру
app = micro функциясы
% Компоненттерді жасаңыз және теңшеңіз
createComponents (қолданба)
% Бағдарламаны App Designer -ге тіркеңіз
registerApp (app, app. UIFigure)
% Іске қосу функциясын орындаңыз
runStartupFcn (қолданба, @startupFcn)
егер наргут == 0
таза қолданба
Соңы
Соңы
% Қолданба жойылғанға дейін орындалатын код
жою (қолданба)
% Қолданба жойылған кезде UIFigure жойыңыз
жою (app. UIFigure)
Соңы
Соңы
Соңы
4 -қадам: соңғы қадам

Код жазылып, Raspberry Pi сымы қосылғаннан кейін, жоғарыдағы суретте бекітілгендей, 3-D баспа теміржол қақпасына сервоприводты бекітіңіз.
Енді, жоба аяқталды. Таңқурай PI пойыз жолына қосыңыз және вагон жүргізушілері мен кондукторлар үшін қауіпсіз теміржол өткелдерін құратын жаңа жүйені қараңыз. Апаттардың алдын алу үшін орнатылған сәтсіз сейфтерді іске қосу үшін GUI -мен өзара әрекеттесу арқылы жүйемен ойнаңыз.
Оқулық осымен аяқталды, жаңа ақылды пойыз жүйесін пайдаланыңыз!
Ұсынылған:
Ойыншықтарды ауыстыруға бейімделу: бу пойыз ойыншығына қол жетімді! 7 қадам (суреттермен)

Ойыншықтарды ауыстырып-бейімдеңіз: пойыз ойыншықтары ойыншықтарға қол жетімді болды!: Ойыншықтарды бейімдеу моторикасының шектеулі немесе дамуында ауытқулары бар балаларға ойыншықтармен өз бетінше араласуға мүмкіндік беретін жаңа мүмкіндіктер мен арнайы шешімдер ашады. Көп жағдайда бейімделген ойыншықтарды қажет ететін балалар кіре алмайды
ХАКЕРЛІК! Серво моторы пойыз жүргізушісінің үлгісі ретінде!: 17 қадам

ХАКЕРЛІК! Серво моторы пойыз жүргізушісінің үлгісі ретінде!: Үлгілі теміржолды бастау керек пе? Барлық қымбат пойыз контроллерлерін сатып алуға бюджет жеткіліксіз бе? Уайымдамаңыз! Бұл нұсқаулықта мен сізге өздігінен жүретін қозғалтқышты бұзу арқылы өзіңіздің төмен бюджеттік пойыз контроллерін қалай жасауға болатынын көрсетемін. Сонымен, келейік
Екі пойыз жүретін теміржолдың автоматты үлгісі (V2.0) - Arduino негізіндегі: 15 қадам (суреттермен)

Екі пойыз жүретін теміржолдың автоматты үлгісі (V2.0) | Arduino негізіндегі: Arduino микроконтроллерлерін қолдана отырып, теміржол модельдерінің макеттерін автоматтандыру - бұл микроконтроллерлерді біріктірудің тамаша тәсілі, бағдарламалау мен теміржолды бір хоббиге біріктіру. Теміржол көлігінде пойызды автономды түрде жүргізуге арналған көптеген жобалар бар
Пойыз орынының индикаторы: 6 қадам

Пойыз орынының индикаторы: Бұл сізде бола ма? Пойыздың алдыңғы бөлігінде адамдар тұруға мәжбүр, ал пойыздың соңғы бөлігінде бос орындықтар көп. Егер пойыздың сыртында қанша орын бос екенін көрсететін белгі болса ше?
Пойыз моделінің орналасуын басқару тақтасының көмегімен басқарыңыз!: 12 қадам

Пойыздың модельдік орналасуын пернетақтаның көмегімен басқарыңыз!: Мен алдыңғы нұсқаулықтың бірінде теледидардың пульті арқылы модельдік пойызды қалай басқаруға болатынын көрсеттім. Жаңартылған нұсқаны мына жерден тексеруге болады. Бұл нұсқаулықта мен сізге пернетақтаның көмегімен пойыздың макетін қалай басқаруға болатынын көрсетемін