Мазмуну:
- 1 -кадам: Бөлүктөр жана материалдар
- 2 -кадам: Конфигурация
- 3 -кадам: Код жана логика
- 4 -кадам: Акыркы кадам
Video: Smart Train системасы: 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:41
Коопсуздукту жогорулатуу, кырсыктардын алдын алуу жана кырсыктар болгон учурда жардам берүү үчүн оң жана жемиштүү жоопту жогорулатуу үчүн иштелип чыккан.
1 -кадам: Бөлүктөр жана материалдар
Жогорудагы сүрөттөр төмөнкү бөлүктөр тизмегинин тартибинде жайгаштырылган:
Бөлүктөр тизмеси
1) Бир Raspberry PI 3 - модель В.
2) Бир нан
3) Кабелдер (өйдөдөн төмөн карай) - Бир кубат, бир Ethernet, бир адаптер
4) Бир Серво Мотору
5) Бир 3D басылган темир жол дарбазасы
6) эки LED (артыкчылыктуу кызыл жана жашыл)
7) Бир баскыч
8) Он Jumper Wires
9) Төрт резистор
10) MATLAB менен ноутбук же рабочий
2 -кадам: Конфигурация
Жогоруда конфигурациянын көптөгөн бурчтан тартылган сүрөттөрү бар:
Киргизүү жерлери (кичине тамга, андан кийин катар номери) учурдагы агымга ылайык ирети менен төмөндө келтирилген.
Зымдар:
j19дан i47ге чейин
j8 - b50
b5 Servoго
c6 үчүн Servo
b7 сервого
a13 - j7
a17 үчүн LED
LED 37ге чейин
e40тан j20га чейин
j53 - j18
j7 үчүн LED
LED үчүн j6
Баскыч:
e54тен h51ге чейин
Резисторлор:
d40тан b37ге чейин
c50 д54 чейин
i51ден j47ге чейин
3 -кадам: Код жана логика
Биздин поезд системабыздын максаты - коопсуздукту жогорулатуу жана темир жол кесилиштеринде өлүмгө алып келүүчү кырсыктардын коркунучун азайтуу. Буга жетишүү үчүн, биздин системада айдоочулар үчүн поезд эскертүү системасы, машиналардын жолдон өтүшүнө жол бербөө үчүн түшүрүлгөн физикалык тоскоолдук жана эгер эрте эскертүү системасы иштен чыкса, кондуктордун басуу үчүн резервдик авариялык баскычы бар.
GUI өткөргүч иштетүү системасы:
Жогоруда көрсөтүлгөн GUI, алар поездди автоунаа темир жол кесилиштерине ээ болгон жерлер аркылуу айдап бара жатканда, өткөргүчтү колдонуу үчүн түзүлгөн.
Оң жактын жогорку бурчунда, эгер келе жаткан темир жол өткөөл дарбазасы жабык болсо, өткөргүчкө кабарлайт жана керек болсо кондукторго дарбазаны ачууга же жабууга уруксат берген жарык бар. Төмөндө поезд өтүүчү камералардын жеми көрсөтүлөт. Төмөнкү сол бурчта, поезддин жайгашкан жери графикте жана графиктин астында тынымсыз сызылып турат, поезддин бир күндө бүтүргөн айланууларынын саны көрсөтүлөт. Позициянын графигинин үстүндө өзгөчө кырдаал баскычы жана абал жөнүндө билдирүү бар. Бул кондукторго жолдо машина бар болсо же коопсуздук дарбазасы туура эмес иштесе, авариялык абал үчүн сигнал берүүгө мүмкүндүк берет.
Код:
classdef micro <matlab.apps. AppBase % Колдонмо компоненттерине туура келген касиеттери
касиеттери (Кирүү = жалпыга ачык)
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
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 этикеткасы
аяктоо
касиеттери (Кирүү = купуя)
counter int16
аяктоо
ыкмалар (Кирүү = коомдук)
функция timerCallback (колдонмо, SRC, окуя)
app. Temp. Text = int2str (app.counter);
app.counter = app.counter + 1;
%программага керек болгон бардык өзгөрмөлөрдү чакырат - - - - - - - - - - - - -
дүйнөлүк rpi
глобалдык с
дүйнөлүк ачык
дүйнөлүк жакын
дүйнөлүк камера
глобалдык м
глобалдык эмс
глобалдык t_count
%------------------------- Поезддин курал бөлүмү --------------------- ---------
ачык болсо == 0
writePosition (s, 50)
app.gateLamp. Color = 'жашыл';
аяктоо
жакын болсо == 0
writePosition (s, 120)
app.gateLamp. Color = 'кызыл';
аяктоо
%---------------------- Камера аркылуу кыймыл аныктоо -----------------------
чын болсо
img = сүрөт (камера);
сүрөт (img);
app. UIAxes (тартылган)
аяктоо
%---------------------- Кол ачык/жабык ----------------------- --------------
if 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 (s, 50)%дарбазаны коет
аяктоо
%-------------------- Мобилдик телефонду колдоо/Сюжет ------------------------ -
m. AccelerationSensorEnabled = 1
m.logging = 1
маалыматтар = нөлдөр (200, 1); %участокту жылдыруу үчүн маалыматтарды интеллектуалдаштыруу
фигура (app. UIAxes2)
p = сюжет (маалыматтар)
огу ([xbounda, ybounds])
пауза (1)
тик
toc <30 %30 секунд иштейт
[a, ~] = accellog (m);
эгер узундугу (а)> 200
data = a (end-199: end, 3);
башка
маалыматтар (1: узундук (а)) = а (:, 3);
аяктоо
%сюжет кайра
p. YData = маалыматтар;
тартуу
аяктоо
%------------------ Пикселдин күтүүсүз өзгөрүшү ---------------------------- ------
x1 = img; % камераны пи чыгып окуйт
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)
%------------------ Button 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 % "buttonPressed == 1" укуругу менен бүтөт
аяктоо
writeDigitalPin (rpi, 16, 0) %баскыч басылбай калганда алып келүүнү өчүрөт setpref ('Интернет', 'SMTP_Server', 'smtp.gmail.com'); setpref ('Интернет', 'E_mail', '[email protected]'); setpref жөнөтүү үчүн % почта эсеби ('Интернет', 'SMTP_Username', '[email protected]'); % жөнөтүүчүлөрдүн колдонуучу аты 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 ('[email protected] ',' Өзгөчө кырдаал! ',' Дирижер дароо жооп берүүнү талап кылып, кол менен алмаштыруу которгучун иштетти! ')
app. UndernormalconditionsLabel. Text = ems
аяктоо
аяктоо
%app. Label_4. Text = num2str (Curr_temp);
ыкмалар (Мүмкүнчүлүк = жеке)
% Компонент түзүлгөндөн кийин аткарылуучу код
startupFcn функциясы (колдонмо)
%---------- Бул функция үчүн зарыл болгон бардык өзгөрмөлөр --------------------
глобалдык rpi %arduino
rpi = raspi ('169.254.0.2', 'pi', 'малина');
глобалдык s %servo
s = servo (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);
дүйнөлүк ачык
open = 1;
дүйнөлүк жабык
жабык = 1;
дүйнөлүк камера
камера = камералык такта (rpi);
глобалдык м
m = mobiledev;
глобалдык эмс
ems = 'Өзгөчө кырдаал жөнүндө кабарланды, EMSге кабарлоо';
глобалдык t_count
t_count = 0;
%сырсөздөгү туташтыргыч EFGroup6
Loop үчүн % Timer Function --------------------------------
app.counter = 0;
t = таймер (…
'TimerFcn', @app.timerCallback,…
'StartDelay', 1,… 'Period', 1,…
'ExecutionMode', 'fixedSpacing',…
'TasksToExecute', inf);
баштоо (t);
аяктоо
% Кайра чалуу функциясы
ManualOverrideSwitchValueChanged функциясы (колдонмо, окуя)
аяктоо
% Button басылган функция: OpenGateButton
OpenGateButtonPushed функциясы (колдонмо, окуя)
дүйнөлүк жакын
close = 0;
аяктоо
% Button басылган функция: CloseGateButton
CloseGateButtonPushed функциясы (колдонмо, окуя)
дүйнөлүк ачык
open = 0;
аяктоо
аяктоо
% Колдонмонун башталышы жана курулушу
ыкмалар (Кирүү = купуя)
% UIFigure жана компоненттерди түзүү
createComponents функциясы (колдонмо)
% UIFigure түзүү
app. UIFigure = uifigure;
app. UIFigure. Position = [100 100 640 480];
app. UIFigure. Name = 'UI Figure';
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, 'Камера түрмөгү')
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, "Поезддин позициясы")
xlabel (app. UIAxes2, 'X Position')
ylabel (app. UIAxes2, 'Y Position')
app. UIAxes2. Box = 'on';
app. UIAxes2. XGrid = 'on';
app. UIAxes2. YGrid = 'on';
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 Group 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 = '####';
аяктоо
аяктоо
ыкмалар (Кирүү = коомдук)
% Колдонмо куруу
колдонмо = микро
% Компоненттерди түзүү жана конфигурациялоо
createComponents (колдонмо)
% Колдонмону App Designer менен каттаңыз
registerApp (app, app. UIFigure)
% Баштоо функциясын аткарыңыз
runStartupFcn (колдонмо, @startupFcn)
эгер nargout == 0
ачык колдонмо
аяктоо
аяктоо
% Колдонмо жок кылынардан мурун аткарылган код
жок кылуу (колдонмо)
Колдонмо жок кылынганда % UIFigure жок кылынат
жок кылуу (app. UIFigure)
аяктоо
аяктоо
аяктоо
4 -кадам: Акыркы кадам
Код жазылып, Raspberry Pi зым тартылгандан кийин, servo моторун 3-D басылган темир жолдун дарбазасына өйдөдөгү сүрөттө тиркелет.
Азыр, долбоор аяктады. Малина PIди поезд жолуна туташтырыңыз жана вагондун айдоочулары үчүн дагы, кондукторлор үчүн дагы коопсуз темир жол өткөөлдөрүн түзүүчү жаңы системаны байкаңыз. Кырсыктарды болтурбоо үчүн коюлган сейфтерди иштетүү үчүн GUI менен өз ара аракеттенүү менен система менен ойноңуз.
Үйрөткүч ушуну менен аяктады, жаңы Smart Train Systemден ырахат алыңыз!
Сунушталууда:
NodeMCU колдонуу менен Smart бөлүштүрүлгөн IoT аба ырайына мониторинг системасы: 11 кадам
NodeMCU колдонуп IoTдун аба ырайын көзөмөлдөө системасы: Баарыңыз салттуу аба ырайы станциясын билишиңиз мүмкүн; бирок ал чынында кантип иштээрин ойлонуп көрдүңүз беле? Адаттагы метеостанция кымбат жана көлөмдүү болгондуктан, бул станциялардын тыгыздыгы бирдикке салыштырмалуу өтө төмөн, бул
Alexa Smart Home системасы NodeMCU реле модулун колдонуп: 10 кадам
NodeMCU релелик модулун колдонуп Alexa Smart Home системасы: Бул IoT долбоорунда мен NodeMCU ESP8266 жана Alexa Smart Home Automation системасын түздүм. Реле модулу. Үн буйругу менен жарыкты, желдеткичти жана башка тиричилик техникаларын оңой башкара аласыз. Echo Dot акылдуу колонкасын туташтыруу үчүн
Түстөрдү сорттоо системасы: Arduino негизделген системасы эки кур менен: 8 кадам
Түстөрдү сорттоо системасы: Arduino негизделген эки белдемдүү система: Өнөр жай тармагындагы продукцияларды жана буюмдарды ташуу жана/же таңгактоо конвейердик линиялардын жардамы менен жүргүзүлөт. Бул курлар нерсени белгилүү бир ылдамдык менен бир чекиттен экинчи пунктка жылдырууга жардам берет. Кээ бир иштетүү же идентификациялык тапшырмалар болушу мүмкүн
SmartBox - Сиздин бөлмөңүз үчүн Smart Home системасы: 6 кадам
SmartBox - Сиздин үйүңүз үчүн Smart Home системасы: Саламатсыздарбы баарына! Бул система эки түзмөктү камтыйт. Сиздин бөлмөңүздөгү учурдагы жашоо сапатын өлчөөчү нымдуулук жана температура сенсору бар жалпы түзүлүш. Сиз
ET Smart Baby мониторинг системасы: 10 кадам
ET Smart Baby мониторинг системасы: ET Smart Baby Monitoring System - бул ымыркайларга кам көргөн ата -энелерге же камкорчуларга ыңгайлуулукту кошууга багытталган система. Мониторинг системасы ымыркайдын температурасын көзөмөлдөйт жана эгер нормадан ашса, ата -энесине же машинасына SMS жөнөтүлөт