สารบัญ:
- ขั้นตอนที่ 1: ชิ้นส่วนและวัสดุ
- ขั้นตอนที่ 2: การกำหนดค่า
- ขั้นตอนที่ 3: รหัสและตรรกะ
- ขั้นตอนที่ 4: ขั้นตอนสุดท้าย
วีดีโอ: ระบบรถไฟอัจฉริยะ: 4 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
ออกแบบมาเพื่อเพิ่มความปลอดภัย ป้องกันอุบัติเหตุ และเพิ่มการตอบสนองเชิงบวกและประสิทธิผลเพื่อช่วยในกรณีที่เกิดอุบัติเหตุ
ขั้นตอนที่ 1: ชิ้นส่วนและวัสดุ
รูปภาพด้านบนจะเรียงลำดับตามรายการอะไหล่ด้านล่าง:
ส่วนรายการ
1) Raspberry PI 3 หนึ่งตัว - รุ่น B
2) เขียงหั่นขนมหนึ่งอัน
3) สายเคเบิล (จากบนลงล่าง) - หนึ่งพลังงาน หนึ่งอีเธอร์เน็ต หนึ่งอะแดปเตอร์
4) หนึ่งเซอร์โวมอเตอร์
5) หนึ่งประตูรถไฟพิมพ์ 3 มิติ
6) ไฟ LED สองดวง (ควรเป็นสีแดงและสีเขียว)
7) หนึ่งปุ่มกด
8) สายจัมเปอร์สิบสาย
9) ตัวต้านทานสี่ตัว
10) แล็ปท็อปหรือเดสก์ท็อปที่มี MATLAB
ขั้นตอนที่ 2: การกำหนดค่า
ด้านบนเป็นภาพการกำหนดค่าจากหลายมุม:
ตำแหน่งพิน (ตัวพิมพ์เล็กตามด้วยหมายเลขแถว) แสดงอยู่ด้านล่างตามลำดับการไหลปัจจุบัน
สายไฟ:
j19 ถึง i47
j8 ถึง b50
b5 ถึงเซอร์โว
c6 ถึงเซอร์โว
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:
GUI ดังที่แสดงไว้ข้างต้น ถูกสร้างขึ้นเพื่อใช้กับตัวนำในขณะที่พวกเขากำลังขับรถไฟผ่านพื้นที่ของรางที่มีทางข้ามทางรถไฟที่มีรถสัญจรไปมา
ที่มุมขวาบน มีไฟที่แจ้งผู้ควบคุมรถหากมีการปิดประตูทางข้ามทางรถไฟที่จะมาถึง และอนุญาตให้ตัวนำเปิดหรือปิดประตูได้หากจำเป็น ด้านล่างนั้นจะแสดงฟีดจากกล้องที่รถไฟวิ่งผ่าน ที่มุมล่างซ้าย ตำแหน่งของรถไฟถูกพล็อตอย่างต่อเนื่องบนกราฟ และด้านล่างกราฟ จะระบุจำนวนรอบที่รถไฟเสร็จสิ้นในหนึ่งวัน เหนือกราฟตำแหน่ง มีปุ่มฉุกเฉินและข้อความแจ้งสถานะ ซึ่งจะช่วยให้ตัวนำส่งสัญญาณฉุกเฉินได้หากมีรถอยู่บนรางหรือประตูนิรภัยทำงานไม่ถูกต้อง
รหัส:
classdef micro < matlab.apps. AppBase % Properties ที่สอดคล้องกับส่วนประกอบของแอพ
คุณสมบัติ (การเข้าถึง = สาธารณะ)
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
ภายใต้สภาวะปกติ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
จบ
คุณสมบัติ (การเข้าถึง = ส่วนตัว)
เคาน์เตอร์ int16
จบ
วิธีการ (การเข้าถึง = สาธารณะ)
ฟังก์ชั่น timerCallback (แอพ, src, เหตุการณ์)
app. Temp. Text = int2str (app.counter);
app.counter = app.counter + 1;
% เรียกตัวแปรทั้งหมดที่โปรแกรมต้องการ - - - - - - - - - - - - -
rpi ทั่วโลก
ทั่วโลก
โกลบอล โอเพ่น
ปิดโลก
กล้องทั่วโลก
ทั่วโลก m
ทั่วโลกems
ทั่วโลก t_count
%-------------------------------------- ส่วนแขนฝึก --------------------- ---------
ถ้าเปิด == 0
ตำแหน่งการเขียน 50)
app.gateLamp. Color = 'สีเขียว';
จบ
ถ้าปิด == 0
ตำแหน่งการเขียน 120)
app.gateLamp. Color = 'สีแดง';
จบ
%---------------------- การตรวจจับความเคลื่อนไหวผ่านกล้อง -----------------------
ในขณะที่จริง
img = สแน็ปช็อต (กล้อง);
รูปภาพ (img);
app. UIAxes (ดึงตอนนี้)
จบ
%---------------------- แขนเปิด/ปิด ----------------------- --------------
ถ้า readDigitalPin(rpi, 20)>1% อ่านพิน 17(ปุ่ม) และตรวจสอบสัญญาณ
สำหรับ i=40:.5:150 %เพิ่มสะพาน
เขียนตำแหน่ง (s, i)
จบ
สำหรับ i= 1:10 % กะพริบแสงสีแดง x จำนวนครั้ง
เขียนDigitalPin(rpi, 13, 1)
หยุดชั่วคราว(.5)
เขียนDigitalPin(rpi, 13, 0)
หยุดชั่วคราว(.5)
จบ
writePosition(s, 50)%วางเกตลง
จบ
%----------- การสนับสนุนโทรศัพท์มือถือ/พล็อต ------------------------ --
m. AccelerationSensorEnabled=1
m.logging=1
ข้อมูล=ศูนย์(200, 1); %เตรียมข้อมูลเบื้องต้นสำหรับพล็อตกลิ้ง
รูป (app. UIAxes2)
p=พล็อต(ข้อมูล)
แกน ([xbounda, ybounds])
หยุดชั่วคราว(1)
tic
ขณะที่ toc <30% รันเป็นเวลา 30 วินาที
[a, ~]=accellolog(m);
ถ้าความยาว (ก) >200
data=a(end-199:end, 3);
อื่น
data(1:length(a))=a(:, 3);
จบ
%วาดพล็อตใหม่
p. YData=ข้อมูล;
drawow
จบ
% ------------------ การเปลี่ยนพิกเซลกะทันหัน ---------------------------- ------
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 โปรแกรม ---------------------------- ---
กำหนดค่าพิน (rpi, 12, 'DigitalOutput'); % ตั้งค่าพิน led, พิน 16 เป็นเอาต์พุต
กำหนดค่าพิน (rpi, 16, 'DigitalInput'); % ตั้งค่าหมุดปุ่ม พิน 24 เป็นอินพุต
buttonPressed = readDigitalPin(rpi, 16); % อ่านค่าการกดปุ่มบนขา 16
ถ้ากดปุ่ม == 1
ขณะกดปุ่ม == 1
เขียนDigitalPin(rpi, 12, 1)
buttonunPressed = writeDigitalPin(rpi, 12, 0); %
end % สิ้นสุด 'ในขณะที่ buttonPressed==1' loop
จบ
writeDigitalPin(rpi, 16, 0) % ตั้งค่าให้ปิดเมื่อไม่ได้กดปุ่ม setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref('อินเทอร์เน็ต', 'อีเมล', '[email protected]'); % บัญชีเมลที่จะส่งจาก setpref('Internet', 'SMTP_Username', '[email protected]'); % ผู้ส่งชื่อผู้ใช้ setpref('Internet', '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]', 'Emergency Status!', 'ผู้ควบคุมวงได้เปิดใช้งานสวิตช์แทนที่แบบแมนนวลแล้ว ขอการตอบสนองทันที!')
app. UndernormalconditionsLabel. Text = ems
จบ
จบ
%app. Label_4. Text = num2str(curr_temp);
วิธีการ (การเข้าถึง = ส่วนตัว)
% รหัสที่ดำเนินการหลังจากสร้างส่วนประกอบ
ฟังก์ชั่น startupFcn(แอพ)
%---------- ตัวแปรทั้งหมดที่จำเป็นสำหรับฟังก์ชันนี้ --------------
rpi ทั่วโลก %arduino
rpi = raspi('169.254.0.2', 'pi', 'ราสเบอร์รี่');
ทั่วโลก %servo
s = เซอร์โว (rpi, 17, 'MinPulseDuration', 5e-4, 'MaxPulseDuration', 2.5e-3);
โกลบอล โอเพ่น
เปิด = 1;
ปิดโลก
ปิด = 1;
กล้องทั่วโลก
กล้อง = กระดานกล้อง (rpi);
ทั่วโลก m
m=mobiledev;
ทั่วโลกems
ems = 'มีการรายงานเหตุฉุกเฉิน แจ้ง EMS';
ทั่วโลก t_count
t_count = 0;
ตัวเชื่อมต่อ % รหัสผ่านคือ EFGroup6
% ฟังก์ชั่นจับเวลาสำหรับลูป --------------------------------
app.counter = 0;
t = ตัวจับเวลา (…
'TimerFcn', @app.timerCallback, …
'StartDelay', 1, … 'ระยะเวลา', 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 = 'รูป 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, 'ดัน');
app. OpenGateButton. ButtonPushedFcn = createCallbackFcn(แอพ, @OpenGateButtonPushed, จริง); app. OpenGateButton. Position = [474 359 100 22];
app. OpenGateButton. Text = 'เปิดประตู';
% สร้าง CloseGateButton
app. CloseGateButton = uibutton(app. UIFigure, 'ดัน');
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];
% สร้างปุ่มฉุกเฉินStatusLampLabel
app. EmergencyButtonStatusLampLabel = uilabel (app. UIFigure); app. EmergencyButtonStatusLampLabel. HorizontalAlignment = 'ขวา'; app. EmergencyButtonStatusLampLabel. Position = [97 323 142 22]; app. EmergencyButtonStatusLampLabel. Text = 'สถานะปุ่มฉุกเฉิน';
% สร้าง EmergencyButtonStatusLamp
app. EmergencyButtonStatusLamp = uilamp (แอพ. 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')
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 = 'center';
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 = '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 = '####';
จบ
จบ
วิธีการ (การเข้าถึง = สาธารณะ)
% สร้างแอป
แอปฟังก์ชัน = micro
% สร้างและกำหนดค่าส่วนประกอบ
createComponents (แอพ)
% ลงทะเบียนแอพด้วย App Designer
registerApp(แอพ, app. UIFigure)
% ดำเนินการฟังก์ชั่นเริ่มต้น
runStartupFcn(แอพ, @startupFcn)
ถ้า nargout == 0
แอพที่ชัดเจน
จบ
จบ
% รหัสที่รันก่อนการลบแอพ
ลบ (แอพ)
% ลบ UIFigure เมื่อแอพถูกลบ
ลบ (app. UIFigure)
จบ
จบ
จบ
ขั้นตอนที่ 4: ขั้นตอนสุดท้าย
เมื่อเขียนโค้ดและต่อสาย Raspberry Pi แล้ว ให้ต่อเซอร์โวมอเตอร์เข้ากับประตูรางรถไฟที่พิมพ์ 3 มิติตามที่แนบไว้ในภาพด้านบน
ตอนนี้โครงการเสร็จสมบูรณ์ เชื่อมต่อ Raspberry PI กับรางรถไฟ และสังเกตระบบใหม่ที่สร้างทางข้ามทางรถไฟที่ปลอดภัยยิ่งขึ้นสำหรับทั้งคนขับรถยนต์และผู้ควบคุมรถ เล่นกับระบบโดยโต้ตอบกับ GUI เพื่อเรียกใช้ตู้นิรภัยที่ล้มเหลวซึ่งตั้งไว้เพื่อป้องกันอุบัติเหตุ
นั่นคือจุดสิ้นสุดของบทช่วยสอน ขอให้สนุกกับระบบรถไฟอัจฉริยะใหม่ของคุณ!
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง