สารบัญ:

ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000): 4 ขั้นตอน
ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000): 4 ขั้นตอน

วีดีโอ: ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000): 4 ขั้นตอน

วีดีโอ: ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000): 4 ขั้นตอน
วีดีโอ: เรียนไมโครคอนโทรลเลอร์ Arduino เบื้องต้น 2024, กรกฎาคม
Anonim
ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000)
ไมโครคอนโทรลเลอร์ควบคุม MATLAB (Arduino MKR1000)

เป้าหมายของโครงการของเราคือการใช้ MATLAB และ Arduino MKR1000 อย่างสุดความสามารถ เป้าหมายของเราคือการสร้างสคริปต์ที่อนุญาตให้คุณลักษณะบางอย่างของ Arduino ดำเนินการเอาต์พุตบางอย่างตามอินพุตเฉพาะ เราใช้ลูปและข้อความสั่งตามเงื่อนไขจำนวนมากใน MATLAB ซึ่งทำให้สิ่งนี้เป็นไปได้ เรายังใช้ MATLAB mobile โดยใช้ข้อมูลที่ได้รับจากไจโรสโคปของอุปกรณ์มือถือเพื่อปรับปรุงโครงการให้มากที่สุด

ขั้นตอนที่ 1: ชิ้นส่วนและวัสดุ

ชิ้นส่วนและวัสดุ
ชิ้นส่วนและวัสดุ
ชิ้นส่วนและวัสดุ
ชิ้นส่วนและวัสดุ
ชิ้นส่วนและวัสดุ
ชิ้นส่วนและวัสดุ

MATLAB 2018a

- MATLAB เวอร์ชัน 2018 เป็นเวอร์ชันที่ต้องการมากที่สุด ส่วนใหญ่เป็นเพราะใช้งานได้ดีที่สุดกับโค้ดที่เชื่อมต่อกับอุปกรณ์มือถือ อย่างไรก็ตาม โค้ดส่วนใหญ่ของเราสามารถตีความได้โดยเวอร์ชัน MATLAB ส่วนใหญ่

Arduino MKR1000

-เป็นอุปกรณ์เฉพาะที่ช่วยให้เราสามารถต่อวงจรได้ถึงพอร์ตดิจิตอลและอนาล็อก สิ่งสำคัญคือคุณต้องมีเขียงหั่นขนมเพื่อใช้งานด้วย

เครื่องประดับ

- เมื่อใช้ MKR1000 เราจำเป็นต้องมีชิ้นส่วนเสริมเพื่อทำหน้าที่ที่จำเป็น

ซึ่งรวมถึง

  1. เซอร์โว
  2. ปุ่ม (6)
  3. ไฟ LED RBG แบบเปลี่ยนได้
  4. สายธรรมดา
  5. เขียงหั่นขนม
  6. สวิตช์ไฟขนาดเล็ก
  7. เซ็นเซอร์อุณหภูมิ
  8. ตัวต้านทาน 330 โอห์ม
  9. ตัวต้านทาน 10K โอห์ม
  10. สาย USB-microUSB
  11. แล็ปท็อป/เดสก์ท็อป
  12. อุปกรณ์โทรศัพท์

นอกจากนี้ ยังมีอุปกรณ์เสริมอีกมากมายที่สามารถใช้กับ MKR1000. ได้

ขั้นตอนที่ 2: แพ็คเกจสนับสนุน MATLAB Arduino

ในการใช้ Arduino MKR1000 ผ่าน MATLAB อย่างถูกต้อง คุณต้องดาวน์โหลด MATLAB Support Package สำหรับ Arduino Hardware การดาวน์โหลดนี้ให้คุณเข้าถึงฟังก์ชันและคำสั่งบางอย่างได้โดยตรงไปยังบอร์ด Arduino

สามารถดาวน์โหลดแพ็คเกจได้ที่ลิงค์ด้านล่าง

www.mathworks.com/matlabcentral/fileexchange/47522-matlab-support-package-for-arduino-hardware

ขั้นตอนที่ 3: การใช้เซ็นเซอร์ข้อมูลที่ได้รับจากอุปกรณ์พกพา

การใช้เซ็นเซอร์ข้อมูลที่ได้รับจากอุปกรณ์เคลื่อนที่
การใช้เซ็นเซอร์ข้อมูลที่ได้รับจากอุปกรณ์เคลื่อนที่

แอพ MATLAB Mobile ช่วยให้เราใช้อุปกรณ์มือถือเพื่อสตรีมข้อมูลโดยใช้ไจโรสโคป ในการรับข้อมูลผ่าน MATLAB เราได้รับข้อมูลโดยการดึงข้อมูลจากเมทริกซ์การวางแนวจาก MATLAB มือถือ เราทำสิ่งนี้โดยการสร้างตัวแปรสำหรับแต่ละคอลัมน์ของเมทริกซ์การวางแนว (Azimuth, Pitch และ Roll) และจัดทำดัชนีกระแสค่าคงที่จากอุปกรณ์มือถือไปยังคอมพิวเตอร์ ซึ่งช่วยให้เราสร้างข้อความสั่งแบบมีเงื่อนไขซึ่งจะสร้างผลลัพธ์ล่วงหน้าหาก MATLAB รับข้อมูลเฉพาะที่ป้อนข้อมูลจากอุปกรณ์เคลื่อนที่ ในการดำเนินการนี้ คุณจะต้องใช้ MATLAB mobile บนอุปกรณ์พกพา และแพ็คเกจรองรับอุปกรณ์พกพาสำหรับ MATLAB บนคอมพิวเตอร์ของคุณ

สามารถดาวน์โหลดไฟล์ได้ที่ลิงค์ด้านล่าง

www.mathworks.com/matlabcentral/fileexchange/51235-matlab-support-package-for-apple-ios-sensors

ขั้นตอนที่ 4: รหัสและพอร์ตสายไฟ

รหัสเริ่มต้นด้วยข้อความเริ่มต้นที่ถามว่าเราต้องการเริ่มต้นอุปกรณ์รักษาความปลอดภัยภายในบ้านของเราหรือไม่ หากเราตอบว่าใช่ และให้รหัสผ่านที่ถูกต้อง สคริปต์จะข้ามไปวนซ้ำในทันที จากนั้นจะเริ่มรวบรวมข้อมูลจากอุปกรณ์มือถือ มีเงื่อนไขที่อ่านข้อมูลนี้ เราสามารถปลดล็อคและล็อคระบบจากอุปกรณ์มือถือของเรา และรหัสจะเปลี่ยนเซอร์โวและไฟ LED กะพริบขึ้นอยู่กับข้อมูลที่ได้รับจากอุปกรณ์มือถือ

startup = questdlg('คุณต้องการเปิดใช้งาน ecoTECH Smart Home Energy System หรือไม่'); % เริ่มลำดับการเปิดใช้งานของ ecoTECHwaitfor (เริ่มต้น); ถ้าเริ่มต้น == "ใช่" % หากเลือก "ใช่" ลำดับการเปิดใช้งานจะเริ่มต้นและเข้าสู่ลูป while ที่ไฟสิ้นสุด = "เปิด"; m1 = msgbox('กำลังเริ่มใช้งาน ecoTECH…'); หยุดชั่วคราว(2); ลบ(m1); m1_wait = waitbar(0, 'กรุณารอสักครู่…'); ขั้นตอน = 25; สำหรับฉัน = 1: หยุดชั่วคราว (.1); waitbar(i/ขั้นตอน); % อัปเดตการลบสิ้นสุด waitbar (m1_wait); รหัสผ่าน = [0 0 0 0]; % เริ่มต้นรหัสผ่าน ii = 0; % เริ่มต้นตัวแปรที่ใช้ในการแยกลูป m2 = msgbox('ecoTECH Fully operation!'); หยุดชั่วคราว(2); ลบ(m2); elseif การเริ่มต้น == "ไม่" || start == "Cancel" % หากเลือก "No" หรือ "Cancel" ลำดับการเปิดใช้งานจะไม่เริ่มทำงานและจะไม่เข้าสู่ while loop power = "off"; m3 = msgbox('โอเค ลาก่อน!'); หยุดชั่วคราว(2); ลบ(m3); จบ

% ecoTECH ในส่วนการดำเนินการขณะเปิดเครื่อง == "เปิด" % ส่วนคีย์มือถือในขณะที่จริง % รวบรวมข้อมูลเกี่ยวกับการวางแนวการหมุนของอุปกรณ์เคลื่อนที่ KEY = m. Orientation(3); % รวบรวมข้อมูลเกี่ยวกับปุ่ม b2 = readDigitalPin(a, 'D2'); % ปุ่ม 2 (สีแดง) b3 = readDigitalPin (a, 'D3'); % ปุ่ม 3 (สีขาว) ถ้า KEY >= 35 % ในหน่วยองศา m4 = msgbox('Welcome Home!'); writeDigitalPin(a, 'D8', 1); % เปิดไฟเขียวหยุดชั่วคราว (.5); writePosition(s, 1); % หมุนเซอร์โวเพื่อปลดล็อกประตูหยุดชั่วคราว(2); writeDigitalPin(a, 'D8', 0); % ปิดการลบไฟสีเขียว (m4); elseif KEY <= -35% in องศา m5 = msgbox('Door Locked!'); writeDigitalPin(a, 'D7', 1); % เปิดไฟสีแดงหยุดชั่วคราว (.5); writePosition(s, 0); % หมุนเซอร์โวเพื่อล็อคประตูหยุดชั่วคราว(2); writeDigitalPin(a, 'D7', 0); % ปิดการลบไฟสีแดง (m5); ii = 1; แตก % ออกในขณะที่วนรอบที่มีกุญแจมือถือถ้าประตูถูกล็อคโดยใช้อุปกรณ์มือถือelseif b2 == 0 && b3 == 0 % ออกในขณะที่วงที่มีรหัสมือถือเพื่อเข้าสู่ส่วนรหัสผ่าน สิ้นสุดการสิ้นสุด

หลังจากนี้ก็สามารถเข้าอีก while loop ได้ ในขณะที่ลูปควบคุมผลลัพธ์ตามอินพุตจากปุ่ม หากการวนรอบแรกนั้นไม่สำคัญหรือจำเป็นต้องมีการล็อกแบบแมนนวล การวนซ้ำจะป้อนในขณะที่วนซ้ำซึ่งจำเป็นต้องใช้รหัสผ่านเฉพาะ หากรหัสผ่านไม่ถูกต้อง ระบบจะรีสตาร์ทลูป

ในขณะที่เป็นจริงถ้า ii == 1 % ออกในขณะที่วนรอบที่มีรหัสผ่านหากประตูถูกปลดล็อคด้วยอุปกรณ์มือถือหยุดสิ้นสุด % รวบรวมข้อมูลเกี่ยวกับปุ่ม b5 = readDigitalPin(a, 'D5'); % ปุ่ม 5 (สีน้ำเงิน) b1 = readDigitalPin (a, 'D1'); % ปุ่ม 1 (สีดำ) b4 = readDigitalPin (a, 'D4'); % ปุ่ม 4 (สีขาว) ถ้า b5 == 0 % เริ่มป้อนรหัสผ่านในส่วนสำหรับ b = 1:5 m6 = msgbox ('โปรดกดปุ่มค้างไว้'); หยุดชั่วคราว(2); ลบ(m6); % รวบรวมข้อมูลเกี่ยวกับปุ่ม b1 = readDigitalPin(a, 'D1'); % ปุ่ม 1 (สีดำ) b2 = readDigitalPin (a, 'D2'); % ปุ่ม 2 (สีแดง) b3 = readDigitalPin (a, 'D3'); % ปุ่ม 3 (สีขาว) b4 = readDigitalPin (a, 'D4'); % ปุ่ม 4 (สีเหลือง) b5 = readDigitalPin (a, 'D5'); % ปุ่ม 5 (สีน้ำเงิน) % แทนที่ค่าในรหัสผ่านเริ่มต้นทีละครั้ง ถ้า b1 == 0 PASSCODE(0+b) = 1; elseif b2 == 0 PASSCODE(0+b) = 2; elseif b3 == 0 PASSCODE(0+b) = 3; elseif b4 == 0 PASSCODE(0+b) = 4; elseif b5 == 0 PASSCODE = sprintf('%.0f%.0f%.0f%.0f', PASSCODE(1), PASSCODE(2), PASSCODE(3), PASSCODE(4)); % เปลี่ยนลำดับของปุ่มที่กดเป็นตัวเลขแล้วแปลงเป็นปลายสตริง % End of for loop สำหรับป้อนตัวเลขสำหรับรหัสผ่านหาก PASSCODE == "2314" % หากรหัสผ่านที่ป้อนตรงกัน ประตูจะปลดล็อคเป็นเวลาสองสามวินาทีจากนั้นล็อค m7 = msgbox('ยินดีต้อนรับกลับบ้าน!'); writeDigitalPin(a, 'D8', 1); % เปิดไฟเขียวหยุดชั่วคราว (.5); writePosition(s, 1); % หมุนเซอร์โวเพื่อปลดล็อกประตูหยุดชั่วคราว(5); writeDigitalPin(a, 'D8', 0); % ปิดไฟเขียวหยุดชั่วคราว (.1); writeDigitalPin(a, 'D7', 1); % เปิดไฟสีแดงหยุดชั่วคราว (.5); writePosition(s, 0); % หมุนเซอร์โวเพื่อล็อคประตูหยุดชั่วคราว(1); writeDigitalPin(a, 'D7', 0); % ปิดการลบไฟสีแดง (m7) ii = 1; แตก % ออกในขณะที่ลูปที่มีรหัสผ่านหลังจากป้อนรหัสผ่านที่ถูกต้อง elseif PASSCODE ~= "2314" writeDigitalPin(a, 'D7', 1); % เปิดไฟสีแดง m8 = msgbox('รหัสผ่านไม่ถูกต้อง! ลองอีกครั้ง!'); waitfor(m8) writeDigitalPin(a, 'D7', 0); % ปิดไฟสีแดงต่อไป % อนุญาตให้คุณป้อนรหัสผ่านอีกครั้ง endelseif b1 == 0 && b4 == 0 % ออกในขณะที่ลูปมีส่วนรหัสผ่านหากคุณไม่ต้องการป้อนรหัสผ่าน ii = 1; แตกปลาย

หากถูกต้องจะเข้าสู่วงจร while ที่ควบคุมเซ็นเซอร์อุณหภูมิทันที หากสวิตช์เปิดอยู่ การวนซ้ำจะดำเนินต่อไปและพล็อตกราฟอุณหภูมิเทียบกับเวลา ซึ่งช่วยให้สามารถดูแนวโน้มได้ หากกดปุ่มที่เชื่อมต่อกับเซ็นเซอร์อุณหภูมิ ระบบจะส่งอีเมลแจ้งให้คุณทราบว่าอุณหภูมิใน "บ้าน" ของคุณอยู่ที่เท่าใด หากปิดสวิตช์ ระบบจะปิดรหัสทันที

เสื้อ = 0; % เวลาเริ่มต้น = 0 วินาทีหยุดชั่วคราว (5) % ให้เวลาสำหรับผู้ใช้ในการเปิดสวิตช์อุณหภูมิ SWITCH = readDigitalPin(a, 'D11'); % รวบรวมข้อมูลเกี่ยวกับสวิตช์ในพิน D11 ในขณะที่ SWITCH == 0 SWITCH = readDigitalPin(a, 'D11'); % รวบรวมข้อมูลเกี่ยวกับสวิตช์ในพิน D11 แรงดัน = readVoltage (a, 'A1'); % อ่านแรงดันไฟฟ้าจากเซ็นเซอร์อุณหภูมิ temp_C = (voltage.*1000 - 500)./10; % แปลงแรงดันไฟฟ้าเป็นอุณหภูมิในหน่วย °C temp_F = (9/5).*temp_C + 32; % แปลงจากพล็อต °C เป็น °F (t, temp_C, 'b.') ที่ชื่อ ('อุณหภูมิห้อง'); xlabel('เวลาเป็นวินาที'); ylabel('อุณหภูมิ'); แกน([0, 180, 0, 100]); plot(t, temp_F, 'r.') legend('Temperature in °C', 'Temperature in °F') หยุดชั่วคราว(1); เสื้อ = เสื้อ + 1; % ตัวนับเวลาเป็นวินาที % ส่วนอีเมล b_temp = readDigitalPin(a, 'D0'); % รวบรวมข้อมูลของปุ่มอุณหภูมิ (สีน้ำเงิน) ในพิน D0 ถ้า b_temp == 0 setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); setpref('อินเทอร์เน็ต', 'อีเมล', '[email protected]'); % ผู้ส่ง setpref ('อินเทอร์เน็ต', 'SMTP_Username', '[email protected]'); % ชื่อผู้ใช้ของผู้ส่ง setpref('Internet', 'SMTP_Password', 'Integral_ecoTECH'); % รหัสผ่านของผู้ส่งอุปกรณ์ประกอบฉาก = 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]', 'ecoTECH อุณหภูมิห้อง', sprintf('อุณหภูมิห้องปัจจุบันคือ %.1f °C หรือ %.1f °F.', temp_C, temp_F)); % ส่งอีเมลไปยังผู้รับโดยให้ข้อมูลเกี่ยวกับอุณหภูมิห้องปัจจุบัน fprintf('อีเมลสำเร็จแล้ว!\n') สิ้นสุดหาก temp_F >= 75 % หากอุณหภูมิห้องเพิ่มขึ้นเป็น 75 °F… temp_AC = 65; % เปลี่ยนอุณหภูมิบนตัวควบคุมอุณหภูมิเป็น 65 °F มิฉะนั้น temp_F <= 65 % หากอุณหภูมิห้องลดลงเป็น 60 °F… temp_AC = 80; % เปลี่ยนอุณหภูมิบนเทอร์โมสตัทเป็น 80 °F สิ้นสุดที่สิ้นสุด % สิ้นสุดของ "SWITCH == 0" ขณะวนซ้ำหากเปิดเครื่อง == "ปิด" || ii == 1 % ออกจาก "power == on" ในขณะที่ loop break end end % สิ้นสุดของ "power == on" ในขณะที่ loop if power == "off" || ii == 1% ออกจากทั้งหมดในขณะที่สิ้นสุดการวนซ้ำ

นี่เป็นเพียงภาพรวมคร่าวๆ ของโค้ดและความสามารถในการทำงาน เราได้แนบโค้ดฉบับเต็มเป็น pdf หากจำเป็น

นี่คือรายการพอร์ตที่แต่ละอุปกรณ์เชื่อมต่ออยู่

1. RGB LED: พินดิจิตอล (7, 8, 9)

2. เซอร์โว: พินดิจิตอล 6

3. ปุ่ม: หมุดดิจิตอล (1, 2, 3, 4, 5)

4. ปุ่มสีน้ำเงินสำหรับอีเมล: Digital Pin 0

5. เซนเซอร์จับอุณหภูมิ: ขาอนาล็อก 1

6. สวิตช์: Digital Pin 11

แนะนำ: