pop-bot xt_th

198
XT 1 Arduino compatible robot kit activity manual Arduino POP-BOT XT

Upload: surprisezz-kasem

Post on 19-Jan-2016

113 views

Category:

Documents


3 download

DESCRIPTION

POP-BOT XT_TH

TRANSCRIPT

Page 1: POP-BOT XT_TH

XT 1

Arduino compatible robot kit activity manual

ArduinoPOP-BOT XT

Page 2: POP-BOT XT_TH

2XT

XT

ใครควรใช หนั งสื อเล มน้ี

1. น ักเร ียน น ิส ิต น ักศ ึกษา และบ ุคคลทั ่วไปที ่ม ีความสนใจในการน ําไมโครคอนโทรลเลอร ไปประย ุกต ใช ในการทดลองเก่ี ยวกั บการทํ างานของระบบอ ัตโนม ัต ิ หรื อสนใจในการเร ียนรู และทดลองไมโครคอนโทรลเลอร ในแนวทางใหม ที ่ใช ก ิจกรรมหุ นยนต อ ัตโนม ัต ิเป นสื ่อ

2. สถาบ ันการศึ กษา โรงเร ียน วิ ทยาลั ย มหาว ิทยาลั ย ที่ ม ีการเป ดการเรี ยนการสอนวิ ชาอิ เล็ กทรอน ิกส หรื อภาคว ิชาว ิศวกรรมอ ิเล ็กทรอน ิกส และคอมพ ิวเตอร

3. คณาจารย ที่ มี ความต องการศึ กษา และเตรี ยมการเรี ยนการสอนวิ ชาไมโครคอนโทรลเลอร รวมถึ งวิ ทยาศาสตร ประยุ กต ที่ ต องการบู รณาการความรู ทางอิ เล็ กทรอนิ กส -ไมโครคอนโทรลเลอร -การเขี ยนโปรแกรมคอมพิ วเตอร -การทดลองทางวิ ทยาศาสตร ในระดั บม ัธยมศึ กษา อาชี วศึ กษา และปริ ญญาตรี

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

สงวนลิ ขสิ ทธิ์ ตาม พ.ร.บ. ลิ ขสิ ทธิ์ พ.ศ. 2537

ห ามการลอกเลี ยนไม ว าส วนหนึ่ งส วนใดของหนั งสื อเล มนี้ นอกจากจะได รั บอน ุญาต

ดํ าเนิ นการจั ดพิ มพ และจํ าหน ายโดยบริ ษั ท อิ นโนเวตี ฟ เอ็ กเพอริ เมนต จํ ากั ด108 ซ.สุ ขุ มวิ ท 101/2 ถ.สุ ขุ มวิ ท แขวงบางนา เขตบางนา กรุ งเทพฯ 10260โทรศั พท 0-2747-7001-4โทรสาร 0-2747-7005

Page 3: POP-BOT XT_TH

XT 3

XT

ช ุดหุ นยนต POP-BOT XT เป นโครงการที ่น ําเสนอทางเล ือกในการเร ียนรู ไมโครคอนโทรลเลอร อย างง ายด วยซอฟต แวร Arduino เพื่ อนํ าเสนอแนวทางและกิ จกรรมในการประยุ กต ใช ไมโครคอนโทรลเลอร และซอฟต แวร โปรแกรมภาษา C/C++ ระบบเป ดหร ือโอเพ นซอร ส มาสร างเป นหุ นยนต อ ัตโนมั ต ิขนาดเล็ กหร ือ Programmable Mobile Robot โดยหุ นยนต ที ่ใช ในโครงการนี้ เป นชุ ดหุ นยนต อ ัตโนมั ต ิที ่ขั บเคล่ื อนด วยมอเตอร ไฟตรงท่ี ม ีเฟ องทดในต ัว

วั ตถุ ประสงค ในการดํ าเนิ นการโครงการนี้ คื อ

1.เพื่ อให น ําเสนอแนวทางในการนํ าแผงวงจรไมโครคอนโทรลเลอร POP-XT ไปใช ในก ิจกรรมที ่ม ีความหลากหลาย โดยเฉพาะอย างยิ ่งก ับการจ ัดก ิจกรรมเกี ่ยวก ับการควบค ุมหุ นยนต อ ัตโนม ัต ิ

2.เพื่ อเป นตั วอย างหรื อทางเลื อกในการขยายโอกาส สํ าหรั บการพั ฒนาส่ื อการเรี ยนการสอนวิ ทยาศาสตร และเทคโนโลย ีที่ ใช หุ นยนต เป นส่ื อส ําหรั บครู -อาจารย

3. เพื่ อเตรี ยมการสํ าหรั บการฝ กอบรมเพื่ อการประลองความรู ความสามารถในการเข ียนโปรแกรมควบคุ มหุ นยนต อ ัตโนม ัติ

ส ําหร ับการจ ัดส่ื อหร ือคู ม ือประกอบในการเร ียนรู และดํ าเน ินก ิจกรรมนั ้น ได จ ัดทํ าหน ังส ือสร างและพ ัฒนาโปรแกรมควบค ุมหุ นยนต อ ัตโนม ัต ิด วยโปรแกรมภาษา C/C++ ก ับ Arduino และ POP-BOTXT เพื ่อใช ประกอบในการเร ียนรู และทดลอง พร อมกั นนี ้สามารถใช หน ังสื อเร ียนรู ระบบควบคุ มอย างง ายด วยโปรแกรมภาษา C ก ับ Arduino และบอร ดไมโครคอนโทรลเลอร POP-XT ประกอบในการเร ียนรู และท ําความเข าใจร วมด วยได

ชุ ด POP-BOT XT robot kit และ POP-BOT XT Lite robot kit เป นสื่ อการเรี ยนรู ทางเลื อกสํ าหรั บครู -อาจารย ,น ักเร ียนและน ักพ ัฒนาระบบสมองกลฝ งต ัวอ ิสระที ่ม ีความประสงค ในการต อยอดหร ือประย ุกต ใช ไมโครคอนโทรลเลอร และซอฟต แวร Arduino ในก ิจกรรมด านหุ นยนต อ ัตโนม ัต ิที ่ควบค ุมด วยโปรแกรมภาษา C/C++ ด ําเน ินการโดย บร ิษ ัทอิ นโนเวตี ฟ เอ็ กเพอร ิเมนต จ ํากั ด การจั ดหาสื ่อการเรี ยนรู นี ้เป นไปในร ูปแบบสมั ครใจ การบริ การเก่ี ยวกั บการจั ดหาและซ อมแซมอุ ปกรณ อยู ภายใต ความรั บผิ ดชอบของบร ิษั ท อิ นโนเวต ีฟ เอ็ กเพอร ิเมนต จํ ากั ด

Page 4: POP-BOT XT_TH

4XT

การน ําเสนอข อม ูลเกี ่ยวก ับข อมู ลทางเทคน ิคและเทคโนโลยี ในหน ังส ือเล มนี ้ เก ิดจากความต องการที ่จะอธ ิบายกระบวนการและหล ักการทํ างาน ของอุ ปกรณ ในภาพรวมด วยถ อยคํ าที ่ง ายเพื ่อสร างความเข าใจแก ผู อ าน ด ังน้ั นการแปลค ําศ ัพท ทางเทคน ิคหลายๆ คํ าอาจไม ตรงตามข อบ ัญญ ัต ิของราชบั ณฑิ ตยสถาน และม ีหลายๆ คํ าที ่ยั งไม มี การบั ญญั ติ อย างเป นทางการ คณะผู เขี ยนจึ งขออนุ ญาตบ ัญญ ัต ิศ ัพท ขึ ้นมาใช ในการอธ ิบาย โดยม ีข อจ ําก ัดเพื ่ออ างอ ิงในหน ังส ือเล มนี ้เท านั ้น

ทั ้งนี ้สาเหตุ หลั กของข อชี ้แจงนี ้มาจาก การรวบรวมข อม ูลของอ ุปกรณ ในระบบสมองกลฝ งต ัวและเทคโนโลย ีหุ นยนต ส ําหร ับการศ ึกษาเพื ่อน ํามาเร ียบเร ียงเป นภาษาไทยนั ้นท ําได ไม ง ายน ัก ทางคณะผู เข ียนต องท ําการรวบรวมและทดลองเพื ่อให แน ใจว า ความเข าใจในกระบวนการท ํางานต าง ๆนั ้นม ีความคลาดเคล่ื อนน อยที ่ส ุด

เมื ่อต องท ําการเร ียบเร ียงออกมาเป นภาษาไทย ศ ัพท ทางเทคน ิคหลายค ําม ีความหมายที ่ท ับซ อนก ันมาก การบ ัญญ ัต ิศ ัพท จ ึงเก ิดจากการปฏ ิบ ัต ิจร ิงร วมก ับความหมายทางภาษาศาสตร ด ังนั ้นหากม ีความคลาดเคลื ่อนหร ือผ ิดพลาดเก ิดขึ ้น ทางคณะผู เข ียนขอน อมร ับและหากได ร ับค ําอธ ิบายหร ือชี ้แนะจากท านผู รู จะได ท ําการชี ้แจงและปร ับปร ุงข อผ ิดพลาดที ่อาจม ีเหล านั ้นโดยเร ็วที ่ส ุด

ทั้ งน้ี เพื ่อให การพั ฒนาส่ื อทางว ิชาการ โดยเฉพาะอย างยิ ่งกั บความรู ของเทคโนโลยี สมั ยใหม สามารถดํ าเนิ นไปได อย างต อเนื ่อง ภายใต การมี ส วนร วมของผู รู ในท ุกภาคส วน

Page 5: POP-BOT XT_TH

XT 5

บทที่ 1 á ¹ йí ÒÍØ » ¡ Ã³ì · ҧΠÒÃì ́ á ÇÃì ¢ Í § POP-BOT XT...........................................................7

บทที่ 2 ลงม ือสร างหุ นยนต POP-BOT XT..............................................................................19

บทที่ 3 แนะน ําโปรแกรม Arduino 1.0..................................................................................27

บทที่ 4 โครงสร างโปรแกรมของ Arduino..................................................................................47

บทที่ 5 การพ ัฒนาโปรแกรมส ําหร ับหุ นยนต POP-BOT XT ด วย Arduino 1.0.....................75

บทที่ 6 ทดสอบการควบคุ มฮาร ดแวร ของ POP-XT แผงวงจรควบคุ มของหุ นยนต POP-BOT XT.............................................................................................................. 83

บทที่ 7 ไลบราร ีส ําหร ับการพ ัฒนาโปรแกรมของหุ นยนต POP-BOT XT..........................101

บทที่ 8 ข ับเคลื ่อนหุ นยนต POP-BOT XT................................................................................131

บทที่ 9 หุ นยนต POP-BOT XT ก ับสว ิตช และการตรวจจ ับการชน ....................................145

บทที่ 10 หุ นยนต POP-BOT XT ก ับภารก ิจตรวจจ ับเส น....................................................153

บทที่ 11 หุ นยนต POP-BOT XT ก ับการตรวจจ ับว ัตถ ุแบบไม ส ัมผ ัส...................................175

บทที่ 12 หุ นยนต POP-BOT XT ก ับการข ับเซอร โวมอเตอร ................................................183

Page 6: POP-BOT XT_TH

6XT

Page 7: POP-BOT XT_TH

XT 7

XTPOP-BOT XT เป นช ุดอ ุปกรณ ส ําหร ับสร างและพ ัฒนาโปรแกรมเพื ่อควบค ุมห ุ นยนต อ ัตโนม ัต ิขนาดเล็ กที ่

ข ับเคลื ่อนด วยมอเตอร ไฟตรงและชุ ดเฟ องขั บ มี ด วยกั น 2 รุ นคื อ

1. POP-BOT X T Lite kit ในชุ ดนี้ ประกอบด วย แผงวงจรควบคุ มหลั กซึ่ งมี ไมโครคอนโทรลเลอร ATmega32U4 เป นอ ุปกรณ หล ักและโมดู ลแสดงผลกราฟ ก LCD สี ในตั ว, แผงวงจรอ ุปกรณ ตรวจจั บส ัญญาณหร ือเซนเซอร (sensor) พื้ นฐาน, มอเตอร ไฟตรงพร อมชุ ดเฟ องขั บหรื อ DC motor gearbox และชิ ้นส วนทางกลที ่จํ าเป นทํ าให นํ าชุ ด POP-BOT XT Lite นี้ ไปใช ในการเรี ยนรู และเขี ยนโปรแกรมเพื่ อควบคุ มหุ นยนต อั ตโนมั ต ิด วยภาษา C/C++ ในเบื้ องต นได ภายใต งบประมาณที่ เหมาะสม

2. POP-BOT XT Standard kit ในชุ ดประกอบด วยอุ ปกรณ หลั กเหมื อนกั บชุ ด POP-BOT XT Lite มี การเพิ่ มตั วตรวจจั บระยะทางด วยแสงอิ นฟราเรด, ตั วตรวจจั บแสงสะท อนอิ นฟราเรดอี ก 2 ตั ว (รวมเป น 4 ตั ว), เซอร โวมอเตอร และชิ้ นต อพลาสติ กเพิ่ มเติ ม เพื่ อให นํ าหุ นยนต POP-BOT XT นี้ มาใช ในการเรี ยนรู , ทดลองและพั ฒนาหุ นยนต อั ตโนมั ติ แบบโปรแกรมได ทั้ งยั งรองรั บกิ จกรรมการแข งขั นได เป นอย างดี

1.1 รายการอุ ปกรณ ที่ ใช ในหุ นยนต POP-BOT XT1. แผงวงจรควบคุ มหุ นยนต POP-XT ที่ ติ ดต้ั งกะบะถ าน AA แบบ 4 ก อน

2. แผงวงจรสวิ ตช 2 ชุ ด

3. แผงวงจร LED 2 ชุ ด

4. แผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 จํ านวน 2 ชุ ด (สํ าหรั บรุ น Lite) หรื อ 4 ชุ ด (สํ าหรั บรุ นมาตรฐานหรื อ Standard)

5. มอเตอร ไฟตรงพร อมชุ ดเฟ องขั บรุ น BO2 อั ตราทด 48:1 พร อมสายเชื่ อมต อแบบ IDC จํ านวน 2 ตั ว

6. ล อพลาสติ กกลมสํ าหรั บชุ ดเฟ องขั บมอเตอร และยาง จํ านวน 2 ชุ ด

7. แผ นกริ ดขนาด 80x60 เซนติ เมตรและ 80x80 เซนติ เมตร จํ านวน 2 ชุ ด

8. แผ นฐานกลมพร อมล ออิ สระ 1 แผ น

9. ชิ้ นต อ/แท งต อพลาสติ ก *

10. ชุ ดฉากโลหะ *

11. ชุ ดนอตและสกรู

12. แผ นทดสอบการเคลื่ อนที่ ตามเส นของหุ นยนต

13. สายเชื่ อมต อ USB-miniB สํ าหรั บดาวน โหลดโปรแกรมและสื่ อสารข อมู ล

14. ซี ดี รอมบรรจุ ซอฟต แวร และตั วอย างโปรแกรมการทดลอง

Page 8: POP-BOT XT_TH

8XT

15. หนั งสื อการสร างและทดลองเขี ยนโปรแกรมควบคุ มหุ นยนต อั ตโนมั ติ ด วยภาษา C (เล มนี้ )

16. โมด ูลตรวจจ ับและว ัดระยะทางแบบอ ินฟราเรด GP2D120**

17. เซอร โวมอเตอร **

* จั ดให มี จํ านวนเพิ่ มขึ้ นในชุ ด POP-BOT XT Standard kit

** เป นอุ ปกรณ ที่ มี เพิ่ มเติ มในชุ ด POP-BOT XT Standard kit

1.2 คุ ณสมบั ติ ของชุ ดอุ ปกรณ ในส วนไมโครคอนโทรลเลอร หลั ก1.2.1 แผงวงจรควบคุ มหลั ก POP-XT

POP-XT เป นแผงวงจรไมโครคอนโทรลเลอร สที่ ใช ไมโครคอนโทรลเลอร ตระกู ล AVR เบอร ATmega32U4 ของ Atmel (www.atmel.com) มี ส วนเชื่ อมต อพอร ต USB เพื่ อใช ในการสื่ อสารข อมู ลและดาวน โหลดโปรแกรมได ในตั ว โดยไม ต องใช สายสั ญญาณหรื ออุ ปกรณ แปลงสั ญญาณใดๆ เพิ่ มเติ ม จ ึงทํ าให การใช งานง ายและสะดวกมาก รวมถ ึง POP-XT ได เล ือกใช ฮาร ดแวร ที ่เข ากั นได กั บฮาร ดแวร ของโครงการไมโครคอนโทรลเลอร ระบบเป ด (โอเพ นซอร ส : open source) ที ่ชื ่อ Arduino (www.arduino.cc/en) ในรุ น Arduino Leonardo จ ึงท ําให สามารถนํ าช ุดพ ัฒนาของ Arduino1.0 มาใช งานได ภายในช ุดพ ัฒนาของ Arduino1.0 ม ีไลบราร ีฟ งก ช ันภาษาซ ีส ําหร ับต ิดต อก ับฮาร ดแวร จํ านวนมากไว ให ท ําให เข ียนโปรแกรมสั ่งงานอ ุปกรณ ต างๆ ได ง าย โดยไม จํ าเป นต องศ ึกษาลงไปในรายละเอ ียดของไมโครคอนโทรลเลอร มากน ัก แต ถ าหากม ีความต องการพ ัฒนาในระดั บที ่ส ูงขึ ้นก ็สามารถน ํา POP-XT ไปใช ร วมก ับเครื ่องม ือพ ัฒนาโปรแกรมรวมถ ึงคอมไพเลอร อื ่นๆ ได เช นก ัน

ส วนประกอบทั้ งหมดของแผงวงจร POP-XT แสดงในรู ปที่ 1-1 ม ีค ุณสมบ ัต ิโดยสร ุปด ังนี ้

ใช ไมโครคอนโทรลเลอร ขนาด 8 บิ ตเบอร ATmega32U4 ของ Atmel ภายในมี โมดู ลแปลงสั ญญาณอะนาลอกเป นดิ จิ ตอลความละเอี ยด 10 บิ ต 12 ช อง มี หน วยความจํ าโปรแกรมแบบแฟลช 32 กิ โลไบต โปรแกรมใหม ได 10,000 ครั้ ง มี หน วยความจํ าข อมู ลอี อี พรอม 1024 ไบต หน วยความจํ าข อมู ลแรม 2.5 กิ โลไบต หรื อ 2560ไบต ใช สั ญญาณนาฬิ กา 16MHz จากเซรามิ กเรโวเนเตอร

จุ ดต อพอร ตใช งาน 25 จุ ด และจั ดสรรเป นจุ ดต อแบบ JST 3 ขา จํ านวน 12 จุ ดสํ าหรั บต ออุ ปกรณ ตรวจจั บและอุ ปกรณ ต อพ วงภายนอกต างๆ

มี ไฟแสดงสถานะไฟเลี้ ยงและไฟทดสอบพอร ต

มี สวิ ตช RESET

มี จุ ดต อพอร ต USB สํ าหรั บดาวน โหลดโปรแกรมและสื่ อสารข อมู ลกั บคอมพิ วเตอร

มี จุ ดต อไฟเลี้ ยง (DC INPUT) ผ านทางจุ ดต อสายแบบขั นสกรู สามารถรั บไฟเลี้ ยงได ตั้ งแต 4.8 ถึ ง7.2V โดยมี สวิ ตช เป ด-ป ดเพื่ อตั ดต อไฟเลี้ ยงแก แผงวงจร

ม ีวงจรควบค ุมไฟเลี ้ยง +5V แบบสว ิตชิ ่งส ําหร ับร ักษาระด ับไฟเลี ้ยงให แก ไมโครคอนโทรลเลอร

จ ุดต อพอร ตอ ินพ ุตเอาต พ ุตดิ จ ิตอลหร ืออะนาลอก 8 ช อง ค ือ A0 ถ ึง A7 (ตรงกั บขา Di18 ถึ ง Di23,Di4 และ Di6)

Page 9: POP-BOT XT_TH

XT 9

รู ปที่ 1-1 แสดงส วนประกอบของแผงวงจรควบคุ ม POP-XT

จ ุดต อพอร ตด ิจ ิตอลรองร ับระบบบ ัส I2C 1 ชุ ด คื อ จุ ดต อ Di2 (SDA) และ Di3 (SCL)

มี จุ ดต อพอร ตส่ื อสารข อมู ลอนุ กรม UART 1 ชุ ดคื อ จุ ดต อ Di0 (RxD) และ Di1 (TxD)

มี วงจรขั บมอเตอร ไฟตรง 2 ช อง พร อมไฟแสดงผล

ม ีจ ุดต อขาพอร ตของไมโครคอนโทรลเลอร ส ําหร ับข ับเซอร โวมอเตอร 3 ช องค ือ Di30, Di12 และ Di13(เรี ยงตามลํ าดั บ SV1, SV2 และ SV3)

มี ลํ าโพงเป ยโซสํ าหรั บขั บเสี ยง โดยต อกั บขาพอร ต Di11

มี จุ ดต อ ISP สํ าหรั บอั ปเกรดหรื อกู เฟ ร มแวร โดยใช ชุ ดโปรแกรมแบบ ISP เพิ่ มเติ ม (แนะนํ าเครื่ องโปรแกรม PX-400 หรื อ PX-4000 ของ inex)

มี โมดู ลแสดงผลแบบกราฟ กสี ความละเอี ยด 128 x 160 จุ ด แสดงภาพกราฟ กลายเส น และพื้ นสี (ไม รองรั บไฟล รู ปภาพใดๆ) พร อมไฟส องหลั ง แสดงผลเป นตั วอั กษรขนาดปกติ (5x7 จุ ด) ได 21 ตั วอั กษร 16บรรทั ด (21x16)

มี สวิ ตช กดติ ดปล อยดั บพร อมใช งาน (สวิ ตช OK) 1 จุ ด โดยต อร วมกั บตั วต านทานปรั บค าได (KNOB) ซึ่ งเชื่ อมต อไปยั งขาพอร ต 8 ทํ าให อ านค าสั ญญาณดิ จิ ตอลและอะนาลอกได ในขาพอร ตเดี ยวกั น

วงจรสมบู รณ ของแผงวงจร POP-XT แสดงในรู ปที่ 1-2

Page 10: POP-BOT XT_TH

10XT

ร ูปที ่ 1-2 วงจรสมบ ูรณ ของแผงวงจรควบคุ ม POP-XT

PE6

IC1ATMega32U4

(TQFP44)

UVccD-D+

UGnd

UCap

VBusPB0PB1PB2PB3

PB

7RST

Vcc

GN

DXTA

L2

XTA

L1

PD

0PD

1PD

2PD

3PD

5

AVcc

GN

DA

REF

PF0

PF1

PF4

PF5

PF6

PF7

GN

DV

cc

SCL3 RXD0 A76

SDA2 TXD1 4

CR116MHz

SW2RESET

R34k7

ISP

C11F

+5V

A0 18

A1 19A3 21A5 23

A2 20A4 22

R44k7

LED1BLUE

+5V

+5V

+5V

R127D-

D+IDGND

VUSB

K1mini B-USBUSB port

+USB

K3BATT

4.8-7.2V

+5V

PF7

PF6PF4PF0

PF5PF1

PD0 PD2 PD7

PD1 PD3 PD4

G

A6

SP1PIEZO

Speaker

30

+Vm

GND

SV1

12

+Vm

GND

SV2

13

+Vm

GND

SV3

IC2TB6612FNG

A1

A1

PG

PG

A2

A2

B2

B2

PG

PG

B1

B1

R71k

R81k

A B

BDIR

BPWM10

7

9

5ADIR

APWM

DC. MOTOROUTPUT

+V

mPW

MA

+V

m+

Vm

PW

MB

BIN

2B

IN1

GN

DS

TB

Vcc

AIN

1A

IN2

+Vm+Vm

+- +-

PB5 PB6

PE6PC6

R54k7

+5V

R64k7

+5V

+5V

Q1KRC102

+Vm

SWITCHON

+Vm

IC3KIA278R05

1 2

3

D1MBRS340

IC4NCP1450

- 5.0

215,6,7,8

4

1,2,3

Q3FDS6680A

5

4

+5V

11

3

R227

C2

0.01F

C310F16V

C40.1F

C50.1F

C6100F10V

C70.1F

C80.1F

Q2KRC102

C90.1F

C10470F16V

C11470F16V

L110H

C120.1F

C13220F10V

11

10

9

8

7

6

5

4

3

2

144 43 42 41 40 39 38 37 36 35 34

33

32

31

30

29

28

27

26

25

24

232221201918171615141312

PE2PC7PC6PB6PB5PB4PD7PD6PD4AVccGND

1 2 3 4 5 6 7 8 9 10 11 12

24 23 22 21 20 19 18 17 16 15 14 13

4

RST

17

15

16

14

31

8

xx

Pxx

+

7

REF

23

22

21

20

19

18

31

PE2

13511

1098

1

4

30

12

6

16

14

3

2

0

RST

+

17

15

PB

4A

8

SP

IE

xt.

GND

GND

GND

+

N/C

GN

DCS

Vcc

Vcc

CLK

MIS

OD

/C/R

ST

GN

DLED

ALED

KG

ND

N/C

1 2 3 4 5 6 7 8 9 10 11 12 13 14

SW3RESET

+3.3V

R104.7k

D11N4148

+3.3V

+3.3V

R94.7

R114.7k

R134.7k

R124.7k

R144.7k

R164.7k

R154.7k

R174.7k

R184.7k

31 PE2

16 PB2

15 PB1

17 PB0

RST

GLCD160x128 pixel

25-character16-line

IC5LM1117-3.3V

+5V +3.3V

C1410F16V

C150.1F

C1610F16V

R111k

VR1KNOB

R111k

SW5OK

+5V

8 PB4C18

0.1F

C170.1F

Page 11: POP-BOT XT_TH

XT 11

1.2 คุ ณสมบั ติ ของอุ ปกรณ เอาต พุ ต

1.2.1 มอเตอร ไฟตรงพร อมชุ ดเฟ องขั บ

เป นช ุดมอเตอร พร อมเฟ องข ับรุ น BO-2 อ ัตราทด 48:1 ม ีสายต อ 2 เส น ค ุณสมบ ัต ิทางเทคนิ คที ่ส ําค ัญม ีด ังนี ้

ต องการไฟเลี้ ยงในย าน +3 ถึ ง +9Vdc

กิ นกระแสไฟฟ า 130mA (ที่ ไฟเลี้ ยง +6V และไม มี โหลด)

ความเร็ วเฉลี่ ย 170 ถึ ง 250 รอบต อนาที (ที่ ไฟเลี้ ยง +6V และไม มี โหลด)

นํ้ าหนั ก 30 กรั ม

แรงบิ ดตํ่ าสุ ด 0.5 กิ โลกรั ม-เซนติ เมตร

ติ ดต้ั งเข ากั บตั วยึ ดพลาสติ กแบบมี พุ กทองเหลื องสํ าหรั บยึ ดในตั ว

ขนาด (กว าง x ยาว x สู ง) 42 x 45 x 22.7 มิ ลลิ เมตร

1.2.2 แผงวงจรไฟแสดงผล : ZX-LEDใช LED ขนาด 8 มิ ลลิ เมตร ต องการลอจิ ก “1” ในการขั บให สว าง มี วงจรแสดงในรู ปที่ 1-3

Q1KRC102

(DTC114)

R1(Default = 510)

LED1

+

S

ร ูปที ่ 1-3 รู ปร างและวงจรของแผงวงจรไฟแสดงผล ZX-LED

Page 12: POP-BOT XT_TH

12XT

1.2.3 เซอร โวมอเตอร แบบมาตรฐาน (เป นอ ุปกรณ เสร ิม ม ีในช ุด POP-BOT XT Standard kit)

มี สายต อใช งาน 3 เส นคื อ สายสั ญญาณ (S) สายไฟเลี้ ยง (+V) และกราวด (G) ภายในเซอร โวมอเตอร มี วงจรควบคุ มการหมุ นติ ดตั้ งอยู ดั งแสดงในรู ปที่ 1-10 คุ ณสมบั ติ ทางเทคนิ คที่ สํ าคั ญมี ดั งนี้

ต องการไฟเลี้ ยงในย าน +4.8 ถึ ง +6Vdc

ความเร็ วเฉลี่ ย 60 รอบต อนาที (ที่ ไฟเลี้ ยง +5V และไม มี โหลด)

นํ้ าหนั ก 45 กรั ม

แรงบิ ด 3.40 กิ โลกรั ม-เซนติ เมตร หรื อ 47 ออนซ -นิ้ ว

ขนาด (กว าง x ยาว x สู ง) 40.5 x 20 x 38 มิ ลลิ เมตร หรื อ 1.60 x 0.79 x 1.50 นิ้ ว

1.3 คุ ณสมบั ติ ของชุ ดอุ ปกรณ ตรวจจั บสั ญญาณ

1.3.1 แผงวงจรสวิ ตช : ZX-01

มี วงจรและรู ปร างแสดงในรู ปที่ 1-4 ประกอบด วยสวิ ตช พร อมไฟแสดงผล ถ ากดสวิ ตช จะส งลอจิ ก “0” ไฟสี แดงติ ด

ร ูปที ่ 1-4 ร ูปร างและวงจรของแผงวงจรสวิ ตช ที ่ใช ในช ุดหุ นยนต POP-BOT XT

DATAR3220

R210k

R1510

LED1

S1

Switch

Indicator

Signal output

GND

+V

Page 13: POP-BOT XT_TH

XT 13

1.3.2 แผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด : ZX-03

ม ีวงจรและหน าตาของแผงวงจรแสดงในร ูปที ่ 1-5 เป นแผงวงจรที ่ใช ในการตรวจสอบการสะท อนของแสงอิ นฟราเรดของตั วตรวจจั บแสงสะท อนอิ นฟราเรดซึ ่งรวมตั วส งและต ัวรั บไว ในตั วถ ังเดี ยวก ัน โดยต ัวตรวจจั บแสงสะท อนอ ินฟราเรดที ่น ํามาใช ค ือ TCRT5000

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

เนื ่องจากแผงวงจรตรวจจั บแสงสะท อนอ ินฟราเรด ZX-03 ให ผลการท ํางานเป นแรงดั นไฟตรง ด ังนั ้นในการใช งานก ับ POP-BOT XT จ ึงต องต อเข าก ับช องอิ นพ ุตอะนาลอกของแผงวงจรหล ัก จากนั ้นใช ความรู จากการอ านค าส ัญญาณอะนาลอก เพื ่ออ านค าจากแผงวงจรตรวจจ ับแสงสะท อนอ ินฟราเรดนํ าไปสู การตรวจจั บเส นต อไป

ร ูปที ่ 1-5 หน าตาและวงจรของแผงวงจรตรวจจ ับแสงสะท อนอ ินฟราเรดที ่ใช ในช ุดหุ นยนต POP-BOT XT

10k

TCRT5000

510

+V

GND

OUT

ต ัวตรวจจ ับแสงสะท อนอ ินฟราเรด

จุ ดต อสั ญญาณ

Page 14: POP-BOT XT_TH

14XT

LED อินฟราเรดตัวสง ตัวรับแสงอินฟราเรด

GP2D12

GNDVout Vcc

GP2D120

4 8 12 16 20 24 28 3200

0.4

0.8

1.2

1.6

2.0

2.4

2.8

แรงดันเอาตพุต(V)

ระยะหางจากวัตถุที่ตรวจจับ (cm)

กราฟแสดงการทํ างานของ GP2D120

หล ักการท ํางานของโมด ูลว ัดระยะทางด วยแสงอ ินฟราเรด

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

L F

A X ดั งนั้ นค า L จะมี ค าเท ากั บ F A

LX

ค าที่ ได จากโฟโต ทรานซิ สเตอร จะถู กเปลี่ ยนเป นระดั บแรงดั นซึ่ งให ผลการเปลี่ ยนแปลงตามระยะทางที่ ตรวจวั ดได

L

A

F

X

วัตถุ

GP2D120

LED อินฟราเรดตัวสง

สวนรับแสง

ร ูปที ่ 1-6 แสดงรู ปร าง การจั ดขา และกราฟแสดงการทํ างานของ GP2D120

1.3.3 GP2D120 โมดู ลตรวจจั บระยะทางแบบอิ นฟราเรด(เป นอ ุปกรณ เสร ิม ม ีในชุ ด POP-BOT XT Standard kit)

GP2D120 เป นโมดู ลตรวจจั บระยะทางแบบอิ นฟราเรดมี ขาต อใช งาน 3 ขาคื อ ขาต อไฟเลี้ ยง (Vcc), ขากราวด (GND) และขาแรงดั นเอาต พุ ต (Vout) การอ านค าแรงดั นจาก GP2D120 จะต องรอให พ นช วงเตรี ยมความพร อมของโมดู ลก อน ซึ่ งใช เวลาประมาณ 32.7 ถึ ง 52.9 มิ ลลิ วิ นาที (โดย 1 มิ ลลิ วิ นาที เท ากั บ 0.001 วิ นาที ) ดั งนั้ นในการอ านค าแรงดั นจึ งควรรอให พ นช วงเวลาดั งกล าวไปก อน ดั งแสดงข อมู ลเบื้ องต นในรู ปที่ 1-6

ค าแรงดั นเอาต พุ ตของ GP2D120 ที่ ระยะทาง 30 เซนติ เมตรที่ ไฟเลี้ ยง +5V อยู ในช วง 0.25 ถึ ง 0.55V โดยค ากลางคื อ 0.4V ช วงของการเปลี่ ยนแปลงแรงดั นเอาต พุ ตที่ ระยะทาง 4 เซนติ เมตรคื อ 2.25V 0.3V

Page 15: POP-BOT XT_TH

XT 15

1.4 ข อมู ลของสายสั ญญาณที่ ใช ในชุ ดหุ นยนต POP-BOT XT

1.4.1 สาย JST3AA-8 : สายเช่ื อมต อระหว างแผงวงจรสาย JST3AA-8 ใช เชื่ อมต อระหว างแผงวงจรควบคุ ม POP-XT กั บแผงวงจรตรวจจั บและแผงวงจรอุ ปกรณ

ต างๆ เป นสายแพ 3 เส น ยาว 8 นิ้ ว ปลายสายทั ้งสองด านติ ดต้ั งคอนเน็ กเตอร แบบ JST 3 ขา ตั วเมี ย ระยะห างระหว างขา 2 มิ ลลิ เมตร มี การจั ดขาดั งนี้

ระยะหางระหวางขา 2 มม. ระยะหางระหวางขา 2 มม.

GNDS

+5V

1.4.2 สาย USB-miniBเป นสายสั ญญาณสํ าหรั บเชื่ อมต อระหว างพอร ต USB ของคอมพิ วเตอร กั บแผงวงจร POP-XT

Page 16: POP-BOT XT_TH

16XT

1.5 ข อมู ลของอุ ปกรณ ทางกลที่ ใช ในชุ ดหุ นยนต POP-BOT XT

1.5.1 ล อพลาสติ กสํ าหรั บชุ ดเฟ องขั บมอตอร และยาง

เป นล อกลม มี เส นผ านศู นย กลาง 65 มิ ลลิ เมตร สามารถสวมเข ากั บแกนของชุ ดเฟ องขั บมอเตอร ได ทั นที โดยไม ต องดั ดแปลงเพิ ่มเติ ม ข ันย ึดด วยสกร ูเกล ียวปล อย 2 ม ิลลิ เมตร ส วนยางขอบล อที ่ใช ร วมด วยผลิ ตจากยางพาราผิ วมี ดอกยางเพื่ อช วยเพิ่ มสมรรถนะในการเกาะพื้ นผิ ว

1.5.2 แผ นกริ ด

เป นแผ นพลาสติ กที่ ผลิ ตจากวั สดุ ABS ขนาด 80x60 มิ ลลิ เมตร และ 80x80 มิ ลลิ เมตร อย างละ 1 แผ น ในแต ละมี รู ขนาด 3 มิ ลลิ เมตรที่ มี ระยะห างกั น 5 มิ ลลิ เมตร

1.5.3 แผ นฐานกลม

เป นแผ นพลาสติ กที ่ผล ิตจากวั สด ุ ABS ขนาดเส นผ านศู นย กลาง มิ ลล ิเมตร เป นแผ นฐานสํ าหร ับยึ ดอ ุปกรณ ต างๆ มี รู ปร างเป นกลม ประกอบด วยล อกลมกึ่ งอิ สระทั้ งด านหน าและหลั ง ช วยเสริ มความคล องตั วให กั บหุ นยนต ได เป นอย างดี ที่ แผ นฐานมี รู ขนาด 3 มิ ลลิ เมตรสํ าหรั บติ ดต้ั งอุ ปกรณ หรื อโครงสร างกลไกเพิ่ มเติ ม

Page 17: POP-BOT XT_TH

XT 17

1.5.4 ชิ้ นต อพลาสติ ก

เป นชิ้ นส วนพลาสติ กแข็ งเหนี ยว มี 3 แบบคื อ ชิ้ นต อแนวตรง, ชิ้ นต อมุ มฉาก และชิ้ นต อมุ มป าน สามารถเสี ยบต อกั นได ใช ต อกั นเป นโครงสร างหรื อตกแต ง บรรจุ 3 แบบ รวม 30 ชิ้ นต อชุ ด (60 ชิ้ นต อชุ ด สํ าหรั บ POP-BOT XT Standard kit)

1.5.5 แท งต อพลาสติ ก

เป นชิ้ นส วนพลาสติ กแข ็งเหน ียวในแต ละชิ ้นจะม ีรู ขนาด 3 ม ิลลิ เมตรสํ าหร ับร อยสกรู เพื ่อติ ดตั้ งหร ือต อก ับชิ้ นส วนโครงสร างอื่ นๆ ที่ ปลายของแท งต อสามารถเสี ยบเข ากั บชิ้ นต อพลาสติ กได ในชุ ดมี 3 ขนาด คื อ 3, 5 และ12 รู แต ละขนาดมี 4 ชิ้ น

1.5.6 กล องรองกะบะถ าน

เป นถาดสํ าหรั บรองรั บกะบะถ านของแผงวงจร RBX-168 เพื่ อยึ ดกั บแผ นฐานแบบต างๆ ได สะดวกขึ้ นทํ าจากพลาสติ กเหนี ยว ตั ดเจาะได มี รู สํ าหรั บติ ดต้ั งเข ากั บแผ นฐานหรื อโครงสร างหลั กอื่ นๆ ได

Page 18: POP-BOT XT_TH

18XT

1.5.7 ฉากโลหะ

เป นชิ้ นส วนโลหะกว าง 7.5 มิ ลลิ เมตรที่ ดั ดเป นมุ มฉาก ในแต ชิ้ นจะมี รู ขนาด 3 มิ ลลิ เมตรสํ าหรั บร อยสกรู เพื่ อติ ดต้ั งหรื อต อกั บชิ้ นส วนโครงสร างอื่ นๆ ในชุ ดมี 3 ขนาด คื อ 1x2 รู , 2x2 รู และ 2x5 รู แต ละขนาดมี 4 ชิ้ น

1.5.8 สกรู และนอต

เป นอุ ปกรณ สํ าหรั บยึ ดชิ้ นส วนต างๆ เข าด วยกั น ประกอบด วยสกรู เกลี ยวปล อย 2 มิ ลลิ เมตร (2 ตั ว), 3x8มิ ลลิ เมตร (4 ตั ว), 3x10 มิ ลลิ เมตร (30 ต ัว), 3x15 มิ ลลิ เมตร (4 ต ัว), 3x40 มิ ลลิ เมตร (4 ต ัว), สกรู หั วตั ด 3x8 มิ ลลิ เมตร(10 ตั ว) และนอต 3 มิ ลลิ เมตร (30 ตั ว)

1.5.9 เสารองโลหะ

เป นอ ุปกรณ ช วยย ึดชิ ้นส วนต างๆ และรองร ับแผงวงจร, แผ นกร ิดและแผ นฐาน ทํ าจากโลหะช ุบน ิเก ิลก ันสน ิมม ีล ักษณะเป นแท งทรงกระบอกยาว 32 ม ิลล ิเมตร ภายในม ีร ูเกล ียวตลอดต ัวสํ าหร ับข ันสกร ู 3 ม ิลล ิเมตร ในช ุดม ี 4 ต ัว

1.6.10 เสารองพลาสติ ก

เป นอ ุปกรณ ช วยย ึดชิ ้นส วนต างๆ และประคองรองร ับแผงวงจร, แผ นกร ิดและแผ นฐาน ท ําจากพลาสต ิก ABSเหน ียว สามารถตั ดได ม ีล ักษณะเป นแท งทรงกระบอก ภายในม ีร ูตลอดต ัวส ําหร ับร อยสกร ู 3 ม ิลล ิเมตร ในช ุดประกอบด วย เสารองขนาด 3 ม ิลล ิเมตร (4 ต ัว), 10 ม ิลล ิเมตร (4 ต ัว), 15 ม ิลล ิเมตร (4 ต ัว) และ 25 ม ิลล ิเมตร (4 ต ัว)

Page 19: POP-BOT XT_TH

XT 19

XT

หุ นยนต POP-BOT XT เป นหุ นยนต อ ัตโนมั ติ ขนาดเล็ กที่ ควบคุ มด วยไมโครคอนโทรลเลอร AVR เบอร ATmega32U4 สร างขึ ้นจากอ ุปกรณ และชิ ้นส วนจ ํานวนไม มาก แต รองร ับความต องการในการเร ียนรู ได อย างครบถ วนรอบด าน ไม ว าจะเป นการควบค ุมมอเตอร ไฟตรงเพื ่อข ับเคลื ่อนหุ นยนต ในล ักษณะต างๆ ทางเคลื ่อนที ่ตรง ถอยหล ัง หม ุนต ัวเลี ้ยวซ ายและขวา การอ านค าจากต ัวตรวจจ ับชน ิดต างๆ ทั ้งแบบด ิจ ิตอลและอะนาลอกเพื ่อน ํามาใช ประกอบการต ัดส ินใจในการท ํางานภายใต ภาวะเงื ่อนไขต างๆ การต ิดต อก ับอ ุปกรณ แสดงผลอย างโมดู ลกราฟ ก LCD

ในบทนี ้น ําเสนอการประกอบต ัวหุ นยนต POP-BOT XT แบบมาตรฐาน และจะใช โครงสร างนี ้เป นหล ักในการเข ียนโปรแกรมเพื ่อควบค ุมการท ํางาน อย างไรก ็ตาม ผู สร างสามารถด ัดแปลงให แตกต างออกไปได หากแต เมื ่อน ํามาเข ียนโปรแกรมจะต องค ําน ึงถ ึงผลของการด ัดแปลงทางโครงสร างที ่ม ีต อการท ํางานของต ัวตรวจจ ับและโปรแกรมด วย

POP-BOT XTArduino Leonardo compatible robot

ข ับเคลื ่อนด วยมอเตอร ไฟตรงพร อมช ุดเฟ องข ับและล อกลม

ควบค ุมด วยไมโครคอนโทรลเลอร ATmega32U4

สามารถต ิดตั ้งแผงวงจรตรวจจ ับแสงสะท อนอ ินฟราเรดเพื ่อตรวจจ ับเส น, แผงวงจรสว ิตช ตรวจจ ับการชน,โมด ูลว ัดระยะทางแบบอ ินฟราเรดเพื ่อวั ดระยะทางและหลบหลี กสิ่ งกี ดขวางแบบไม ส ัมผั ส,แผงวงจรเช่ื อมต อจอยสติ๊ กของเครื ่องเล นเกมส เพื ่อควบคุ มแบบใช สาย, แผงวงจรรั บแสงอิ นฟราเรดเพื ่อควบคุ มจากระยะไกล, โมดู ลสื ่อสารข อมู ลผ านระบบบล ูท ูธเพื ่อควบคุ มแบบไร สาย

มี โมดู ลกราฟ ก LCD สี สํ าหรั บแสดงผลการทํ างาน

ขั บ RC เซอร โวมอเตอร ได 3 ช อง จึ งสามารถต ิดตั ้งกลไกเคลื ่อนไหวเพิ ่มเติ มได

ใช ไฟเลี ้ยงจากแบตเตอรี่ AA แบบอ ัลคาไลน หร ือแบบประจุ ได จํ านวน 4 ก อน

ดาวน โหลดโปรแกรมผ านทางพอร ต USB ของคอมพ ิวเตอร

Page 20: POP-BOT XT_TH

20XT

บอร ด POP-XT x1แผ นฐานพลาสติ กกลม x 1 ถาดรองกะบะถ าน x 1

ล อพลาสติ กพร อมยาง x 2 ชุ ดเฟ องขั บมอเตอร x 2 เสารองโลหะ 33 มม. x 4

แผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 x 2

ชุ ดชิ้ นต อพลาสติ กฉากโลหะ 2x2 x 2

สกรู เกลี ยวปล อย 2 มม. x 2

ชุ ดเสารองพลาสติ ก ชุ ดสกรู และนอต

แผงวงจรสวิ ตช x 2

ชุ ดแท งต อ 3 รู , 5 รู และ 12 รู

Page 21: POP-BOT XT_TH

XT 21

(1) นํ าชุ ดเฟ องขั บมอเตอร ยึ ดเข ากั บถาดรองกะบะถ าน โดยใช สกรู หั วตั ดขนาด 3 x 8 มม. ขั นยึ ดในตํ าแหน งดั งรู ป

(2) นํ าเสารองโลหะขนาด 32 มม. ยึ ดเข ากั บถาดรองกะบะถ าน แล วใช สกรู ห ัวตั ดขนาด 3 x 8 มม. ข ันย ึด ในต ําแหน งด ังร ูป

(3) นํ าล อพลาสติ กพร อมยางเสี ยบเข ากั บแกนมอเตอร สี ชมพู แล วใช สกรู เกลี ยวปล อย 2 มม. ขั นยึ ด

สกรู หั วตั ด 3x8

เสารองโลหะ 32 มม.

เสารองโลหะ 32 มม.

สกรู เกลี ยวปล อย 2 มม.

Page 22: POP-BOT XT_TH

22XT

(4) นํ าชุ ดมอเตอร ยึ ดเข าก ับฐานพลาสต ิกของหุ นยนต แล วใช สกร ูขนาด 3 x 6 มม.ข ันยึ ด ในตํ าแหน งดั งร ูป จะสั งเกตได ว าการวางมอเตอร ทั้ งสองด านไม สมมาตรกั นแต ล อพลาสติ กจะอยู ตรงกลางพอดี

(5) นํ าแผงวงจรตรวจจ ับแสงสะท อนอิ นฟราเรด ZX-03 ร อยด วยสกร ู 3 x 15 มม. ย ึดเข ากั บแท งต อ 5 ร ู ท ําเหม ือนกั น 2ช ุด สํ าหร ับด านซ ายและขวาของหุ นยนต

(6) ยึ ดแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรดจากข้ั นตอนที่ (5) เข าที่ ด านหน าของหุ นยนต ทั้ งทางซ ายและขวาโดยใช สกรู ขนาด 3x10 มม. ข ันย ึด

แท งต อ 5 รู

ZX-03

ZX-03

Page 23: POP-BOT XT_TH

XT 23

(7) นํ าแท งต อ 5 ร ูอ ีกสองอ ันมาย ึดเข าที ่ด านหน าของฐานหุ นยนต ด ังร ูป โดยใช สกรู 3x10 มม.ขั นยึ ด ต ิดตั ้งทั ้งสองข างของหุ นยนต ด ังร ูป

(8) น ําแผงวงจรสว ิตช ย ึดเข าก ับย ึดเข าก ับชิ ้นต อม ุมฉาก โดยใช สกรู 3x10 มม.และนอต 3 มม.ขั นยึ ด จากนั ้นนํ าชิ ้นต อม ุมป าน เสี ยบเข ากั บปลายอ ีกด านหนึ ่งของชิ ้นต อม ุมฉาก ทํ าเหม ือนก ัน 2 ช ุด

ชิ ้นต อมุ มป าน

สกรู 3x10 มม.

ชิ ้นต อม ุมฉาก

นอต 3 มม.

Page 24: POP-BOT XT_TH

24XT

(9) น ําชุ ดแผงวงจรสว ิตช ติ ดต้ั งเข ากั บฐานของหุ นยนต โดยเส ียบเข าไปที ่แท งต อดั งร ูป

(10) น ําแผงวงจร POP-XT วางลงบนกล องรองกะบะถ าน โดยห ันด านจ ุดต อต ัวตรวจจ ับไว ด านหน าของหุ นยนต ด ังร ูป

ด านจุ ดต อตั วตรวจจั บ

Page 25: POP-BOT XT_TH

XT 25

(11) นํ าสายมอเตอร ต อเข าก ับจ ุดต อมอเตอร โดยให ตรวจสอบขั ้วของมอเตอร จากการหม ุนล อ เมื ่อต อสายแล ว หม ุนล อไปด านหน า LED แสดงสถานะของมอเตอร ควรต ิดเป นส ีเข ียว หม ุนล อกล ับไปทางด านหล ังในท ิศตรงข าม LED ควรต ิดเป นสี แดง ถ าไม ใช ให สล ับขั ้วต อสายมอเตอร จนกระทั ่ง LED แสดงส ีที ่ถ ูกต องทั ้งสองล อ

(12) จากนั ้นต อสายของแผงวงจรตรวจจ ับแสงสะท อน ZX-03 ด านซ ายเข าที่ จ ุดต อ A1/19 และต อ ZX-03 ทางด านขวาเข าที ่จ ุดต อ A0/18 ต อสายจากแผงวงจรสว ิตช ด านซ ายเข าก ับจ ุดต อ A5/23 และต อสายจากแผงวงจรสว ิตช ด านขวาเข าก ับจ ุดต อ A4/22

สายต อของมอเตอร B ด านขวา

สายต อของมอเตอร A ด านซ าย

มอเตอร A ต อกั บล อด านซ าย

ZX-03 ขวาต อที ่ A0/18

ZX-03 ซ ายต อที ่ A1/19

ZX-01 ซ ายต อที ่ A5/23

ZX-01 ขวาต อที่ A4/22

มอเตอร B ต อกั บล อด านขวา

Page 26: POP-BOT XT_TH

26XT

(13) จะได หุ นยนต POP-BOT XT ที ่พร อมสํ าหร ับการเข ียนโปรแกรมต อไป

Page 27: POP-BOT XT_TH

XT 27

ในบทนี้ จะอธิ บายส วนประกอบและรายละเอี ยดของโปรแกรม Arduino1.0 ที่ ใช ในการเขี ยนโปรแกรมคอมไพล โปรแกรม และอั ปโหลดโปรแกรมไปยั งหุ นยนต POP-BOT XT โดยซอฟต แวร Arduino1.0 สามารถรั นบนระบบปฏิ บั ติ การได ทุ กแบบ ไม ว าจะเป น วิ นโดวส ที่ รองรั บตั้ งแต วิ นโดวส XP ขึ้ นไป, MAC OS และ Linux

3.1 การติ ดตั้ งซอฟต แวร Arduinoในชุ ดซอฟต แวร ที่ มาพร อมกั บชุ ดหุ นยนต POP-BOT XT ประกอบด วย ซอฟต แวร Arduino 1.0 ที่ บรรจุ

ไดรเวอร และข อม ูลส ําหร ับต ิดต อกั บแผงวงจร POP-XT ของหุ นยนต POP-BOT XT ซึ ่งเข าก ันได ก ับฮาร ดแวร ArduinoLeomardo, ไฟล ไลบรารี ของหุ นยนต POP-BOT XT ที่ ชื่ อ popxt.h และโปรแกรมตั วอย าง มี ขั้ นตอนการติ ดต้ั งดั งนี้ (ภาพประกอบที่ เป นหน าต างต างๆ ของโปรแกรมอ างอิ งกั บระบบปฏิ บั ติ การวิ นโดวส 7)

(3.1.1) นํ าแผ นซ ีดี รอมที่ มากั บชุ ดหุ นยนต POP-BOT XT ใส เข าไปในซ ีดี รอมไดรฟของคอมพ ิวเตอร ค นหาและดั บเบิ้ ลคลิ กที่ ไฟล Arduino1.0 POP-BOT XT Setup.exe จะปรากฎหน าต างต อนรั บสู การติ ดต้ั งให คลิ ก Nextหน าต างติ ดต้ั งจะสอบถามตํ าแหน งการติ ดต้ั งโปรแกรมให กด Next ข ามขั้ นตอนน้ี ไป

Page 28: POP-BOT XT_TH

28XT

(3.1.2) หน าต างติ ดต้ั งจะสอบถามชื่ อที่ จะใช สร างที่ Start Menu ให คลิ ก Next ต อไป หน าต างติ ดต้ั งจะแสดงข อสรุ ปมาให ให กด Install เพื่ อเริ่ มขั้ นตอนการติ ดต้ั ง โปรแกรมติ ดต้ั งจะใช เวลาสั กครู ก็ จะติ ดต้ั งเรี ยบร อย

Page 29: POP-BOT XT_TH

XT 29

(3.1.3) หลั งจากนั้ นจะเข าสู หน าต างของการต ิดต้ั งไดรเวอร USB ขั้ นต นของแผงวงจร POP-XT อ ันเป นแผงวงจรควบคุ มการทํ างานของหุ นยนต POP-BOT XT ดั งรู ป คลิ กปุ ม Next

(3.1.4) ระบบจะแจ งว า ว ินโดวส ไม เคยทดสอบไดรเวอร ตั วน้ี และสอบถามว าต องการให ยกเลิ กการติ ดต้ั งหรื อดํ าเนิ นการติ ดต้ั งต อไป คลิ กเลื อกที่ Install this driver software anyway อั นเป นการเลื อกให ทํ าการติ ดต้ั งไดรเวอร ต อไป

Page 30: POP-BOT XT_TH

30XT

(3.1.5) จากน้ั นการติ ดต้ั งไดรเวอร ขั้ นต นจะเกิ ดข้ึ น รอจนกระทั่ งติ ดต้ั งเสร็ จ จะปรากฏหน าต างแจ งการติ ดตั้ งไดรเวอร เสร็ จสมบู รณ และแสดงชื่ อของไดรเวอร ที่ ติ ดต้ั งลงไป ในที่ นี้ คื อ Arduino LLC คลิ กปุ ม Finish ตอบรั บการติ ดต้ั งเสร็ จสิ้ น

(3.1.6) โปรแกรมจะสร างชื่ อ Arduino1.0 ไว ที่ Start Menu ทํ าการทดสอบว า โปรแกรมติ ดต้ั งเรี ยบร อยหรื อไม ด วยการให เข าไปที่ Start Menu และเลื อกเป ดโปรแกรม Arduino ขึ้ นมา

หน าต างของโปรแกรม Arduino 1.0 จะเป ดข้ึ นมา เป นการยื นยั นว า การติ ดต้ั งโปรแกรมเป นไปอย างถู กต อง

Page 31: POP-BOT XT_TH

XT 31

3.2 ติ ดตั้ งไดรเวอร ให กั บหุ นยนต POP-BOT XTสํ าหรั บวิ นโดวส 7ในการใช งานหุ นยนต POP-BOT XT จะต องมี การติ ดตั้ งไดรเวอร เพื่ อให คอมพิ วเตอร รู จั กอุ ปกรณ นี้ เสี ย

ก อน โดยมี ขั้ นตอนดั งนี้ (ภาพประกอบของการติ ดต้ั งไดรเวอร อ างถึ งระบบปฏิ บั ติ การวิ นโดวส 7 รุ น 64 บิ ต)

(3.2.1) เตรี ยมความพร อมให กั บหุ นยนต โดยนํ าแผงวงจร POP-XT ออกมาจากหุ นยนต เป ดฝาของกะบะถ านเพื่ อบรรจุ แบตเตอรี่ AA จํ านวน 4 ก อน ขอแนะนํ าให ใช แบตเตอรี่ ชนิ ดอั ลคาไลน หรื อแบบประจุ ได ที่ มี ความจุ 1800mAH เป นอย างน อย จากนั้ นนํ าแผงวงจร POP-XT ใส ลงในหุ นยนต POP-BOT XT ในตํ าแหน งเดิ ม

(3.2.2) เป ดสว ิตช จ ายไฟให แก หุ นยนต POP-BOT XT รอส ักครู หนึ ่ง (ประมาณ 10 วิ นาท ี) จากนั ้นจ ึงต อสายUSB-miniB เข าที ่หุ นยนต ในตํ าแหน งด ังร ูป ส วนปลายอ ีกด านของสาย USB ต อเข าก ับพอร ต USB ของคอมพ ิวเตอร

ขั้ นตอนน้ี สํ าคั ญมาก จะต องเป ดสวิ ตช จ ายไฟก อน แล วรอสั กครู หน่ึ ง จึ งค อยต อสายเข ากั บพอร ต USB ของคอมพิ วเตอร มิ เช นนั้ นการติ ดตั้ งไดรเวอร อาจมี ข อผิ ดพลาดได

Page 32: POP-BOT XT_TH

32XT

(3.2.3) เมื่ อต อแผงวงจร POP-XT เข ากั บพอร ต USB ระบบจะตรวจสอบฮาร ดแวร ครู หนึ่ ง จากน้ั นทํ าการตรวจสอบการเชื่ อมต อโดยไปที่ My Computer คลิ กเมาส ปุ มขวาเลื อกหั วข อ Properties

(3.2.4) จะเข าสู หน าต าง Control panel จากนั้ นเลื อกรายการ Device Manager

(3.2.5) ดู ที่ หั วข อ Ports จะพบรายการ Unicon@POP-XT (COMxx) โดยหมายเลขของ COM อาจเปลี่ ยนไปได ในคอมพิ วเตอร แต ละเครื่ อง ให จํ าหมายเลขพอร ต COM นี้ ไว เพื่ อใช เลื อกพอร ตในการติ ดต อกั บแผงวงจรPOP-XT ในซอฟต แวร Arduino1.0

Page 33: POP-BOT XT_TH

XT 33

(3.2.6) ในกรณี ที่ ผู ใช งานต อสาย USB-miniB จากคอมพิ วเตอร เข ากั บแผงวงจร POP-XT ก อนเป ดสวิ ตช หรื อเป ดสวิ ตช แล ว แต ไม รอให การเตรี ยมความพร อมของแผงวงจรเสร็ จสิ้ น (ประมาณ 7 ถึ ง 10 วิ นาที ) มี โอกาสที่ ระบบจะตรวจพบว า มี อุ ปกรณ ที่ ไม มี ไดรเวอร ติ ดต้ั งอยู หรื อติ ดต้ั งไดรเวอร ไม สมบู รณ ดั งรู ป

ไม ต องตกใจ ให คลิ กตอบไปที ่ Click here for details ระบบจะแจ งให ทราบถึ งอ ุปกรณ ที่ ไม มี ไดรเวอร รองรั บหรื อไดรเวอร ไม สมบู รณ ซึ่ งก็ คื อ อุ ปกรณ ที่ ชื่ อว า POP-XT Bootloader ซึ่ งไม สํ าคั ญ เพราะไดรเวอร ที่ ถู กต องและใช งานจริ งคื อ Unicon Board & POP-XT (COMxx) หากที่ รายการน้ี มี ข อความแจ งสถานะต อท ายว า Readyto us ถื อว า ใช ได ให กลั บไปตรวจสอบตํ าแหน งพอร ต COM อี กครั้ งที่ Device Manager ตามขั้ นตอนที่ (3.2.3) ถึ ง(3.2.5)

Page 34: POP-BOT XT_TH

34XT

3.3 ติ ดตั้ งไดรเวอร ให กั บหุ นยนต POP-BOT XTสํ าหรั บวิ นโดวส 7 ในกรณี ที่ ไม สามารถติ ดตั้ งตามขั้ นตอนในหั วข อ 3.2 ได

สํ าหรั บผู ใช งานที่ ใช ระบบปฏิ บั ติ การวิ นโดวส 7 รุ น 64 บิ ต มี โอกาสที่ การติ ดต้ั งไดรเวอร จากข้ั นตอนในหั วข อ 3.2 ไม สามารถดํ าเนิ นการได อย างสมบู รณ ขอให ดํ าเนิ นการติ ดต้ั งไดรเวอร ในอี กวิ ธี หนึ่ ง ดั งนี้

(3.3.1) เป ดสวิ ตช จ ายไฟให แก หุ นยนต POP-BOT XT รอสั กครู หนึ่ ง (ประมาณ 10 วิ นาที ) จากน้ั นจึ งต อสาย USB-miniB เข าที่ หุ นยนต กั บพอร ต USB ของคอมพิ วเตอร

ขั ้นตอนน้ี สํ าค ัญมาก จะต องเป ดสว ิตช จ ายไฟก อน แล วรอส ักครู หนึ ่ง เพื ่อให แผงวงจรเตร ียมความพร อมในการท ํางานเสร ็จสิ ้นเส ียก อน นี ่ค ือค ุณสมบ ัต ิปกต ิของอ ุปกรณ USB ที ่จะต องเตรี ยมความพร อมของฮาร ดแวร ให เรี ยบร อยก อนติ ดต อกั บคอมพิ วเตอร ใช เวลาประมาณ 7 ถึ ง 10 วิ นาที จากนั้ นจึ งค อยต อสายเข ากั บพอร ต USB ของคอมพิ วเตอร มิ เช นนั้ นการต ิดตั้ งไดรเวอร อาจม ีข อผิ ดพลาดได

(3.3.2)ที ่มุ มขวาล างของคอมพิ วเตอร จะแจ งว า ตรวจพบฮาร ดแวร ตั วใหม และพยายามติ ดตั ้งไดรเวอร ลงในเครื่ องคอมพิ วเตอร โดยในขั้ นต นจะแจ งว าการติ ดต้ั งไดรเวอร ไม สมบู รณ ดั งรู ป

(3.3.4) เพื่ อติ ดต้ั งไดรเวอร ให สมบู รณ ทํ าการคลิ กเมาส ปุ มขวาที่ หน าต าง My Computer > Propertiesเลื อกหั วข อ Device Manager ดั งแสดงตํ าแหน งตามรู ป

Page 35: POP-BOT XT_TH

XT 35

(3.3.5) ที่ หน าต าง Device Manager จะพบอุ ปกรณ Arduino Leonardo ที่ มี เครื่ องหมาย ! ปรากฎอยู ซึ่ งหมายถึ ง การติ ดไดรเวอร ของอุ ปกรณ ตั วน้ี ยั งไม สมบู รณ ให คลิ กเมาส ปุ มขวาที่ อุ ปกรณ ตั วน้ี แล วเลื อก UpdateDriver Software..

(3.3.6) จะปรากฎหน าต างตั วเลื อกค นหาไดรเวอร แบบอั ตโนมั ติ หร ือหาด วยตนเองภายในคอมพิ วเตอร ให เลื อก Browse my computer for driver software อั นเป นการเลื อกตค นหาไดรเวอร ด วยตนเอง

Page 36: POP-BOT XT_TH

36XT

(3.3.7) ระบุ ตํ าแหน งของไดรเวอร ไปที่ C:\Arduino\Drivers จากนั้ นกด Next

(3.3.8) โปรแกรมจะแจ งเต ือนเรื ่องความปลอดภั ยของไดรเวอร ที ่เราต ิดต้ั งลงไป ให เล ือกห ัวข อ Install thisdriver software anyway เพื่ อยื นยั นการติ ดต้ั ง

Page 37: POP-BOT XT_TH

XT 37

(3.3.9) ระบบจะใช เวลาสั กครู เพื่ อต ิดต้ั งไดรเวอร จากนั้ นที ่หน าต าง Device Manager จะแสดงชื ่ออุ ปกรณ Unicon Board & POP-XT (COMxx) โดยหมายเลขของ COM นั้ นข้ึ นอยู กั บการลงทะเบี ยนของคอมพิ วเตอร แต ละเครื่ อง ซึ่ งอาจแตกต างกั น โดยปกติ จะมี หมายเลขตํ าแหน งตั้ งแต COM2 ขึ้ นไป

(3.3.10) ขั้ นตอนสุ ดท ายจะต องจดจํ ากํ าหนดตํ าแหน งพอร ต COM ที่ เกิ ดข้ึ นจากการติ ดต้ั งไดรเวอร ในข อ(3.2.8) เพื่ อนํ าไปใช ในซอฟต แวร Arduino1.0 เพื่ อเลื อกช องทางการติ ดต อกั บฮาร ดแวร ได ถู กต อง (จากตั วอย างตํ าแหน งพอร ตที่ ใช งานคื อ COM2)

การติ ดต้ั งไดรเวอร อาจมี ขั ้นตอนพอสมควร ดั งนั้ นจึ งขอให ผู ใช งานปฏิ บ ัติ ตาม เพื่ อลดความผิ ดพลาดที่ อาจเกิ ดข้ึ นได

เมื่ อติ ดตั้ งไดรเวอร ได เรี ยบร อย หุ นยนต POP-BOT X T ก็ พร อมสํ าหรั บการอั ปโหลดโปรแกรมจากคอมพิ วเตอร เพื่ อทํ าการทดสอบและเริ่ มต นการเรี ยนรู เพื่ อพั ฒนาโปรแกรมควบคุ มหุ นยนต อั ตโนมั ติ ขนาดเล็ กในลํ าดั บต อไป

Page 38: POP-BOT XT_TH

38XT

3.4 ติ ดตั้ งไดรเวอร ให กั บหุ นยนต POP-BOT XTสํ าหรั บวิ นโดวส XPสํ าหรั บวิ นโดวส XP จะมี ขั้ นตอนและหน าต างของการติ ดต้ั งไดรเวอร ที่ แตกต างไปจากวิ นโดวส 7 ดั งนี้

(3.4.1) บรรจุ แบตเตอรี่ AA จํ านวน 4 ก อน ลงในแผงวงจร POP-XT จากน้ั นนํ าแผงวงจร POP-XT ใส ลงในหุ นยนต POP-BOT XT ในตํ าแหน งเดิ ม

(3.4.2) เป ดสว ิตช จ ายไฟให แก หุ นยนต POP-BOT XT รอส ักครู หนึ ่ง (ประมาณ 10 ว ินาท ี) จากนั ้นจ ึงต อสายUSB-miniB เข าที ่จ ุดต อพอร ต USB ของหุ นยนต ส วนปลายอ ีกด านของสาย USB ต อเข าก ับพอร ต USB ของคอมพ ิวเตอร

ขั้ นตอนน้ี สํ าคั ญมาก จะต องเป ดสวิ ตช จ ายไฟก อน แล วรอสั กครู หน่ึ ง จึ งค อยต อสายเข ากั บพอร ต USB ของคอมพิ วเตอร มิ เช นนั้ นการติ ดตั้ งไดรเวอร อาจมี ข อผิ ดพลาดได

220 F

100 F

TB6612

ATMega32U4

100

(3.4.3)หล ังจากต อสาย ที ่ม ุมขวาล างของคอมพ ิวเตอร จะแจ งว า ตรวจพบฮาร ดแวร ต ัวใหม เป นอ ุปกรณ USBคอมโพสิ ต และสอบถามถึ งตํ าแหน งของไฟล ไดรเวอร ที่ ต องการติ ดต้ั ง ให คลิ กเลื อกที่ ช อง Install from a list orspecific location (Advanced) จากนั้ นคลิ กที่ ปุ ม Next เพื่ อผ านขั้ นตอนน้ี ไป

Page 39: POP-BOT XT_TH

XT 39

(3.4.4) เลื อกตํ าแหน งของไดรเวอร ไปที่ C:\Arduino\Drivers ตามรู ป แล วคลิ กปุ ม Next

(3.4.5) จากน้ั นกระบวนการติ ดต้ั งไดรเวอร จะเริ่ มขึ้ น รอจนกระทั่ งเสร็ จ คลิ กปุ ม Finish เพื่ อจบการติ ดต้ั ง

Page 40: POP-BOT XT_TH

40XT

(3.4.10) ตรวจสอบตํ าแหน งของพรอ ตอนุ กรมของบอร ด POP-XT ที่ เกิ ดขึ้ นได ที่ Control Panel > System> Hardware > Device Manager แล วดู ที ่รายการ Ports จะพบชื ่อ Unicon Board & POP-XT (COM xx) จากตั วอย างคื อ COM104

เป นการยื นยั นว า การติ ดตั้ งไดรเวอร ของแผงวงจร POP-XT เสร็ จสมบู รณ เมื่ อติ ดต้ั งไดรเวอร ได เรี ยบร อยหุ นยนต POP-BOT XT ก็ พร อมสํ าหรั บการอั ปโหลดโปรแกรมจากคอมพิ วเตอร เพื่ อทดสอบและเริ่ มต นการเรี ยนรู เพื่ อพั ฒนาโปรแกรมควบคุ มหุ นยนต อั ตโนมั ติ ขนาดเล็ กในลํ าดั บต อไป

Page 41: POP-BOT XT_TH

XT 41

3.5 การติ ดตั้ งซอฟต แวร Arduino1.0 บนคอมพิ วเตอร Macintosh ที่ ใช ระบบปฏิ บั ติ การ OSX 10.6 ขึ้ นไป

การต ิดต้ั งซอฟต แวร Arduino1.0 บนคอมพ ิวเตอร Macintosh ม ีขั ้นตอนที ่ไม ซ ับซ อน เนื ่องจากไฟล ทั ้งหมดได รั บการบรรจุ รวมอยู ในไฟล .ZIP เพี ยงไฟล เดี ยว มี ขั้ นตอนดั งนี้

(3.5.1) คั ดลอกไฟล Arduino1.0.zip จากแผ นซี ด ีรอม หรื อจากการดาวน โหลดมาจาก www.inex.co.th หรื อwww.uniconboard.com ไปไว ที่ หน า Desktop

(3.5.2) ทํ าการแตกไฟล โดยเลื อกคํ าสั่ ง Open With > Archive Utility หรื อใช ซอฟต แวร ที่ ทํ าหน าที่ ในการแตกไฟล .zip

(3.5.3) จากการแตกไฟล จะได เป นไฟล Arduino มี ไอคอนดั งรู ป

(3.5.4) เป ดหน าต าง Finder ลากไอคอน Arduino ไปไว รวมใน Applications

Page 42: POP-BOT XT_TH

42XT

(3.5.5) ดั บเบิ้ ลคลิ กเพื่ อเป ดซอฟต แวร Arduino จากน้ั นไปที่ เมนู Tools เลื อก Board เป นรุ น POP-XT

(3.5.6) เป ดสว ิตช จ ายไฟแก แผงวงจร POP-XT รอส ักครู เพื ่อให แผงวงจรเตร ียมความพร อม ใช เวลาประมาณ10 วิ นาที จากนั้ นจึ งเสี ยบสาย USB จากแผงวงจร POP-XT เข าที่ พอร ต USB ของคอมพิ วเตอร Macintosh

(3.5.7) ไปที่ เมนู Tools เลื อก Serial Port จะพบอุ ปกรณ ที่ ชื่ อ /dev/tty.usbmodemxxxx โดย xxxx ที่ ตามมาข างหลั งอาจจะมี ชื่ อใด ๆ อยู ก็ ได ให เลื อกใช การสื่ อสารอนุ กรมจากอุ ปรณ ตั วน้ี

หากได ตามนี้ แสดงว า การติ ดตั้ งไดรเวอร ของแผงวงจร POP-XT เสร็ จสมบู รณ พร อมสํ าหรั บการนํ าไปใช งานจริ งกั บหุ นยนต POP-BOT XT

Page 43: POP-BOT XT_TH

XT 43

3.6 ส วนประกอบของหน าจอโปรแกรม Arduino1.0เมื่ อเรี ยกให โปรแกรมทํ างาน จะมี หน าตาดั งรู ปที่ 3-1 ตั วโปรแกรมประกอบด วยส วนต างๆ ดั งนี้

เมนู (Menu) ใช เลื อกคํ าสั่ งต างๆ ในการใช งานโปรแกรม

แถบเครื่ องมื อ (Toolbar) เป นการนํ าคํ าสั่ งที่ ใช งานบ อยๆ มาสร างเป นปุ มเพื่ อให เรี ยกใช คํ าสั่ งได รวดเร็ วข้ึ น

แถบเล ือกโปรแกรม (Tabs) เป นแถบที ่ใช เลื อกไฟล โปรแกรมแต ละตั ว (กรณี ที ่เข ียนโปรแกรมขนาดใหญ ประกอบด วยไฟล หลายตั ว)

พื้ นที่ เขี ยนโปรแกรม (Text editor) เป นพื้ นที่ สํ าหรั บเขี ยนโปรแกรมภาษา C/C++

พื้ นที่ แสดงสถานะการทํ างาน (Message area) เป นพื้ นที่ โปรแกรมใช แจ งสถานะการทํ างานของโปรแกรม เช น ผลการคอมไพล โปรแกรม

ร ูปที ่ 3-1 แสดงส วนประกอบของโปรแกรม Arduino1.0

แถบเครื่ องมื อ (Tools bar)

แถบเลื อกโปรแกรม (Tab)

เมนู (Menu)

พื้ นที่ แสดงสถานะการทํ างาน (Message area)

Serial Monitorคลิ กเพื่ อเป ดหน าต างสํ าหรั บรั บและส งข อมู ลอนุ กรมระหว างฮาร ดแวร Arduino กั บคอมพิ วเตอร

พื้ นที่ สํ าหรั บเขี ยนโปรแกรม(Text Editor)

Page 44: POP-BOT XT_TH

44XT

พื้ นที่ แสดงข อมู ล (Text area) ใช แจ งว าโปรแกรมที่ ผ านการคอมไพล แล วมี ขนาดกี่ ไบต

ปุ มสํ าหรั บเป ดหน าต าง Serial Monitor ปุ มนี้ จะอยู ทางมุ มบนด านขวามื อ คลิ กปุ มนี้ เมื่ อต องการเป ดหน าต างสื่ อสารและแสดงข อมู ลอนุ กรม โดยต องมี การต อฮาร ดแวร Arduino และเลื อกพอร ตการเชื่ อมต อให ถู กต องก อน

หน าต าง Serial Monitor มี บทบาทค อนข างมากในการใช แสดงผลการทํ างานของโปรแกรมแทนการใช อุ ปกรณ แสดงผลอื่ นๆ เนื่ องจาก Arduino ได เตรี ยมคํ าสั่ งสํ าหรั บใช แสดงค าของตั วแปรที่ ต องการดู ผลการทํ างานไว แล ว นั่ นคื อ Serial.print ส วนการส งข อมู ลจากคอมพิ วเตอร ไปยั งฮาร ดแวร Arduino หรื อแผงวงจรควบคุ มให พิ มพ ข อความและคลิ กปุ ม Send ในการรั บส งข อมู ลต องกํ าหนดอั ตราเร็ วในการถ ายทอดข อมู ลหรื อบอดเรต(baud rate) ให กั บโปรแกรมในคํ าสั่ ง Serial.begin กรณี ที่ ใช งานกั บคอมพิ วเตอร Mcintosh หรื อคอมพิ วเตอร ที่ ติ ดตั้ งระบบปฏิ บั ติ การ Linux ตั วฮาร ดแวร ของ Arduino จะรี เซ็ ตเมื่ อเริ่ มเป ดใช งาน Serial monitor

3.6.1 เมนู บาร

เป นส วนที่ แสดงรายการ (เมนู ) ของคํ าสั่ งต างๆ ของโปรแกรม ประกอบด วย

3.6.1.1 เมนู File

ใน Arduino จะเรี ยกโปรแกรมที่ พ ัฒนาขึ้ นว า สเก็ ตช (Sketch) และในโปรแกรมของผู ใช งานอาจม ีไฟล โปรแกรมหลายตั ว จ ึงเร ียกรวมว าเป น สเก ็ตช บุ ก (Sketchbook) ในเมน ูนี ้จะเกี ่ยวข องก ับการเป ด-บ ันท ึก-ป ดไฟล ด ังนี ้

New : ใช สร างไฟล สเก็ ตช ตั วใหม เพื่ อเริ่ มเขี ยนโปรแกรมใหม

Open ใช เป ดสเก็ ตช ที่ บั นทึ กไว ก อนหน านี้

Sketchbook : ใช เป ดไฟล สเก็ ตช ล าสุ ดที่ เป ดใช งานเสมอ

Example : ใช ในการเล ือกเป ดไฟล สเก ็ตช ต ัวอย างที ่บรรจ ุและรวบรวมไว ในโฟลเดอร ของโปรแกรมArduino1.0

Page 45: POP-BOT XT_TH

XT 45

Save : ใช ในการบั นทึ กไฟล สเก็ ตช ป จจุ บั น

Save as : ใช บั นทึ กไฟล สเก็ ตช โดยเปลี่ ยนชื่ อไฟล

Upload to I/O board : ใช อั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT ในหุ นยนต POP-BOT XTหรื อฮาร ดแวร ของ Arduino Leonardo

Page setup : ตั้ งค าหน ากระดาษของไฟล สเก็ ตช ป จจุ บั น

Print : สั่ งพิ มพ โค ดของไฟล สเก็ ตช ป จจุ บั นออกทางเครื่ องพิ มพ

Preference : ใช กํ าหนดค าการทํ างานของโปรแกรม

Quit : ใช จบการทํ างานและออกจากโปรแกรม

3.6.1.2 เมนู Edit

ในขณะที ่พ ิมพ โปรแกรม สามารถใช คํ าสั ่งในเมน ูนี ้ในการสั ่งยกเล ิกคํ าสั ่งที ่แล ว ทํ าซํ ้า ฯลฯ ม ีเมน ูต างๆ ด ังนี ้

Undo : ยกเลิ กคํ าสั่ งหรื อการพิ มพ ครั้ งสุ ดท าย

Redo : ทํ าซํ้ าคํ าสั่ งหรื อการพิ มพ ครั้ งสุ ดท าย

Cut : ตั ดข อความที่ เลื อกไว ไปเก็ บในคลิ ปบอร ดของโปรแกรม

Copy : คั ดลอกข อความที่ เลื อกไว มาเก็ บในคลิ ปบอร ด

Paste : นํ าข อความที่ อยู ในคลิ ปบอร ดมาแปะลงในตํ าแหน งที่ เคอร เซอร ชี้ อยู

Select All : เลื อกข อความทั้ งหมด

Comment/Uncomment : ใช เติ มเครื่ องหมาย // เพื่ อสร างหมายเหตุ หรื อคํ าอธิ บายลงในโปรแกรมหรื อยกเลิ กหมายเหตุ ด วยการนํ าเครื อ งหมาย // ออก

Find : ค นหาข อความ

Find Next : ค นหาข อความถั ดไป

3.6.1.3 เมนู Sketch

เป นเมนู ที่ บรรจุ คํ าสั่ งที่ ใช ในการคอมไพล โปรแกรม เพิ่ มไฟล ไลบรารี ฯลฯ โดยมี เมนู ย อยดั งนี้

Verify/Compile : ใช คอมไพล แปลโปรแกรมภาษาซี ให เป นภาษาเครื่ อง

Stop : หยุ ดการคอมไพล โปรแกรม

Add file : เพิ่ มไฟล ให กั บสเก็ ตช บุ กป จจุ บั น เมื่ อใช คํ าสั่ งนี้ โปรแกรม Arduino จะทํ าการคั ดลอกไฟล ที่ เลื อกไว มาเก็ บไว ในโฟลเดอร เดี ยวกั นกั บโปรแกรมที่ กํ าลั งพั ฒนา

Import Library : เป นคํ าสั ่งเร ียกใช ไลบราร ีเพิ ่มเต ิม เมื ่อคล ิกเล ือกคํ าสั ่งนี ้แล ว โปรแกรม Arduino IDEจะแสดงไลบราร ีให เล ือก เมื ่อเล ือกแล ว โปรแกรมจะแทรกบรรท ัดค ําสั ่ง #include ลงในส วนต นของไฟล

Show Sketch folder : สั ่งเป ดโฟลเดอร ที ่เก ็บโปรแกรมของผู ใช

Page 46: POP-BOT XT_TH

46XT

3.6.1.4 เมนู Tools

ใช จ ัดร ูปแบบของโค ดโปรแกรม, เล ือกรุ นของฮาร ดแวร ไมโครคอนโทรลเลอร Arduino, เล ือกพอร ตอน ุกรมเมน ูที่ ใช งานในหุ นยนต POP-BOT XT มี ด ังนี ้

Auto Format : จ ัดร ูปแบบของโค ดโปรแกรมให สวยงาม เช น กั ้นหน าเยื ้องขวา จ ัดต ําแหน งของวงเล ็บป กกาป ดให ตรงก ับป กกาเป ด ถ าเป นคํ าสั ่งที ่อยู ภายในวงเล ็บป กกาเป ดและป ดจะถ ูกกั ้นหน าเยื ้องไปทางขวามากขึ ้น

Archive Sketch : สั่ งบี บอั ดไฟล โปรแกรมทั้ งโฟลเดอร หลั กและโฟลเดอร ย อยของสเก็ ตช บุ กป จจ ุบ ัน ไฟล ที ่สร างใหม จะม ีชื ่อเด ียวก ับสเก ็ตช บุ กป จจุ บ ันต อท ายด วย -510123.zip

Export Folder : สั่ งเป ดโฟลเดอร ที่ เก็ บสเก็ ตช บุ กป จจุ บั น

Board : เล ือกฮาร ดแวร ของบอร ไมโครคอนโทรลเลอร Arduino ส ําหรั บ POP-XT หรื อหุ นยนต POP-BOT XT ให เล ือก POP-XT หรื อ Unicon Board เนื่ องจาก POP-XT เป นหน่ึ งในอนุ กรมของบอร ด Unicon ที่ พั ฒนาขึ้ นโดยบริ ษั ท อิ นโนเวตี ฟ เอ็ กเพอริ เมนต จํ ากั ด หรื อ inex ซึ่ งเข ากั นได กั บฮาร ดแวร Arduini Leomardo

Serial Port : เลื อกหมายเลขพอร ตอนุ กรมของคอมพิ วเตอร ที่ ใช ติ ดต อกั บฮาร ดแวร Arduino รวมทั้ งแผงวงจร POP-XT และ Unicon Board

3.6.1.5 เมนู Help

เมื ่อต องการความช วยเหล ือหร ือต องการข อม ูลเกี ่ยวก ับโปรแกรมให เล ือกเมน ูนี ้ เมื ่อเล ือกเมน ูย อย ต ัวโปรแกรมจะเป ดไฟล เว ็บเพจ (ไฟล นามสก ุล .html) ที ่เกี ่ยวข องก ับห ัวข อนั ้นๆ ซึ ่งอยู ภายในโฟลเดอร ที ่เก ็บ Arduino IDE

3.6.2 แถบเครื่ องมื อ (ทู ลบาร : Tools bar)

สํ าหรั บคํ าสั่ งที่ มี การใช บ อยๆ ตั วโปรแกรม Arduino1.0 จะนํ ามาสร างเป นปุ มบนแถบเครื่ องมื อ เพื่ อให สามารถคลิ กเลื อกได ทั นที ปุ มต างๆ บนแถบเครื่ องมื อมี ดั งนี้

Verfy/Compile ใช ตรวจสอบการเขี ยนคํ าสั ่งในโปรแกรมว า มี ถ ูกต องตามหล ักไวยกรณ หรื อ

ไม และคอมไพล โปรแกรม

Upload to I/O Board ใช อั ปโหลดโปรแกรมที่ เขี ยนขึ้ นไปยั งบอร ดหรื อฮาร ดแวร Arduino

ก อนจะอั ปโหลดไฟล ต องแน ใจว าได บั นทึ กไฟล และคอมไพล ไฟล สเก็ ตช เรี ยบร อยแล ว

New ใช สร างสเก็ ตไฟล (ไฟล โปรแกรม) ตั วใหม

Open ใช แทนเมนู File Sketchbook เพื่ อเป ดสเก็ ตช บุ ก (ไฟล โปรแกรม) ที่ มี ในเครื่ อง

Save ใช บั นทึ กไฟล สเก็ ตชบุ กที่ เขี ยนขึ้ น

Page 47: POP-BOT XT_TH

XT 47

ในการเข ียนโปรแกรมส ําหร ับแผงวงจร POP-XT และหุ นยนต POP-BOT XT จะต องเข ียนโปรแกรมโดยใช ภาษา C/C++ ของ Arduino (Arduino programming language) เวอร ชั น 1.0 ขึ้ นไป ซึ ่งต ัวภาษาของ Arduino เองก ็น ําเอาโอเพ นซอร สโปรเจ ็กต ชื ่อ wiring มาพ ัฒนาต อ ภาษาของ Arduino แบ งได เป น 2 ส วนหล ักค ือ

1. โครงสร างภาษา (structure) ตั วแปรและค าคงที่

2. ฟ งก ชั่ น (function)

ภาษาของ Arduino จะอ างอ ิงตามภาษา C/C++ จึ งอาจกล าวได ว าการเขี ยนโปรแกรมสํ าหรั บ Arduino (ซึ ่งก็ รวมถึ ง POP-MCU) ก็ คื อการเขี ยนโปรแกรมภาษาซี โดยเรี ยกใช ฟ งก ชั่ นและไลบรารี ที่ ทาง Arduino ได เตรี ยมไว ให แล ว ซึ่ งสะดวก และทํ าให ผู ที่ ไม ม ีความรู ด านไมโครคอนโทรลเลอร อย างลึ กซึ้ ง สามารถเขี ยนโปรแกรมสั่ งงานได

ในบทนี้ จะอธิ บายถึ งโครงสร างโปรแกรมของ Arduino เป นหลั ก ส วนฟ งก ชั่ นโปรแกรมภาษา C ของArduino ฉบั บสมบู รณ สามารถอ านเพิ ่มเติ มได จากหนั งสื อ เรี ยนรู ระบบควบคุ มอย างง ายด วยโปรแกรมภาษา C กั บArduino ซึ่ งจั ดมาในชุ ดหุ นยนต POP-BOT XT แล ว

4.1 โครงสร างโปรแกรมของ Arduinoโปรแกรมของ Arduino แบ งได เป นสองส วนคื อ

void setup()

และ

void loop()

โดยฟ งก ชั ่น setup() เมื ่อโปรแกรมทํ างานจะท ําคํ าสั ่งของฟ งก ชั ่นนี ้เพ ียงครั ้งเด ียว ใช ในการก ําหนดค าเริ ่มต นของการท ํางาน ส วนฟ งก ชั ่น loop() เป นส วนท ํางาน โปรแกรมจะท ําคํ าสั ่งในฟ งก ชั ่นนี ้ต อเนื ่องก ันตลอดเวลา โดยปกติ ใช กํ าหนดโหมดการทํ างานของขาต างๆ กํ าหนดการสื่ อสารแบบอนุ กรม ฯลฯ ส วนของ loop() เป นโค ดโปรแกรมที ่ทํ างาน เช น อ านค าอ ินพ ุต ประมวลผล สั ่งงานเอาต พ ุต ฯลฯ โดยส วนก ําหนดค าเริ ่มต นเช นตั วแปร จะต องเข ียนที ่ส วนห ัวของโปรแกรม ก อนถ ึงต ัวฟ งก ชั ่น นอกจากนั ้นย ังต องค ําน ึงถ ึงต ัวพ ิมพ เล ็ก-ใหญ ของต ัวแปรและชื ่อฟ งก ชั ่นให ถ ูกต อง

Page 48: POP-BOT XT_TH

48XT

4.1.1 ส วนของฟ งก ชั่ น setup()

ฟ งก ชั่ นนี้ จะเขี ยนที่ ส วนต นของโปรแกรม ทํ างานเมื่ อโปรแกรมเริ่ มต นเพี ยงครั้ งเดี ยว ใช เพื่ อกํ าหนดค าของตั วแปร โหมดการทํ างานของขาต างๆ เริ่ มต นเรี ยกใช ไลบรารี่ ฯลฯฯ

ตั วอย างที่ 4-1int buttonPin = 3;void setup(){

beginSerial(9600);pinMode(buttonPin, INPUT);

}void loop(){

if (digitalRead(buttonPin) == HIGH)serialWrite(‘H’);elseserialWrite(‘L’);

delay(1000);

}

ในขณะที่ โปรแกรมภาษา C มาตรฐานท่ี เขี ยนบน AVR GCC (เป นโปรแกรมภาษา C ที่ ใช C คอมไพเลอร แบบ GCC สํ าหรั บไมโครคอนโทรลเลอร AVR) จะเขี ยนได ดั งนี้

int main(void)

{

init();

setup();

for (;;)

loop();

return ;

}

4.1.2 ส วนของฟ งก ชั่ น loop()หลั งจากที่ เขี ยนฟ งก ชั่ น setup()ที่ กํ าหนดค าเริ่ มต นของโปรแกรมแล ว ส วนถั ดมาคื อฟ งก ชั่ น loop()

ซึ่ งมี การทํ างานตรงตามชื่ อคื อ จะทํ างานตามฟ งก ชั่ นน้ี วนต อเนื่ องตลอดเวลา ภายในฟ งก ชั่ นน้ี จะมี โปรแกรมของผู ใช เพื่ อรั บค าจากพอร ต ประมวล แล วสั่ งเอาต พุ ตออกขาต างๆ เพื่ อควบคุ มการทํ างานของบอร ด

ตั วอย างที่ 4-2int buttonPin = 3; // setup initializes serial and the button pinvoid setup(){

beginSerial(9600);pinMode(buttonPin, INPUT);

}// loop checks the button pin each time and will send serial if it is pressedvoid loop(){

if (digitalRead(buttonPin) == HIGH)serialWrite(‘H’);

elseserialWrite(‘L’);

delay(1000);

}

ตรงกั บ void setup()

ตรงกั บ void loop()

Page 49: POP-BOT XT_TH

XT 49

4.2 คํ าสั่ งควบคุ มการทํ างาน

4.2.1 คํ าสั่ ง if

ใช ทดสอบเพื่ อกํ าหนดเงื่ อนไขการทํ างานของโปรแกรม เช น ถ าอิ นพุ ตมี ค ามากกว าค าที่ กํ าหนดไว จะให ทํ าอะไร โดยมี รู ปแบบการเขี ยนดั งนี้

if (someVariable > 50)

{

// do something here

}

ต ัวโปรแกรม จะทดสอบว าถ าต ัวแปร someVariable ม ีค ามากกว า 50 หร ือไม ถ าใช ให ท ําอะไร ถ าไม ใช ให ข ามการทํ างานส วนน ี้

การทํ างานของคํ าสั่ งนี้ จะทดสอบเงื่ อนไข ที่ เขี ยนในเครื่ องหมายวงเล็ บ ถ าเง่ื อนไขเป นจริ ง ทํ าตามคํ าสั่ งที่ เขี ยนในวงเล็ บป กกา ถ าเงื่ อนไขเป นเท็ จ ข ามการทํ างานส วนนี้ ไป

ส วนของการทดสอบเงื่ อนไขที่ เขี ยนอยู ภายในวงเล็ บ จะต องใช ตั วกระทํ าเปรี ยบเที ยบต างๆ ดั งนี้

x == y (x เท ากั บ y)

x != y (x ไม เท ากั บ y)

x < y (x น อยกว า y)

x > y (x มากกว า y)

x <= y (x น อยกว าหรื อเท ากั บ y)

x >= y (x มากกว าหรื อเท ากั บ y)

เทคนิ คสํ าหรั บการเขี ยนโปรแกรม

ในการเปรี ยบเที ยบตั วแปรให ใช ตั วกระทํ า == (เช น if (x==10) ) ห ามเขี ยนผิ ดเป น = (เช น if(x=10)) คํ าสั ่งที ่เขี ยนผ ิดในแบบที ่สองนี ้ ทํ าให ผลการทดสอบเป นจร ิงเสมอ และเมื ่อผ านคํ าสั ่งนี ้แล ว x ม ีค าเท าก ับ 10 ทํ าให การทํ างานของโปรแกรมผิ ดเพี้ ยนไป ไม เป นตามที่ กํ าหนดไว

เราสามารถใช คํ าสั่ ง if ในคํ าสั่ งควบคุ มการแยกเส นทางของโปรแกรม โดยใช คํ าสั่ ง if....else

Page 50: POP-BOT XT_TH

50XT

4.2.2 คํ าสั่ ง if...else

ใช ทดสอบเพื ่อกํ าหนดเงื่ อนไขการทํ างานของโปรแกรมได มากกว าคํ าสั่ ง if ธรรมดา โดยสามารถก ําหนดได ว า ถ าเงื่ อนไขเป นจริ งให ทํ าอะไร ถ าเป นเท็ จให ทํ าอะไร เช น ถ าค าอิ นพุ ตอะนาลอกที่ อ านได น อยกว า 500 ให ทํ าอะไร ถ าค ามากกว าหรื อเท ากั บ 500 ให ทํ าอี กอย าง สามารถเขี ยนคํ าสั่ งได ดั งนี้

ตั วอย างที่ 4-3if (pinFiveInput < 500){

// do Thing A}else{

// do Thing B}

หลั งคํ าสั่ ง else สามารถตามด วยคํ าสั่ ง if สํ าหรั บการทดสอบอื่ นๆ ทํ าให รู ปแบบคํ าสั่ งกลายเป นif....else...if เป นการทดสอบเงื่ อนไขต างๆ เมื่ อเป นจริ งให ทํ าตามที่ ต องการ ดั งตั วอย างต อไปนี้

ตั วอย างที่ 4-4if (pinFiveInput < 500){

// do Thing A}else if (pinFiveInput >= 1000){

// do Thing B}else{

// do Thing C}

หลั งคํ าสั่ ง else สามารถตามด วยคํ าสั่ ง if ได ไม จํ ากั ดจํ านวน (สามารถใช คํ าสั่ ง switch case แทนคํ าสั่ ง if...else...if สํ าหรั บการทดสอบเงื่ อนไขจํ านวนมากๆ ได )

เมื่ อใช คํ าสั่ ง if...else แล ว ต องกํ าหนดด วยว าถ าทดสอบไม ตรงกั บเงื่ อนไขใดๆ เลย ให ทํ าอะไร โดยให กํ าหนดที่ คํ าสั่ ง else ตั วสุ ดท าย

Page 51: POP-BOT XT_TH

XT 51

4.2.3 คํ าสั่ ง for()

คํ าสั่ งนี้ ใช เพื่ อสั่ งให คํ าสั่ งที่ อยู ภายในวงเล็ บป กกาหลั ง for มี การทํ างานซํ้ ากั นตามจํ านวนรอบที่ ต องการคํ าสั ่งนี ้มี ประโยชน มากสํ าหรั บการทํ างานใดๆ ที ่ต องทํ าซํ ้ากั นและทราบจํ านวนรอบของการทํ าซํ้ าที ่แน นอน มั กใช คู กั บตั วแปรอะเรย ในการเก็ บสะสมค าที่ อ านได จากขาอิ นพุ ตอะนาลอกหลายๆ ขาที่ มี หมายเลขขาต อเนื่ องกั น

รู ปแบบของคํ าสั่ ง for() แบ งได 3 ส วนดั งนี้ for (initialization; condition; increment){

//statement(s);

}

เริ ่มต นด วย initialization ใช กํ าหนดค าเริ่ มต นของตั วแปรควบคุ มการวนรอบ ในการทํ างานแต ละรอบจะทดสอบ condition ถ าเงื ่อนไขเป นจร ิงท ําตามคํ าสั ่งในวงเล ็บป กกา แล วมาเพิ ่มหร ือลดค าต ัวแปรตามท่ี สั ่งใน incrementแล วทดสอบเงื่ อนไขอี ก ทํ าซํ้ าจนกว าเงื่ อนไขเป นเท็ จ

ตั วอย างที่ 4-5for (int i=1; i <= 8; i++){

// statement using the value i;

}

ค ําสั ่ง for ของภาษาซ ีจะย ืดหยุ นกว าคํ าสั ่ง for ของภาษาคอมพ ิวเตอร อื ่นๆ โดยสามารถละเว นบางส วนหร ือทั้ งสามส วนของคํ าสั่ ง for ได อย างไรก็ ตามยั งคงต องมี เซมิ โคลอน เราสามารถนํ าคํ าสั่ งภาษาซี ที่ มี ต ัวแปรที ่ไม เกี ่ยวข องมาเข ียนในส วนของ initialization, condition และ increment ของคํ าสั ่ง for ได

4.2.4 คํ าสั่ ง switch-case

ใช ทดสอบเงื ่อนไขเพื ่อก ําหนดการทํ างานของโปรแกรม ถ าต ัวแปรที ่ทดสอบตรงก ับเงื ่อนไขใดก็ ให ทํ างานตามที่ กํ าหนดไว

พารามิ เตอร

var ตั วแปรที่ ต องการทดสอบว าตรงกั บเงื่ อนไขใด

default ถ าไม ตรงก ับเงื ่อนไขใดๆ เลยให ทํ าค ําสั ่งต อท ายนี ้

break เป นส วนสํ าคั ญมาก ใช เขี ยนต อท าย case ต างๆ เมื่ อพบเงื่ อนไขน้ั นแล วทํ าตามคํ าสั่ งต างๆแล วให หยุ ดการทํ างานของคํ าสั่ ง switch-case ถ าล ืมเขี ยน break เมื่ อพบเงื่ อนไขทํ าตามเงื่ อนไขแล ว โปรแกรมจะทํ างานตามเงื่ อนไขต อไปเรื่ อยๆ จนกว าจะพบคํ าสั่ ง break

ตั วอย างที่ 4-6switch (var){

case 1://do something when var == 1

break;case 2:

//do something when var == 2break;default:

// if nothing else matches, do the default}

Page 52: POP-BOT XT_TH

52XT

4.2.5 คํ าสั่ ง while

เป นคํ าสั่ งวนรอบ โดยจะทํ าคํ าสั ่งที่ เข ียนในวงเล็ บป กกาอย างต อเนื่ อง จนกว าเงื่ อนไขที ่เขี ยนในวงเล็ บของคํ าสั่ ง while() จะเป นเท็ จ คํ าสั่ งที่ ให ทํ าซํ้ าจะต องมี การเปลี่ ยนแปลงค าตั วแปรที่ ใช ทดสอบ เช น มี การเพิ่ มต าตั วแปร หรื อมี เงื ่อนไขภายนอกเช นอ านค าจากเซ ็นเซอร ได เรี ยบร อยแล วให หยุ ดการอ านค า มิ ฉะนั้ นเงื ่อนไขในวงเล็ บของ while() เป นจริ งตลอดเวลา ทํ าให คํ าสั่ ง while ทํ างานวนรอบไปเรื่ อยๆ ไม รู จบ

รู ปแบบคํ าสั่ งwhile(expression){

// statement(s)

}

พารามิ เตอร expression เป นคํ าสั่ งทดสอบเงื่ อนไข (ถู กหรื อผิ ด)

ตั วอย างที่ 4-7var = 0;

while(var < 200){

// do something repetitive 200 times

var++;

}

Page 53: POP-BOT XT_TH

XT 53

4.3 ตั วกระทํ าทางคณิ ตศาสตร ประกอบด วยตั วกระทํ า 5 ตั วคื อ + (บวก),- (ลบ), * (คู ณ), / (หาร) และ % (หารเอาเศษ)

4.4.1 ตั วกระทํ าทางคณิ ตศาสตร บวก ลบ คู ณ และหาร

ใช หาค าผลรวม ผลต าง ผลคู ณ และผลหารค าของตั วถู กกระทํ าสองตั ว โดยให คํ าตอบม ีประเภทตรงก ับตั วถู กกระทํ าทั้ งสองตั ว เช น 9/4 ให คํ าตอบเท ากั บ 2 เนื่ องจากทั้ ง 9 และ 4 เป นตั วแปรเลขจํ านวนเต็ ม (int)

นอกจากนี ้ต ัวกระท ําทางคณ ิตศาสตร อาจท ําให เก ิดโอเวอร โฟลว (overflow) ถ าผลล ัพธ ที ่ได ม ีขนาดใหญ เก ินกว าจะสามารถเก ็บในตั วแปรประเภทนั ้น ถ าต ัวที ่ถ ูกกระทํ าต างประเภทก ันผลล ัพธ ได เป นจะม ีขนาดใหญ ขึ ้นเท าก ับประเภทของต ัวแปรที ่ใหญ ที ่ส ุด (เช น 9/4 = 2 หร ือ 9/4.0 = 2.25)

รู ปแบบคํ าสั่ งresult = value1 + value2;

result = value1 - value2;

result = value1 * value2;

result = value1 / value2;

พารามิ เตอร

value1 : เป นค าของตั วแปรหรื อค าคงที่ ใดๆ

value2: เป นค าของตั วแปรหรื อค าคงที่ ใดๆ

ตั วอย างที่ 4-8y = y + 3;

x = x - 7;

i = j * 6;

r = r / 5;

เทคนิ คสํ าหรั บการเขี ยนโปรแกรม

เลื อกขนาดของตั วแปรให ใหญ พอสํ าหรั บเก็ บค าผลลั พธ ที่ มากที่ สุ ดของการคํ านวณ

ต องทราบว าที่ ค าใดตั วแปรที่ เก็ บจะมี การวนซํ้ าค ากลั บ และวนกลั บอย างไร ตั วอย างเช น (0 ไป 1) หรื อ(0 ไป -32768)

สํ าหรั บการคํ าณวณที่ ต องการเศษส วนให ใช ตั วแปรประเภท float แต ให ระวั งผลลบ เช น ตั วแปรมี ขนาดใหญ คํ านวณได ช า

ใช ตั วกระทํ า cast เช น (int)myfloat ในการเปลี่ ยนประเภทของตั วแปรชั่ วคราวขณะที่ โปรแกรมทํ างาน

Page 54: POP-BOT XT_TH

54XT

4.4.2 ตั วกระทํ า % หารเอาเศษ

ใช หาค าเศษที่ ได ของการหารเลขจํ านวนเต็ ม 2 ตั ว ตั วกระทํ าหารเอาเศษไม สามารถใช งานกั บตั วแปรเลขทศนิ ยม (float)

รู ปแบบคํ าสั่ งresult = value1 % value2;

พารามิ เตอร

value1 - เป นตั วแปรประเภท byte,char,int หรื อ long

value2 - เป นตั วแปรประเภท byte,char,int หรื อ long

ผลที่ ได

เศษจากการหารค าเลขจ ํานวนเต ็ม เป นข อม ูลชน ิดเลขจํ านวนเต ็ม

ตั วอย างที่ 4-9x = 7 % 5; // x now contains 2

x = 9 % 5; // x now contains 4

x = 5 % 5; // x now contains 0

x = 4 % 5; // x now contains 4

ตั วกระทํ าหารเอาเศษ นี้ ใช ประโยชน มากในงานท่ี ต องการให เหตุ การณ เกิ ดขึ้ นด วยช วงเวลาที่ สมํ่ าเสมอหรื อใช ทํ าให หน วยความที่ เก็ บตั วแปรอะเรย เกิ ดการล นค ากลั บ (roll over)

ตั วอย างที่ 4-10// check a sensor every 10 times through a loop

void loop()

{

i++;

if ((i % 10) == 0)

{

x = analogRead(sensPin);

// read sensor every ten times through loop

}

/ ...

}

// setup a buffer that averages the last five samples of a sensor

int senVal[5]; // create an array for sensor data

int i, j; // counter variables

long average; // variable to store average

...

void loop()

{

// input sensor data into oldest memory slot

sensVal[(i++) % 5] = analogRead(sensPin);

average = 0;

for (j=0; j<5; j++)

{

average += sensVal[j]; // add samples

}

average = average / 5; // divide by total

Page 55: POP-BOT XT_TH

XT 55

4.4 ตั วกระทํ าเปรี ยบเที ยบใช ประกอบกั บคํ าสั ่ง if() เพื ่อทดสอบเงื่ อนไขหรื อเปรี ยบเที ยบค าตั วแปรต าง โดยจะเขี ยนเป นนิ พจน อยู

ภายในเครื่ องหมาย ()

x == y (x เท ากั บ y)

x != y (x ไม เท ากั บ y)

x < y (x น อยกว า y)

x > y (x มากกว า y)

x <= y (x น อยกว าหรื อเท ากั บ y)

x >= y (x มากกว าหรื อเท ากั บ y)

4.5 ตั วกระทํ าทางตรรกะใช ในการเปรี ยบเที ยบของคํ าสั่ ง if() มี 3 ตั วคื อ &&, || และ !

4.5.1 && (ตรรกะ และ)

ให ค าเป นจริ งเมื่ อผลการเปรี ยบเที ยบทั้ งสองข างเป นจริ งทั้ งคู

ตั วอย างที่ 4-11if (x > 0 && x < 5)

{

// ...

}

ให ค าเป นจริ งเมื่ อ x มากกว า 0 และน อยกว า 5 (มี ค า 1 ถึ ง 4)

4.5.2 && (ตรรกะ หรื อ)

ให ค าเป นจริ ง เมื่ อผลการเปรี ยบเที ยบพบว า มี ตั วแปรใดเป นจริ งหรื อเป นจริ งทั้ งคู

ตั วอย างที่ 4-12if (x > 0 || y > 0)

{

// ...

}

ให ผลเป นจริ งเมื่ อ x หรื อ y มี ค ามากกว า 0

4.5.3 ! (ใช กลั บผลเป นตรงกั นข าม)ให ค าเป นจริ ง เมื่ อผลการเปรี ยบเที ยบเป นเท็ จ

ตั วอย างที่ 4-13if (!x)

{

// ...

}

ให ผลเป นจริ งถ า x เป นเท็ จ (เช น ถ า x = 0 ให ผลเป นจริ ง)

Page 56: POP-BOT XT_TH

56XT

4.5.4 ข อควรระวั ง

ระวั งเรื่ องการเขี ยนโปรแกรม ถ าต องการใช ตั วกระทํ าตรรกะและ ต องเขี ยนเครื่ องหมาย && ถ าลื มเขี ยนเป น & จะเป นตั วกระทํ าและระดั บบิ ตกั บตั วแปร ซึ่ งให ผลที่ แตกต าง

เช นกั นในการใช ตรรกะหร ือให เขี ยนเป น || (ข ีดต้ั งสองตั วติ ดกั น) ถ าเขี ยนเป น | (ข ีดต้ั งตั วเดี ยว) จะหมายถึ งตั วกระทํ าหรื อระดั บบิ ตกั บตั วแปร

ตั วกระทํ า NOT ระดั บบิ ต (~) จะแตกต างจากตั วกลั บผลให เป นตรงข าม (!) ให เลื อกใช ให ถู กต อง

ตั วอย างที่ 4-14if (a >= 10 && a <= 20){}

// true if a is between 10 and 20

4.6 ตั วกระทํ าระดั บบิ ตตั วกระท ําระด ับจะนํ าบ ิตของตั วแปรมาประมวลผล ใช ประโยชน ในการแก ป ญหาด านการเข ียนโปรแกรม

ได หลากหลาย ตั วกระทํ าระดั บของภาษาซี (ซึ่ งรวมถึ ง Arduino) มี 6 ตั วได แก & (bitwise AND), | (OR), ^(Exclusive OR), ~ (NOT), << (เลื่ อนบิ ตไปทางขวา) และ >> (เลื่ อนบิ ตไปทางซ าย)

4.6.1 ตั วกระทํ าระดั บบิ ต AND (&)

คํ าสั่ ง AND ในระดั บบิ ตของภาษาซี เขี ยนได โดยใช & หนึ่ งตั ว โดยต องเขี ยนระหว างนิ พจน หรื อตั วแปรที ่เป นเลขจํ านวนเต็ ม การทํ างานจะนํ าข อม ูลแต ละบ ิตของตั วแปรทั ้งสองต ัวมากระทํ าทางตรรกะและ โดยม ีกฎด ังนี ้

ถ าอิ นพุ ตทั้ งสองตั วเป น “1” ทั้ งคู เอาต พุ ตเป น “1” กรณี อื่ นๆ เอาต พุ ตเป น “0” ดั งตั วอย างต อไปนี้ ในการดู ให คู ของตั วกระทํ าตามแนวตั้ ง

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 0 0 1 Returned result

ใน Arduino ตั วแปรประเภท int จะมี ขนาด 16 บิ ต ดั งนั้ นเมื่ อใช ตั วกระทํ าระดั บบิ ต AND จะมี การกระทํ าตรรกะและพร อมกั นกั บข อมู ลทั้ ง 16 บิ ต ดั งตั วอย างในส วนของโปรแกรมต อไปนี้

ตั วอย างที่ 4-15int a = 92; // in binary: 0000000001011100

int b = 101; // in binary: 0000000001100101

int c = a & b; // result: 0000000001000100 or 68 in decimal.

ในตั วอย างนี้ จะนํ าข อมู ลทั้ ง 16 บิ ตของตั วแปร a และ b มากระทํ าทางตรรกะและ แล วนํ าผลลั พธ ที่ ได ทั้ ง 16 บิ ตไปเก็ บท่ี ตั วแปร c ซึ่ งได ค าเป น 01000100 ในเลขฐานสองหรื อเท ากั บ 68 ฐานสิ บ

นิ ยมใช ตั วกระทํ าระดั บบิ ต AND เพื่ อใช เลื อกข อมู ลบิ ตที่ ต องการ (อาจเป นหน่ึ งบิ ตหรื อหลายบิ ต) จากตั วแปร int ซึ่ งการเลื อกเพี ยงบางบิ ตน้ี จะเรี ยกว า masking

Page 57: POP-BOT XT_TH

XT 57

4.6.2 ตั วกระทํ าระดั บบิ ต OR (|)

ค ําสั ่งระด ับบ ิต OR ของภาษาซ ีเข ียนได โดยใช เครื ่องหมาย |หนึ ่งต ัว โดยต องเข ียนระหว างน ิพจน หร ือต ัวแปรที ่เป นเลขจํ านวนเต ็ม การท ํางานจะน ําข อม ูลแต ละบ ิตของต ัวแปรทั ้งสองต ัวมากระทํ าทางตรรกะหร ือ โดยม ีกฎด ังนี ้

ถ าอ ินพ ุตต ัวใดต ัวหนึ ่งหรื อทั ้งสองต ัวเป น “1” เอาต พ ุตเป น “1” กรณ ีที ่อ ินพ ุตเป น “0” ทั ้งคู เอาต พ ุตจ ึงจะเป น“0” ด ังต ัวอย างต อไปนี ้

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 1 1 1 Returned result

ตั วอย างที่ 4-16

ส วนของโปรแกรมแสดงการใช ตั วกระทํ าระดั บบิ ต ORint a = 92; // in binary: 0000000001011100

int b = 101; // in binary: 0000000001100101

int c = a | b; // result: 0000000001111101 or 125 in decimal.

ตั วอย างที่ 4-17

โปรแกรมแสดงการใช ต ัวกระทํ าระด ับบ ิต AND และ OR

ตั วอย างงานท่ี ใช ตั วกระทํ าระดั บบิ ต AND และ OR เป นงานท่ี โปรแกรมเมอร เรี ยกว า Read-Modify-Writeon a port สํ าหรั บไมโครคอนโทรลเลอร 8 บิ ต ค าที่ อ านหรื อเขี ยนไปยั งพอร ตมี ขนาด 8 บิ ต ซึ่ งแสดงค าอิ นพุ ตที่ ขาทั้ ง 8 ขา การเขี ยนค าไปยั งพอร ตจะเขี ยนค าครั้ งเดี ยวได ทั้ ง 8 บิ ต

ตั วแปรชื่ อ PORTD เป นค าที่ ใช แทนสถานะของขาดิ จิ ตอลหมายเลข 0,1,2,3,4,5,6,7 ถ าบิ ตใดมี ค าเป น 1ทํ าให ขานั้ นมี ค าลอจิ กเป น HIGH (อย าลื มกํ าหนดให ขาพอร ตนั้ นๆ ทํ างานเป นเอาต พุ ตด วยคํ าสั่ ง pinMode()ก อน) ดั งนั้ นถ ากํ าหนดค าให PORTD = B00110001; ก็ คื อต องการให ขา 2,3 และ 7 เป น HIGH ในกรณี นี้ ไม ต องเปลี ่ยนค าสถานะของขา 0 และ 1 ซึ ่งปกต ิแล วฮาร ดแวร ของ Arduino ใช ในการสื ่อสารแบบอน ุกรม ถ าไปเปลี ่ยนค าแล วจะกระทบต อการสื่ อสารแบบอนุ กรม

อั ลกอริ ธึ มสํ าหรั บโปรแกรมเป นดั งนี้

อ านค าจาก PORTD แล วล างค าเฉพาะบิ ตที่ ต องการควบคุ ม (ใช ตั วกระทํ าแบบบิ ต AND)

นํ าค า PORTD ที่ แก ไขจากข างต นมารวมกั บค าบิ ตที่ ต องการควบคุ ม (ใช ตั วกระทํ าแบบบิ ต OR)

ซึ่ งเขี ยนเป นโปรแกรมได ดั งนี้

Page 58: POP-BOT XT_TH

58XT

int i; // counter variable

int j;

void setup()

{

DDRD = DDRD | B11111100;

// set direction bits for pins 2 to 7,

// leave 0 and 1 untouched (xx | 00 == xx)

// same as pinMode(pin,OUTPUT) for pins 2 to 7

Serial.begin(9600);

}

void loop()

{

for (i=0; i<64; i++)

{

PORTD = PORTD & B00000011;

// clear out bits 2 - 7, leave pins 0// and 1 untouched (xx & 11 == xx)

j = (i << 2);

// shift variable up to pins 2 - 7 to avoid pins 0 and 1

PORTD = PORTD | j;

// combine the port information with the new information for LED pins

Serial.println(PORTD, BIN); // debug to show masking

delay(100);

}

}

4.6.3 คํ าสั่ งระดั บบิ ต Exclusive OR (^)

เป นโอเปอร เตอร พิ เศษที่ ไม ค อยได ใช ในภาษา C/C++ ตั วกระทํ าระดั บบิ ต exclusive OR (หรื อ XOR)จะเขี ยนโดยใช สั ญลั กษณ เครื่ องหมาย ^ ตั วกระทํ านี้ มี การทํ างานใกล เคี ยงกั บตั วกระทํ าระดั บบิ ต OR แต ต างกั นเมื่ ออิ นพุ ตเป น “1” ทั้ งคู จะให เอาต พุ ตเป น “0” แสดงการทํ างานได ดั งนี้

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 1 1 0 Returned result

หรื อกล าวได อี กอย างว า ตั วกระทํ าระดั บบิ ต XOR จะให เอาต พุ ตเป น “0” เมื่ ออิ นพุ ตทั้ งสองตั วมี ค าเหมื อนกั น และให เอาต พุ ตเป น “1” เมื่ ออิ นพุ ตทั้ งสองมี ค าต างกั น

ตั วอย างที่ 4-18int x = 12; // binary: 1100

int y = 10; // binary: 1010

int z = x ^ y; // binary: 0110, or decimal 6

Page 59: POP-BOT XT_TH

XT 59

ตั วกระทํ าระดั บบิ ต XOR จะใช มากในการสลั บค าบางบิ ตของตั วตั วแปร int เช น กลั บจาก “0” เป น “1”หรื อกลั บจาก “1” เป น “0”

เมื่ อใช ตั วกระทํ าระดั บบิ ต XOR ถ าบิ ตของ mask เป น “1” ทํ าให บิ ตน้ั นถู กสลั บค า ถ า mask มี ค าเป น “1”บิ ตน้ั นมี ค าคงเดิ ม ตั วอย างต อไปนี้ เป นโปรแกรมแสดงการสั่ งให ขาดิ จิ ตอล 5 (Di 5) มี การกลั บลอจิ กตลอดเวลา

ตั วอย างที่ 4-19// Blink_Pin_5

// demo for Exclusive OR

void setup()

{

DDRD = DDRD | B00100000; // set digital pin five as OUTPUT

Serial.begin(9600);

}

void loop()

{

PORTD = PORTD ^ B00100000; // invert bit 5 (digital pin 5),

// leave others untouched

delay(100);

}

4.6.4 ตั วกระทํ าระดั บบิ ต NOT (~)

ตั วกระทํ าระดั บบิ ต NOT จะเขี ยนโดยใช สั ญลั กษณ เครื่ องหมาย ~ ตั วกระทํ านี้ จะใช งานกั บตั วถู กกระทํ าเพี ยงตั วเดี ยวที่ อยู ขวามื อ โดยทํ าการสลั บบิ ตทุ กบิ ตให มี ค าตรงกั นข ามคื อ จาก “0” เป น “1” และจาก “1” เป น “0”ดั งตั วอย าง

0 1 Operand1

—————

1 0 ~ operand1

int a = 103; // binary: 0000000001100111

int b = ~a; // binary: 1111111110011000

เมื่ อกระทํ าแล ว ทํ าให ตั วแปร b มี ค า -104 (ฐานสิ บ) ซึ่ งคํ าตอบที่ ได ติ ดลบเน่ื องจากบิ ตที่ มี ความสํ าคั ญสู งสุ ด (บิ ตซ ายมื อสุ ด) ของตั วแปร int อั นเป นบิ ตแจ งว าตั วเลขเป นบวกหรื อลบ มี ค าเป น “1” แสดงว า ค าที่ ได นี้ ติ ดลบโดยในคอมพิ วเตอร จะเก็ บค าตั วเลขทั้ งบวกและลบตามระบบทู คอมพลี เมนต (2’s complement)

การประกาศตั วแปร int ซึ่ งมี ความหมายเหมื อนกั บการประกาศตั วแปรเป น signed int ต องระวั งค าของตั วแปรจะติ ดลบได

Page 60: POP-BOT XT_TH

60XT

4.6.5 คํ าสั่ งเลื่ อนบิ ตไปทางซ าย (<<) และเลื่ อนบิ ตไปทางขวา (>>)

ในภาษา C/C++ ม ีต ัวกระท ําเลื ่อนบ ิตไปทางซ าย << และเลื ่อนบ ิตไปทางขวา >> ต ัวกระทํ านี ้จะสั ่งเลื ่อนบ ิตของต ัวถ ูกกระทํ าที ่เข ียนด านซ ายม ือไปทางซ ายหร ือไปทางขวาตามจ ํานวนบ ิตที ่ระบ ุไว ในด านขวาม ือของต ัวกระท ํา

รู ปแบบคํ าสั่ งvariable << number_of_bits

variable >> number_of_bits

พารามิ เตอร

variable เป นตั วแปรเลขจํ านวนเต็ มที่ มี จํ านวนบิ ตน อยกว าหรื อเท ากั บ 32 บิ ต (หรื อตั วแปรประเภท byte, int หรื อ long)

ตั วอย างที่ 4-20int a = 5; // binary: 0000000000000101

int b = a << 3; // binary: 0000000000101000 or 40 in decimal

int c = b >> 3; // binary: 0000000000000101 or back to 5

ตั วอย างที่ 4-21

เมื่ อสั่ งเลื่ อนค าตั วแปร x ไปทางซ ายจํ านวน y บิ ต (x << y) บิ ตข อมู ลที่ อยู ด านซ ายสุ ดของ x จํ านวน yตั วจะหายไป เน่ื องจากถู กเลื่ อนหายไปทางซ ายมื อ

int a = 5; // binary: 0000000000000101

int b = a << 14; // binary: 0100000000000000

การเลื่ อนบิ ตไปทางซ าย จะท ําให ค าของตั วแปรด านซ ายม ือของตั วกระท ําจะถ ูกคู ณด วยค าสองยกกํ าลั งบ ิตที่ เลื่ อนไปทางซ ายมื อ ดั งนี้

1 << 0 == 1

1 << 1 == 2

1 << 2 == 4

1 << 3 == 8

...

1 << 8 == 256

1 << 9 == 512

1 << 10 == 1024

...

เมื่ อสั่ งเลื่ อนตั วแปร x ไปทางขวามื อจํ านวน y บิ ต (x >> y) จะมี ผลแตกต างกั นข้ึ นกั บประเภทของตั วแปร ถ า x เป นตั วแปรประเภท int ค าที่ เก็ บได มี ทั้ งค าบวกและลบ โดยบิ ตซ ายมื อสุ ดจะเป น sign bit ถ าเป นค าลบค าบิ ตซ ายมื อสุ ดจะมี ค าเป น 1 กรณี นี้ เมื่ อสั่ งเลื่ อนบิ ตไปทางขวามื อแล วโปรแกรมจะนํ าค า sign bit นี้ มาเติ มให กั บบิ ตทางซ ายมื อสุ ดไปเรื่ อยๆ ปรากฏการณ นี้ เรี ยกว า sign eXTension มี ตั วอย างดั งนี้

ตั วอย างที่ 4-22int x = -16; // binary: 1111111111110000

int y = x >> 3; // binary: 1111111111111110

Page 61: POP-BOT XT_TH

XT 61

ถ าต องการเลื ่อนบ ิตไปทางขวาม ือแล วให ค า 0 มาเติ มย ังบ ิตซ ายม ือส ุด (ซึ ่งเก ิดก ับกรณ ีที ่ต ัวแปรเป นประเภทunsigned int) เราสามารถทํ าได โดยใช การเปลี่ ยนประเภทต ัวแปรชั่ วคราว (typecast) เพื ่อเปลี่ ยนให ต ัวแปร x เป นunsigned int ชั ่วคราวด ังต ัวอย างต อไปนี ้

int x = -16; // binary: 1111111111110000

int y = unsigned(x) >> 3; // binary: 0001111111111110

ถ าคุ ณระมั ดระวั งเรื่ อง sign eXTension แล ว คุ ณสามารถใช ตั วกระทํ าเลื่ อนบิ ตไปทางขวามื อสํ าหรั บการหารค าตั วแปรด วย 2 ยกกํ าลั งต างๆ ได ดั งตั วอย าง

int x = 1000;

int y = x >> 3; // integer division of 1000 by 8, causing y = 125.

4.7 ไวยากรณ ภาษาของ Arduino

4.7.1 ; (เซมิ โคลอน - semicolon)

ใช เขี ยนแจ งว า จบคํ าสั่ ง

ตั วอย างที่ 4-23int a = 13;

บรรท ัดคํ าสั ่งที ่ล ืมเข ียนป ดท ายด วยเซม ิโคลอน จะท ําให แปลโปรแกรมไม ผ าน โดยต ัวแปรภาษาอาจจะแจ งให ทราบว า ไม พบเครื่ องหมายเซมิ โคลอน หรื อแจ งเป นการผิ ดพลาดอื่ นๆ บางกรณี ที่ ตรวจสอบบรรทั ดที่ แจ งว าเกิ ดการผิ ดพลาดแล วไม พบที่ ผิ ด ให ตรวจสอบบรรทั ดก อนหน านั้ น

4.7.2 { } (วงเล็ บป กกา - curly brace)

เครื่ องหมายวงเล็ บป กกา เป นส วนสํ าคั ญของภาษาซี โดยมี การใช งานต างตํ าแหน ง สร างความสั บสนให กั บผู ที่ เริ่ มต น

วงเล็ บป กกาเป ด { จะต องเขี ยนตามด วยวงเล็ บป กกาป ด } ด วยเสมอ หรื อที่ เรี ยกว าวงเล็ บต องครบคู ในซอฟต แวร Arduino IDE ที่ ใช เขี ยนโปรแกรมจะมี ความสามารถในการตรวจสอบการครบคู ของเครื่ องหมายวงเล็ บผู ใช งานเพี ยงแค คลิ กที่ วงเล็ บ มั นจะแสดงวงเล็ บที่ เหลื อซึ่ งเป นคู ของมั น

สํ าหรั บโปรแกรมเมอร มื อใหม และโปรแกรมเมอร ที่ ย ายจากภาษา BASIC มาเป นภาษา C มั กจะสั บสนกั บการใช เครื่ องหมายวงเล็ บ แท ที่ จริ งแล วเครื่ องหมายป กกาป ดนี้ เที ยบได กั บคํ าสั่ ง RETURN ของ subroutine(function) หรื อแทนคํ าสั่ ง ENDIF ในการเปรี ยบเที ยบ และแทนคํ าสั่ ง NEXT ของคํ าสั่ งวนรอบ FOR

เนื ่องจากม ีการใช วงเล ็บป กกาได หลากหลาย ด ังนั ้นเมื ่อต องการเข ียนค ําสั ่งที ่ต องใช เครื ่องหมายวงเล ็บ เมื ่อเข ียนวงเล ็บเป ดแล วให เขี ยนเครื ่องหมายวงเล ็บป ดท ันท ี ถ ัดมาจ ึงค อยเคาะปุ ม Enter ในระหว างเครื ่องหมายวงเล ็บเพื ่อขึ ้นบรรท ัดใหม แล วเข ียนคํ าสั ่งที ่ต องการ ถ าท ําได ตามนี ้วงเล ็บจะครบคู แน นอน

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

Page 62: POP-BOT XT_TH

62XT

ตํ าแหน งที่ ใช วงเล็ บป กกา

ฟ งก ชั่ น (Function)void myfunction(datatype argument){

statements(s)

}

คํ าสั่ งวนรอบ (Loops) while (boolean expression)

{

statement(s)

}

do

{

statement(s)

} while (boolean expression);

for (initialisation; termination condition; incrementing expr)

{

statement(s)

}

คํ าสั่ งทดสอบเงื่ อนไข (condition) if (boolean expression)

{

statement(s)

}

else if (boolean expression)

{

statement(s)

}

else

{

statement(s)

}

4.7.3 // และ /*...* หมายเหต ุบรรท ัดเด ียวและหลายบรรท ัด

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

(1) หมายเหตุ บรรรทั ดเดี ยว เขี ยนเครื่ องสเลช // 2 ตั วหน าบรรทั ด

(2) หมายเหตุ หลายบรรทั ด เขี ยนเครื่ องหมายสเลช / คู กั บดอกจั น * คร อมข อความที่ เป นหมายเหตุ เช น /* blabla */

Page 63: POP-BOT XT_TH

XT 63

4.7.4 #define

เป นคํ าสั่ งที่ ใช งานมาก ในการกํ าหนดค าคงที่ ให กั บโปรแกรม ในการกํ าหนดค าคงที่ ไม ได เปลื องพื้ นที่ หน วยความจํ าของไมโครคอนโทรลเลอร แต อย างไร เมื่ อถึ งขั้ นตอนแปลภาษาคอมไพเลอร จะแทนที่ ตั วอั กษรข อความด วยค าที่ กํ าหนดไว

ใน Arduino จะใช คํ าสั่ ง #define ตรงกั บภาษาซี

รู ปแบบ#define constantName value

อย าลื มเครื่ องหมาย #

ตั วอย างที่ 4-24#define ledPin 3

เป นการกํ าหนดให ตั วแปร ledPin เท ากั บค าคงที่ 3

เทคนิ คสํ าหรั บการเขี ยนโปรแกรม

ท ายคํ าสั ่ง #define ไม ต องมี เครื่ องหมายเซมิ โคลอน ถ าใส เกิ นแล วเวลาคอมไพล โปรแกรมจะแจ งว าเกิ ดการผิ ดพลาดในบรรทั ดถั ดไป

4.7.5 #include

ใช สั่ งให รวมไฟล อื่ นๆ เข ากั บไฟล โปรแกรมของเราก อน แล วจึ งทํ าการคอมไพล โปรแกรม

รู ปแบบคํ าสั่ ง#include <file>

#include “file”

ตั วอย างที่ 4-25#include <stdio.h>

#include “popxt.h”

บรรทั ดแรกจะสั่ งให เรี ยกไฟล stdio.h มารวมกั บไฟล โปรแกรมของเรา โดยค นหาไฟล จากตํ าแหน งที่ เก็ บไฟล ระบบของ Arduino โดยปกติ เป นไฟล มาตรฐานท่ี มาพร อมกั บ Arduino

บรรทั ดที่ 2 สั่ งให รวมไฟล popxt.h มารวมกั บไฟล โปรแกรมของเรา โดยหาไฟล จากตํ าแหน งที่ อยู ของไฟล ภาษาซี ของเราก อน ปกติ เป นไฟล ที่ ผู ใช สร างขึ้ นเอง

Page 64: POP-BOT XT_TH

64XT

4.8 ตั วแปรตั วแปรเป นตั วอั กษรหลายตั วๆ ที่ กํ าหนดข้ึ นในโปรแกรมเพื่ อใช ในการเก็ บค าข อมู ลต างๆ เช น ค าที่ อ าน

ได จากตั วตรวจจั บที่ ต ออยู กั บขาพอร ตอะนาลอกของ Arduino ตั วแปรมี หลายประเภทดั งนี้

4.8.1 char : ตั วแปรประเภทตั วอั กขระ

เป นตั วแปรที่ มี ขนาด 1 ไบต (8 บิ ต) มี ไว เพื่ อเก็ บค าตั วอั กษร ตั วอั กษรในภาษา C จะเขี ยนอยู ในเครื่ องหมายคํ าพู ดขี ดเดี ยว เช น ‘A’ (สํ าหรั บข อความ ที่ ประกอบจากตั วอั กษรหลายตั วเขี ยนต อกั นจะเขี ยนอยู ในเครื่ องหมายคํ าพ ูดปกติ เช น “ABC”) คุ ณสามารถสั่ งกระทํ าทางคณิ ตศาสตร กั บต ัวอั กษรได ในกรณี จะนํ าค ารห ัส ASCIIของตั วอั กษรมาใช เช น ‘A’ +1 มี ค าเท ากั บ 66 เนื่ องจากค ารหั ส ASCII ของตั วอั กษร A เท ากั บ 65

รู ปแบบคํ าสั่ งchar sign = ‘ ’;

พารามิ เตอร char var = ‘x’;

var คื อชื่ อของตั วแปรประเภท char ที่ ต องการ

x ค ือค าที ่ต องการก ําหนดให ก ับต ัวแปร ในท่ี นี ้เป นต ัวอ ักษรหนึ ่งต ัว

4.8.2 byte : ตั วแปรประเภทตั วเลบ 8 บิ ตหรื อ 1 ไบต

ตั วแปร byte ใช เก็ บค าตั วเลขขนาด 8 บิ ต มี ค าได จาก 0 - 255

ตั วอย างที่ 4-26byte b = B10010; // “B” is the binary formatter (18 decimal)

4.8.3 int : ตั วแปรประเภทตั วเลขจํ านวนเต็ ม

ย อจาก interger ซึ ่งแปลว าเลขจํ านวนเต็ ม int เป นตั วแปรพื้ นฐานสํ าหรั บเก ็บตั วเลข ต ัวแปรหนึ่ งตั วมี ขนาด2 ไบต เก็ บค าได จาก -32,768 ถึ ง 32,767 (ค าตํ่ าสุ ดจาก -215 ค าสู งสุ ดจาก (215- 1)

ในการเก็ บค าต ัวเลขติ ดลบ จะใช เทคนิ คที่ เรี ยกว า ทู คอมพล ีเมนต (2’s complement) บ ิตสู งสุ ดบางที จะเรี ยกว าเป นบิ ตเครื่ องหมายหรื อ sign bit ถ ามี ค าเป น “1” แสดงว าค าติ ดลบ

ใน Arduino จะจั ดการกั บตั วเลขค าติ ดลบให เอง ทํ าให นํ าค าตั วแปรไปคํ านวณได อย างถู กต อง อย างไรก็ ตามเมื่ อนํ าตั วเลขค าติ ดลบน้ี ไปเลื่ อนบิ ตไปทางขวา (>>) จะมี ป ญหาเรื่ องค าของตั วเลขที่ ผิ ดพลาด

รู ปแบบคํ าสั่ งint var = val;

พารามิ เตอร

var คื อชื่ อของตั วแปรประเภท int ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

Page 65: POP-BOT XT_TH

XT 65

ตั วอย างที่ 4-27int ledPin = 13;

เทคนิ คสํ าหรั บการเขี ยนโปรแกรม

เมื่ อตั วแปรมี ค ามากกว าค าสู งสุ ดที่ เก็ บได จะเกิ ดการ “ล นกลั บ” (roll over) ไปยั งค าตํ่ าสุ ดที่ เก็ บได และเมื่ อมี ค าน อยกว าค าตํ่ าสุ ดที่ เก็ บได จะล นกลั บไปยั งค าสู งสุ ด ดั งตั วอย างต อไปนี้

ตั วอย างที่ 4-28int x

x = -32,768;

x = x - 1; // x now contains 32,767 - rolls over in neg. direction

x = 32,767;

x = x + 1; // x now contains -32,768 - rolls over

4.8.4 unsigned int : ตั วแปรประเภทเลขจํ านวนเต็ มไม คิ ดเครื่ องหมาย

ต ัวแปรประเภทนี ้คล ายกั บต ัวแปร int ตรงที ่ใช หน วยความจํ า 2 ไบต แต จะเก ็บเลขจ ํานวนเต็ มบวกเท านั ้น โดยเก ็บค า 0 ถ ึง 65,535 (216 -1)

รู ปแบบคํ าสั่ งunsigned int var = val;

พารามิ เตอร

var คื อชื่ อของตั วแปร int ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-29unsigned int ledPin = 13;

เทคนิ คสํ าหรั บการเขี ยนโปรแกรม

เมื ่อต ัวแปรมี ค ามากกว าค าส ูงส ุดจะล นกล ับไปค าตํ ่าสุ ด และเมื ่อมี ค าน อยกว าค าตํ่ าส ุดจะล นกลั บเป นค าสู งสุ ด ดั งตั วอย าง

ตั วอย างที่ 4-30unsigned int x

x = 0;

x = x - 1; // x now contains 65535 - rolls over in neg direction

x = x + 1; // x now contains 0 - rolls over

Page 66: POP-BOT XT_TH

66XT

4.8.5 long : ตั วแปรประเภทเลขจํ านวนเต็ ม 32 บิ ต

เป นตั วแปรเก ็บค าเลขจํ านวนเต็ มที ่ขยายความจ ุเพิ ่มจากตั วแปร int โดยตั วแปร long หนึ ่งต ัวกิ นพื ้นที ่หน วยความจํ า 32 บิ ต (4 ไบต ) เก็ บค าได จาก -2,147,483,648 ถึ ง 2,147,483,647

รู ปแบบคํ าสั่ งlong var = val;

พารามิ เตอร

var คื อชื่ อของตั วแปร long ท่ี ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-31long time;void setup(){

Serial.begin(9600);}void loop(){

Serial.print(“Time: “);time = millis(); //prints time since program startedSerial.println(time); // wait a second so as not to send

// massive amounts of datadelay(1000);

}

4.8.6 unsigned long : ตั วแปรประเภทเลขจํ านวนเต็ ม 32 บิ ต แบบไม คิ ดเครื่ องหมาย

เป นต ัวแปรเก ็บค าเลขจ ํานวนเต ็มบวก ต ัวแปรหนึ ่งต ัวก ินพื ้นที ่หน วยความจ ํา 32 บ ิต (4 ไบต ) เก ็บค าได จาก 0ถ ึง 4,294,967,295 หร ือ 232 - 1

รู ปแบบคํ าสั่ งunsigned long var = val;

พารามิ เตอร

var คื อชื่ อของตั วแปร unsigned long ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-32long time;void setup(){

Serial.begin(9600);}void loop(){

Serial.print(“Time: “);time = millis(); //prints time since program startedSerial.println(time); // wait a second so as not to send

// massive amounts of datadelay(1000);

}

Page 67: POP-BOT XT_TH

XT 67

4.8.7 float : ตั วแปรประเภทเลขทศนิ ยม

เป นตั วแปรสํ าหรั บเก็ บค าเลขเลขทศนิ ยม ซึ่ งนิ ยมใช ในการเก็ บค าสั ญญาณอะนาล็ อกหรื อค าที่ ต อเนื่ องเนื่ องจากสามารถเก็ บค าได ละเอี ยดกว าตั วแปร int ตั วแปร float เก็ บค าได จาก 4.4028235 x 1038 ถึ ง -4.4028235 x1038 โดยหนึ่ งตั วจะกิ นพื้ นที่ หน วยความจํ า 32 บิ ต (4 ไบต )

ในการคํ านวณคณิ ตศาสตร กั บตั วแปร float จะช ากว าการคํ านวณของตั วแปร int ดั งนั้ นพยายามหลี กเลี่ ยงการคํ านวณกั บตั วแปร float เช น ในคํ าสั่ งวนรอบที่ ทํ างานด วยความเร็ วสู งสุ ดสํ าหรั บฟ งก ชั่ นทางเวลาที่ ต องแม นยํ าอย างมาก โปรแกรมเมอร บางคนจะทํ าการแปลงตั วเลขทศนิ ยมให เป นเลขจํ านวนเต็ มก อนแล วจึ งคํ านวณเพื่ อให ทํ างานได เร็ วขึ้ น

จะเห ็นได ว าการค ํานวณคณิ ตศาสตร ของเลข floating point จะม ีการใช งานมากสํ าหร ับการค ํานวณค าข อม ูลที่ รั บจากภายนอกซึ่ งเป นตั วเลขทศนิ ยม ซึ่ งทางผู ศึ กษาระบบไมโครคอนโทรลเลอร มั กจะมองข ามไป

รู ปแบบคํ าสั่ งfloat var = val;

พารามิ เตอร

var คื อชื่ อของตั วแปร float ที่ ต องการ

val คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 4-33float myfloat;

float sensorCalbrate = 1.117;

ตั วอย างที่ 4-34int x;

int y;

float z;

x = 1;

y = x / 2; // y now contains 0, integers can’t hold fractions

z = (float)x / 2.0; // z now contains .5 (you have to use 2.0, not 2)

Page 68: POP-BOT XT_TH

68XT

4.8.8 double : ต ัวแปรประเภทเลขทศน ิยมความละเอ ียดสองเท า

เป นต ัวแปรทศนิ ยมความละเอ ียดสองเท า ม ีขนาด 8 ไบต ค าส ูงส ุดที ่เก ็บได ค ือ 1.7976931348623157 x 10308

ใน Arduino ม ีหน วยความจํ าจ ําก ัด จ ึงไม น ิยมใช ต ัวแปรประเภทนี ้

4.8.9 string : ตั วแปรประเภทข อความ

เป นตั วแปรเก็ บข อความ ซึ่ งในภาษาซี จะนิ ยามเป นอะเรย ของตั วแปรประเภท char

ตั วอย างที่ 4-35 ตั วอย างการประกาศตั วแปรสตริ งchar Str1[15];

char Str2[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’,‘o’};

char Str3[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’, ‘o’,’\0'};

char Str4[ ] = “arduino”;

char Str5[8] = “arduino”;

char Str6[15] = “arduino”;

Str1 เป นการประกาศตั วแปรสตริ งโดยไม ได กํ าหนดค าเริ่ มต น

Str2 ประกาศตั วแปรสตริ งพร อมกํ าหนดค าให กั บข อความที ละตั วอั กษร จากตั วอย าง คอมไพเลอร จะเพิ่ ม null character ให เอง

Str3 ประกาศตั วแปรสตริ งพร อมกํ าหนดค าให กั บข อความที ละตั วอั กษร จากตั วอย าง เพิ่ มค า nullstring เอง

Str4 ประกาศตั วแปรสตริ งค พร อมกํ าหนคค าตั วแปรในเครื่ องหมายคํ าพู ด จากตั วอย าง ไม ได กํ าหนดขนาดตั วแปร คอมไพเลอร จะกํ าหนดขนาดให เองตามจํ านวนตั วอั กษร + 1 สํ าหรั บ null string

Str5 ประกาศตั วแปรสตริ งพร อมกํ าหนคค าตั วแปรในเครื่ องหมายคํ าพู ด จากตั วอย าง กํ าหนดขนาดตั วแปรเอง

Str6 ประกาศตั วแปรสตริ ง โดยกํ าหนดขนาดเผื่ อไว สํ าหรั บข อความอื่ นท่ี ยาวมากกว านี้

4.8.9.1 การเพิ่ มตั วอั กษรแจ งว าจบข อความ (null termination)

ในตั วแปรสตริ งของภาษา C กํ าหนดให ตั วอั กษรสุ ดท ายเป นตั วแจ งการจบข อความ (null string) ซึ่ งก็ คื อตั วอั กษร \0 ในการกํ าหนดขนาดของตั วแปร (ค าในวงเล็ บเหลี่ ยม) จะต องกํ าหนดให เท ากั บจํ านวนตั วอั กษร + 1ดั งในตั วแปร Str2 และ Str3 ในตั วอย างที่ 4-35 ที่ ข อความ Arduino มี ตั วอั กษร 7 ตั ว ในการประกาศตั วแปรต องระบุ เป น [8]

ในการประกาศต ัวแปรสตร ิง ต องเผื ่อพื ้นที ่ส ําหร ับเก ็บต ัวอ ักษรแจ งว าจบข อความ ม ิฉะนั ้นคอมไพเลอร จะแจ งเต ือนว าเก ิดการผ ิดพลาด ในตั วอย างที ่ 4-35 ต ัวแปร Str1 และ Str6 เก ็บข อความได ส ูงส ุด 14 ต ัวอ ักษร

4.8.9.2 เคร่ื องหมายคํ าพู ดขี ดเดี ยวและสองขี ด

ปกติ แล วจะกํ าหนดค าตั วแปรสตร ิงภายในเครื่ องหมายคํ าพู ด เช น “Abc” สํ าหร ับตั วแปรต ัวอั กษร (char)จะกํ าหนดค าภายในเครื่ องหมายคํ าพู ดขี ดเดี ยว ‘A’

Page 69: POP-BOT XT_TH

XT 69

4.8.10 ตั วแปรอะเรย (array)

ตั วแปรอะเรย เป นตั วแปรหลายตั ว ที่ ถู กเก็ บรวมอยู ในตั วแปรชื่ อเดี ยวกั น โดยอ างถึ งตั วแปรแต ละตั วด วยหมายเลขดั ชนี ที่ เขี ยนอยู ในวงเล็ บสี่ เหลี่ ยม ตั วแปรอะเรย ของ Arduino จะอ างอิ งตามภาษา C ตั วแปรอะเรย อาจจะดู ซั บซ อน แต ถ าใช เพี ยงตั วแปรอะเรย อย างง ายจะตรงไปตรงมา และง ายต อการทํ าความข าใจมากกว า

ตั วอย างการประกาศตั วแปรอะเรย int myInts[6];

int myPins[] = {2, 4, 8, 3, 6};

int mySensVals[6] = {2, 4, -8, 3, 2};

char message[6] = “hello”;

เราสามารถประกาศตั วแปรอะเรย ได โดยยั งไม กํ าหนดค าดั งตั วแปร myInts

ในตั วแปร myPins จะประกาศตั วแปรอะเรย โดยไม ระบุ ขนาด ซึ่ งทํ าได เมื่ อประกาศตั วแปรแล วกํ าหนดค าทั นที เพื่ อให คอมไพเลอร นั บว า ตั วแปรมี สมาชิ กกี่ ตั วและกํ าหนดค าได ถู กต อง

ท ายที ่สุ ดคุ ณสามารถประกาศตั วแปรและกํ าหนดขนาดของต ัวแปรอะเรย ดั งต ัวแปร mySensVals ในการประกาศอะเรย ของตั วแปร char จะต องเผื่ อที่ สํ าหรั บเก็ บค าตั วอั กษรแจ งว าจบข อความด วย

4.8.10.1 การใช งานตั วแปรอะเรย

การใช งานตั วแปรอะเรย ทํ าได โดยการพิ มพ ชื่ อตั วแปรพร อมกั บระบุ ค าดั ชนี ภายในเครื่ องหมายวงเล็ บสี่ เหลี่ ยม ค าดั ชนี ของตั วแปรอะเรย เริ่ มต นด วยค า 0 ดั งนั้ นค าของตั วแปร mySensVals มี ค าดั งนี้

mySensVals[0] == 2, mySensVals[1] == 4 , ฯลฯ

การกํ าหนดค าให กั บตั วแปรอะเรย mySensVals[0] = 10;

การเรี ยกค าสมาชิ กของตั วแปรอะเรย x = mySensVals[4];

4.8.10.2 อะเรย และคํ าสั่ งวนรอบ for

โดยทั ่วไปเราจะพบการใช งานต ัวแปรอะเรย ภายในคํ าสั่ ง for โดยใช ค าตั วแปรนั บรอบของคํ าสั ่ง for เป นค าดั ชนี ของตั วแปรอะเรย ดั งตั วอย าง การพิ มพ ค าสมาชิ กแต ละตั วของตั วแปรอะเรย ผ านพอร ตอนุ กรม ให เขี ยนโปรแกรมดั งนี้

int i;

for (i = 0; i < 5; i = i + 1) {

Serial.println(myPins[i]);

}

ตั วอย างโปรแกรมสาธิ ตการใช งานตั วแปรอะเรย ที่ สมบู รณ ดู ได ในตั วอย าง KnightRider ในหั วข อTutorials ในเวบไซต www.arduino.cc

Page 70: POP-BOT XT_TH

70XT

4.9 ขอบเขตของตั วแปรตั วแปรในภาษาซี ที ่ใช ใน Arduino จะมี คุ ณสมบั ติ ที่ เรี ยกว า “ขอบเขตของตั วแปร” (scope) ซึ่ งแตกต างจาก

ภาษา BASIC ซึ่ งตั วแปรทุ กตั วมี สถานะเท าเที ยมกั นหมดคื อ เป นแบบ global

4.9.1 ต ัวแปรโลคอลและโกลบอล

ตั วแปรแบบโกลบอล (global variable) เป นตั วแปรที ่ทุ กฟ งก ชั ่นในโปรแกรมรู จั ก โดยต องประกาศตั วแปรนอกฟ งก ชั่ น สํ าหรั บตั วแปรแบบโลคอลหรื อตั วแปรท องถิ่ น เป นตั วแปรที่ ประกาศตั วแปรอยู ภายในเครื่ องหมายวงเล็ บป กกาของฟ งก ชั่ น และรู จั กเฉพาะแค ภายในฟ งก ชั่ นน้ั น

เมื่ อโปรแกรมเริ่ มมี ขนาดใหญ และซั บซ อนมากขึ้ น การใช ตั วแปรโลคอลจะมี ประโยชน มาก เนื่ องจากแน ใจได ว ามี แค ฟ งก ชั่ นน้ั นเท านั้ นที่ สามารถใช งานตั วแปร ช วยป องกั นการเกิ ดการผิ ดพลาดเมื่ อฟ งก ชั่ นทํ าการแก ไขค าตั วแปรที่ ใช งานโดยฟ งก ชั่ นอื่ น

ตั วอย างที่ 4-36int gPWMval; // any function will see this variable

void setup(){

// ...

}

void loop(){

int i; // “i” is only “visible” inside of “loop”

float f; // “f” is only “visible” inside of “loop”

}

4.9.2 ตั วแปรสแตติ ก (static)

เป นคํ าสงวน (keyword) ที ่ใช ตอนประกาศต ัวแปรที ่ม ีขอบเขตใช งานแค ภายในฟ งก ชั ่นเท านั ้น โดยต างจากต ัวแปรโลคอลตรงที ่ต ัวแปรแบบโลคอลจะถ ูกสร างและลบทิ ้งท ุกครั ้งที ่เร ียกใช ฟ งก ชั ่น ส ําหร ับต ัวแปรสแตต ิกเมื ่อจบการท ํางานของฟ งก ชั ่นค าต ัวแปรจะย ังคงอยู (ไม ถ ูกลบทิ ้ง) เป นการร ักษาค าต ัวแปรไว ระหว างการเร ียกใช งานฟ งก ชั ่น

ตั วแปรที่ ประกาศเป น static จะถู กสร างและกํ าหนดค าในครั้ งแรกที่ เรี ยกใช ฟ งก ชั่ น

4.10 ค าคงที่ (constants)ค าคงที ่เป น กลุ มตั วอั กษรหรื อข อความที ่ได กํ าหนดค าไว ล วงหน าแล ว ต ัวคอมไพเลอร ของ Arduino จะรู จ ัก

กั บค าคงที่ เหล านี้ แล ว ไม จํ าเป นต องประกาศหรื อกํ าหนดค าคงที่

4.10.1 HIGH, LOW : ใช กํ าหนดค าทางตรรกะ

ในการอ านหรื อเขี ยนค าให กั บขาที่ เป นดิ จิ ตอล ค าที่ เป นได แค มี 2 ค าคื อ HIGH หรื อ LOW เท านั้ น

HIGH เป นการกํ าหนดค าให ขาด ิจ ิตอลนั ้นม ีแรงด ันเท าก ับ +5V ในการอ านค า ถ าอ านได +3V หร ือมากกว าไมโครคอนโทรลเลอร จะอ านค าได เป น HIGH ค าคงที ่ของ HIGH ก ็ค ือ “1” หร ือเท ียบเป นตรรกะค ือ จร ิง (TRUE)

LOW เป นการกํ าหนดค าให ขาด ิจิ ตอลนั้ นมี แรงดั นเท ากั บ 0V ในการอ านค า ถ าอ านได +2V หรื อน อยกว าไมโครคอนโทรลเลอร จะอ านค าได เป น LOW ค าคงที่ ของ LOW ก็ คื อ “0” หรื อเที ยบเป นตรรกะคื อ เท็ จ (FALSE)

Page 71: POP-BOT XT_TH

XT 71

4.10.2 INPUT, OUTPUT : กํ าหนดทิ ศทางของขาพอร ตดิ จิ ตอล

ขาพอร ตด ิจ ิตอลท ําหน าที ่ได 2 อย างค ือ เป นอ ินพ ุตและเอาต พุ ต

เมื่ อกํ าหนดเป น INPUT หมายถึ ง กํ าหนดให ขาพอร ตน้ั นๆ เป นขาอิ นพุ ต

เมื่ อกํ าหนดเป น OUTPUT หมายถึ ง กํ าหนดให ขาพอร ตน้ั นๆ เป นขาเอาต พุ ต

การกํ าหนดค าคงที่ เลขจํ านวนเต็ มเป นเลขฐานต างๆ ของ Arduino

ค าคงที่ เลขจํ านวนเต็ มก็ คื อตั วเลขที่ คุ ณเขี ยนในโปรแกรมของ Arduino โดยตรงเช น 123 โดยปกติ แล วตั วเลขเหล านี้ จะเป นเลขฐานสิ บ (decimal) ถ าต องการกํ าหนดเป นเลขฐานอื่ นจะต องใช เครื่ องหมายพิ เศษระบ ุ เช น

ฐาน ตั วอย าง10 (decimal) 1232 (binary) B11110118 (octal) 017316 (hexadecimal) 0x7B

Decimal ก็ คื อเลขฐานสิ บ ซึ่ งเราใช ในชี วิ ตประจํ าวั น

ตั วอย าง 101 == 101 decimal ((1 * 2^2) + (0 * 2^1) + 1)

Binary เป นเลขฐานสอง ตั วเลขแต ละหลั กเป นได แค 0 หรื อ 1

ตั วอย าง B101 == 5 decimal ((1 * 2^2) + (0 * 2^1) + 1)

เลขฐานสองจะใช งานได ไม เกิ น 8 บิ ต (ไม เกิ น 1 ไบต ) มี ค าจาก 0 (B0) ถึ ง 255 (B11111111) ถ าต องการป อนเลขฐานสองขนาด 16 บิ ต (ตั วแปรประเภท int) จะต องป อนค าสองขั้ นตอนดั งนี้

myInt = (B11001100 * 256) + B10101010; // B11001100 is the high byte

Octal เป นเลขฐานแปด ตั วเลขแต ละหลั กมี ค าจาก 0 ถึ ง 7 เท านั้ น

ตั วอย าง 0101 == 65 decimal ((1 * 8^2) + (0 * 8^1) + 1)

ข อควรระวั งในการกํ าหนดค าคงที่ อย าเผลอใส เลข 0 นํ าหน า มิ ฉะนั้ นตั วคอมไพเลอร จะแปลความหมายผิ ดไปว าค าตั วเลขเป นเลขฐาน 8

Hexadecimal (hex) เป นเลขฐานสิ บหก ตั วเลขแต ละหลั กมี ค าจาก 0 ถึ ง 9 และตั วอั กษร A คื อ 10, B คื อ 11ไปจนถึ ง F ซึ่ งเท ากั บ 15

ตั วอย าง 0x101 == 257 decimal ((1 * 16^2) + (0 * 16^1) + 1)

POP-Note

Page 72: POP-BOT XT_TH

72XT

4.11 ตั วกระทํ าอื่ นๆ ที่ เกี่ ยวข องกั บตั วแปร

4.11.1 cast : การเปลี่ ยนประเภทตั วแปรชั่ วคราว

cast เป นตั วกระทํ าที ่ใช สั ่งให เปลี ่ยนประเภทของต ัวแปรไปเป นประเภทอื ่น และบ ังค ับให คํ านวณค าต ัวแปรเป นประเภทใหม

รู ปแบบคํ าสั่ ง(type)variable

เมื่ อ Type เป นประเภทของตั วแปรใดๆ (เช น int, float, long)

Variable เป นตั วแปรหรื อค าคงที่ ใดๆ

ตั วอย างที่ 4-37int i;

float f;

f = 4.6;

i = (int) f; // now i is 3

ในการเปลี่ ยนประเภทตั วแปรจาก float เป น int ค าที่ ได จะถู กตั ดเศษออก ดั งนั้ น (int)4.2 และ (int)4.7มี ค าเท ากั นคื อ 3

4.11.2 sizeof : แจ งขนาดของตั วแปร

ใช แจ งบอกจํ านวนไบต ของตั วแปรที่ ต องการทราบค า ซึ่ งเป นทั้ งตั วแปรปกติ และตั วแปรอาเรย

รู ปแบบคํ าสั่ ง

เขี ยนได ทั้ งสองแบบดั งนี้ sizeof(variable)

sizeof variable

เมื่ อ Variable คื อตั วแปรปกติ หรื อตั วแปรอะเรย (int, float, long) ที่ ต องการทราบขนาด

ตั วอย างที่ 4-38

ตั วกระทํ า sizeof มี ประโยชน อย างมากในการจั ดการกั บตั วแปรอาเรย (รวมถึ งตั วแปรสตริ งค ) ตั วอย างต อไปนี้ จะพิ มพ ข อความออกทางพอร ตอนุ กรมครั้ งละหนึ่ งตั วอั กษร ให ทดลองเปลี่ ยนข อความ

char myStr[] = “this is a test”;

int i;

void setup(){

Serial.begin(9600);

}

void loop() {

for (i = 0; i < sizeof(myStr) - 1; i++){

Serial.print(i, DEC);

Serial.print(“ = “);

Serial.println(myStr[i], BYTE);

}

Page 73: POP-BOT XT_TH

XT 73

4.12 คํ าสงวนของ Arduinoคํ าสงวนคื อ ค าคงที่ ตั วแปร และฟ งก ชั่ นที่ ได กํ าหนดไว เป นส วนหนึ่ งของภาษา C ของ Arduino ห ามนํ า

คํ าเหล านี้ ไปตั้ งชื่ อตั วแปร สามารถแสดงได ดั งนี้ # Constants

HIGH

LOW

INPUT

OUTPUT

SERIAL

DISPLAY

PI

HALF_PI

TWO_PI

LSBFIRST

MSBFIRST

CHANGE

FALLING

RISING

false

true

null

# Port Constants

DDRB

PINB

PORTB

DDRC

PINC

PORTC

DDRD

PIND

PORTD

# Datatypes

boolean

byte

char

class

default

do

double

int

long

private

protected

public

return

short

signed

static

switch

throw

try

unsigned

void

# Other

abs

acos

+=

+[]

asin

=

atan

atan2

&

&=

||=

boolean

byte

case

ceil

char

charclass

,

//

?:

constrain

cos

{}

—default

delay

delayMicroseconds

/

/**

.

else

==exp

false

float

float

floor

for

<<=

HALF_PI

if

++

!=

int

<<

<<=

log

&&

!

||

^

^=loop

max

millis

min

-

%

/*

*new

null

()

PII

return

>>

;

Serial

Setupsin

sq

sqrt

-=

switch

tan

this

trueTWO_PI

void

while

Serial

begin

read

printwrite

println

available

digitalWrite

digitalRead

pinMode

analogRead

analogWriteattachInterrupts

detachInterrupts

beginSerial

serialWrite

serialRead

serialAvailable

printStringprintInteger

printByte

printHex

printOctal

printBinary

printNewline

pulseIn

shiftOut

Page 74: POP-BOT XT_TH

74XT

Page 75: POP-BOT XT_TH

XT 75

XT

ชุ ดหุ นยนต POP-BOT XT ได ร ับการออกแบบให รองรั บกั บการเรี ยนรู ด านเทคโนโลยี และฝ กกระบวนการคิ ดผ านทางการเข ียนโปรแกรมควบคุ มด วยภาษา C เป นหลั ก ในบทนี้ เป นการนํ าเสนอถึ งองค ประกอบทั้ งหมดโดยสรุ ปของสื่ อการเรี ยนรู ชุ ดนี้ พร อมกั บแนะนํ าตั วอย างการใช งานเครื่ องมื อสํ าหรั บพั ฒนาโปรแกรมและตั วอย างของการทดสอบการทํ างานทางฮาร ดแวร ในขั ้นต น เพื่ อใช เป นแนวทางในการพั ฒนาโปรแกรมสํ าหร ับควบคุ มสื่ อหุ นยนต เพื่ อการศึ กษาตั วน้ี

5.1 องค ประกอบหลั กทางฮาร ดแวร ที่ ใช สร างหุ นยนต POP-BOT XT5.1.1 แผงวงจรควบคุ มหลั ก POP-XT เป นแผงวงจรหลั กที่ ใช ในการประมวลผลและควบคุ มการทํ างานที่

มี จอแสดงผลแบบกราฟ ก LCD สี สํ าหรั บแสดงผลการทํ างานของหุ นยนต

5.1.2 ชุ ดเฟ องขั บมอเตอร ไฟตรง จํ านวน 2 ตั ว ทํ าหน าที่ เป นอุ ปกรณ ขั บเคลื่ อนของหุ นยนต

5.1.3 ตั วตรวจจั บชนิ ดต างๆ ทั้ งแบบดิ จิ ตอลและอะนาลอก

5.1.4 ชุ ดโครงสร างหุ นยนต และอุ ปกรณ ทางกล

5.2 องค ประกอบหลั กทางซอฟต แวร ที่ ใช ในการพั ฒนาโปรแกรมควบคุ มหุ นยนต ประกอบด วยช ุดซอฟต แวร พ ัฒนาโปรแกรมภาษา C/C++ ส ําหรั บไมโครคอนโทรลเลอร AVR แบบโอเพ น

ซอร ส (open source) ที่ สามารถน ํามาใช ได โดยไม ต องเส ียค าใช จ าย มี ข อมู ลโดยสรุ ปดั งนี้

Arduino1.0 เป นซอฟต แวร พั ฒนาโปรแรมด วยภาษา C/C++ ในแบบโอเพ นซอร สที่ ได รั บความนิ ยมสู งในชุ ดซอฟต แวร ที่ ใช เขี ยนโปรแกรมมี ความสมบู รณ พร อม ไม ว าจะเป นไลบรารี ที่ บรรจุ ฟ งก ชั่ นสํ าหรั บติ ดต อกั บฮาร ดแวร ได หลากหลาย สนั บสนุ นการพั ฒนาโปรแกรมด วยหน าต างการทํ างานเพี ยงหน าต างเดี ยว ตั้ งแต เขี ยนโปรแกรม คอมไพล จนถึ งการดาวน โหลดโปรแกรม (ใน Arduino เรี ยกว า การอั ปโหลดโปรแกรม) ทํ าให ง ายต อการทํ าความเข าใจและใช งาน ผู ใช Arduino ไม จํ าเป นต องมี ความรู ด านฮาร ดแวร มากนั กก็ สามารถเขี ยนโปรแกรมควบคุ มอุ ปกรณ ฮาร ดแวร ต างๆ ได นอกจากนี้ ยั งมี นั กพั ฒนาจากทั่ วโลกร วมพั ฒนาไลบรารี ไฟล เพิ่ มเติ ม ทํ าให Arduino มี ความสามารถเพิ่ มมากขึ้ น ข อมู ลเพิ่ มเติ มดู ได ที่ www.arduino.cc สํ าหรั บใน POP-BOT XT เลื อกใช ซอฟต แวร Arduino1.0 นี้ ในการพั ฒนาโปรแกรม

5.3 ขั้ นตอนการพั ฒนาโปรแกรมภาษา C เพื่ อควบคุ มหุ นยนต POP-BOT XTขั้ นตอนการพั ฒนาโปรแกรมสํ าหรั บชุ ดหุ นยนต POP-BOT XT สามารถสรุ ปเป นแผนภาพได ดั งรู ปที่ 5-1

Page 76: POP-BOT XT_TH

76XT

ร ูปที ่ 5-1 แสดงผ ังงานของการพั ฒนาโปรแกรมเพ่ื อควบค ุมหุ นยนต POP-BOT XT ด วยภาษา C โดยใช Arduino1.0

สรางไฟลสเกต็ชเขียนโปรแกรมภาษา C บน Arduino IDE

คอมไพล

อัปโหลดโปรแกรม

อัปโหลดโปรแกรมผานพอรต USB1. ตอสาย USB-miniB เขากบัพอรต USBและหุนยนต POP-BOT XT2. ตรวจสอบตําแหนง USB Serial port (COMx)ที่เกิดขึน้3. เลือกฮารดแวรเปน Unicon Board เนื่องจากแผงวงจร POP-XT ในหุนยนต POP-BOT XTเปนหนึ่งในอนุกรมของแผงวงจร Uniconซึ่งเขากันไดกับฮารดแวร Arduino Leonardo4. ทําการโปรแกรม

รันโปรแกรมหลงัจากอัปโหลดโปรแกรมเสร็จสมบูรณแลวกดสวติช RESET บนแผงวงจรควบคุมของหุนยนตPOP-BOT XT จากนั้นหุนยนตจะเริ่มทาํงานทันที

ติดตั้งซอฟตแวร- Arduino1.0 ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีท้ังสวนของเท็กซเอดิเตอรสําหรับเขียนโปรแกรม, คอมไพเลอร และซอฟตแวรสาํหรับโปรแกรมไมโครคอนโทรลเลอร- ไดรเวอรของแผงวงจร POP-XT ซึง่เปนหนึ่งในอนุกรมของบอรด Unicon ที่เขากันไดกบั Arduino Leonardo

พอรต USB

Page 77: POP-BOT XT_TH

XT 77

5.4 ทดสอบการทํ างานของแผงวงจรควบคุ มของหุ นยนต POP-BOT XTหล ังจากที ่ต ิดตั ้งโปรแกรมและไดรเวอร ของ POP-XT อ ันเป นแผงวงจรควบค ุมการทํ างานของหุ นยนต POP-

BOT XT เร ียบร อยแล วต้ั งแต บทที ่ 3 ในหั วข อนี ้เป นการทดสอบการทํ างานในเบื ้องต น ด วยการนํ าโปรแกรมต ัวอย างมาคอมไพล และอั ปโหลดโปรแกรมไปยั งหุ นยนต POP-BOT XT

เรี ยกโปรแกรม Arduino1.0 ขึ้ นมาใช งาน โดยคลิ กปุ ม Start > Arduino1.0 > Arduino

เมื่ อ Arduino ทํ างานในครั้ งแรกจะมี หน าจอดั งรู ป

Page 78: POP-BOT XT_TH

78XT

5.4.1 กํ าหนดค าทางฮาร ดแวร เพื่ อใช กั บหุ นยนต POP-BOT XT

ในการใช งานโปรแกรม Arduino ครั ้งแรกจะต องก ําหนดค าของฮาร ดแวร ที ่ใช งานร วมด วย ซึ ่งประกอบด วยการเล ือกแผงวงจรไมโครคอนโทรลเลอร ที ่ใช และเล ือกพอร ตอน ุกรมของคอมพ ิวเตอร ที ่ต องการเชื ่อมต อ เมื ่อก ําหนดค าแล ว ครั ้งต อไปที ่เป ดโปรแกรมจะน ําค าที ่กํ าหนดไว มาใช งานท ันท ี

5.4.1.1 เลื อกเบอร ของไมโครคอนโทรลเลอร

เลื อกเมนู Tools Board POP-XT หรื อ Unicon Board (ใช ได ทั้ งสองรุ น) ดั งรู ป

5.4.1.2 กํ าหนดพอร ตอนุ กรมที่ ใช ในการต ิดต อกั บโมดู ล

การอ ัปโหลดโปรแกรมจาก Arduino ไปย ังหุ นยนต POP-BOT XT จะกระท ําผ านพอร ตอน ุกรม ซึ ่งจะต องก ําหนดหมายเลขพอร ตที ่ใช ด ังนี ้ เล ือกเมน ู Tools Serial Port โปรแกรมจะแสดงพอร ตอน ุกรมที ่ม ีในคอมพ ิวเตอร ให ผู ใช เลื ่อนเคอร เซอร ของเมาส ไปย ังพอร ตอน ุกรมที ่ต องการ ด ังร ูป

พอร ตอนุ กรมที่ ใช กั บหุ นยนต POP-BOT XT เป นพอร ตอนุ กรมเสมื อน (virtual COM port) ที่ เกิ ดจากการติ ดต้ั งไดรเวอร ปกติ คื อพอร ต COM ที่ มี หมายเลขมากกว า 2 ขึ้ นไป ในตั วอย างเลื อกพอร ต COM104

Page 79: POP-BOT XT_TH

XT 79

5.4.2 ทดลองสร างไฟล สเก็ ตช ตั วอย าง

Arduino จะเร ียกโปรแกรมที ่เข ียนขึ ้นว า สเก ็ตช บุ ก (Sketchbook) เริ ่มต นการสร างไฟล สเก ็ตช ด วยค ําสั ่ง New

(1) คลิ กเลื อกเมนู File > New จากน้ั นพิ มพ โค ดตั วอย างดั งต อไปนี้ #include <popxt.h> //Include POP-XT libraryvoid setup(){

glcd(1,0,"Hello World"); //Show message on GLCD}void loop(){}

(2) บั นทึ กเป นไฟล ชื่ อ HelloWorld.ino

(3) จากน้ั นทํ าการคอมไพล โปรแกรม เลื อกเมนู Sketch Verify/Compile ดั งรู ปหรื อกดที่ ปุ ม

Page 80: POP-BOT XT_TH

80XT

(4) เมื่ อคอมไพล โปรแกรมแล ว ที่ แถบแสดงสถานะและหน าต างแสดงผลการคอมไพล ซึ่ งเป นหน าต างส ีดํ าอยู ด านล างของโปรแกรม ที ่แถบแสดงสถานะจะปรากฏข อความ Done compiling และหน าต างแสดงผลแสดงข อความว า Binary sketch size: 11006 bytes (of a 30720 byte maximum) ดั งรู ป แสดงว าโปรแกรมภาษาเครื่ องที่ ได จากการคอมไพล มี ขนาด 11,006 ไบต จากขนาดของหน วยความจํ าแฟลชของไมโครคอนโทรลเลอร ทั้ งหมดที่ ใช งานได 30,720 ไบต

5.4.3 อั ปโหลดโปรแกรมไปยั งหุ นยนต POP-BOT XT

หล ังจากที ่คอมไพล โปรแกรมเสร ็จสมบ ูรณ แล ว ขั ้นตอนต อมาเป นการอ ัปโหลดโปรแกรมภาษาเครื ่องไปย ังหุ นยนต POP-BOT XT ในซอฟต แวร Arduino เร ียกกระบวนการการส งข อม ูลของโปรแกรมภาษา C ที ่คอมไพล แล วไปย ังหุ นยนต POP-BOTXTว า อ ัปโหลด (upload) ซึ ่งแตกต างจากการพ ัฒนาโปรแกรมของไมโครคอนโทรลเลอร อื ่นๆ ซึ ่งเร ียกว า การดาวน โหลด (download)

ม ีขั ้นตอนโดยสรุ ปด ังนี ้

(1) เป ดสวิ ตช ของหุ นยนต POP-BOT XT รอให ตั วหุ นยนต พร อมทํ างานประมาณ 10 วิ นาที จากน้ั นต อสายUSB เข ากั บคอมพิ วเตอร

สาย USB-miniB

ตอกับพอรต USBของคอมพิวเตอร

คอมพิวเตอร

หุนยนต POP-BOT XT

220F

100F

TB6612

ATMega32U4

100

Page 81: POP-BOT XT_TH

XT 81

(2) อั ปโหลดโปรแกรมไปยั งหุ นยนต POP-BOT XT โดยคลิ กที่ ปุ ม หรื อเลื อกที่ เมนู File > Upload

(3) รอจนการอั ปโหลดเสร็ จสิ้ น โปรแกรมจะเริ่ มทํ างานทั นที หรื อกดสวิ ตช RESET อี กครั้ ง

โปรแกรม HelloWorld เป นการส งข อความ Hello World ออกไปที่ บรรทั ด 1 คอลั มน 0 ของจอแสดงผลกราฟ ก LCD ของหุ นยนต POP-BOT XT

ทั้ งหมดนี้ คื อ การเตรี ยมการและตั วอย างการพั ฒนาโปรแกรมภาษา C ด วย Arduino สํ าหรั บหุ นยนต POP-BOT XT ขั้ นต น ในการพั ฒนาโปรแกรมควบคุ มหุ นยนต ของกิ จกรรมถั ดไปนั บจากนี้ จะใช ขั้ นตอนในการพั ฒนาโปรแกรมและอั ปโหลดหรื อดาวน โหลดโปรแกรมในลั กษณะเดี ยวกั น จะเห็ นได ว า การพั ฒนาโปรแกรมภาษา Cสํ าหรั บไมโครคอนโทรลเลอร หรื อหุ นยนต อั ตโนมั ติ ด วย Arduino มี ความสะดวกและสามารถดํ าเนิ นการขั้ นตอนทั้ งหมดภายในหน าต างการทํ างานหลั กเพี ยงหน าต างเดี ยว

Page 82: POP-BOT XT_TH

82XT

Page 83: POP-BOT XT_TH

XT 83

XT

หลั งจากการแนะนํ าขั้ นตอนแนวทางการพั ฒนาโปรแกรมภาษา C/C++ ด วย Arduino1.0 ไปแล วในบทที่ 5 เพื ่อให การเรี ยนรู เป นไปอย างต อเนื่ อง ในบทนี้ จึ งนํ าเสนอคตั วอย างการทดสอบการทํ างานในส วนต างๆ ที ่สํ าคั ญของแผงวงจร POP-XT อั นเป นแผงวงจรควบคุ มการทํ างานทั้ งหมดของหุ นยนต POP-BOT XT เพื่ อเป นแนวทางในการต อยอดสู การพั ฒนาโปรแกรมเพื่ อควบคุ มหุ นยนต อย างเต็ มรู ปแบบต อไป

หั วข อกิ จกรรมสํ าหรั บทดสอบการทํ างานของแผงวงจร POP-XT มี ทั้ งสิ้ น 4 กิ จกรรม ประกอบด วย

กิ จกรรมที่ 1 แสดงผลข อความที่ หน าจอภาพกราฟ ก LCD (มี กิ จกรรมย อย 3 กิ จกรรม)

กิ จกรรมที่ 2 ขั บเสี ยงออกลํ าโพงเป ยโซ

กิ จกรรมที่ 3 อ านค าจากปุ ม KNOB และสวิ ตช OK บนแผงวงจร POP-XT

กิ จกรรมที่ 4 ขั บอุ ปกรณ เอาต พุ ตอย างง าย

ขั ้นตอนการพ ัฒนาโปรแกรมในแต ละก ิจกรรมจะเหม ือนก ัน นั ่นค ือ เป ดโปรแกรม Arduino1.0 ท ําการเข ียนโปรแกรม คอมไพล และอั ปโหลดลงบนแผงวงจร POP-XT ของหุ นยนต POP-BOT XT จากน้ั นทดสอบการทํ างาน

สิ่ งสํ าคั ญที่ ต องเน นยํ้ าคื อ ทุ กครั้ งที่ เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT หรื อหุ นยนต POP-BOT XT ต องรอให ต ัวควบค ุมพร อมทํ างานเส ียก อน ซึ ่งใช เวลาประมาณ 10 ว ินาที หล ังจากเป ดไฟเลี ้ยงหร ือหล ังจากการกดสวิ ตช RESET หากม ีการอ ัปโหลดก อนที ่แผงวงจร POP-XT จะพร

อมทํ างาน อาจทํ าให เกิ ดความผิ ดพลาดในการเชื่ อมต อ หรื อโค ดที่ อั ปโหลดลงไปไม ทํ างานตามที่ ควบจะเป น แต จะไม ส งผลจนทํ าให แผงวงจรเกิ ดความเส ียหาย สิ่ งที ่เกิ ดข้ึ นมี เพี ยงแผงวงจรไม ทํ างานหรื อท ํางานไม ถู กต องเท านั้ น

Page 84: POP-BOT XT_TH

84XT

(A1.1.1) เป ดโปรแกรม Arduino1.0 พิ มพ โปรแกรมที่ A1-1 แล วบั นทึ กไฟล

(A1.1.2) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT แล ว เช่ื อมต อสาย USB เข ากั บคอมพิ วเตอร

สาย USB-miniB

ตอกับพอรต USBของคอมพิวเตอร

คอมพิวเตอร

หุนยนต POP-BOT XT

220F

100F

TB6612

ATMega32U4

100

(A1.1.3) เลื อกชนิ ดหรื อรุ นของฮาร ดแวร ให ถู กต อง โดยเลื อกที่ เมน ู Tools > Board > POP-XT หร ือ Unicon Board(ใช ได ทั้ งสองรุ น) ดั งรู ป

Page 85: POP-BOT XT_TH

XT 85

(A1.1.4) เลื อกพอร ตอนุ กรมสํ าหรั บติ ดต อกั บแผงวงจร POP-XT หรื อหุ นยนต POP-BOT XT โดยเลื อกท่ี เมนู Tools> Serial Port ดั งรู ป (ตํ าแหน งของพอร ตที่ ใช เช่ื อมต ออาจแตกต างกั นในคอมพิ วเตอร แต ละเครื่ อง)

(A1.1.5) คอมไพล และอั ปโหลดไปยั งแผงวงจร POP-XT โดยคลิ กท่ี ปุ ม หรื อเลื อกท่ี เมนู File > Upload

ที่ หน าจอแสดงผลกราฟ ก LCD ของแผงวงจร POP-XT แสดงข อความ Hello World

220 F

100 F

TB6612

AT Mega32U4

100

Hello World

#include <popxt.h> // ผนวกไลบรารี หลั กvoid setup(){

glcd(1,0,"Hello World"); // แสดงข อความบนจอแสดงผล}void loop(){}คํ าอธิ บายโปรแกรม

โปรแกรมนี้ จะทํ างานโดยส งข อความ Hello World ออกไปแสดงผลที่ บรรทั ด 1 คอลั มน 0 ของจอแสดงผล จะทํ างานเพี ยงครั้ งเดี ยว จึ งเขี ยนโปรแกรมไว ที่ ตํ าแหน งของ void setup() เท านั้ น

โปรแกรมที ่ A1-1 ไฟล HelloWorld.ino สํ าหรั บทดสอบการแสดงผลของแผงวงจร POP-XT

Page 86: POP-BOT XT_TH

86XT

จอแสดงผลของแผงวงจร POP-XT มี ขนาด 128 x 160 พิ กเซล แสดงตั วอั กษรความละเอี ยด 5 x 7 จุ ดจํ านวน 21 ตั วอั กษร 16 บรรทั ด ผู ใช งานสามารถระบุ ตํ าแหน งบรรทั ดและตํ าแหน งคอลั มน ที่ ต องการแสดงผลได โดยกํ าหนดผ านคํ าสั่ ง glcd ซึ่ งมี อยู ในไฟล ไลบรารี popxt.h

นอกจากนั้ นคํ าสั่ ง glcd ยั งมี อั กขระพิ เศษเพื่ อระบุ ตํ าแหน งแทนการใช ค าตั วเลข ดั งแสดงในโปรแกรมที่ A1-2

(A1.2.1) เป ดโปรแกรม Arduino1.0 พิ มพ โปรแกรมที่ A1-2 แล วบั นทึ กไฟล

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กint i,j;void setup(){

glcdFillScreen(GLCD_WHITE); // กํ าหนดให สี ของพื้ นหลั งของจอแสดงผลเป นสี ขาวsetTextColor(GLCD_BLACK); // กํ าหนดสี ตั วอั กษรเป นสี ดํ าsetTextBackgroundColor(GLCD_WHITE); // กํ าหนดสี พื้ นหลั งของตั วอั กษรเป นสี ขาวfor (i=0;i<16;i++) // วนลู ป 16 รอบเพื่ อแสดงข อความ{glcd(i,0," Row %d ",i); // แสดงข อความที่ จอแสดงผล}

}void loop(){}

โปรแกรมที่ A1-2 ไฟล MultipleTextline.ino สํ าหรั บทดสอบการแสดงผลของแผงวงจร POP-XT

คํ าอธิ บายโปรแกรม

ในโปรแกรมนี้ เพิ่ มเติ มคํ าสั่ งสํ าหรั บการใช งานจอแสดงผลอี ก 3 คํ าสั่ งคื อ

1. glcdFillScreen เป นคํ าสั่ งกํ าหนดสี พื้ นหลั งของจอแสดงผล

2. setTextColor สํ าหรั บกํ าหนดสี ให แก ตั วอั กษร

3. setTextBackground สํ าหรั บกํ าหนดสี พื้ นหลั งของตั วอั กษร

เมื่ อตั้ งค าของจอแสดงผลแล ว จึ งทํ าการส งข อความ Row ตามด วยหมายเลขบรรทั ดซึ่ งมาจากการเพิ ่มค าของตั วแปร i และมี การเลื ่อนต ําแหน งตามค าของ i ด วย ด ังน้ั นท่ี บรรท ัดแรก ข อความ Row0 ถ ูกแสดงที่ คอลั มน 0 ที่ บรรทั ด 2 แสดงข อความ Row 1 ที่ คอลั มน 1 ไล ไปตามลํ าดั บจนถึ งบรรทั ด 15 (บรรทั ดที่ 16)จะแสดงเป น Row 15 ที่ คอลั มน 15

Page 87: POP-BOT XT_TH

XT 87

(A1.2.2) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT แล ว เช่ื อมต อสาย USB เข ากั บคอมพิ วเตอร

(A1.2.3) คอมไพล และอ ัปโหลดโปรแกรมไปยั งแผงวงจร POP-XT โดยคล ิกที ่ปุ ม หร ือเล ือกที ่เมน ู File > Upload

ที่ หน าจอแสดงผลกราฟ ก LCD ของแผงวงจร POP-XT แสดงข อความ Row 0 ถ ึง Row 15 เรี ยงไปบรรทั ดละข อความ

220 F

100 F

TB6612

AT Mega32U4

100

Row00

Row01

RRRow02

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRRRow015

Page 88: POP-BOT XT_TH

88XT

ขนาดตั วอั กษรปกติ ที่ แสดงบนจอแสดงผลของแผงวงจร POP-XT เมื่ อเริ่ มต นทํ างานเป นขนาดเล็ กสุ ด ใช จํ านวนจุ ดต อตั วอั กษรคื อ 6 x 10 จุ ด (อั กษรจริ งมี ขนาด 5 x 7 จุ ด) ถ าต องการปรั บขนาดตั วอั กษรให ใหญ ขึ้ นจะมี คํ าสั่ ง setTextSize ไว สํ าหรั บปรั บขนาด โดยค าที่ กํ าหนดจะเป นจํ านวนเท าของตั วอั กษรปกติ เช น

setTextSize(2) หมายถึ งขนาดตั วอั กษรใหญ ขึ้ นเป น 2 เท า ใช 12 x 20 พิ กเซลต อ 1 ตั วอั กษร

setTextSize(3) หมายถึ งขนาดตั วอั กษรใหญ ขึ้ นเป น 3 เท า ใช 18 x 30 พิ กเซลต อ 1 ตั วอั กษร

เมื่ อปรั บขนาดตั วอั กษรมี ขนาดใหญ ขึ้ น จํ านวนตั วอั กษรต อบรรทั ดก็ ต องลดลง จากเดิ ม 21 ตั วอั กษร 16บรรทั ด เมื่ อขนาดของตั วอั กษรเพิ่ มขึ้ นเป นสองเท า ก็ จะทํ าให แสดงได 10 ตั วอั กษร 8 บรรทั ดแทน ดั งนั้ นเมื่ อเขี ยนโปรแกรมจะต องคํ านึ งถึ งค าเหล านี้ ด วย

นอกจากขนาดต ัวอ ักษรแล ว ย ังกํ าหนดท ิศทางการแสดงผลของจองแสดงผลได โดยใช คํ าสั ่ง glcdMode()โดยมี ค าตั้ งต นคื อ โหมด 0 (glcdMode(0) นั่ นคื อ แสดงผลในแนวตั้ ง สํ าหรั บอี ก 3 โหมดคื อ โหมด 1, 2 และ 3ใช ปรั บให การแสดงผลหมถนไปโหมดละ 90 องศา นั่ นคื อ โหมด 1 หมุ นไป 90 องศา, โหมด 2 หมุ นไป 180 องศาและโหมด 3 หมุ นไป 270 องศา

(A1.3.1) เป ดโปรแกรม Arduino1.0 พิ มพ โปรแกรมที่ A1-3 แล วบั นทึ กไฟล

#include <popxt.h>int x,m;void setup(){

setTextColor(GLCD_RED); // กํ าหนดสี ตั วอั กษรเป นสี แดง}void loop(){

for (x=1;x<6;x++){

setTextSize(x); // กํ าหนดขนาดตั วอั กษรfor(m=0;m<4;m++){

glcdClear(); // เคลี ยร หน าจอglcdMode(m); // กํ าหนดทิ ศทางglcd(0,0,”%dX”,x); // แสดงขนาดตั วอั กษรglcd(1,0,”M=%d”,m); // แสดงโหมดทิ ศทางsleep(500);

}}

}

โปรแกรมที ่ A1-3 ไฟล SetText_FlipDisplay.ino สํ าหร ับทดสอบการเพ่ิ มขนาดต ัวอ ักษรในการแสดงผลและการเปลี ่ยนท ิศทางของการแสดงผลของแผงวงจร POP-XT

Page 89: POP-BOT XT_TH

XT 89

(A1.3.2) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT แล ว เช่ื อมต อสาย USB เข ากั บคอมพิ วเตอร

(A1.3.3) คอมไพล และอ ัปโหลดโปรแกรมไปย ังแผงวงจร POP-XT โดยคล ิกที ่ปุ ม หร ือเล ือกที ่เมน ู File > Upload

ที่ หน าจอแสดงผลกราฟ ก LCD ของแผงวงจร POP-XT แสดงข อความแจ งขนาดของตั วอั กษรและโหมดของการแสดงผลในทิ ศทางที่ ต างกั น เริ่ มจากมุ มบนซ าย, มุ มบนขวา, มุ มล างขวา และมุ มล างซ าย โดยรอบการแสดงผลจะเริ่ มจากขนาด 1X, 2X, 3X , 4X และ 5X แต ละรอบจะมี การแสดงผล 4 ทิ ศทาง โดยดู จากค า M

M = 0 จอแสดงข อความแนวตั้ ง M = 1 หมุ นการแสดงผลไป 90 องศาทางขวาตั วอั กษรขนาด 3 เท า ตั วอั กษรขนาด 4 เท า

M = 2 หมุ นการการแสดงผลไป 180 องศา M = 3 หมุ นการแสดงผลไป 270 องศา จะได ภาพที่ กลั บหั วเมื่ อเที ยบกั บ M = 0 ตั วอั กษรขนาด 5 เท า

ตั วอั กษรขนาด 4 เท า

Page 90: POP-BOT XT_TH

90XT

ฟ งก ชั่ น glcd เป นฟ งก ชั่ นหลั กในการติ ดต อกั บจอแสดงผลกราฟ ก LCD นอกจากมี คํ าสั่ งแสดงข อความแล ว ยั งมี คํ าสั่ งในการวาดลายเส นกราฟ กอี กหลายคํ าสั่ ง ประกอบด วย

glcdRect(int x1,int y1,int width,int height,uint color) เป นคํ าสั่ งสร างรู ปสี่ เหลี่ ยม

glcdFillRect(int x1,int y1,int width,int height,uint color) เป นคํ าสั ่งสร างพื้ นสี่ เหลี่ ยม

glcdLine(int x1, int y1, int x2, int y2,uint color) เป นคํ าสั่ งลากเส น

glcdCircle(int x, int y, int radius,uint color) เป นคํ าสั่ งวาดเส นวงกลม

glcdFillCircle(int x, int y, int radius,uint color) เป นคํ าสั ่งสร างพื ้นท่ี วงกลม

glcdClear(uint color) เป นการเคลี ยร หน าจอแสดงผล

โดยทดสอบเขี ยนโปรแกรมได ด ังโปรแกรมที ่ A1-4 แล วอั ปโหลดเพื ่อทดสอบการทํ างานไปย ังแผงวงจร POP-XT จะได ผลดั งรู ป

Page 91: POP-BOT XT_TH

XT 91

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint i,j;void setup(){}void loop(){

glcdClear; // เคลี ยร หน าจอและพื้ นหลั งเป นสี ดํ าsleep(300);for (i=0;i<160;i+=4){

glcdLine(0,0,128,i,GLCD_WHITE); // วาดเส นสี ขาวจากพิ กั ด 0,0 ไปยั งจุ ดที่ กํ าหนด}for (i=0;i<128;i+=4){

glcdLine(0,0,i,160,GLCD_RED); // วาดเส นสี แดงจากพิ กั ด 0,0 ไปยั งจุ ดที่ กํ าหนด}sleep(2000);glcdRect(32,40,64,80,GLCD_BLUE); // วาดเส นกรอบสี่ เหลี่ ยมสี นํ้ าเงิ นsleep(300);glcdFillCircle(32,40,31,GLCD_GREEN); // สร างวงกลมพื้ นสี เขี ยวglcdFillCircle(96,40,31,GLCD_YELLOW); // สร างวงกลมพื้ นสี เหลื องglcdFillCircle(32,120,31,GLCD_MAGENTA); // สร างวงกลมพื้ นสี บานเย็ นglcdFillCircle(96,120,31,GLCD_SKY); // สร างวงกลมพื้ นสี ฟ าsleep(1000);glcdCircle(64,40,31,GLCD_GREEN); // วาดเส นรอบวงกลมสี เขี ยวglcdCircle(32,80,31,GLCD_BLUE); // วาดเส นรอบวงกลมสี นํ้ าเงิ นglcdCircle(64,120,31,GLCD_YELLOW); // วาดเส นรอบวงกลมสี เหลื องglcdCircle(96,80,31,GLCD_SKY); // วาดเส นรอบวงกลมเส นสี ฟ าsleep(1000);glcdFillRect(0,0,128,160,GLCD_YELLOW); // สร างรู ปสี่ เหลี่ ยมสี เหลื องsleep(1000);

}

โปรแกรมที่ A1-4 ไฟล Simplegraphic.ino ส ําหร ับทดสอบการแสดงผลของแผงวงจร POP-XT

Page 92: POP-BOT XT_TH

92XT

นอกจากวงกลมและสี่ เหลี่ ยมแล ว เส นโค งก็ เป นส วนประกอบสํ าคั ญในการสร างภาพกราฟ ก ในชุ ดคํ าสั่ งเกี่ ยวกั บการแสดงผลจอภาพแบบกราฟ กสี ของแผงวงจร POP-XT ยั งมี คํ าสั่ ง glcdArc() สํ าหรั บสร างเส นโค ง โดยม ีพาราม ิเตอร หร ือต ัวแปรที ่ต องก ําหนดอยู พอสมควร ด ูรายละเอ ียดเพิ ่มเต ิมในบทท่ี 7 เก่ี ยวกั บไฟล ไลบราร ี popxt.hซึ่ งบรรจุ คํ าสั่ งพิ เศษเหล านี้ ไว

(A1.5.1) เป ดโปรแกรม Arduino1.0 พิ มพ โปรแกรมที่ A1-5 แล วบั นทึ กไฟล

(A1.5.2) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT แล ว เช่ื อมต อสาย USB เข ากั บคอมพิ วเตอร

(A1.5.3) คอมไพล และอ ัปโหลดโปรแกรมไปย ังแผงวงจร POP-XT โดยคล ิกที ่ปุ ม หร ือเล ือกที ่เมน ู File > Upload

#include <popxt.h>int i;// ฟ งก ชั่ นสร างรู ปหน ายิ้ มvoid face(){

glcdFillCircle(64,70,50,GLCD_WHITE);glcdArc(48,60,16,30,150,GLCD_RED);glcdCircle(48,55,5,GLCD_BLUE);glcdCircle(80,55,5,GLCD_BLUE);glcdArc(80,60,16,30,150,GLCD_RED);glcdFillCircle(64,70,7,GLCD_YELLOW);glcdArc(64,80,30,220,320,GLCD_RED);glcdArc(64,80,29,220,320,GLCD_RED);

}void setup(){}void loop(){

for(i=0;i<4;i++){

glcdClear();glcdMode(i); // สั่ งหมุ นการแสดงผลface();sleep(1000);

}}

โปรแกรมที ่ A1-5 ไฟล SmileFace_ArcTest.ino สํ าหรั บทดสอบการวาดเส นโค งของแผงวงจร POP-XT

Page 93: POP-BOT XT_TH

XT 93

(A1.5.4) รั นโปรแกรม ดู ผลการทํ างานท่ี จอแสดงผลของแผงวงจร POP-XT

ที่ จอแสดงผลแสดงเป นรู ปการ ตู นหน ายิ้ มนาน 1 วิ นาที แล วหมุ นไปครั้ งละ 90 องศา แล ววนกลั บมาที่ หน าเริ่ มต น จะวนแสดงผลไปตลอดเวลา

Page 94: POP-BOT XT_TH

94XT

บนแผงวงจร POP-XT ม ีส วนขั บเส ียงโดยใช ลํ าโพงเป ยโซ โดยตั วลํ าโพงเป ยโซขนาดเล็ กนี ้ตอบสนองความถี่ เสี ยงในช วงความถี่ ประมาณ 300 ถึ ง 3,000Hz สํ าหรั บไฟล ไลบรารี popxt.h มี คํ าสั่ งสํ าหรั บขั บเสี ยงออกลํ าโพงเป ยโซ 2 คํ าสั่ งคื อ beep() และ sound()

ในโปรแกรมที่ A2-1 เป นตั วอย างการใช คํ าสั่ ง beep() เพื่ อขั บเสี ยง “ต้ิ ด” ความถี่ เดี ยวออกทางลํ าโพงทุ กๆ1 วิ นาที

ส วนในโปรแกรมที่ A2-2 เป นตั วอย างการใช คํ าสั่ ง sound() เพื่ อขั บเสี ยงที่ มี ความถี่ ตามที่ กํ าหนดออกทางลํ าโพงเป ยโซ ตามเวลาที่ กํ าหนดในโปรแกรม

การทดสอบโปรแกรมทั้ งสองให ดํ าเนิ นการเหมื อนกั บในกิ จกรรมที่ ผ านมา นั่ นคื อ เป ดโปรแกรมArduino1.0 แล วสร างไฟล สเก็ ตช ขึ้ นใหม จากนั้ นพิ มพ โปรแกรมที่ A2-1 หรื อ A2-2 ตามต องการ แล วบั นทึ กไฟล จากนั้ นทํ าการคอมไพล และอั ปโหลดไปยั งแผงวงจร POP-XT

ต องไม ลื มว า หลั งจากเป ดสวิ ตช จ ายไฟใหม หรื อกดสวิ ตช RESET ต องรอประมาณ 10 วิ นาที เพื่ อให แผงวงจร POP-XT พร อมทํ างานก อนทํ าการอั ปโหลดโปรแกรมใหม

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){}void loop(){ beep(); // ขั บเสี ยง “ติ้ ด” ออกลํ าโพง sleep(1000);}

โปรแกรมที ่ A2-1 ไฟล BeepTest.ino สํ าหรั บทดสอบการขั บเส ียงออกลํ าโพงของแผงวงจร POP-XT

Page 95: POP-BOT XT_TH

XT 95

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){}void loop(){

sound(500,500); // ขั บเสี ยงที่ มี ความถี่ 500Hz นาน 0.5 วิ นาที sound(2500,500); // ขั บเสี ยงที่ มี ความถี่ 2500Hz นาน 0.5 วิ นาที

}

โปรแกรมที่ A2-2 ไฟล SoundTest.ino สํ าหรั บทดสอบการขั บเสี ยงออกลํ าโพงของแผงวงจร POP-XTแบบก ําหนดความถี ่และเวลาได

Page 96: POP-BOT XT_TH

96XT

ในระบบควบคุ มพื้ นฐานจะต องมี การปรั บตั้ งค า มี เมนู มี สวิ ตช ในการสั่ งงานต างๆ บนแผงวงจร POP-XTก็ มี ส วนติ ดตต อกั บผู ใช งานด วยเช นกั น ประกอบด วยปุ ม KNOB สํ าหรั บปรั บเลื อกรายการ และสวิ ตช OK สํ าหรั บยื นยั นการเข าสู รายการทางเลื อกน้ั นๆ

220 F

100 F

TB6612

AT Mega32U4

100

เขี ยนโปรแกรมที่ A3-1 แล วบั นทึ กไฟล ชื่ อ KnobSwitchTest.ino จากน้ั นทํ าการคอมไพล และอั ปโหลดไปยั งแผงวงจร POP-XT แล วรั นโปรแกรมทดสอบการทํ างาน

เมื่ อโปรแกรมเริ่ มทํ างาน ที่ หน าจอแสดงผลของแผงวงจร POP-XT แสดงข อความ

Press OK (ขนาดตั วอั กษรใหญ เป นขนาด 2x)

ให ทํ าการกดสวิ ตช OK เพื่ อเริ่ มการทํ างาน

จะได ยิ นเสี ยง “ต้ิ ด” 1 ครั้ ง จากน้ั นจอแสดงผลจะแสดงข อความ

Knob value (ขนาดตั วอั กษรใหญ เป นขนาด 2x)

XXXX (ขนาดตั วอั กษรใหญ ขึ้ นเป นขนาด 3x)

โดยที่ xxxx มี ค าได ตั้ งแต 80 ถึ ง 1023

ทดลองปรั บปุ ม KNOB บนแผงวงจร POP-XT

ค าของ Knob ที่ จอแสดงผลจะต องเปลี่ ยนแปลงตามการปรั บที่ ปุ ม KNOB

จากน้ั นทํ าการกดสวิ ตช OK

จะได ยิ นเสี ยงของความถี่ 500Hz ดั งนาน 0.5 วิ นาที และแผงวงจร POP-XT จะขั บเสี ยงความถี่ นี้ ทุ กครั้ งที่ มี การกดสวิ ตช OK

Page 97: POP-BOT XT_TH

XT 97

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

glcdClear; // เคลี ยร หน าจอแสดงผล กํ าหนดพื้ นหลั งเป นสี ดํ าsetTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ glcd(1,1,"Press OK"); // แสดงข อความออกหน าจอแสดงผลsw_ok_press(); // วนรอจนกระทั่ งกดสวิ ตช OKbeep(); // ขั บเสี ยง “ติ้ ด” ออกลํ าโพงglcdClear; // เคลี ยร หน าจอแสดงผล กํ าหนดพื้ นหลั งเป นสี ดํ า

}void loop(){

if (sw_ok()) // ตรวจสอบการกดสวิ ตช OK {

sound(500,500); // หากมี การกดสวิ ตช ขั บเสี ยงความถี่ 500 Hz นาน 0.5 วิ นาที }

glcd(1,0,"Knob value"); // แสดงข อความที่ จอแสดงผลsetTextSize(3); // เลื อกขนาดตั วอั กษรใหญ เป น 3 เท าจากขนาดปกติ glcd(2,2,"%d ",knob()); // แสดงค าที่ อ านได จากการปรั บปุ ม KNOB ที่ หน าจอแสดงผลsetTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ

}

โปรแกรมที ่ A3-1 ไฟล KnobSwitchTest.ino สํ าหร ับทดสอบอ านค าจากปุ ม KNOB และสวิ ตช OK

Page 98: POP-BOT XT_TH

98XT

ในไฟล ไลบรารี popxt.h มี คํ าสั่ ง out(int num,int _dat) ซึ่ งช วยให สามารถส งลอจิ ก “0” หรื อ “1”ออกไปยั งขาพอร ต ที่ ต องการได ทํ าให นํ าแผงวงจร POP-XT และหุ นยนต POP-BOT XT ไปใช ขั บอุ ปกรณ เอาต พุ ตพื้ นฐานได ง ายขึ้ น ยกตั วอย างง ายที่ สุ ดคื อ ไดโอดเปล งแสงหรื อ LED

ในกิ จกรรมนี้ จึ งนํ าแผงวงจร ZX-LED อั นเป นแผงวงจร LED แสดงผลแบบเดี่ ยวที่ จะติ ดสว างเมื่ อได รั บลอจิ ก “1” และดั บลงเมื่ อได รั บลอจิ ก “0” มาต อกั บแผงวงจร POP-XT เพื่ อทดลองใช งาน

(A4.1) นํ า ZX-LED ชุ ดที่ 1 ต อเข ากั บจุ ดต อพอร ต 6 /A7 และชุ ดที่ 2 ต อกั บจุ ดต อพอร ต 4/A6

(A4.2) เขี ยนโปรแกรมที่ A4-1 บั นทึ กไฟล ชื่ อ LEDTest.ino

(A4.3) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT รอประมาณ 10 วิ นาที เพื่ อให แผงวงจรพร อมทํ างาน จากน้ั นต อสายUSB เข ากั บคอมพิ วเตอร

(A4.4) คอมไล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT บนหุ นยนต POP-BOT XT

(A4.5) รั นโปรแกรม สั งเกตการทํ างานของ ZX-LED

เมื่ อรั นโปรแกรม ที่ หน าจอแสดงผลของแผงวงจร POP-XT แสดงข อความ

Press OK

ให กดสวิ ตช OK เพื่ อเริ่ มการทํ างาน จะเห็ น LED บนแผงวงจร ZX-LED ทั้ งสองชุ ดติ ดและดั บสลั บกั นไปอย างต อเนื่ อง

แผงวงจร ZX-LED

Page 99: POP-BOT XT_TH

XT 99

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ glcd(1,1,"Press OK"); // แสดงข อความออกหน าจอ GLCDsw_ok_press(); // วนรอการกดสวิ ตช OK

}void loop(){

out(4,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 (Di 4) ติ ดสว างout(6,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 (Di 6) ดั บsleep(400);out(4,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 (Di 4) ดั บout(6,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 (Di 6) ติ ดสว างsleep(400);

}

โปรแกรมที ่ A4-1 ไฟล LEDTest.ino ส ําหร ับทดสอบการขั บอุ ปกรณ เอาต พุ ตอย างง าย

Page 100: POP-BOT XT_TH
Page 101: POP-BOT XT_TH

XT 101

XT

การพั ฒนาโปรแกรมภาษา C/C++ ด วย Arduino สํ าหรั บหุ นยนต POP-BOT XT ดํ าเนิ นการภายใต การสนั บสนุ นของไฟล ไลบรารี popxt.h ทั้ งนี้ เพื่ อช วยลดข้ั นตอนและความซั บซ อนในการเขี ยนโปรแกรมควบคุ มส วนต างๆ ของฮาร ดแวร ลง เนื่ องจากต องการให ความสํ าคั ญของการพั ฒนาโปรแกรมควบคุ มหุ นยนต POP-BOTXT ไปอยู ที่ การเขี ยนโปรแกรมสํ าหรั บรองรั บการเรี ยนรู และกิ จกรรมการแข งขั น

โครงสร างของไฟล ไลบรารี popxt.h แสดงดั งรู ป

Page 102: POP-BOT XT_TH

102XT

7.1 ไลบรารี ย อยภายในไฟล ไลบรารี popxt.h glcd บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บแสดงผลข อความ, ตั วเลข และสร างภาพกราฟ กสี ที่ จอแสดงผล

แบบกราฟ ก LCD สี ของ POP-BOT XT (ยั งไม รองรั บการทํ างานกั บไฟล รู ปภาพ)

sleep บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บการหน วงเวลา

in_out บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บอ านค าอิ นพุ ตดิ จิ ตอลและส งค าออกทางขาพอร ตเอาต พุ ตดิ จิ ตอล

analog บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บอ านค าจากอิ นพุ ตอะนาลอกที่ ต อกั บตั วตรวจจั บ

sound บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บสร างเสี ยงเพื่ อขั บออกลํ าโพง

motor บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บขั บมอเตอร ไฟตรง

servo บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บขั บเซอร โวมอเตอร

serial บรรจุ ฟ งก ชั่ นและคํ าสั่ งสํ าหรั บสื่ อสารข อมู ลอนุ กรมผ านทางพอร ต USB และผ านทางขาพอร ต TxD และ RxD ของแผงวงจร POP-XT

ในการเรี ยกใช งานชุ ดคํ าสั ่งย อยต างๆ เพื ่อการพั ฒนาโปรแกรมควบคุ มหุ นยนต POP-BOT XT ผู พั ฒนาต องผนวกไฟล ไลบรารี หลั ก popbot.h ไว ในตอนต นของโปรแกรมด วยคํ าสั่ ง

#include <popxt.h>

เพื ่อประกาศให ให ต ัวแปลภาษาหรื อคอมไพเลอร รู จ ักชุ ดคํ าสั่ งย อยต างๆ ที่ กํ าล ังจะถู กเรี ยกใช งานจากไฟล ไลบรารี popxt.h

Page 103: POP-BOT XT_TH

XT 103

7.2 รายละเอี ยดของฟ งก ชั่ นหรื อคํ าสั่ งหลั กในไฟล ไลบรารี popxt.h7.2.1 ฟ งก ชั่ นเกี่ ยวกั บการแสดงผลจอภาพแบบกราฟ ก LCD สี

7.2.1.1 glcdเป นฟ งก ชั ่นแสดงข อความที ่หน าจอแสดงผลกราฟ ก LCD ส ี โดยแสดงตั วอั กษรขนาดปกติ ได 21 ตั วอ ักษร

16 บรรทั ด

รู ปแบบ

void glcd(unsigned char x, unsigned char y ,char *p,...)พารามิ เตอร

x คื อตํ าแหน งบรรทั ดมี ค าตั้ งแต 0 ถึ ง 15

y คื อตํ าแหน งตั วอั กษรมี ค าตั้ งแต 0 ถึ ง 20

*p คื อข อความที่ ต องการนํ ามาแสดงรวมถึ งรหั สที่ ใช กํ าหนดรู ปแบบพิ เศษเพื่ อร วมแสดงผลข อมู ลตั วเลขในรู ปแบบอื่ นๆ ประกอบด วย

%c หรื อ %C - รั บค าแสดงผลตั วอั กษร 1 ตั วอั กษร

%d หรื อ %D - รั บค าแสดงผลตั วเลขจํ านวนเต็ มในช วง -32,768 ถึ ง 32,767

%l หรื อ %L - รั บค าแสดงผลตั วเลขจํ านวนเต็ มในช วง -2,147,483,648 ถึ ง 2,147,483,647

%f หรื อ %F - รั บค าเพื่ อแสดงผลตั วเลขจํ านวนจริ ง (แสดงทศนิ ยม 3 หลั ก)

ตั วอย างที่ 7-1

glcd(2,0,“Hello World“); // แสดงข อความ Hello World ที ่ต ําแหน งซ ายสุ ดของบรรทั ด 2 (บรรท ัดที ่ 3)

100 F

HelloRWorld

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

ตั วอย างที่ 7-2int x=20;glcd(1,2,”Value = %d”,x); // แสดงตั วอั กษรและตั วเลขบนบรรทั ดเดี ยวกั น

// เริ่ มต นที่ คอลั มน 2 ของบรรทั ด 1 (บรรทั ดที่ 2)

100 FRow00

RRValueR=R20

RRRow02

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

Page 104: POP-BOT XT_TH

104XT

7.2.1.2 colorRGB

เป นฟ งก ชั่ นเปลี่ ยนค าสี ในรู ปแบบ RGB (แดง เขี ยว นํ้ าเงิ น) ให อยู ในรู ปของตั วเลข 16 บิ ต โดยแบ งเป นค าของสี แดง 5 บิ ต ต อด วยสี เขี ยว 6 บิ ต และป ดท ายด วยค าของสี นํ้ าเงิ น 5 บิ ต

รู ปแบบ

unsigned int colorRGB(uint red,uint green,uint blue)พารามิ เตอร

red - เป นค าของสี แดง มี ค าระหว าง 0 ถึ ง 31 ถ าค าที่ ป อนมากกว า 31 จะปรั บลดให เท ากั บ 31

green - ค าของสี เขี ยว มี ค าระหว าง 0 ถึ ง 63 ถ าค าที่ ป อนมากกว า 63 จะถู กปรั บลดให เท ากั บ 63

blue - ค าของสี นํ้ าเงิ น มี ค าระหว าง0 ถึ ง 31 ถ าค าที่ ป อนมากกว า 31 จะปรั บลดให เท ากั บ 31

ตั วอย างที่ 7-3#include <popxt.h>int colors;void setup(){

int colors;colors=colorRGB(31,0,0); // ส งค าสี 16 บิ ตของสี แดงให ตั วแปร colorsglcdFillScreen(colors); // นํ าค าไปแสดงเป นสี พื้ นของจอแสดงผล

}void loop(){}

220 F

100 F

TB6612

ATMega32U4

100

Row00

RRValueR=R20

RRRow02

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRRRow015

Page 105: POP-BOT XT_TH

XT 105

7.2.1.3 color[ ]

เป นตั วแปรอะเรย ที่ ใช กํ าหนดสี จํ านวน 8 สี ที่ เป นสี พื้ นฐาน ผู พั ฒนาโปรแกรมสามารถเรี ยกใช ตั วแปรcolor[] หรื อเรี ยกใช ชื่ อสี ตรงๆ ก็ ได

รู ปแบบ

unsigned int color[]= { GLCD_RED,GLCD_GREEN,GLCD_BLUE,GLCD_YELLOW,GLCD_BLACK,GLCD_WHITE,GLCD_SKY,GLCD_MAGENTA};

พารามิ เตอร

GLCD_RED - ใช กํ าหนดสี แดง

GLCD_GREEN - ใช กํ าหนดสี เขี ยว

GLCD_BLUE - ใช กํ าหนดสี นํ้ าเงิ น

GLCD_YELLOW - ใช กํ าหนดสี เหลื อง

GLCD_BLACK - ใช กํ าหนดสี ดํ า

GLCD_WHITE - ใช กํ าหนดสี ขาว

GLCD_SKY - ใช กํ าหนดสี ฟ า

GLCD_MAGENTA - ใช กํ าหนดสี บานเย็ น

ตั วอย าง 7-4glcdFillScreen(color[5]) // กํ าหนดให พื้ นหลั งเป นสี ขาว

ตั วอย าง 7-5glcdFillScreen(GLCD_BLUE) // กํ าหนดให พื้ นหลั งเป นสี นํ้ าเงิ น

Page 106: POP-BOT XT_TH

106XT

7.2.1.4 setTextColor

เป นการกํ าหนดค าสี ของตั วอั กษรที่ แสดงด วยฟ งก ชั่ น glcd() โดยค าตั้ งต นกํ าหนดเป นสี ขาว

รู ปแบบ

void setTextColor(unsigned int newColor)พารามิ เตอร

newColor คื อสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 7-6setTextColor(GLCD_YELLOW); // กํ าหนดให สี ของตั วอั กษรเป นสี เหลื อง

7.2.1.5 setTextBackgroundColor

เป นฟ งก ชั ่นกํ าหนดสี ของพื ้นหลั งตั วอั กษร โดยค าตั ้งต นเป นส ีดํ า ส ีของพื้ นหล ังต ัวอ ักษรจะเป นคนละส วนกั บสี ของพื้ นจอภาพ (screen background) ซึ่ งต องกํ าหนดค าผ านฟ งก ชั่ น glcdFillScreen

รู ปแบบ

void setTextBackgroundColor(unsigned int newColor)พารามิ เตอร

newColor คื อสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 7-7setTextBackgroundColor(GLCD_GREEN); // กํ าหนดให สี พื้ นหลั งตั วอั กษรเป นสี เขี ยว

220 F

100 F

TB6612

ATMega32U4

100

RRValueR=R20

RRRow02

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRR Row015

Hello World

Page 107: POP-BOT XT_TH

XT 107

7.2.1.6 glcdClear

เป นการเคล ียร หน าจอแสดงผล โดยสี ของพื ้นหลั งจะเป นสี พื ้นหล ังของตั วอั กษรล าส ุด โดยถ าไม ได ก ําหนดด วยคํ าสั่ ง setTextBackGroundColor() มาก อนหน านี้ หลั งจากทํ าคํ าสั่ ง glcdClear() แล วพื้ นหลั งจะเป นสี ดํ า

รู ปแบบ

void glcdClear()ตั วอย างที่ 7-8

glcdClear(); // เคลี ยร หน าจอแสดงผล

7.2.1.7 glcdFillScreen

เป นการเคลี ยร หน าจอแสดงผล แล วเปลี่ ยนสี พื้ นหลั งของจอแสดงผลด วยสี ที่ ระบุ

รู ปแบบ

void glcdFillScreen(unsigned int color)พารามิ เตอร

color คื อสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 7-9glcdFillScreen(GLCD_BLUE); // กํ าหนดสี พื้ นหลั งของจอภาพเป นสี นํ้ าเงิ น

Page 108: POP-BOT XT_TH

108XT

7.2.1.8 glcdMode

เป นการกํ าหนดทิ ศทางแสดงผลให ข อความหรื อภาพหน าจอหมุ นจอภาพให แสดงภาพตั้ งฉากตรงหน า(โหมด 0), หมุ นขวา 90 ศา (โหมด 1), หมุ น 180 องศาหรื อกลั บหั ว (โหมด 2) และหมุ น 270 องศา (โหมด 3)

รู ปแบบ

glcdMode(unsigned int modeset)พารามิ เตอร

modeset คื อค าทิ ศทางของการหมุ นมี ค า 0 ถึ ง 3 โดยใช แทนทิ ศทาง 0 องศา 90 องศา 180 องศา หรื อ270 องศา โดยเมื่ อเริ่ มต นค าทิ ศทางคื อ 0 องศา ทํ างานอยู ในแนวตั้ ง

ตั วอย างที่ 7-10#include <popxt.h>void setup(){

setTextSize(2); // ขนาดตั วอั กษร 2 เท า}void loop(){

glcdClear(); // เคลี ยร หน าจอglcdMode(0); // โหมด 0 องศาglcd(0,0,”POP-BOTXT”); // แสดงข อความsw_ok_press(); // รอกดสวิ ตช เข าโหมดต อไปglcdClear();glcdMode(1);glcd(0,0,”POP-BOTXT”);sw_ok_press();glcdClear();glcdMode(2);glcd(0,0,”POP-BOTXT”);sw_ok_press();glcdClear();glcdMode(3);glcd(0,0,”POP-BOTXT”);sw_ok_press();

}

Page 109: POP-BOT XT_TH

XT 109

7.2.1.9 setTextSize

เป นการกํ าหนดขนาดตั วอั กษรโดยระบุ เป นจํ านวนเท าของขนาดปกติ ค าตั้ งต นเมื่ อเริ่ มทํ างานทุ กครั้ งคื อขนาดตั วอั กษรปกติ ใช พื้ นที่ รวมระยะช องไฟคื อ 6x10 พิ กเซลต อ 1 ตั วอั กษร จึ งแสดงได 21 ตั วอั กษร 16 บรรทั ดในแนวตั้ ง

รู ปแบบ

setTextSize(unsigned int newSize)พารามิ เตอร

newSize คื อค าขนาดจํ านวนเท าของขนาดปกติ มี ค า 1 ถึ ง 16 เพื่ อให ตั วอั กษรที่ แสดงไม ล นหน าจอ

ตั วอย างที่ 7-11#include <popxt.h>void setup(){

setTextSize(1); // กํ าหนดขนาดข อความ 1 เท าsetTextColor(GLCD_GREEN); // สี ตั วอั กษรเป นสี เขี ยวglcd(0,0,”Size1”); // แสดงข อความsetTextSize(2);glcd(1,0,”Size2”); // กํ าหนดขนาดข อความ 2 เท าsetTextSize(3);glcd(2,0,”Size3”); // กํ าหนดขนาดข อความ 3 เท าsetTextSize(4);glcd(3,0,”Size4”); // กํ าหนดขนาดข อความ 4 เท า

}void loop(){}

Page 110: POP-BOT XT_TH

110XT

7.2.1.10 getTextColor

เป นคํ าสั่ งคื นค าสี ป จจุ บั นของตั วอั กษร

รู ปแบบ

unsigned int getTextColor()การคื นค า

textColor เป นค าสี แสดงอยู ในรู ปของตั วเลข 16 บิ ต ดู รู ปแบบได จากฟ งก ชั่ น colorRGB()

ตั วอย างที่ 7-12unsigned int color;color=getTextColor(); // นํ าค าสี ของตั วอั กษรเก็ บไว ที่ ตั วแปร color

7.2.1.11 getTextBackgroundColor

คื นค าสี พื้ นหลั งของตั วอั กษร

รู ปแบบ

unsigned int getTextBackgroundColor()การคื นค า

textBackgroundColor เป นค าสี แสดงอยู ในรู ปของตั วเลข 16 บิ ต ดู รู ปแบบได จากฟ งก ชั่ น colorRGB()

ตั วอย างที่ 7-13unsigned int color;color=getTextBackgroundColor(); // นํ าค าสี พื้ นหลั งของตั วอั กษรเก็ บในตั วแปร color

7.2.1.12 getTextSize

คื นค าขนาดของตั วอั กษรออกมาเป นจํ านวนเท าของค าปกติ

รู ปแบบ

unsigned int getTextSize()การคื นค า

textSize เป นค าจํ านวนเท าของขนาดตั วอั กษร

ตั วอย างที่ 7-14unsigned int textSize;textSize=getTextSize(); // นํ าค าจํ านวนเท าของขนาดของตั วอั กษรเก็ บในตั วแปร textSize

Page 111: POP-BOT XT_TH

XT 111

7.2.1.13 glcdGetMode

คื นค าของโหมดทิ ศทางการแสดงผล

รู ปแบบ

unsigned int glcdGetMode()การคื นค า

mode เป นค าของโหมดทิ ศทางการแสดงผล เป นตั วเลข 0 ถึ ง 3 เพื่ อแสดงผลในทิ ศทาง 0 องศา, หมุ น 90องศา, หมุ น 180 องศา และหมุ น 270 องศาตามลํ าดั บ

ตั วอย างที่ 7-15unsigned int Mode;Mode=glcdGetMode(); // คื นค าทิ ศทางการแสดงผลของหน าจอ GLCD

7.2.1.14 glcdPixel

เป นการพล็ อตจุ ดบนจอภาพตามพิ กั ดที่ กํ าหนด โดยอ างอิ งจอภาพขนาด 128 x 160 พิ กเซล

รู ปแบบ

void glcdPixel(unsigned int x,unsigned int y,unsigned int color)พารามิ เตอร

x คื อค าพิ กั ดในแนวนอนหรื อแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อค าพิ กั ดในแนวตั้ งหรื อแกน y มี ค าระหว าง 0 ถึ ง 159

color คื อค าของสี ที่ ต องการ เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 7-16#include <popxt.h>int i;void setup(){

for (i=0;i<128;i+=4){

glcdPixel(i,80,GLCD_RED);// พล็ อตจุ ดทุ กๆ 4 พิ กเซลในแนวแกน x กลางจอ

}for (i=0;i<160;i+=4){

glcdPixel(64,i,GLCD_RED);// พล็ อตจุ ดทุ กๆ 4 พิ กเซลในแนวแกน y กลางจอ

}}void loop(){}

Page 112: POP-BOT XT_TH

112XT

7.2.1.18 glcdRect

เป นฟ งก ชั่ นลากเส นจากพิ กั ดที่ กํ าหนดมายั งพิ กั ดปลายทาง

รู ปแบบ

void glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned intheight,unsigned int color)

พารามิ เตอร

x1 คื อ ค าตํ าแหน งเริ่ มต นของรู ปสี่ เหลี่ ยมในแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อ ค าตํ าแหน งเริ่ มต นของรู ปสี่ เหลี่ ยมในแกน y มี ค าระหว าง 0 ถึ ง 159

width คื อ ค าความกว างของรู ปสี่ เหลี่ ยม (แนวนอน) มี ค าระหว าง 1 ถึ ง 128

height คื อ ค าความสู งของรู ปสี่ เหลี่ ยม (แนวตั้ ง) มี ค าระหว าง 1 ถึ ง 158

color คื อ สี ของเส น เป นค าตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[] ก็ ได

ตั วอย างที่ 7-17#include <popxt.h>void setup(){

glcdRect(32,40,64,80,GLCD_RED); // วาดรู ปสี่ เหลี่ ยมเส นสี แดง ขนาด 64 x 80 พิ กเซล}void loop(){}

Page 113: POP-BOT XT_TH

XT 113

7.2.1.19 glcdFillRect

เป นการระบายสี พื้ นของรู ปสี่ เหลี่ ยม โดยกํ าหนดจุ ดเริ่ มต นและความกว างยาวของรู ปสี่ เหลี่ ยมที่ ต องการฟ งก ชั่ นน้ี เป นการสร างรู ปสี่ เหลี่ ยมที่ มี สี พื้ นแต ไม มี เส นกรอบ ในขณะที่ ฟ งก ชั่ น glcdRect เป นการวาดรู ปกรอบสี่ เหลี่ ยมที่ กํ าหนดสี ของเส นกรอบได แต ภายในกรอบไม มี สี

รู ปแบบ

void glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned intheight,unsigned int color)

พารามิ เตอร

x1 คื อ ค าตํ าแหน งเริ่ มต นของรู ปสี่ เหลี่ ยมในแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อ ค าตํ าแหน งเริ่ มต นของรู ปสี่ เหลี่ ยมในแกน y มี ค าระหว าง 0 ถึ ง 159

width คื อ ค าความกว างของรู ปสี่ เหลี่ ยม (แนวนอน) มี ค าระหว าง 1 ถึ ง 128

height คื อ ค าความสู งของรู ปสี่ เหลี่ ยม (แนวตั้ ง) มี ค าระหว าง 1 ถึ ง 158

color คื อ สี ของเส น เป นค าตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[] ก็ ได

ตั วอย างที่ 7-18#include <popxt.h>void setup(){

glcdFillRect(32,40,64,80,GLCD_RED); // สร างภาพสี่ เหลี่ ยมพื้ นสี แดง ขนาด 64 x 80 พิ กเซล}void loop(){}

Page 114: POP-BOT XT_TH

114XT

7.2.1.20 glcdLine

เป นฟ งก ชั่ นหน วงเวลาโดยประมาณภายในโปรแกรมในหน วยมิ ลลิ วิ นาที

รู ปแบบ

void glcdLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned inty2,unsigned int color)

พารามิ เตอร

x1 คื อค าตํ าแหน งเริ่ มต นของเส นบนแกน x มี ค าระหว าง 0 ถึ ง 127

y1 คื อค าตํ าแหน งเริ่ มต นของเส นบนแกน y มี ค าระหว าง 0 ถึ ง 159

x2 คื อค าตํ าแหน งสิ้ นสุ ดของเส นบนแกน x มี ค าระหว าง 0 ถึ ง 127

y2 คื อค าตํ าแหน งสิ้ นสุ ดของเส นบนแกน y มี ค าระหว าง 0 ถึ ง 159

color คื อ ค าสี ของเส น เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[] ก็ ได

ตั วอย างที่ 7-19#include <popxt.h>void setup(){

glcdLine(0,0,127,159,GLCD_RED); // ลากเส นส ีแดงทแยงม ุมจากด านบนซ ายลงมาด านล างขวา}void loop(){}

Page 115: POP-BOT XT_TH

XT 115

7.2.1.21 glcdCircle

เป นฟ งก ชั่ นวาดเส นรู ปวงกลมจากการกํ าหนดจุ ดกึ่ งกลางของวงกลมและความยาวของรั ศมี

รู ปแบบ

void glcdCircle(unsgined int x, unsgined int y, unsgined int radius,unsgined int color)พารามิ เตอร

x คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน y มี ค าระหว าง 0 ถึ ง 159

radius คื อ ค ารั ศมี ของวงกลม

color คื อ ค าสี ของเส น เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[] ก็ ได

ตั วอย างที่ 7-20#include <popxt.h>void setup(){

glcdCircle(32,120,31,GLCD_MAGENTA); // สร างเส นวงกลมสี บานเย็ น มี รั ศมี 31 พิ กเซล}void loop(){}

Page 116: POP-BOT XT_TH

116XT

7.2.1.22 glcdFillCircle

เป นฟ งก ชั ่นวาดร ูปวงกลมที ่มี ส ีพื ้นจากการก ําหนดจุ ดศ ูนย กลางของวงกลมและความยาวของรั ศมี ฟ งก ชั ่นนี้ เป นการสร างรู ปวงกลมที่ ม ีสี พื้ นแต ไม มี เส นกรอบ ในขณะที่ ฟ งก ชั่ น glcdCircle เป นการวาดรู ปวงกลมที่ กํ าหนดสี ของเส นรอบวงได แต ภายในวงกลมไม มี สี

รู ปแบบ

void glcdFillCircle(unsigned int x, unsigned int y, unsigned int radius,unsigned int color)พารามิ เตอร

x คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน x มี ค าระหว าง 0 ถึ ง 127

y คื อ พิ กั ดจุ ดศู นย กลางของวงกลมบนแกน y มี ค าระหว าง 0 ถึ ง 159

radius คื อ ค ารั ศมี ของวงกลม

color คื อ ค าสี ของพื้ นวงกลม เป นตั วเลข 16 บิ ต หรื อเป นค าตั วแปรที่ กํ าหนดค าไว แล วจากตั วแปร color[]

ตั วอย างที่ 7-21#include <popxt.h>void setup(){

glcdFillCircle(32,120,31,GLCD_MAGENTA); // สร างรู ปวงกลมพื้ นสี บานเย็ น รั ศมี 31 พิ กเซล}void loop(){}

Page 117: POP-BOT XT_TH

XT 117

7.2.1.23 glcdArc

เป นฟ งก ชั่ นวาดส วนโค งของวงกลม โดยระบุ ตํ าแหน งจุ ดก่ึ งกลาง รั ศมี ตํ าแหน งจุ ดเริ่ ม จุ ดสิ้ นสุ ดและสี ของเส น

รู ปแบบ

void glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,intend_angle,uint color)

พารามิ เตอร

x คื อตํ าแหน งจุ ดกึ่ งกลางในแนวแกน x

y คื อตํ าแหน งจุ ดกึ่ งกลางในแนวแกน y

r คื อรั ศมี ของเส นโค ง

start_angle คื อตํ าแหน งมุ มของจุ ดเริ่ มต นของวงกลม

end_angle คื อตํ าแหน งมุ มจุ ดสิ้ นสุ ดของวงกลม

color คื อสี ของเส นวงกลม

ตั วอย างที่ 7-22#include <popxt.h>void setup(){

glcdArc(48,80,16,30,150,GLCD_RED);glcdCircle(48,75,5,GLCD_BLUE);glcdCircle(80,75,5,GLCD_BLUE);glcdArc(80,80,16,30,150,GLCD_RED);glcdFillCircle(64,90,7,GLCD_GREEN);glcdArc(64,100,30,220,320,GLCD_RED);

}void loop(){}

Page 118: POP-BOT XT_TH

118XT

7.2.2 ฟ งก ชั่ นเกี่ ยวกั บเวลา7.2.2.1 sleep และ delay

เป นฟ งก ชั่ นหน วงเวลาโดยประมาณภายในโปรแกรมในหน วยมิ ลลิ วิ นาที

รู ปแบบvoid sleep(unsigned int ms)void delay(unsigned int ms)

พารามิ เตอร ms - กํ าหนดค าเวลาที่ ต องการหน วงในหน วยมิ ลลิ วิ นาที มี ค า 0 ถึ ง 65,535

ตั วอย างที่ 7-23sleep(20); // หน วงเวลาประมาณ 20 มิ ลลิ วิ นาที delay(1000); // หน วงเวลาประมาณ 1 วิ นาที

7.2.2.2 delay_usเป นฟ งก ชั่ นหน วงเวลาโดยประมาณภายในโปรแกรมในหน วยไมโครวิ นาที

รู ปแบบvoid delay_us(unsigned int us)

พารามิ เตอร us - กํ าหนดค าเวลาที่ ต องการหน วงในหน วยไมโครวิ นาที มี ค า 0 ถึ ง 65,535

ตั วอย างที่ 7-24

delay_us(100); // หน วงเวลาประมาณ 100 ไมโครวิ นาที

7.2.3 ฟ งก ชั่ นเกี่ ยวกั บเสี ยง7.2.3.1 beep

เป นฟ งก ชั ่นก ําเน ิดเส ียง “ติ ๊ด” ม ีความถี ่ 500Hz นาน 100 ม ิลล ิว ินาท ี เพื ่อข ับออกล ําโพงเป ยโซของ POP-BOT XT

รู ปแบบvoid beep()

ตั วอย างที่ 7-25beep(); // กํ าเนิ ดเสี ยงความถี่ 500Hz นาน 100 มิ ลลิ วิ นาที

7.2.3.2 soundเป นฟ งก ชั่ นกํ าเนิ ดสั ญญาณเสี ยงที่ กํ าหนดความถี่ และระยะเวลาในการกํ าเนิ ดสั ญญาณได

รู ปแบบvoid sound(int freq,int time)

พารามิ เตอร freq - กํ าหนดความถี่ สั ญญาณเสี ยง มี ค า 0 ถึ ง 32,767time - กํ าหนดค าเวลาในการกํ าเนิ ดสั ญญาณเสี ยงในหน วย 1 มิ ลลิ วิ นาที มี ค า 0 ถึ ง 32,767

ตั วอย างที่ 7-26

sound(1200,500); // กํ าเนิ ดสั ญญาณเสี ยงความถี่ 1200Hz นาน 500 มิ ลลิ วิ นาที

Page 119: POP-BOT XT_TH

XT 119

7.2.4 ฟ งก ชั่ นเกี่ ยวกั บพอร ตอิ นพุ ตเอาต พุ ต

7.2.4.1 inเป นฟ งก ชั่ นอ านค าสถานะลอจิ กของพอร ตที่ กํ าหนด เป นหน่ึ งในฟ งก ชั่ นการอ านและเขี ยนค ากั บพอร ต

อิ นพุ ตเอาต พุ ตของหุ นยนต POP-BOT XT

รู ปแบบ

char in(x)พารามิ เตอร

x - กํ าหนดขาพอร ตที่ ต องการอ านค า

การคื นค า

เป น 0 หรื อ 1

ตั วอย างที่ 7-27char x; // ประกาศตั วแปร x เพื่ อเก็ บค าผลลั พธ จาการอ านค าระดั บสั ญญาณx = in(2); // อ านค าดิ จิ ตอลจากพอร ตดิ จิ ตอล 2 (Di2) มาเก็ บไว ที่ ตั วแปร x

7.2.4.2 outเป นฟ งก ชั่ นกํ าหนดระดั บสั ญญาณหรื อข อมู ลดิ จิ ตอลไปยั งพอร ตที่ กํ าหนด

รู ปแบบ

out(char _bit,char _dat)

พารามิ เตอร

_bit - กํ าหนดขาพอร ตที่ ต องการ

ตั วอย างที่ 7-28out(4,1); // กํ าหนดให ขาพอร ต 4/A6 เป นเอาต พุ ตดิ จิ ตอลและมี ค าเป น “1”out(6,0); // กํ าหนดให ขาพอร ต 6/A7 เป นเอาต พุ ตดิ จิ ตอลและมี ค าเป น “0”

Page 120: POP-BOT XT_TH

120XT

7.2.5 ฟ งก ชั ่นเกี่ ยวกั บการติ ดต อก ับตั วตรวจจั บ

7.2.5.1 analog

เป นฟ งก ชั่ นอ านค าข อมู ลดิ จิ ตอลที่ ได จากการแปลงสั ญญาณอะนาลอกของไมโครคอนโทรลเลอร ที่ ขาพอร ต A0 ถึ ง A7 ซึ่ งใช ในการเชื่ อมต อกั บตั วตรวจจั บที่ ให ผลการทํ างานในรู ปแรงดั นไฟฟ าในย าน 0 ถึ ง +5V

รู ปแบบ

unsigned int analog(unsigned char channel)พารามิ เตอร

channel - กํ าหนดช องอิ นพุ ตอะนาลอกที่ ต องการ มี ค า 0 ถึ ง 7 ซึ่ งตรงกั บขาพอร ต A0 ถึ ง A7

การคื นค า

เป นข อมู ลที่ ได จากการแปลงสั ญญาณของโมดู ลแปลงสั ญญาณอะนาลอกเป นดิ จิ ตอลภายในไมโครคอนโทรลเลอร จากช องอิ นพุ ตที่ กํ าหนด โดยข อมู ลมี ความละเอี ยด 10 บิ ต ดั งนั้ นค าที่ เป นไปได คื อ 0 ถึ ง 1,023

7.2.5.2 knob

เป นฟ งก ชั่ นอ านค าข อมู ลจากตั วต านทานปรั บค าได KNOB บนแผงวงจร POP-XT มี การทํ างานเหมื อนกั บคํ าสั่ ง analog(8) แต ค าที่ อ านได มี ค าในช วง 80 ถึ ง 1023 เนื่ องจากตั วต านทานปรั บค าได นี้ เชื่ อมต อกั บสวิ ตช OKที่ ติ ดตั้ งบนแผงวงจร POP-XT ด วย

รู ปแบบ

unsigned int knob()การคื นค า

ค าที่ อ านได จากตั วต านทานปรั บค าได KNOB บนแผงวงจร POP-XT มี ค าระหว าง 80 ถึ ง 1023

ตั วอย างที่ 7-29int val=0; // กํ าหนดค าตั วแปรสํ าหรั บเก็ บค าอะนาลอกval=knob(); // อ านค าจากตั วต านทานปรั บค าได KNOB บนแผงวงจร POP-XT เก็ บในตั วแปร val

7.2.5.3 sw_ok()

เป นฟ งก ชั่ นตรวจสอบสถานะสวิ ตช OK บนแผงวงจร POP-XT โดยให สถานะ “เป นจริ ง” เมื่ อมี การกดสวิ ตช และ “เป นเท็ จ” เมื่ อไม มี การกดสวิ ตช

รู ปแบบ

unsigned char sw_ok()การคื นค า

1 (เป นจริ ง) เมื่ อมี การกดสวิ ตช

0 (เป นเท็ จ) เมื่ อไม มี การกดสวิ ตช

หมายเหตุ การกดสวิ ตช OK มี ผลทํ าให ค าที่ อ านได จาก Knob เป น 0 ด วย

Page 121: POP-BOT XT_TH

XT 121

ตั วอย างที่ 7-30if(sw_ok()){

beep(); // เมื่ อกดสวิ ตช OK จะมี เสี ยง “ติ้ ด” ดั งออกลํ าโพง}

7.2.5.4 sw_ok_press()

เป นฟ งก ชั่ นวนตรวจสอบการกดสวิ ตช OK บนแผงวงจร POP-XT ต องรอจนกระทั่ งสวิ ตช ถู กปล อยหลั งจากการกดสวิ ตช จึ งจะผ านฟ งก ชั่ นน้ี ไปกระทํ าคํ าสั่ งอื่ นๆ

ตั วอย างที่ 7-31........sw_ok_press(); // รอจนกระทั้ งเกิ ดกดสวิ ตช OK......

7.2.6 ฟ งก ชั่ นเกี่ ยวกั บการขั บมอเตอร ไฟตรง

7.2.6.1 motor

เป นฟ งก ชั่ นขั บเคลื่ อนมอเตอร ไฟตรง

รู ปแบบ

void motor(char _channel,int _power)พารามิ เตอร

_channel - กํ าหนดช องเอาต พุ ตมอเตอร ไฟตรงของหุ นยนต POP-BOT XT มี ค า 1 และ 2

_power - กํ าหนดกํ าลั งขั บมอเตอร มี ค าในช วง -100 ถึ ง 100ถ ากํ าหนดค า _power เป นบวก (1 ถึ ง 100) ทํ าให มอเตอร หมุ นไปในทิ ศทางหนึ่ งถ ากํ าหนดค า _power เป นลบ (-1 ถึ ง -100) มอเตอร จะถู กขั บให หมุ นไปในทิ ศทางตรงข ามถ ากํ าหนดค า _power เป น 0 มอเตอร หยุ ดหมุ น ไม แนะนํ าให กํ าหนดค าเป น 0 หากต องการให มอเตอร

หยุ ดหมุ นควรเรี ยกใช ฟ งก ชั่ น motor_stop

ตั วอย างที่ 7-32motor(1,60); // ขั บมอเตอร ช อง A ด วยกํ าลั ง 60% ของกํ าลั งสู งสุ ดmotor(1,-60); // ข ับมอเตอร ช อง A ด วยก ําล ัง 60% ม ีท ิศทางการหม ุนตรงข ามก ับค ําสั ่งก อนหน า

ตั วอย างที่ 7-33

motor(2,100); // ขั บมอเตอร ช อง B ด วยกํ าลั ง 100% อั นเป นค ากํ าลั งสู งสุ ด

Page 122: POP-BOT XT_TH

122XT

7.2.6.2 motor_stop

เป นฟ งก ชั่ นหยุ ดขั บมอเตอร

รู ปแบบ

void motor_stop(char _channel)พารามิ เตอร

_channel - ก ําหนดช องเอาต พ ุตมอเตอร ไฟตรง ม ีค า 1, 2 และ ALL โดย ALLเป นการเล ือกให มอเตอร ทั ้ง 2ช องหย ุดท ํางานพร อมก ัน

ตั วอย างที่ 7-34motor_stop(1); // หยุ ดขั บมอเตอร ช อง Amotor_stop(2); // หยุ ดขั บมอเตอร ช อง B

ตั วอย างที่ 7-35

motor_stop(ALL); // มอเตอร ทั้ ง 2 ช องหยุ ดทํ างานพร อมกั น

7.2.6.3 fd

มาจากคํ าว า forward เป นฟ งก ชั่ นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ไปข างหน า

รู ปแบบ

fd(unsigned int speed)พารามิ เตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 7-36fd(60); // สั่ งให หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ ว 60 เปอร เซ็ นต

7.2.6.4 fd2

มาจากคํ าว า forward2 เป นฟ งก ชั่ นที่ กํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ไปข างหน าแบบกํ าหนดความเร็ วมอเตอร แยกอิ สระ

รู ปแบบ

fd2(unsigned int speed1 ,unsigned int speed2)พารามิ เตอร

speed1 คื อ ค าความเร็ วของมอเตอร A มี ค าตั้ งแต 0 ถึ ง 100%

speed2 คื อ ค าความเร็ วของมอเตอร B มี ค าตั้ งแต 0 ถึ ง 100%

ตั วอย างที่ 7-37fd2(30,80); // ควบค ุมให หุ นยนต เคลื ่อนที ่เป นวงกลม เนื ่องจากมอเตอร B หม ุนเร ็วกว ามอเตอร A มาก

Page 123: POP-BOT XT_TH

XT 123

7.2.6.5 bk

มาจากคํ าว า backward เป นฟ งก ชั นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั ง

รู ปแบบ

bk(unsigned int speed)พารามิ เตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 7-38bk(90); // กํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั งด วยความเร็ ว 90 เปอร เซ็ นต

7.2.6.6 bk2มาจากคํ าว า backward2 เป นฟ งก ชั่ นก ําหนดให หุ นยนต POP-BOT XT เคลื ่อนที่ ถอยหลั งแบบกํ าหนดความ

เร็ วมอเตอร อิ สระ

รู ปแบบ

bk2(unsigned int speed1 ,unsigned int speed2)พารามิ เตอร

speed1 คื อเปอร เซ็ นต ความเร็ วของมอเตอร A มี ค าตั้ งแต 0 ถึ ง 100speed2 คื อเปอร เซ็ นต ความเร็ วของมอเตอร B มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 7-39bk2(80,80); // เป นคํ าสั่ งเคลื่ อนถอยหลั งตรงด วยความเร็ วเท ากั น ซึ่ งทํ างานเหมื อนกั บคํ าสั่ ง bk()

ทั ้งฟ งก ชั ่น fd2() และ bk2() ม ีไว เพื ่อปร ับแต งการท ํางานของมอเตอร ไฟตรงทั ้ง 2 ต ัวของหุ นยนต POP-BOTXT ซึ ่งอาจแตกต างก ันด านความเร ็วในการหม ุน ให ท ํางานได อย างใกล เค ียงก ันด วยการปร ับค า speed1 และ speed2

7.2.6.7 tl และ tr

มาจากค ําว า turn left และ turn right หร ือเลี ้ยวซ ายและเลี ้ยวขวานั ่นเอง โดยการเลี ้ยวของฟ งก ชั ่นทั ้งสองนี ้จะก ําหนดให มอเตอร ต ัวใดต ัวหนึ ่งของหุ นยนต หย ุดอยู ก ับที ่ จ ุดหม ุนของหุ นยนต จะอยู ที ่ล อของมอเตอร ที ่หย ุดอยู ก ับที ่

รู ปแบบ

tl(unsigned int speed) และ tr(unsigned int speed)พารามิ เตอร

speed คื อ ค าความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100 เปอร เซ็ นต

ตั วอย างที่ 7-40tl(60); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 60 เปอร เซ็ นต tr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100 เปอร เซ็ นต

Page 124: POP-BOT XT_TH

124XT

7.2.6.8 sl และ sr

มาจากคํ าว า spin left และ spin right หรื อหมุ นตั วทางซ ายและทางขวา ในฟ งก ชั่ นน้ี จะกํ าหนดให มอเตอร ไฟตรงทั้ งสองตั วของหุ นยนต หมุ นในทิ ศทางตรงกั นข าม จุ ดหมุ นของการเลี้ ยวจึ งอยู ที่ กึ่ งกลางของหุ นยนต

รู ปแบบ

sl(unsigned int speed) และ sr(unsigned int speed)พารามิ เตอร

speed คื อ ค าความเร็ วของมอเตอร มี ค า 0 ถึ ง 100%

ตั วอย างที่ 7-41sl(70); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 70%sr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100%

7.2.6.9 ao

มาจากคํ าว า all motor off เป นฟ งก ชั่ นหยุ ดการทํ างานของมอเตอร ทั้ งสองตั วพร อมกั นเหมื อนกั บการเรี ยกใช ฟ งก ชั่ น motor_stop(ALL);

รู ปแบบ

ao()ตั วอย างที่ 7-42

void setup(){

fd(100); // หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ วสู งสุ ดsleep(2000); // เป นเวลา 2 วิ นาที ao(); // กํ าหนดให มอเตอร หยุ ดทํ างาน หุ นยนต จะหยุ ดเคลื่ อนที่ ทั นที

}

7.2.7 ฟ งก ชั่ นเกี่ ยวกั บการขั บเซอร โวมอเตอร

ในไฟล ไลบรารี นี ้ม ี 1 ฟ งก ชั ่นคื อ servo เป นฟ งก ชั ่นกํ าหนดต ําแหน งแกนหม ุนของเซอร โวมอเตอร ควบค ุมได 3 ตั ว

รู ปแบบvoid servo(unsigned char _ch, int _pos)

พารามิ เตอร _ch - ช องเอาต พุ ตเซอร โวมอเตอร มี ค า 8 ถึ ง 13_pos - กํ าหนดตํ าแหน งแกนหมุ นของเซอร โวมอเตอร มี ค าในช วง 0 ถึ ง 180 และ -1

ถ ากํ าหนดเป น -1 หมายถึ ง ไม ใช งานเซอร โวมอเตอร ที่ ช องนั้ นๆ

Page 125: POP-BOT XT_TH

XT 125

7.2.8 ฟ งก ชั่ นเกี่ ยวกั บการสื่ อสารข อมู ลอนุ กรม

เป นไฟล ไลบรารี สนั บสนุ นชุ ดคํ าสั่ งเกี่ ยวกั บการรั บส งข อมู ลผ านโมดู ลสื่ อสารข อมู ลอนุ กรม (UART)

7.2.8.1 การเช่ื อมต อทางฮาร ดแวร เมื่ อต องการใช งานช อง UART0

ให ต อสายจากจุ ดต อพอร ต USB บนแผงวงจร POP-XT (เป นจุ ดต อเดี ยวกั บที่ ใช ในการอั ปโหลด) เข ากั บพอร ต USB ของคอมพิ วเตอร

เมื่ อต องการใช งานช อง UART1

ต อสายสั ญญาณเข ากั บจุ ดต อ RXD1 (ขาพอร ต 2) และ TXD1 (ขาพอร ต 3)

7.2.8.2 uartเป นฟ งก ชั่ นสํ าหรั บส งข อมู ลสายอั กขระออกจากโมดู ล UART0 มี อั ตราบอดเริ่ มต นที่ 4,800 บิ ตต อวิ นาที

รู ปแบบvoid uart(char *p,...)

พารามิ เตอร

p - รั บรหั สของกลุ มข อความที่ ต องการส งออกจากภาคส งของโมดู ล UART0 โดยสามารถกํ าหนดรู ปแบบการแทรกสั ญลั กษณ พิ เศษเพื่ อใช ร วมในการแสดงผลได ดั งนี้

รหั สบั งคั บ การทํ างาน

%c หรื อ %C แสดงผลตั วอั กษร 1 ตั ว

%d หรื อ %D แสดงผลตั วเลขฐานสิ บช วงตั้ งแต -32,768 ถึ ง +32,767

%l หรื อ %L แสดงผลตั วเลขฐานสิ บช วงตั้ งแต -2,147,483,648 ถึ ง +2,147,483,647

%f หรื อ %F แสดงผลข อมู ลแบบจํ านวนจริ ง(แสดงทศนิ ยม 3 หลั ก)

\r กํ าหนดให ข อความชิ ดไปทางด านซ ายของบรรทั ด

\n กํ าหนดให ข อความขึ้ นบรรทั ดใหม

7.2.8.3 uart_set_baudเป นฟ งก ชั่ นกํ าหนดอั ตราบอดในการสื่ อสารของโมดู ล UART0 กั บคอมพิ วเตอร

รู ปแบบvoid uart_set_baud(unsigned int baud)

พารามิ เตอร

baud - อั ตราบอดในการสื่ อสารของโมดู ล UART0 กั บคอมพิ วเตอร มี ค า 2400 ถึ ง 115,200

ตั วอย างที่ 7-43uart_set_baud(4800); // กํ าหนดอั ตราบอดในการสื่ อสารข อมู ลเป น 4,800 บิ ตต อวิ นาที

Page 126: POP-BOT XT_TH

126XT

7.2.8.4 uart_availableเป นฟ งก ชั่ นตรวจสอบการรั บข อมู ลเข ามาของโมดู ล UART0 เมื่ อติ ดต อกั บคอมพิ วเตอร

รู ปแบบunsigned char uart_available(void)

การคื นค า- เป น “0” เมื่ อยั งไม มี ข อมู ลเข ามา- มากกว า 0 เมื่ อมี ข อมู ลเข ามา โดยมี ค าเท ากั บจํ านวนของอั กขระที่ ได รั บ

ตั วอย างที่ 7-44char x =uart_available();

// ตรวจสอบว า มี ข อมู ลเข ามาทางภาครั บของโมดู ล UART0 หรื อไม ถ า x มี ค ามากกว า 0 แสดงว า// มี ข อมู ลเข ามายั งภาครั บแล ว ควรอ านข อมู ลออกด วยฟ งก ชั่ น uart_getkey ในลํ าดั บถั ดไปทั นที

7.2.8.5 uart_getkeyเป นฟ งก ชั่ นอ านข อมู ลจากบั ฟเฟอร ตั วรั บของโมดู ล UART0

รู ปแบบ

char uart_getkey(void)การคื นค า

- เป น “0” เมื่ อไม มี การรั บอั กขระใดๆ เข ามายั งวงจรภาครั บของโมดู ล UART- เป นค าของอั กขระที่ รั บได ในรู ปแบบของรหั สแอสกี้

ตั วอย างที่ 7-45#include <popxt.h> // เรี ยกใช ฟ งก ชั่ นพื้ นฐานvoid setup(){

glcdClear(); // ล างจอภาพsetTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcdMode(1); // เลื อกแสดงผลในแนวนอน

}void loop() // ลู ปการทํ างานหลั ก{

if(uart_available()) // ตรวจสอบว ามี ข อมู ลเข ามาหรื อไม {

if(uart_getkey()==’a’) // ตรวจจั บการกดคี ย a ว า ถู กกดหรื อไม {

glcd(1,0,“Key a Active!”); // แสดงข อความเพื่ อตอบสนองต อการตรวจพบว ามี การคี ย asleep(1000); // หน วงเวลาแสดงข อความประมาณ 1 วิ นาที

}else{

glcdClear; // เคลี ยร ข อความที่ จอแสดงผล}

}}

Page 127: POP-BOT XT_TH

XT 127

เมื่ อรั นโปรแกรมนี้ ต องเป ดหน าต าง Serial Monitor ของ Arduino1.0 แล วเลื อกการป ดท ายข อความเป นแบบNo line ending อั ตราบอด 115200 และคลิ กเพ่ื อปลดเครื่ องหมายใดๆ ที่ ช อง Autoscroll จากนั้ นพิ มพ a ที่ ช องส งข อม ูล แล วคลิ กปุ ม Send เพื่ อส งข อมู ลจากคอมพิ วเตอร ไปยั งแผงวงจรควบคุ ม POP-XT ผ านทางพอร ต USB ที่ ถู กก ําหนดให ทํ างานเป นพอร ตอนุ กรมเสมื อนหรื อ USB Serial port

เมื่ อแผงวงจร POP-XT ได รั บตั วอั กษร a ก็ จะแสดงข อความ Key a Active! บนจอแสดงผล

หมายเหตุ เมื ่อเร ียกใช ฟ งก ชั ่น uart เพื ่อส งข อม ูลออกทางโมด ูลพอร ตอน ุกรมหร ือ UART และ uart_getkey เพื ่อตรวจจ ับอ ักขระใดๆ นั ้น อ ัตราบอดจะถ ูกกํ าหนดเป น 115,200 บ ิตต อว ินาท ี ข อม ูล 8 บ ิต และไม ม ีการตรวจสอบพาร ิตี ้โดยอ ัตโนม ัต ิ และเป นค าตั ้งต น เพื ่อลดความซ ับซ อนในการเข ียนโปรแกรมลง หากต องการเปลี ่ยนอ ัตราบอดต องใช uart_set_baudอย างไรก ็ตาม ต องค ําน ึงด วยว า เมื ่ออ ัตราบอดส ูงขึ ้นอาจส งผลกระทบต อความถ ูกต องในการสื ่อสารข อม ูล

Page 128: POP-BOT XT_TH

128XT

7.2.8.6 uart1เป นฟ งก ชั ่นส งข อม ูลสายอ ักขระออกทางภาคส งของโมด ูล UART1 ม ีอ ัตราบอดเริ ่มต นที ่ 9,600 บ ิตต อว ินาท ี

รู ปแบบvoid uart1(char *p,...)

พารามิ เตอร

p - รั บรหั สของกลุ มข อความที่ ต องการส งออกจากภาคส งของโมดู ล UART1 โดยสามารถกํ าหนดรู ปแบบการแทรกสั ญลั กษณ พิ เศษเพื่ อใช ร วมในการแสดงผลเหมื อนกั บฟ งก ชั่ น uart

7.2.8.7 uart1_set_baudเป นฟ งก ชั่ นกํ าหนดอั ตราบอดในการสื่ อสารของโมดู ล UART1 กั บคอมพิ วเตอร

รู ปแบบvoid uart1_set_baud(unsigned int baud)

พารามิ เตอร

baud - กํ าหนดค าอั ตราบอดในการสื่ อสารของโมดู ล UART1 มี ค า 2400 ถึ ง 115,200

ตั วอย างที่ 7-46

uart1_set_baud(19200); // กํ าหนดอั ตราบอดในการสื่ อสารเป น 19,200 บิ ตต อวิ นาที

7.2.8.8 uart1_availableเป นฟ งก ชั่ นตรวจสอบการรั บข อมู ลเข ามาของโมดู ล UART1 เมื่ อติ ดต อกั บคอมพิ วเตอร

รู ปแบบunsigned char uart1_available(void)

การคื นค า- เป น 0 เมื่ อไม มี ข อมู ลเข ามา- มากกว า 0 โดยมี ค าเท ากั บจํ านวนของอั กขระที่ ได รั บ

ตั วอย างที่ 7-47char x =uart1_available();// ตรวจสอบว ามี ข อมู ลเข ามาทางภาครั บของโมดู ล UART1 หรื อไม // ถ า x มี ค ามากกว า 0 แสดงว ามี ข อมู ลเข ามาแล ว ควรอ านออกไปด วยฟ งก ชั่ น uart1_getkey ทั นที

7.2.8.9 uart1_getkeyเป นฟ งก ชั่ นอ านข อมู ลจากบั ฟเฟอร ตั วรั บของโมดู ล UART1

รู ปแบบ

char uart1_getkey(void)การคื นค า

- เป น 0 เมื่ อยั งไม มี การรั บอั กขระใดๆ- เป นค าของอั กขระที่ รั บได ในรู ปแบบของรหั สแอสกี้

Page 129: POP-BOT XT_TH

XT 129

7.3 ไลบราร ีเพิ ่มเต ิมส ําหร ับใช งาน GP2D120 โมดู ลว ัดระยะทางด วยแสงอ ินฟราเรดนอกจากไฟล ไลบรารี popbot.h ซึ่ งเป นไลบรารี หลั กของการเขี ยนโปรแกรมเพื่ อควบคุ มการทํ างานของ

หุ นยนต POP-BOT XT ยั งมี ไฟล ไลบรารี สํ าหรั บติ ดต อกั บตั วตรวจจั บหน าที่ พิ เศษอื่ นๆ ของหุ นยนต POP-BOT XTที่ มิ ได รวมไว ในไฟล ไลบรารี popxt.h ดั งนั้ นเมื่ อต องการใช งานจึ งต องผนวกเพิ่ มเติ มไว ในตอนต นของโปรแกรม

สํ าหรั บตั วตรวจจั บแบบพิ เศษที่ มี ในชุ ดหุ นยนต POP-BOT XT มี อยู 1 ตั วคื อ โมดู ล GP2D120 อั นเป นโม

ดู ล ตรวจจั บและวั ดระยะทางด วยแสงอิ นฟราเรด ไฟล ไลบรารี สํ าหรั บใช งาน GP2D120 คื อ gp2d120_lib.h

ไลบรารี gp2d120_lib.h ม ีฟ งก ชั ่นสนั บสนุ นการทํ างานก ับ GP2D120 โมดู ลตรวจจั บและว ัดระยะทางด วยแสงอิ นฟราเรด ก อนเรี ยกใช งานฟ งก ชั่ นภายในไลบรารี นี้ จะต องผนวกไฟล ไลบรารี ไว ในตอนต นของโปรแกรมด วยคํ าสั่ ง

#include <gp2d120_lib.h>

เนื่ องจากโมดู ล GP2D120 ให ผลการทํ างานเป นแรงดั นไฟตรงที่ สั มพั นธ กั บระยะทางที่ ตรวจวั ดได ดั งนั้ นในการใช งานผู พั ฒนาจึ งต องต อโมดู ลตรวจจั บนี้ เข ากั บอิ นพุ ตสั ญญาณอะนาลอกใดๆ ของ POP-BOT XT นั่ นคื อพอร ต A0 ถึ ง A7

7.3.1 getdist

เป นฟ งก ชั่ นอ านค าระยะทางที่ วั ดได จากโมดู ลวั ดระยะทางด วยแสงอิ นฟราเรด GP2D120

รู ปแบบ

unsigned int getdist(char adc_ch)

พารามิ เตอร

adc_ch ทํ าหน าที่ รั บการกํ าหนดช องอะนาลอกที่ ใช งานตั้ งแต 0 ถึ ง 7

การคื นค า

ระยะทางในหน วยเซนติ เมตร

ตั วอย างที่ 7-48

dist = getdist(3); // อ านค าระยะทางจาก GP2D120 ที่ ต อกั บพอร ต A3

Page 130: POP-BOT XT_TH

130XT

Page 131: POP-BOT XT_TH

XT 131

XT

ในบทนี้ นํ าเสนอการเขี ยนโปรแกรมเพื่ อขั บเคลื่ อนหุ นยนต POP-BOT XT โดยหั วใจหลั กคื อ การเขี ยนโปรแกรมเพื ่อควบค ุมให แผงวงจร POP-XT ส งส ัญญาณไปย ังวงจรขั บมอเตอร ซึ ่งใช ไอซี เบอร TB6612 เพื ่อข ับให มอเตอร หม ุนไปในท ิศทางและด วยความเร ็วตามที ่ต องการ

8.1 ไมโครคอนโทรลเลอร กั บการขั บมอเตอร ไฟตรงการใช งานไมโครคอนโทรลเลอร เพื ่อข ับโหลดกระแสส ูงอย างมอเตอร ม ีว ิธ ีการควบค ุมอย างมากมาย ตั ้งแต

ควบค ุมให หม ุนหร ือหย ุดหม ุน, ควบค ุมการล ็อกหร ือปล อยแกนหม ุน, ควบค ุมท ิศทางการหม ุน และควบค ุมความเร ็วในการหม ุน ซึ ่งแต ละว ิธ ีจะใช อ ุปกรณ และว ิธ ีการที ่แตกต างก ัน แต สิ ่งหนึ ่งที ่จ ําเป นอย างยิ ่งค ือ วงจรข ับมอเตอร (motordriver) ทั ้งนี ้เนื ่องจากไมโครคอนโทรลเลอร ม ีความสามารถในการจ ายกระแสที ่จ ําก ัดและค อนข างตํ ่าค ือ 20mA (ในกรณ ีใช ไมโครคอนโทรลเลอร ATmega32U4) ในขณะที ่มอเตอร ต องการกระแสไฟฟ ามากกว านั ้น ด ังนั ้นวงจรข ับมอเตอร จะเข ามาทํ าหน าที ่นั ้น โดยรั บสั ญญาณกระตุ น และสั ญญาณกํ าหนดความเร็ วในการควบค ุมมอเตอร มาจากไมโครคอนโทรลเลอร ส วนวงจรข ับมอเตอร ท ําหน าที ่ข ับมอเตอร โดยตรง ให หม ุนหร ือล ็อกแกน หร ือหม ุนในท ิศทางใดและถ ายทอดพล ังงานไปย ังมอเตอร เพื ่อให สามารถหม ุนได เร ็วตามที ่ก ําหนดมาจากไมโครคอนโทรลเลอร

8.2 ควบคุ มความเร็ วของมอเตอร ในการข ับมอเตอร โดยปกต ิจะป อนแรงด ันไฟตรงให โดยตรง มอเตอร จะท ํางานเต ็มก ําล ัง ซึ ่งอาจม ีความเร ็วมาก

เก ินไป ด ังนั ้นการปร ับความเร ็วของมอเตอร จ ึงใช ว ิธ ีลดแรงด ันไฟฟ าที ่ป อนให ก ับมอเตอร ว ิธ ีที ่น ิยมคื อ การป อนพ ัลส ไปข ับมอเตอร แทน แล วปร ับความกว างพ ัลส ช วงบวก เพื ่อให ได ค าแรงด ันเฉลี ่ยตามต องการ ว ิธ ีการน้ี เร ียกว า พ ัลส ว ิดธ มอด ูเลเตอร (PWM) โดยความกว างพ ัลส ช วงบวกเมื ่อเท ียบก ับความกว างพ ัลส ทั ้งหมดเร ียกว า ด ิวตี ้ไซเก ิล โดยจะค ิดค าด ิวต้ี ไซเก ิลเป นเปอร เซ ็นต ของค าความกว างพ ัลส ทั ้งหมด

ตั วอย างจากรู ปที่ 8-1 (ข) มี ค าดิ วต้ี ไซเกิ ล 50% หมายถึ ง ความกว างของพ ัลส ช วงบวกมี ความกว างเป น 50%ของความกว างทั้ งหมด ดั งนั้ นแรงดั นเฉลี่ ยที่ ได เท ากั บ (50 x 4.8) /100 = 2.4V สํ าหรั บรู ปที่ 8-1 (ค) และ (ง) เป นการกํ าหนดค าดิ วต้ี ไซเกิ ล 75% และ 25% ตามลํ าดั บ

Page 132: POP-BOT XT_TH

132XT

ร ูปที ่ 8-1 แสดงการเปรี ยบเที ยบค าแรงดั นที ่เกิ ดขึ ้นเมื ่อใช PWM (ก) ป อนส ัญญาณไฟตรง(ข) PWM มี ดิ วตี ้ไซเกิ ล 50% (ค) PWM มี ดิ วตี้ ไซเกิ ล 75% (ง) PWM มี ด ิวตี้ ไซเกิ ล 25%

(ก) (ข)

(ค) (ง)

4.8V

3.6V

4.8V

1.2V

แรงดัน(V)

เวลา

แรงดัน(V)

เวลา

แรงดั นเฉล่ี ยแรงดั นเฉล่ี ยดิ วตี้ ไซเกิ ล 75% ดิ วตี้ ไซเกิ ล 25 %

4.8V 4.8V

2.4V

แรงดัน(V)

แรงดัน(V)

เวลา เวลา

แรงดั นเฉล่ี ย ดิ วตี้ ไซเกิ ล 50%

8.3 การสร างสั ญญาณ PWM ของ Arduinoใน Arduino ม ีฟ งก ชั ่น analogWrite() ทํ าให ไมโครคอนโทรลเลอร สามารถสร างส ัญญาณอะนาลอกส ง

ออกทางขาพอร ตเอาต พ ุตได โดยอาศ ัยเทคน ิคการสร างส ัญญาณ PWM (Pulse Width Modulation) หร ือส ัญญาณมอด ูเลชั ่นทางความกว างพ ัลส ผู ใช งานสามารถปร ับค าด ิวต้ี ไซเก ิลของส ัญญาณพ ัลส ได โดยค าด ิวต้ี ไซเก ิลม ีค าระหว าง 0ถ ึง 255 เมื ่อค าเป น 0 แรงดั นที ่ขาที ่ก ําหนดไว จะม ีค าคงที ่เป น 0V เมื ่อม ีค าเป น 255 แรงด ันที ่ขาพอร ตนั ้นเท าก ับ +5Vส ําหร ับค าระหว าง 0 ถ ึง 255 จะท ําให ขาที ่ก ําหนดไว ม ีแรงด ันเปลี ่ยนแปลงสล ับไปมาระหว าง 0 และ 5V ถ าม ีค าส ูงขึ ้นช วงเวลาที ่ขาพอร ตนั ้นเป น 5V จะนานขึ ้น

ถ าค าเป น 51 สั ญญาณพั ลส จะมี ระดั บสั ญญาณ +5V เป นเวลานาน 20% ของคาบเวลา และมี แรงดั น0V นาน 80% ของคาบเวลา หรื อมี ค าดิ วต้ี ไซเกิ ลเท ากั บ 20%นั่ นเอง

ถ ามี ค าเป น 127 สั ญญาณพั ลส จะมี ระดั บสั ญญาณ +5V เป นเวลานานครึ่ งหนึ่ งของคาบเวลา และ 0Vนานครึ่ งหนึ่ งของคาบเวลา หรื อมี ค าดิ วต้ี ไซเกิ ล 50%

ถ ามี ค าเป น 191 นั่ นคื อ สั ญญาณพั ลส จะมี ระดั บสั ญญาณ +5V เป นเวลานานสามส วนสี่ ของคาบเวลาและมี แรงดั น 0V นานหนึ่ งส วนสี่ ของคาบเวลา หรื อมี ค าดิ วต้ี ไซเกิ ล 75%

ในรู ปที่ 8-2 แสดงสั ญญาณ PWM ที่ ค าดิ วต้ี ไซเกิ ลต างๆ

Page 133: POP-BOT XT_TH

XT 133

รู ปที่ 8-2 แสดงสั ญญาณ PWM ที ่ค าด ิวตี้ ไซเกิ ลต างๆ

20%

50%

75%

ด ิวตี ้ไซเก ิลของส ัญญาณพั ลส

สามารถคํ านวณได จาก

T

tW

100%T

tD w

โดยที่ tw คื อความกว างของพั ลส T คื อ คาบเวลาของสั ญญาณ

พั ลส 1 ลู กนั่ นหมายความว า ความถ่ี จะ

ไม ม ีผลต อการปร ับหร ือเปลี ่ยนแปลงดิ วตี้ ไซเกิ ลแต อย างใด

ค าแรงด ันของส ัญญาณพ ัลส จะได เป นค าเฉลี ่ยของส ัญญาณพั ลส ซึ่ งสามารถคํ านวณได จากความส ัมพ ันธ ทางคณิ ตศาสตร ต อไปนี ้

Output_voltage = (on_time / off_time) * max_voltage

เราสามารถนํ าสั ญญาณ PWM ที่ ได จากคํ าสั่ ง analogWrite() นี้ ไปปรั บความสว างของ LED หรื อต อขยายกระแสเพื ่อควบคุ มความเร ็วของมอเตอร ไฟตรงได หล ังจากเรี ยกใช ค ําสั ่งนี ้แล วขาพอร ตที ่ก ําหนดจะม ีส ัญญาณPWM ส งออกมาอย างต อเนื่ อง จนกว าจะมี การเรี ยกใช คํ าสั่ ง analogWrite ในรอบใหม หรื อเรี ยกคํ าสั่ งdigitalRead หรื อ digitalWrite ที่ ขาพอร ตเดี ยวกั น

ฮาร ดแวร Arduino Leonardo (ซึ่ งแผงวงจร POP-XT ใช อ างอิ งถึ ง) มี ขาพอร ตที่ ทํ าหน าที่ เป นเอาต พุ ตอะนาลอก 5 ขา คื อ ขา 3, 5, 9, 10 และ 11 สํ าหรั บบนแผงวงจร POP-XT ใช ขา 5, 9 และ 10 ในการเชื่ อมต อกั บวงจรขั บมอเตอร ในขณะที่ ขา 3 มี จุ ดต อออกมาใช งาน โดยเป นขาร วมกั บขา SDA ส วนขา 11 ถู กต อกั บลํ าโพงเป ยโซ

การสั่ งให ขาพอร ตทํ างานสร างสั ญญาณ PWM ต องสั่ งผ านฟ งก ชั่ น analogWrite() ซึ่ งมี รู ปแบบดั งนี้ analogWrite(pin,value);

เมื ่อ pin ค ือ หมายเลขขาพอร ตที ่ต องการ (3, 5, 9 ถ ึง 11)

value ค าดิ วตี้ ไซเกิ ลที่ ต องการ ค าจาก 0 ถึ ง 255

Page 134: POP-BOT XT_TH

134XT

8.4 ฟ งก ชั่ นขั บมอเตอร เพื่ อให การเขี ยนโปรแกรมภาษา C/C++ เพื่ อขั บมอเตอร ของหุ นยนต POP-BOT XT ทํ าได ง ายขึ้ น จึ งมี การ

สร างฟ งก ชั่ นขั บมอเตอร ขึ้ น รวมเข าไว ในไฟล ไลบรารี popxt.h มี คํ าสั่ งต างๆ ดั งนี้

motor(_channel,_power); เลื อกวงจรขั บมอเตอร และกํ าหนดความเร็ ว

motor_stop(_channel); หยุ ดการทํ างานของวงจรขั บมอเตอร ที ่ต องการ

fd(speed); เคลื่ อนที ่ไปข างหน า

bk(speed); เคลื่ อนที ่ถอยหลั ง

tl(speed); เลี้ ยวไปทางซ าย

tr(speed); เลี้ ยวไปทางขวา

sl(speed); หมุ นตั วทางซ าย

sr(speed); หมุ นตั วทางขวา

ao(); มอเตอร หยุ ดทํ างานทั้ งหมด

8.4.1 motor

เป นฟ งก ชั่ นขั บเคลื่ อนมอเตอร ไฟตรง

รู ปแบบ

void motor(char _channel,int _power)พารามิ เตอร

_channel - กํ าหนดช องเอาต พุ ตมอเตอร ไฟตรงของหุ นยนต POP-BOT XT มี ค า 1 และ 2

_power - กํ าหนดกํ าลั งขั บมอเตอร มี ค าในช วง -100 ถึ ง 100ถ ากํ าหนดค า _power เป นบวก (1 ถึ ง 100) ทํ าให มอเตอร หมุ นไปในทิ ศทางหนึ่ งถ ากํ าหนดค า _power เป นลบ (-1 ถึ ง -100) มอเตอร จะถู กขั บให หมุ นไปในทิ ศทางตรงข ามถ ากํ าหนดค า _power เป น 0 มอเตอร หยุ ดหมุ น ไม แนะนํ าให กํ าหนดค าเป น 0 หากต องการให มอเตอร

หยุ ดหมุ นควรเรี ยกใช ฟ งก ชั่ น motor_stop

ตั วอย างที่ 8-1motor(1,60); // ขั บมอเตอร ช อง A ด วยกํ าลั ง 60% ของกํ าลั งสู งสุ ดmotor(1,-60); // ข ับมอเตอร ช อง A ด วยก ําล ัง 60% ม ีท ิศทางการหม ุนตรงข ามก ับค ําสั ่งก อนหน า

ตั วอย างที่ 8-2

motor(2,100); // ขั บมอเตอร ช อง B ด วยกํ าลั ง 100% อั นเป นค ากํ าลั งสู งสุ ด

Page 135: POP-BOT XT_TH

XT 135

8.4.2 motor_stop

เป นฟ งก ชั่ นหยุ ดขั บมอเตอร

รู ปแบบ

void motor_stop(char _channel)พารามิ เตอร

_channel - ก ําหนดช องเอาต พ ุตมอเตอร ไฟตรง ม ีค า 1, 2 และ ALL โดย ALLเป นการเล ือกให มอเตอร ทั ้ง 2ช องหย ุดท ํางานพร อมก ัน

ตั วอย างที่ 8-3motor_stop(1); // หยุ ดขั บมอเตอร ช อง 1motor_stop(2); // หยุ ดขั บมอเตอร ช อง 2

ตั วอย างที่ 8-4

motor_stop(ALL); // มอเตอร ทั้ ง 2 ช องหยุ ดทํ างานพร อมกั น

8.4.3 fd

มาจากคํ าว า forward เป นฟ งก ชั่ นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ไปข างหน า

รู ปแบบ

fd(unsigned int speed)พารามิ เตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 8-5fd(60); // สั่ งให หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ ว 60 เปอร เซ็ นต

8.4.4 fd2

มาจากคํ าว า forward2 เป นฟ งก ชั่ นที่ กํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ไปข างหน าแบบกํ าหนดความเร็ วมอเตอร แยกอิ สระ

รู ปแบบ

fd2(unsigned int speed1 ,unsigned int speed2)พารามิ เตอร

speed1 คื อ ค าความเร็ วของมอเตอร A มี ค าตั้ งแต 0 ถึ ง 100%

speed2 คื อ ค าความเร็ วของมอเตอร B มี ค าตั้ งแต 0 ถึ ง 100%

ตั วอย างที่ 8-6fd2(30,80); // คํ าสั่ งให หุ นยนต เคลื่ อนที่ เป นวงกลม เนื่ องจากมอเตอร B หมุ นเร็ วกว ามอเตอร A ค อน

ข างมาก

Page 136: POP-BOT XT_TH

136XT

8.4.5 bk

มาจากคํ าว า backward เป นฟ งก ชั นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั ง

รู ปแบบ

bk(unsigned int speed)พารามิ เตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 8-7bk(90); // กํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั งด วยความเร็ ว 90 เปอร เซ็ นต

8.4.6 bk2

มาจากคํ าว า backward2 เป นฟ งก ชั่ นก ําหนดให หุ นยนต POP-BOT XT เคลื ่อนที่ ถอยหลั งแบบกํ าหนดความเร็ วมอเตอร อิ สระ

รู ปแบบ

bk2(unsigned int speed1 ,unsigned int speed2)พารามิ เตอร

speed1 คื อเปอร เซ็ นต ความเร็ วของมอเตอร A มี ค าตั้ งแต 0 ถึ ง 100

speed2 คื อเปอร เซ็ นต ความเร็ วของมอเตอร B มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 8-8bk2(80,80); // เป นคํ าสั่ งเคลื่ อนถอยหลั งตรงด วยความเร็ วเท ากั น ซึ่ งทํ างานเหมื อนกั บคํ าสั่ ง bk()

ทั้ งฟ งก ชั่ น fd2() และ bk2() มี ไว เพื่ อปรั บแต งการทํ างานของมอเตอร ไฟตรงทั้ ง 2 ตั วของหุ นยนต POP-BOT XT ซึ ่งอาจมี ความแตกต างก ันด านความเร ็วในการหม ุน ให ทํ างานได อย างใกล เค ียงกั นมากที ่ส ุดด วยการปร ับค าspeed1 และ speed2

8.4.7 tl และ tr

มาจากค ําว า turn left และ turn right หร ือเลี ้ยวซ ายและเลี ้ยวขวานั ่นเอง โดยการเลี ้ยวของฟ งก ชั ่นทั ้งสองนี ้จะก ําหนดให มอเตอร ต ัวใดต ัวหนึ ่งของหุ นยนต หย ุดอยู ก ับที ่ จ ุดหม ุนของหุ นยนต จะอยู ที ่ล อของมอเตอร ที ่หย ุดอยู ก ับที ่

รู ปแบบ

tl(unsigned int speed) และ tr(unsigned int speed)พารามิ เตอร

speed คื อ ค าความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100 เปอร เซ็ นต

ตั วอย างที่ 8-9tl(60); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 60 เปอร เซ็ นต tr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100 เปอร เซ็ นต

Page 137: POP-BOT XT_TH

XT 137

8.4.8 sl และ sr

มาจากคํ าว า spin left และ spin right หรื อหมุ นตั วทางซ ายและทางขวา ในฟ งก ชั่ นน้ี จะกํ าหนดให มอเตอร ไฟตรงทั้ งสองตั วของหุ นยนต หมุ นในทิ ศทางตรงกั นข าม จุ ดหมุ นของการเลี้ ยวจึ งอยู ที่ กึ่ งกลางของหุ นยนต

รู ปแบบ

sl(unsigned int speed) และ sr(unsigned int speed)พารามิ เตอร

speed คื อ ค าความเร็ วของมอเตอร มี ค า 0 ถึ ง 100%

ตั วอย างที่ 8-10sl(70); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 70%sr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100%

8.4.9 ao

มาจากคํ าว า all motor off เป นฟ งก ชั่ นหยุ ดการทํ างานของมอเตอร ทั้ งสองตั วพร อมกั นเหมื อนกั บการเรี ยกใช ฟ งก ชั่ น motor_stop(ALL);

รู ปแบบ

ao()ตั วอย างที่ 8-7

void setup(){

fd(100); // หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ วสู งสุ ดsleep(2000); // เป นเวลา 2 วิ นาที ao(); // กํ าหนดให มอเตอร หยุ ดทํ างาน หุ นยนต จะหยุ ดเคลื่ อนที่ ทั นที

}

Page 138: POP-BOT XT_TH

138XT

XT

เป ดโปรแกรม Arduino IDE เพื ่อเข ียนโปรแกรมที ่ A5-1 จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปยั งหุ นยนต POP-BOT XT จากนั ้นปลดสาย USB ออก นํ าหุ นยนต มาวางที ่พื ้น เป ดสว ิตช จ ายไฟ ส ังเกตการท ํางานของหุ นยนต

หลั งจากเป ดสวิ ตช เพื่ อจ ายไฟให หุ นยนต ทํ างาน หุ นยนต จะเริ่ มเคลื่ อนท่ี ทั นที โดยเริ่ มเคลื่ อนท่ี ตรงไปข างหน าก อน จะสั งเกตเห็ นว าไฟ LED ที่ ตํ าแหน งมอเตอร ทั้ งคู ติ ดเป นสี เขี ยว จากนั้ นอี ก 1 วิ นาที LED จะเปลี่ ยนเป นสี แดง ให ดู ทิ ศทางการเคลื่ อนท่ี ของหุ นยนต ว าถู กต องหรื อไม ถ าหุ นยนต เคลื่ อนไม ถู กต องให สลั บสายของมอเตอร จนหุ นยนต เคลื่ อนท่ี ได ถู กต อง

#include <popxt.h>void setup(){}void loop(){

fd(80);sleep(1000);bk(80);sleep(1000);

}

โปรแกรมที่ A5-1 ไฟล ForwardBackward.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บทดสอบข ับเคลื ่อนหุ นยนต POP-BOT XT ให เคลื ่อนที ่ไปข างหน าและถอยหล ังสล ับก ันอย างต อเนื ่อง

Page 139: POP-BOT XT_TH

XT 139

โปรแกรมที่ A1-2 เป นการขั บเคลื่ อนหุ นยนต โดยกํ าหนดค าการจ ายกํ าลั งให กั บล อแต ละล อไม เท ากั น ส งผลให หุ นยนต เคลื่ อนท่ี เป นวงกลม นอกจากนี้ ในโปรแกรมนี้ ยั งเพิ่ มเติ มคํ าสั่ งตรวจสอบการกดสวิ ตช เพื่ อหยุ ดการทํ างานของหุ นยนต ด วย ถ าหากกดสวิ ตช OK บนบอร ดควบคุ ม หุ นยนต จะหยุ ดทํ างาน

#include <popxt.h>void setup(){

fd2(30,90);sw_ok_press();

ao();}void loop(){}

โปรแกรมที ่ A5-2 ไฟล CircleMove.ino โปรแกรมภาษา C ของ Arduino1.0 ส ําหร ับทดสอบข ับเคลื ่อนหุ นยนต POP-BOT XT ให เคลื ่อนที ่เป นวงกลม ด วยการก ําหนดให ความเร ็วของมอเตอร แต ละต ัวของหุ นยนต ไม เท าก ัน

Page 140: POP-BOT XT_TH

140XT

โปรแกรมที่ A5-3 เป นการสั่ งงานให หุ นยนต เคลื่ อนท่ี ตรงแล วเลี้ ยวสลั บกั นไป ทํ าให เกิ ดเส นทางเคลื่ อนท่ี เป นรู ปสี่ เหลี่ ยม โดยการเคลื่ อนท่ี จะเกิ ดขึ้ นเมื่ อกดสวิ ตช OK บนแผงวงจร POP-XT ของหุ นยนต

#include <popxt.h> // ผนวกไลบรารี หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นการทํ างานglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,”Moving...”); // แสดงข อความเริ่ มต นการเคลื่ อนที่

}void loop(){

fd(80); // เคลื่ อนที่ ตรงด วยกํ าลั ง 80%sleep(900);tr(80); // เลี้ ยวขวาด วยกํ าลั ง 80%sleep(400);

}

โปรแกรมที ่ A5- 3 ไฟล Rectangle_Running.pde โปรแกรมภาษา C ของ Arduino ส ําหร ับทดสอบข ับเคลื ่อนหุ นยนต POP-BOT XT ให เคลื ่อนที ่เป นสี ่เหลี ่ยม

Page 141: POP-BOT XT_TH

XT 141

โปรแกรมที่ A5-4 เป นการสั่ งงานให หุ นยนต เคลื่ อนท่ี ไปในทิ ศทางต างๆ ประกอบด วย เคลื่ อนท่ี ตรงไปข างหน า 0.6 วิ นาที เลี้ ยวซ าย 0.4 วิ นาที ถอยหลั ง 0.6 วิ นาที หมุ นตั วไปทางขวา 0.3 วิ นาที ถอยหลั ง 0.6 วิ นาที หมุ นต ัวไปทางซ าย 0.3 วิ นาที จากน้ั นวนกลั บเริ่ มต นเคลื ่อนท่ี ข างหน า แล วเคลื่ อนท่ี ตามรู ปแบบเดิ มอย างต อเน่ื อง

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

glcdClear(); // เคลี ยร หน าจอ GLCDsetTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นการทํ างานglcd(2,1,”to Start”);sw_ok_press(); // วนรอจนกระทั่ งกดสวิ ตช beep(); // ส งเสี ยงออกลํ าโพงglcdClear(); // เคลี ยร หน าจอ GLCD

}void loop(){ glcdFillScreen(GLCD_RED); // เคลี ยร หน าจอ GLCD พื้ นหลั งสี แดง

fd(80); // เคลื่ อนที่ ด านหน าความเร็ ว 80 เปอร เซ็ นต sleep(600); // เป นเวลา 0.6 วิ นาที glcdFillScreen(GLCD_GREEN); // เคลี ยร หน าจอ GLCD พื้ นหลั งสี เขี ยวtl(60); // เลี้ ยวซ ายความเร็ ว 60 เปอร เซ็ นต

sleep(400); // เป นเวลา 0.4 วิ นาที glcdFillScreen(GLCD_BLUE); // เคลี ยร หน าจอ GLCD พื้ นหลั งสี นํ้ าเงิ นbk(80); // ถอยหลั งความเร็ ว 80 เปอร เซ็ นต sleep(600); // เป นเวลา 0.6 วิ นาที glcdFillScreen(GLCD_YELLOW); // เคลี ยร หน าจอ GLCD พื้ นหลั งสี เหลื องsr(60); // หมุ นตั วทางขวาความเร็ ว 60 เปอร เซ็ นต sleep(300); // เป นเวลา 0.3 วิ นาที glcdFillScreen(GLCD_MAGENTA); // เคลี ยร หน าจอ GLCD พื้ นหลั งสี บานเย็ นbk(80); // ถอยหลั งความเร็ ว 80 เปอร เซ็ นต sleep(600); // เป นเวลา 0.6 วิ นาที glcdFillScreen(GLCD_WHITE); // เคลี ยร หน าจอ GLCD พื้ นหลั งขาวsl(60); // หมุ นตั วทางซ ายความเร็ ว 60 เปอร เซ็ นต sleep(300); // เป นเวลา 0.3 วิ นาที

}

โปรแกรมที ่ A5 -4 ไฟล MultiDirectionMove.ino โปรแกรมภาษา C ของ Arduino ส ําหร ับทดสอบข ับเคลื ่อนหุ นยนต POP-BOT XT ให เคลื ่อนที ่ไปในท ิศทางต างๆ ที ่หลากหลาย

Page 142: POP-BOT XT_TH

142XT

เมื่ ออั ปโหลดโปรแกรมเรี ยบร อยแล ว ปลดสาย USB ออก นํ าหุ นยนต POP-BOT XT มาวางบนพื้ น แล วเป ดสวิ ตช จ ยไฟ รอจนกระทั่ งหุ นยนต พร อมทํ างาน ที่ จอแสดงผลแสดงข อความ

Press OK

to Start

ให กดสวิ ตช OK บนแผงวงจรควบคุ มของหุ นยนต POP-BOT XT หุ นยนต จึ งจะเริ่ มต นการเคลื่ อนท่ี ตามทิ ศทางที่ กํ าหนดในโปรแกรม และเมื่ อมี การเปลี่ ยนทิ ศทางหรื อรู ปแบบการเคลื่ อนท่ี จอแสดงผลจะมี การเปลี่ ยนสี ตามไปด วย เพื่ อแจ งให ทราบถึ งการเปลี่ ยนแปลงที่ เกิ ดขึ้ น

ฟ งก ชั่ น fd2(speed1,speed2) และ bk2(speed1,speed2) เป นฟ งก ชั่ นควบคุ มการเคลื่ อนท่ี ของหุ นยนต ที่ ทํ างานเหมื อนกั บฟ งก ชั่ น fd() และ bk() ความต างอยู ที่ ฟ งก ชั่ น fd2() และ bk2() มี ตั วแปรที่ ใช กํ าหนดความเร็ วของมอเตอร 2 ตั ว สํ าหรั บมอเตอร A และ B ของหุ นยนต POP-BOT XT

เนื่ องจากการขั บเคลื่ อนหุ นยนต POP-BOT XT ใช มอเตอร 2 ตั ว ความไม เท ากั นของมอเตอร อาจส งผลให การเคลื ่อนท่ี ตรงของหุ นยนต อาจเอ ียงไปด านใดด านหนึ่ ง ดั งนั้ นก อนที่ สั ่งงานให หุ นยนต ทํ างานอ ัตโนม ัติ จะต องกํ าหนดการเคลื่ อนท่ี ของหุ นยนต ให มี ความเที่ ยงตรงก อน

ในโปรแกรมที่ A5-5 เป นโปรแกรมตั วอย างที่ ใช คํ าสั่ งง ายๆ ในการควบคุ มให หุ นยนต เคลื่ อนท่ี ไปข างหน าโดยม ีการปร ับแต งความเร ็วขอบมอเตอร แต ละต ัวด วยฟ งก ชั ่น fd2 และ bk2 เพื ่อให การเคลื ่อนท่ี ม ีท ิศทางที ่ตรงมากที่ สุ ดเท าที่ จะเป นไปได

Page 143: POP-BOT XT_TH

XT 143

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นการทํ างานglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,”Moving...”); // แสดงข อความเริ่ มต นการเคลื่ อนที่ fd2(70,70); // ควบคุ มให หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ ว 70%

}void loop(){}

โปรแกรมที ่ A5 -5 ไฟล MoveAlignment.ino โปรแกรมภาษา C ของ Arduino ส ําหร ับทดสอบขั บเคลื ่อนหุ นยนต POP-BOT XT ให เคลื ่อนที ่ตรงโดยปรั บแต งความเร็ วผ านฟ งก ชั่ น fd เพ่ื อให หุ นยนต เคลื่ อนที่ ได ตรงมากที ่ส ุดเท าที ่เป นไปได

หลั งจากอั ปโหลดโปรแกรม แล วทดลองปล อยให หุ นยนต เคลื่ อนท่ี สั งเกตทิ ศทางของการเคลื่ อนท่ี

กรณี ที่ 1 หุ นยนต เริ่ มเคล่ื อนที่ เอี ยงไปทางซ าย

แสดงว ามอเตอร ทางด านซ ายหมุ นช ากว ามอเตอร ทางด านขวา สิ่ งที่ ต องทํ าคื อ เพิ่ มความเร็ วของมอเตอร ด านซ ายให เร็ วขึ้ น โดยให ปรั บท่ี ตั วแปร speed1 ของฟ งก ชั่ น fd2 ซึ่ งการปรั บค าต องค อยๆ เพิ่ มค าที ละน อย จนกระทั่ งหุ นยนต เคลื่ อนท่ี ตรงมากท่ี สุ ด

กรณี ที่ 2 หุ นยนต เริ่ มเคล่ื อนที่ เอี ยงไปทางขวา

แสดงว ามอเตอร ทางด านขวาหม ุนช ากว ามอเตอร ทางด านซ าย สิ่ งที่ ต องทํ าคื อ เพิ่ มความเร็ วของมอเตอร ด านขวาให เร็ วขึ้ น โดยให ปรั บท่ี ตั วแปร speed2 ของฟ งก ชั่ น fd2 ซึ่ งการปรั บค าต องค อยๆ เพิ่ มค าที ละน อย จนกระทั่ งหุ นยนต เคลื่ อนท่ี ตรงมากท่ี สุ ด

Page 144: POP-BOT XT_TH
Page 145: POP-BOT XT_TH

XT 145

XT

การเร ียนรู ในลํ าด ับต อจากการข ับเคลื ่อนหุ นยนต แบบพื้ นฐานค ือ การอ านค าจากต ัวตรวจจั บเพื ่อน ํามาก ําหนดเป นเงื ่อนไขในการเคลื ่อนที ่ ต ัวตรวจจ ับพื ้นฐานที ่ส ุดที ่ท ําหน าที ่นี ้ค ือ สว ิตช (switch) ในบทน้ี จะกล าวถ ึง การใช งานแผงวงจรสว ิตช ร วมก ับหุ นยนต POP-BOT XT เพื ่อน ํามาใช ตรวจจ ับการชน ท ําให หุ นยนต ร ับรู ได ว า เคลื ่อนที ่ไปพบสิ ่งก ีดขวาง จากนั ้นตั วควบค ุมจะทํ าการประมวลผลเพื ่อก ําหนดการเคลื ่อนที ่ให หุ นยนต POP-BOT XT สามารถเคลื ่อนที ่พ นสิ ่งก ีดขวางไปได

อ ุปกรณ ส ําค ัญที ่ใช ในการเร ียนรู นี ้ค ือ แผงวงจรสว ิตช ZX-01 ม ีวงจรและการท ํางานแสดงในร ูปที ่ 9-1 เมื ่อสว ิตช ถ ูกกดซึ ่งเท ียบได ก ับการชนก ับสิ ่งก ีดขวาง ส ัญญาณลอจ ิกที ่เอาต พ ุตจะเปลี ่ยนจากลอจ ิก “1” เป น “0” จนกว าจะปล อยหร ือไม เก ิดการชน ส ัญญาณเอาต พ ุตจะเปลี ่ยนกล ับไปเป น “1” อ ีกครั ้ง

ด วยค ุณสมบ ัต ิการท ํางานของต ัวตรวจจ ับแบบน ี้ จึ งนํ ามาก ําหนดเงื ่อนไขในการเคลื ่อนที ่ให ก ับหุ นยนต POP-BOT XT ได โดยต ิดตั ้งสว ิตช เข าที ่ด านหน าของหุ นยนต เมื ่อหุ นยนต POP-BOT XT เคลื ่อนที ่ไปชนก ับสิ ่งก ีดขวางจะท ําให สว ิตช ถ ูกกด ต ัวควบค ุมร ับรู ถึ งการเปลี ่ยนแปลงของอ ินพ ุตที ่ต อก ับสว ิตช จากนั้ นทํ าการควบค ุมให หุ นยนต เคลื ่อนที ่ถอยหลั ง ต อด วยการเปลี ่ยนท ิศทางการเคลื ่อนที ่ เพ ียงเท านี ้หุ นยนต ก ็จะสามารถเคลื ่อนที ่ผ านสิ ่งก ีดขวางไปได

ที่ ช องเอาต พุ ต :ถ ากดสวิ ตช จะส งลอจิ ก ”0” ออกไปท่ี เอาต พุ ตLED สี แดงติ ดถ าไม กดสวิ ตช จะส งลอจ ิก ”1” ออกไปท่ี เอาต พุ ตLED สี แดงดั บ

รู ปที่ 9-1 รู ปร างและวงจรของแผงวงจรสวิ ตช ZX-01 ที ่ใช ในช ุดหุ นยนต POP-BOT XT

DATAR3220

R210k

R1510

LED1

S1Switch

Indicator

Signal output

GND

+V

Page 146: POP-BOT XT_TH

146XT

แผงวงจรสวิ ตช ZX-01 เป นอุ ปกรณ อิ นพุ ตดิ จิ ตอล เมื่ อสวิ ตช ถู กกดจะให เอาต พุ ตเป นลอจิ ก “0” ถ าไม มี การกด ให เอาต พุ ตเป นลอจิ ก “1” ในกิ จกรรมนี้ เป นการเขี ยนโปรแกรมง ายๆ เพื่ อทดสอบบการอ านค าสถานะของสวิ ตช เข ามา เพื่ อควบคุ มการขั บเสี ยงออกลํ าโพง

(A6.1) ต อสายของแผงวงจรสวิ ตช ZX-01 เข าที่ จุ ดต อพอร ต 22/A4 และ 23/A5

TB6612

AT Mega32U4

100

Press OK to Start

(A6.2) เป ดโปรแกรม Arduino1.0 แล วพิ มพ โปรแกรมที่ A6-1 บั นทึ กไฟล ชื่ อ TouchSwitchTest.ino

(A6.3) เป ดสวิ ตช จ ายไฟให แก แผงวงจร POP-XT ของหุ นยนต POP-BOT XT รอ 10 วิ นาที ให ตั วแผงวงจรควบคุ มพร อมทํ างาน จากนั้ นต อสาย USB เข ากั บคอมพิ วเตอร

(A6.4) ทํ าการคอมไพล และอั ปโหลดโปรแกรมลงในแผงวงจร POP-XT ของหุ นยนต POP-BOT XT

(A6.5) รั นโปรแกรม ที่ จอแสดงผลแสดงข อความ

Press OK To Start

กดสวิ ตช OK บนแผงวงจร POP-XT ของหุ นยนต POP-BOT XT เพื่ อเริ่ มการทํ างาน

จากนั้ นทดลองกดสวิ ตช ของแผงวงจร ZX-01 ที่ ต อกั บพอร ต 22/A4

ได ยิ นเสี ยงความถี่ 1kHz ดั งออกจากลํ าโพง นาน 0.3 วิ นาที และจอภาพจะกลายเป นสี แดง หากกดสวิ ตช ค างไว จะได ยิ นเสี ยงดั งต อเน่ื องเป นจั งหวะ

ทดลองกดสวิ ตช ของแผงวงจร ZX-01 ที่ ต อกั บพอร ต 23/A5

ได ยิ นเสี ยงความถี่ 2kHz (เสี ยงแหลมกว า) ดั งออกจากลํ าโพง นาน 0.3 วิ นาที และจอภพากลายเป นสี เหลื อง หากยั งกดสวิ ตช ค างไว จะได ยิ นเสี ยงดั งต อเน่ื องเป นจั งหวะ

Page 147: POP-BOT XT_TH

XT 147

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,”Let’s go!”); // แสดงข อความพร อมทํ างาน

}void loop(){ if(in(22)==0) // ถ ากดสวิ ตช ตํ าแหน ง 22 { sound(1000,300); // ขั บเสี ยงความถี่ 1kHz glcdFillScreen(GLCD_RED); // เปลี่ ยนสี หน าจอเป นสี แดง } if(in(23)==0) // ถ ากดสวิ ตช ตํ าแหน ง 23 { sound(2000,300); // ขั บเสี ยงความถี่ 2kHz glcdFillScrren(GLCD_YELLOW); // เปลี่ ยนสี หน าจอเป นสี เหลื อง }}

โปรแกรมที่ A6-1 ไฟล TouchSwitchTest.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บทดสอบการอ านค าจากสวิ ตช ที ่พอร ตด ิจ ิตอลของหุ นยนต POP-BOT XT

Page 148: POP-BOT XT_TH

148XT

XT

เมื่ อม ีการติ ดตั้ งสวิ ตช 2 ตั วให แก หุ นยนต จะทํ าให เกิ ดเหตุ การณ ที่ ไม ซํ้ าก ัน 4 กรณี อ ันนํ าไปสู การกํ าหนดให หุ นยนต ทํ างานแตกต างกั นไป เหตุ การณ ทั้ งหมดประกอบด วย

1. ไม กดสวิ ตช เลย : หุ นยนต POP-BOT XT หยุ ดเคลื่ อนท่ี

2. กดสวิ ตช พร อมกั นสองตั ว : หุ นยนต POP-BOT XT เคลื่ อนท่ี ไปข างหน า

3. กดสวิ ตช ด านซ ายที่ ต อกั บพอร ต 22/A4 เพี ยงตั วเดี ยว : หุ นยนต POP-BOT XT เลี้ ยวซ าย

4. กดสวิ ตช ด านซ ายที่ ต อกั บพอร ต 23/A5 เพี ยงตั วเดี ยว : หุ นยนต POP-BOT XT เลี้ ยวขวา

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,”Let’s go!”); // แสดงข อความพร อมทํ างาน

}void loop(){

if(in(22)==0&&in(23)==0) // สวิ ตช ถู กกดทั้ งสองตั วหรื อไม {

fd(60); // ถ าใช เคลื่ อนที่ ไปด านหน า}else if(in(22)==0) // สวิ ตช ที่ พอร ต 22 ถู กกดหรื อไม {

tl(60); // ถ าใช ควบคุ มให หุ นยนต เลี้ ยวซ าย}else if(in(23)==0) // สวิ ตช ที่ พอร ต 23 ถู กกดหรื อไม {

tr(60); // ถ าใช ควบคุ มให หุ นยนต เลี้ ยวขวา}else{

ao(); // ถ าไม กดสวิ ตช หุ นยนต หยุ ดทํ างาน}

}

สิ่ งควรทราบจากโปรแกรม

คํ าสั่ งที่ ใช ในการตรวจสอบเงื่ อนไขของโปรแกรมนี ้ ม ีการใช ค ําสั ่ง && หร ือแอนด เพื ่อเชื ่อมและตรวจสอบเงื่ อนไข 2 เงื่ อนไข โดยเงื่ อนไขจะต องเป นจริ งทั้ งคู ผลลั พธ ที่ ได จึ งจะเป นจริ ง จากโปรแกรมคื อ ต องเกิ ดการกดสวิ ตช ทั้ งสองตั ว เงื่ อนไข if ชุ ดแรกจึ งจะเป นจริ ง

โปรแกรมที ่ A7-1 ไฟล RemoteSwitch.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บทดสอบอ านค าจากสวิ ตช เพ่ื อใช ควบค ุมการเคลื ่อนที ่ของหุ นยนต POP-BOT XT

Page 149: POP-BOT XT_TH

XT 149

จากเหตุ การณ ข างต นนํ ามากํ าหนดเป นเงื ่อนไขเพื่ อเขี ยนโปรแกรมควบคุ มการเคลื ่อนท่ี ของหุ นยนต POP-BOT XT ได ตามโปรแกรมที่ A7-1

(A7.1) ทํ าการถอดแผงวงจรสวิ ตช ZX-01 ทั้ งสองตั วออกจากโครงหุ นยนต โดยยั งคงต อสายกั บแผงวงจร POP-XTบนหุ นยนต POP-BOT XT อยู ดั งนั้ นจึ งดู เหมื อนแผงวงจรสวิ ตช ZX-01 เป นรี โมตคอนโทรลแบบมี สายที่ ต อเข ากั บตั วหุ นยนต POP-BOT XT

(A7.2) เขี ยนโปรแกรมที่ A7-1 ทํ าการคอมไพล และอั ปโหลดไปยั งหุ นยนต POP-BOT XT

(A7.3) รั นโปรแกรม แล วทดลองใช สวิ ตช ทั้ งสองตั วควบคุ มการเคลื่ อนท่ี ของหุ นยนต POP-BOT XT ตามต องการ

Page 150: POP-BOT XT_TH

150XT

จากกิ จกรรมที ่ 7 ได เรี ยนรู การใช สว ิตช ในการควบค ุมการเคลื ่อนที่ ของหุ นยนต POP-BOT XT เมื ่อน ําสว ิตช กลั บมาติ ดตั้ งที่ ด านหน าของหุ นยนต POP-BOT X T แล วแก ไขโปรแกรมใหม โดยยั งคงใช หลั กการเดิ มคื อการกดสวิ ตข เป นเงื่ อนไขสํ าคั ญในการเคลื่ อนท่ี ของหุ นยนต เพี ยงแต คราวนี้ หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ไปอย างต อเนื่ อง เมื่ อสวิ ตช ถู กกด นั่ นคื อ เกิ ดการชนกั บสิ่ งกี ดขวางตรงหน า หรื อด านข าง โปรแกรมที่ สร างขึ น ใหม จะช วยในการตั ดสิ นใจของหุ นยนต ต อไปว า จะเคลื่ อนท่ี ต อไปอย างไร เพื่ อให สามารถผ านสิ่ งกี ดขวางไปได

สํ าหรั บในกิ จกรรมนี้ กํ าหนดให เมื่ อเริ่ มทํ างาน หุ นยนต POP-BOT XT เคลื่ อนท่ี ตรงไปข างหน า โดยมี การตรวจสอบการชนอยู ตลอดเวลา เมื่ อสวิ ตช ทางซ ายถู กกดหรื อถู กชน หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ถอยหลั งแล วหมุ นตั วเพื่ อเปลี่ ยนทิ ศทางการเคลื่ อนท่ี ไปทางขวา

Page 151: POP-BOT XT_TH

XT 151

ในทางตรงข ามหากเกิ ดการชนท่ี สวิ ตช ด านขวา หุ นยนต จะเคลื่ อนท่ี ถอยหลั งเช นกั น แล วหมุ นตั วเพื่ อเปลี่ ยนทิ ศทางการเคลื่ อนท่ี ไปทางซ าย

จากแนวคิ ดในการทํ างานนํ ามาสร างเป นโปรแกรมควบคุ มหุ นยนต POP-BOT XT ให เคลื่ อนท่ี หลบหลี กสิ่ งกี ดขวางด วยการชนได ดั งแสดงในโปรแกรมที่ A8-1

(A8.1) เขี ยนโปรแกรมที่ A8-1 ทํ าการคอมไพล และอั ปโหลดไปยั งหุ นยนต POP-BOT XT

(A8.2) ปลดสาย USB ออก แล วนํ าหุ นยนต ไปวางบนพื้ น จั ดเตรี ยมสิ่ งกี ดขวาง จากนั้ นรั นโปรแกรม

ที่ หน าจอแสดงผลแสดงข อความ

Press OK

to Start

ให กดสวิ ตช OK ที่ หุ นยนต POP-BOT XT สั งเกตการเคลื่ อนท่ี ของหุ นยนต POP-BOT XT ในภาวะที่ ชนและไม ชนสิ่ งกี ดขวาง ตรวจสอบดู ว า มี การทํ างานตรงตามเงื่ อนไขท่ี กํ าหนดไว หรื อไม

Page 152: POP-BOT XT_TH

152XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,”Press OK”); // แสดงข อความเริ่ มต นglcd(2,1,”to Start”);sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,”Let’s go!”); // แสดงข อความพร อมทํ างาน

}void loop(){

fd(70);if(in(22)==0) // ตรวจสอบการชนของสวิ ตช ด านซ าย{

bk(80); // ถอยหลั งsleep(300);sr(80); // เลี้ ยวขวาsleep(200);

}if(in(23)==0) // ตรวจสอบการชนของสวิ ตช ด านขวา{

bk(80); // ถอยหลั งsleep(400);sl(80); // เลี้ ยวซ ายsleep(400);

}}

สิ่ งที่ ควรทราบจากโปรแกรม

ส ังเกตว า โปรแกรมนี ้ก ําหนดค าหน วงเวลาในฟ งก ชั ่น Sleep() ของการถอยหล ังและการเลี ้ยวซ ายขวาไว ไม เท าก ันทั้ งนี้ เป นการช วยในกรณี ที่ หุ นยนต เคลื่ อนที่ เข าไปติ ดอยู ในมุ ม เนื่ องจากการถอยและเลี้ ยวด วยเวลาที่ ไม เท ากั น จะทํ าให หุ นยนต เคลื่ อนที่ หลุ ดออกมาจากมุ มได ง ายขึ้ น

โปรแกรมที่ A8-1 ไฟล ObjectAvoider.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บควบคุ มหุ นยนต POP-BOT XT ให เคลื ่อนที ่หลบหล ีกสิ ่งก ีดขวางด วยการชนหร ือส ัมผ ัส

Page 153: POP-BOT XT_TH

XT 153

XT

หนึ ่งภาระก ิจของการเร ียนรู เพื ่อควบค ุมหุ นยนต อ ัตโนม ัต ิขนาดเล ็กค ือ การตรวจจ ับเส นและการเคลื ่อนที ่ตามเส น ส ําหร ับช ุดหุ นยนต POP-BOT XT ก ็สามารถปฏ ิบ ัต ิภาระก ิจนี ้ได โดยเนื ้อหาในบทน้ี จะเริ ่มต นด วยการอธ ิบายการทํ างานของตั วตรวจจ ับแสงสะท อนอิ นฟราเรดซึ ่งน ํามาประย ุกต ใช งานเป นตั วตรวจจั บเส น การอ านค าจากตั วตรวจจ ับในพื้ นที่ ที่ มี สี ต างกั น จากนั ้นเข าสู การทดลองเข ียนโปรแกรมภาษา C เพื ่อควบคุ มให หุ นยนต POP-BOT XT เคลื ่อนที ่ตามเส นทั ้งแบบไม พ ิจารณาทางแยกและพ ิจารณาทางแยก

10.1 คุ ณสมบั ติ ของแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรดเป นแผงวงจรที ่ใช ในการตรวจสอบการสะท อนของแสงอ ินฟราเรดของต ัวตรวจจ ับแสงสะท อนอ ินฟราเรด

ซึ ่งรวมต ัวส งและต ัวร ับไว ในต ัวถ ังเด ียวก ัน โดยต ัวตรวจจั บแสงสะท อนอ ินฟราเรดที ่น ํามาใช ค ือ TCRT5000 ในรู ปที่ 10-1 แสดงการทํ างานของแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรดเมื่ อนํ ามาใช งานกั บพื้ นผิ วสี ขาวและดํ า

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

ร ูปที ่ 10-1 แสดงการทํ างานของแผงวงจรตรวจจั บแสงสะท อนอ ินฟราเรดก ับพ้ื นผ ิวส ีขาวและดํ า

LED อินฟราเรด

โฟโตทรานซิสเตอร

พื้นสีขาว

10k

TCRT5000

510

+V

GND

OUT

แรงดันเอาตพุตคาสูง

LED อินฟราเรด

โฟโตทรานซิสเตอร

พ้ืนสีดํา

10k

TCRT5000

510

+V

GND

OUT

แรงดันเอาตพุตคาต่ํากระแ

สไฟ

ฟา

กระแ

สไฟ

ฟา

Page 154: POP-BOT XT_TH

154XT

10.2 การเตร ียมความพร อมก อนพ ัฒนาโปรแกรมเพื ่อข ับเคลื ่อนหุ นยนต ตรวจจ ับเส น10.2.1 เตรี ยมอุ ปกรณ สํ าหรั บสร างสนามทดสอบ

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

สํ าหรั บสนามทดสอบตั วอย างที่ ใช ในหนั งสื อเล มนี้ ท ําจากแผ นพลาสติ กลู กฟู ก (หรื อชื่ อเรี ยกกั นทั่ วไปว าแผ นฟ วเจอร บอร ด) มาติ ดเทปสี ดํ า โดยมี อุ ปกรณ และเครื่ องมื อที่ ใช ดั งนี้

1. แผ นพลาสติ กล ูกฟ ูก (หร ือชื ่อเร ียกทั ่วไปว า แผ นฟ วเจอร บอร ด) ส ีขาวและดํ า ขนาด 90 x 60 เซนต ิเมตรอาจเล ็กใหญ กว านี ้ก ็ได อย างละ 1 แผ นขอให ม ีพื ้นที ่มากพอส ําหร ับการเคลื ่อนที ่ของหุ นยนต POP-BOT XT

2. เทปพ ันสายไฟส ีดํ าขนาด 1 นิ้ ว จํ านวน 2 ม วน แนะน ํายี ่ห อ 3M เนื ่องจากม ีความย ืดหยุ นส ูง สามารถต ิดเป นเส นโค งได ดี

3. กรรไกรสํ าหรั บตั ดเทปพั นสายไฟ

10.2.2 กํ าหนดค าอ างอิ งเพื่ อแยกความแตกต างระหว างเส นและพื ้นสนาม

ในการก ําหนดค าอ างอ ิงเพื ่อใช ในการเปร ียบเท ียบเพื ่อให หุ นยนต ทราบว า ต ัวตรวจจ ับพบเส นหร ือพื ้นสนามนั ้นโดยทั ่วไปจะอาศ ัยการเข ียนโปรแกรมอ านค าอะนาลอกจากแผงวงจรตรวจจั บแสงสะท อนอ ินฟราเรดแต ละต ัวข้ึ นมาแสดงผลเพื ่อส ังเกตค าผลล ัพธ ที ่ได จากเส นและพื ้นสนามม ีค าแตกต างก ันเพ ียงไร ปกต ิแล วค าทั ้งสองต องแตกต างก ันพอสมควร

ในการเขี ยนโปรแกรมภาษา C ด วย Arduino เพื่ ออ านค าจากแผงวงจรตรวจจั บแสงสะท อนอ ินฟราเรดของแผงวงจรควบคุ มในหุ นยนต POP-BOT XT จะใช ฟ งก ชั่ น analog ซึ่ งให ค าผลลั พธ 0 ถึ ง 1023 เมื่ อแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรดไปอยู บริ เวณตํ าแหน งของเส นสี ดํ าจะให ค าตํ่ ามี แนวโน มเอี ยงไปทางค า 0 ถ าไปอยู ในบริ เวณพื้ นสนามสี ขาวจะให ค าสู งที่ มี แนวโน มเอี ยงไปทางค า 1023 สามารถทดสอบได จากกิ จกรรมที่ 9 ซึ่ งช วยให ผู พั ฒนาโปรแกรมสามารถกํ าหนดค าอ างอ ิงสํ าหรั บใช เปรี ยบเที ยบเพื่ อแยกแยะระหว างเส นและพื ้นสนาม ซึ ่งจะนํ าไปใช ในการพั ฒนาโปรแกรมเพื่ อควบคุ มให หุ นยนต POP-BOT XT สามารถตรวจจั บและเคลื่ อนที่ ตามเส นได

Page 155: POP-BOT XT_TH

XT 155

ในกิ จกรรมนี้ เป นการอ านค าจากแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 เพื่ อนํ าค าที่ อ านได นี้ มาแยกแยะว า พื้ นที่ หรื อเส นที่ ทํ าการตรวจจั บนั้ นเป นสี ขาวหรื อดํ า โดยผลของการอ านค าจากตั วตรวจจั บจะถู กนํ ามาแสดงที่ หน าจอแสดงผลของหุ นยนต

(A9.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A9-1

(A9.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ปลดสาย USB ออก

(A9.3) สร างแผ นทดสอบสี โดยกํ าหนดพื้ นผิ วทั้ งสี ขาวและสี ดํ า มี ขนาดไม น อยกว า 30x30 ซม. ดั งรู ป

(A9.4) ตรวจสอบการเชื่ อมต อแผงวงจร ZX-03 ทั้ งสองตั วให ถู กต องก อนการทดสอบ โดย ZX-03 ด านซ ายต องต อกั บพอร ต 18/A0 และ ZX-03 ด านขวาต อกั บพอร ต 19/A1

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

setTextSize(3);glcdMode(3);glcd(1,1,"Press OK"); //แสดงข อความที่ จอแสดงผลsw_ok_press(); // วนรอจนกระทั่ งกดสวิ ตช OK

}void loop(){

glcd(1,0,"L=%d ",analog(0)); // อ านค าจากแผงวงจร ZX-03 ด านซ ายglcd(3,0,"R=%d ",analog(1)); // อ านค าจากแผงวงจร ZX-03 ด านขวาsleep(100);

}

โปรแกรมที ่ A9-1 ไฟล SurfaceRead.pde โปรแกรมภาษา C ของ Arduino1.0 ส ําหร ับอ านค าจากแผงวงจรตรวจจั บแสงสะท อนอ ินฟราเรดแสดงผลผ านจอภาพกราฟ ก LCD ส ีของหุ นยนต POP-BOT XT

Page 156: POP-BOT XT_TH

156XT

(A9.5) นํ าหุ นยนต POP-BOT XT ที่ โปรแกรมแล วจากขั้ นตอนที่ (A9.3) ไปวางบนแผ นทดสอบฝ งสี ดํ า

อ านค าได 80 ถึ ง 250

TB6612

100

T B6612

100L=100

R=100

(A9.6) นํ าหุ นยนต POP-BOT XT ไปวางบนแผ นทดสอบฝ งสี ขาว

อ านค าได 700 ถึ ง 1000

TB6612

100

T B6612

100

L=900

R=900

จากการทดลองพบว า ค าที่ อ านได จากสี ขาวมี ค าอยู ประมาณ 700 ถึ ง 1000 ค าที่ อ านได จากสี ดํ ามี ค าอยู ประมาณ 80 ถึ ง 250 ดั งนั้ นค าที่ เหมาะสม เพื่ อใช เป นค าอ างอิ งจะอยู ที่ (700+250) /2 = 500 ในกรณ ียกตั วหุ นยนต ขึ้ นจากพื้ น เพื่ อไม ให เกิ ดการสะท อน ค าที่ อ านได ควรมี ค าไม เกิ น 30

Page 157: POP-BOT XT_TH

XT 157

นี ่ค ือต ัวอย างก ิจกรรมประย ุกต เพื ่อสร างระบบก ันขโมยอย างง ายๆ เมื ่อหุ นยนต ถ ูกยกขึ ้นจากพื ้น (โดยที ่ย ังม ีการจ ายไฟอยู ) แผงวงจรตรวจจ ับแสงสะท อนอ ินฟราเรด ZX-03 ที ่ต ิดตั ้งอยู ใต หุ นยนต จะไม สามารถตรวจจ ับแสงสะท อนได ค าที ่อ านได จ ึงน อยมาก (น อยกว าค าของส ีดํ า) จ ึงน ําความแตกต างของระด ับข อม ูลนี ้มาใช ประโยชน ได

(A10.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A10-1

(A10.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

(A10.3) นํ าหุ นยนต วางไว บนพื้ น แล วจึ งเป ดสวิ ตช จ ายไฟแก หุ นยนต

ขณะนี้ หุ นยนต จะไม มี การทํ างานใดๆ มี เพี ยงไฟแสดงสถานะไฟเลี้ ยงติ ดอยู เท านั้ น และหน าจอแสดงผลเป นสี ดํ า

(A10.4) ทดลองยกหุ นยนต ขึ้ นจากพื้ น

หุ นยนต จะขั บเสี ยงออกทางลํ าโพง พื้ นจอแสดงผลเปลี่ ยนเป นสี แดง เพื่ อแจ งเตื อนให ทราบว า ขณะนี้ หุ นยนต ถู กยกขึ้ นจากพื้ น

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){}void loop(){

if(analog(0)<20) // ตรวจสอบค าจาก ZX-03 ด านซ าย{

sound(2500,500); // ส งเสี ยงเตื อนออกลํ าโพงglcdFillScreen(GLCD_RED); // พื้ นจอแสดงผลเปลี่ ยนเป นสี แดง

}else{

glcdClear(); // พื้ นจอแสดงผลเป นสี ดํ า}

}

โปรแกรมที่ A10-1 ไฟล AlarmBOT.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บตรวจจั บการยกหุ นยนต POP-BOT XT ขึ้ นจากพ้ื น

Page 158: POP-BOT XT_TH

158XT

กิ จกรรมนี้ ต อยอดมาจากกิ จกรรมที่ 10 เมื่ อหุ นยนต POP-BOT XT สามารถตรวจจั บสภาวะการไม มี แสงสะท อนได จึ งนํ าความสามารถนี้ มาใช ในการตรวจจั บพื้ นท่ี ที่ มี ขอบเขต เช น บนโต ะ หรื อบนกระดานท่ี อยู สู งจากพื้ น แล วเขี ยนโปรแกรมเพื่ อทํ าให หุ นยนต POP-BOT XT สามารถเคลื่ อนท่ี อยู ในพื้ นท่ี กํ าหนด

ในก ิจกรรมนี้ หุ นยนต POP-BOT XT จะเคลื ่อนท่ี บนโต ะอย างต อเน่ื อง โดยมี แผงวงจรตรวจจั บแสงสะท อนZX-03 ทั ้งสองตั วทํ าหน าที ่ตรวจจั บว า หุ นยนต ย ังอยู เคลื ่อนท่ี อยู บนโต ะ เมื่ อใดก ็ตามที ่แผงวงจรตรวจจั บ ZX-03 อ านค าแสงสะท อนได น อย แสดงว า หุ นยนต กํ าลั งจะออกนอกพื้ นท่ี หรื อกํ าลั งจะเคลื่ อนท่ี ตกโต ะ ก็ จะต องควบคุ มให หุ นยนต เคลื่ อนท่ี ถอยหลั งทั นที จากนั้ นเปลี่ ยนเส นทาง ด วยการทํ างานแบบน้ี หุ นยนต POP-BOT XT จะสามารถเคลื่ อนที่ อยู บนโต ะได อย างต อเน่ื อง

(A11.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A11-1

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กint L,R;void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,"Moving..."); // แสดงข อความพร อมทํ างาน

}

Page 159: POP-BOT XT_TH

XT 159

void loop(){

fd(60); // เคลื่ อนที่ ตรงไปข างหน าL=analog(0); // กํ าหนดให ตั วตรวจจั บที่ ช อง A0 เป นตั วตรวจจั บด านซ ายR=analog(1); // กํ าหนดให ตั วตรวจจั บที่ ช อง A1 เป นตั วตรวจจั บด านซ ายif (L<500&&R<500) // ตั วตรวจจั บทั้ งสองตั วออกนอกโต ะ{

bk(80); // ถอยหลั งsound(1000,100); // ขั บเสี ยงแจ งเปลี่ ยนเส นทางเคลื่ อนที่ เนื่ องจากพบว า กํ าลั งจะออกนอกโต ะsleep(500);sr(60); // หมุ นขวาเพื่ อเปลี่ ยนทิ ศทางการเคลื่ อนที่ sleep(300);

}else if(L<500) // ตั วตรวจจั บด านซ ายออกนอกโต ะ{

bk(80); // ถอยหลั งsound(1500,100); // ขั บเสี ยงแจ งเปลี่ ยนเส นทางเคลื่ อนที่ sleep(400);sr(60); // หมุ นขวาเพื่ อเปลี่ ยนทิ ศทางการเคลื่ อนที่ sleep(300);

}else if(R<500) // ตั วตรวจจั บด านขวาออกนอกโต ะ

{bk(80); // ถอยหลั งsound(1500,100); // ขั บเสี ยงแจ งเปลี่ ยนเส นทางเคลื่ อนที่ sleep(300);sl(60); // หมุ นซ ายเพื่ อเปลี่ ยนทิ ศทางการเคลื่ อนที่ sleep(500);

}}คํ าอธิ บายโปรแกรมเพิ่ มเติ ม

โปรแกรมนี้ สร างตั วแปรขึ้ นมา 2 ตั วคื อ L และ R สํ าหรั บเก็ บค าที่ อ านได จากแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 ทั้ งด านซ ายและขวา จากนั้ นนํ าค าของตั วแปรมาตรวจสอบในคํ าสั่ ง IF เมื่ อพบว า หุ นยนต กํ าลั งจะเคลื่ อนที่ ออกนอกพื้ นโต ะ ก็ จะสั่ งให หุ นยนต ถอยหลั ง แล วส งเสี ยงออกลํ าโพง จากนั้ นหมุ นตั วเพ่ื อเปลี่ ยนทิ ศทาง

จะพบว า มี การเรี ยกใช คํ าสั่ ง sound ต อจากคํ าสั่ งถอยหลั ง (bk();) ทั้ งนี้ เนื่ องจากคํ าสั่ ง sound ต องใช เวลาในการทํ างาน ถ าเรี ยกใช ก อนที่ จะถอยหลั ง หุ นยนต อาจตกจากโต ะในขณะที่ หุ นยนต กํ าลั งขั บเสี ยงออกลํ าโพง

โปรแกรมที ่ A11-1 ไฟล EdgeDetect.ino โปรแกรมภาษา C สํ าหร ับควบค ุมหุ นยนต POP-BOT XTไม ให เคลื ่อนที ่ตกโต ะ

Page 160: POP-BOT XT_TH

160XT

(A11.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

(A11.3) นํ าหุ นยนต วางไว บนโต ะ เป ดสวิ ตช จ ายไฟแก หุ นยนต กดสวิ ตช OK เพื่ อเริ่ มต นการทํ างาน

หุ นยนต จะเคลื ่อนที ่ตรงมาข างหน าอย างต อเนื่ องจนกระทั ่งแผงวงจตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03ตั วใดตั วหนึ่ งหรื อทั้ งคู เลยขอบโต ะออกมา นั่ นคื อ พบว า หุ นยนต กํ าลั งจะเคลื่ อนท่ี ตกโต ะ หุ นยนต จะถอยหลั งแล วหมุ นตั วไปในทิ ศทางตรงข ามกั บแผงวงจรตรวจจั บ ZX-03 ด านที่ ตรวจพบว า ไม มี การสะท อนแสง นั่ นคื อแผงวงจรตรวจจั บไม อยู บนโต ะแล ว

กรณี ตั วตรวจจั บท้ั งสองตั วพ นขอบโต ะ การเคลื่ อนท่ี เป นดั งนี้

TB6612

100

TB6612

100

TB 6612

100

TB 6612

100

TB661 2

1 00

T B6 6 1

2

100

1

4 5 6

2 3

กรณี ตั วตรวจจั บด านซ ายพ นขอบโต ะ การเคลื่ อนท่ี เป นดั งนี้

TB6612

100

TB6612

100

T B66 1

2

100

กรณี ตั วตรวจจั บด านขวาพ นขอบโต ะ การเคลื่ อนท่ี เป นดั งนี้

T B6612

100

TB6612

100

TB6612

100

Page 161: POP-BOT XT_TH

XT 161

XT

จากกิ จกรรมที่ 9 เป นการทดสอบให ทราบว า หุ นยนต POP-BOT XT ตั วที่ กํ าลั งใช งานนี้ มี ค าอ างอิ งหรื อจุ ดตั ดสิ นใจระหว างสี ดํ าและขาวอยู ที่ 500 ดั งนั้ นถ าค าที่ อ านได จากแผงวงจรตรวจั บแสงะสะท อนอิ นฟราเรด ZX-03 ตํ่ ากว า 500 จะได รั บการตี ความว าเป นสี ดํ าเสมอ

เพื่ อเป นการยื นยั นผลการตรวจจั บในกิ จกรรมนี้ จึ งกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนท่ี ตรงมาข างหน าอย างอิ สระ จนหระทั่ งพบเส นสี ดํ า หุ นยนต POP-BOT XT จะต องหยุ ดการเคลื่ อนท่ี ทั นที

(A12.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A12-1

(A12.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

(A12.3) นํ าเทปสี ดํ าติ ดยาว 30 ซม .ลงบนพื้ นท่ี สํ าหรั บการทดสอบ

(A12.4) นํ าหุ นยนต วางไว บนพื้ น ให ห างจากเทปสี ดํ าประมาณ 60 ซม. เป ดสวิ ตช จ ายไฟแก หุ นยนต กดสวิ ตช OK

หุ นยนต จะเคลื่ อนที่ ตรงมาข างหน าอย างต อเน่ื อง และหยุ ดเมื่ อตั วตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03ตั วใดตั วหน่ึ งที่ อยู ด านหน าของหุ นยนต พบเส นสี ดํ า

(A12.5) จากการทดสอบโปรแกรมที ่ A12 -1 พบว า เมื ่อใช เพ ียงค ําสั ่ง ao(); เพื ่อหยุ ดการท ํางานของมอเตอร ในความเป นจร ิง มอเตอร อาจไม ได หยุ ดในทั นที ม ันอาจม ีแรงเฉื ่อยที ่ทํ าให หุ นยนต เคลื ่อนที ่ไปข างหน าได อ ีกเล ็กน อย ด ังนั ้นถ าต องการหยุ ดแบบทั นท ีท ันใด จะต องใช การถอยหล ังด วยระยะเวลาสั ้นๆ ก อนหย ุด ด ังแสดงในโปรแกรมที ่ A12 -2

(A12.6) เขี ยนโปรแกรมที่ A12-2 แล วคอไมไฟล และอั ปโหลดไปยั งหุ นยนต POP-BOT XT

(A12.7) ยั งคงใช สนามทดสอบแบบเดิ ม วางหุ นยนต ในตํ าแน งเดี ยวกั บขั้ นตอนที่ (A11.4) จากน้ั น เป ดสวิ ตช จ ายไฟแก หุ นยนต กดสวิ ตช OK เพื่ อเริ่ มต นการทํ างาน

หุ นยนต จะเคลื่ อนที่ ตรงมาข างหน าอย างต อเน่ื อง และหยุ ดเมื่ อตั วตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03ด านซ ายพบเส นสี ดํ า การหยุ ดในครั้ งนี้ กระทํ าได นิ่ งกว าการใช โปรแกรมที่ A12-1

Page 162: POP-BOT XT_TH

162XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcd(1,1,"Moving..."); // แสดงข อความการทํ างานfd(60); // เคลื่ อนที่ ตรงไปข างหน าwhile(analog(0)>500); // ตรวจสอบค าจากตั วตรวจจั บที่ ช อง A0 จนกระทั่ งเงื่ อนไขเป นเท็ จao(); // หยุ ดการทํ างานของมอเตอร

}void loop(){}การทํ างานของโปรแกรม

เมื่ อกดสวิ ตช OK หุ นยนต จะเริ่ มเคลื่ อนที่ ไปพร อมกั บอ านค าจากแผงวงจรตรวจจั บ ZX-03 ที่ ช อง A0 (ด านซ าย) เมื่ อใดที่ อ านค าได น อยกว า 500 จะตี ความว า พบเส นสี ดํ า จึ งสั่ งให มอเตอร ทั้ งหมดหยุ ดทํ างานด วยคํ าสั่ ง ao();

โปรแกรมที่ A12-1 ไฟล BlackLineDetect.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บตรวจจั บเส นสี ดํ าของหุ นยนต POP-BOT XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcd(1,1,"Moving..."); // แสดงข อความการทํ างานfd(60);while(analog(0)>500); // ตรวจสอบค าจากตั วตรวจจั บที่ ช อง A0 จนกระทั่ งเงื่ อนไขเป นเท็ จbk(100); // ถอยหลั งสั้ นๆ เพื่ อทํ าการหยุ ดsleep(100);ao(); // หยุ ดการทํ างานของมอเตอร

}void loop(){}

โปรแกรมที่ A12-2 ไฟล BlackLineDetect2.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บตรวจจั บเส นส ีดํ าของหุ นยนต POP-BOT XT และหยุ ดได แม นยํ ามากขึ ้นด วยการเพ่ิ มคํ าสั่ ง bk(); ก อนหย ุด

Page 163: POP-BOT XT_TH

XT 163

XT

หั วใจหล ักของหุ นยนต เคลื ่อนท่ี ตามเส นคื อ ควบค ุมให หุ นยนต เคลื ่อนท่ี โดยที่ ต ัวตรวจจ ับเส นทั้ งสองต ัวอยู ในตํ าแหน งที่ คร อมเส น ดั งนั้ นจะเกิ ดเหตุ การณ ขึ้ น 4 กรณี ซึ่ งนํ ามาใช กํ าหนดเงื่ อนไขของการทํ างานได ดั งนี้

กรณี ที่ 1 หุ นยนต อยู ในแนวเส นของสนามหรื อคร อมเส น

TB6612

100

ต องกํ าหนดให หุ นยนต เคลื่ อนที่ ตรงไปข างหน า

กรณ ีที ่ 2 หุ นยนต เคลื ่อนที ่เอ ียงไปทางขวา ต ัวตรวจจ ับเส นด านซ ายพบเส นส ีด ํา

TB6612

100

ต องกํ าหนดให หุ นยนต เคลื่ อนที่ มาทางซ าย

Page 164: POP-BOT XT_TH

164XT

กรณี ที่ 3 หุ นยนต เคลื่ อนที่ เอี ยงไปทางซ าย ตั วตรวจจั บเส นด านขวาพบเส นสี ดํ า

TB6612

100

ต องกํ าหนดให หุ นยนต เคลื่ อนท่ี มาทางขวา

กรณี ที่ 4 หุ นยนต พบเส นตั ด ตั วตรวจจั บเส นทั้ งคู พบเส นสี ดํ า

TB6612

100

ต องเลื อกว า ต องการให หุ นยนต เคลื่ อนท่ี ไปทางตรง เลี้ ยวซ าย หรื อเลี้ ยวขวา

(A13.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A12-1

(A13.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

Page 165: POP-BOT XT_TH

XT 165

(A13.3) ใช แผ นพลาสติ กลู กฟู กขนาด 90 x 60 เซนติ เมตร (หรื อขนาดอื่ นก็ ได ตามต องการ แต ควรมี ขนาดใหญ เพี ยงพอให หุ นยนต สามารถเคลื่ อนท่ี ได โดยสะดวก) มาทํ าเป นพื้ นสนาม แล วติ ดเทปสี ดํ าตามรู ป

(A13.4) น ําหุ นยนต POP-BOT XT วางไว คร อมเส น เป ดสว ิตช จ ายไฟแก หุ นยนต กดสว ิตช OK เพื ่อเริ ่มต นการท ํางาน

หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ตามเส นอย างต อเน่ื องเมื่ อพบเส นตั ด หุ นยนต จะเคลื่ อนท่ี ข ามเส นตั ดและขั บเสี ยง “ติ้ ด” ออกทางลํ าโพง

(A13.5) ทดลองเพิ ่มความเร ็วของหุ นยนต POP-BOT XT จนกระทั ่งได ความเร ็วส ูงส ุดที ่หุ นยนต ย ังคงสามารถเคลื ่อนที่ ได โดยไม หลุ ดออกจากเส น

คํ าแนะนํ าต อไปนี ้ เป นส วนหนึ ่งของการตรวจสอบและค นหาสาเหตุ ในกรณี ที ่หุ นยนต ไม เคลื ่อนท่ี ตามเส นโดยรวบรวมจากประสบการณ ตรงที่ ได จากการแนะนํ าและอบรมทั้ งจากผู ใช งานทั่ วไป นั กเรี ยน และนั กศึ กษา

1. ตรวจสอบการเชื่ อมต อสายของแผงวงจรตรวจจั บแสงสะท อนอิ นฟราเรด ZX-03 ที ่นํ ามาใช เป นตั วตรวจจั บเส นท้ั งสองตั วว า มี การต อสลั บขาพอร ตกั นหรื อไม โดยตั วตรวจจั บเส นด านซ ายต องต อกั บพอร ต A0/18 ส วนตั วตรวจจั บเส นด านขวาต อกั บพอร ต A1/19

2. ตรวจสอบการต อสายมอเตอร ว า มี การต อสลั บกั นระหว างมอเตอร A และมอเตอร B หรื อไม โดยมอเตอร A (หรื อมอเตอร 1) ในท่ี นี้ คื อ มอเตอร ด านซ าย ส วนมอเตอร B (หรื อมอเตอร 2) คื อ มอเตอร ด านขวา

3. การติ ดตั้ งตั วตรวจจั บเส นสู งหรื อตํ่ ากว าค าที่ ควรจะเป นหรื อไม ควรติ ดตั้ งสู งจากพื้ นในช วง 5 ถึ ง 10มิ ลล ิเมตร

4. ทดสอบการอ านค าและเลื อกค าอ างอิ งสํ าหรั บใช ตั ดสิ นว า เป นสี ดํ าหรื อขาวอี กครั้ งตามขั้ นตอนในกิ จกรรมที่ 9 เพื่ อตรวจสอบการทํ างานของตั วตรวจจั บเส นว า ยั งทํ างานถู กต องอยู หรื อไม

Page 166: POP-BOT XT_TH

166XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint L,R;void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcd(1,1,"Moving..."); // แสดงข อความการทํ างาน

}void loop(){

L=analog(0); // อ านและเก็ บค าของตั วตรวจจั บเส นด านซ ายR=analog(1); // อ านและเก็ บค าตั วตรวจจั บเส นด านขวาif (L<500&&R<500) // พบเส นตั ดสี ดํ าหรื อไม {

fd(60); // เคลื่ อนที่ ตรงต อไปเพื่ อข ามทางแยก พร อมขั บเสี ยงสั ญญาณsound(2000,200);

}else if(L>500&&R>500) // ตรวจสอบว า หุ นยนต คร อมเส นอยู หรื อไม {

fd(60); // ถ ายั งคร อมเส นอยู ควบคุ มให เคลื่ อนที่ ตรงต อไปด วยช วงเวลาสั้ นๆ}else if(L<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางขวา

// เพราะตั วตรวจจั บเส นด านซ ายพบเส นสี ดํ า{

sl(60); // หมุ นตั วทางซ ายเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}else if(R<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางซ าย

// เพราะตั วตรวจจั บเส นด านขวาพบเส นสี ดํ า{

sr(60); // หมุ นตั วทางขวาเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}}

โปรแกรมที่ A13-1 ไฟล SimpleLineTracking.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บควบคุ มหุ นยนต POP-BOT XT เคลื ่อนที ่ตามเส นสี ดํ า โดยใช ต ัวตรวจจ ับเส น 2 ตั ว

Page 167: POP-BOT XT_TH

XT 167

ในกิ จกรรมนี้ เป นตั วอย างที่ จํ าลองมาจากการแข งขั นเขาวงกตแบบเส นหรื อ Maze Solving อั นเป นการกิ จกรรมที่ ต องการให หุ นยนต เคลื่ อนท่ี ตามเส น เมื่ อพบจุ ดตั ด จะต องม ีการเลี ้ยวเพื่ อเปลี่ ยนเส นทาง และจะเคลื ่อนที่ ในลั กษณะนี้ ไปจนกระทั่ งพบเส นตั ดทั้ งหมดที่ มี ในสนามแข งขั น

ใช เทปผ าหรื อเทปพั นสายไฟสี ดํ าติ ดลงบนแผ นพลาสติ กลู กฟู กขนาด 90x60 เซนติ เมตร (หรื อขนาดอื่ นก็ ได ตามต องการ แต ควรมี ขนาดใหญ เพี ยงพอให หุ นยนต สามารถเคลื่ อนท่ี ได โดยสะดวก) ตามรู ป

ในการทํ ากิ จกรรมลั กษณะนี้ ป จจั ยหนึ่ งที่ มี ความสํ าคั ญมากคื อ การเลี้ ยวแบบ 90 องศาอย างแม นยํ ามาพอ จึ งต องมี การสร างฟ งก ชั่ นสํ าหรั บทํ าหน าที่ นี้ โดยเฉพาะ ซึ่ งในท่ี นี้ ตั้ งชื่ อว า ฟ งก ชั่ น R90() เป นฟ งก ชั่ นเลี้ ยวขวา 90 องศาเม่ื อพบเส นตั ด

การเลี้ ยวขวาเมื่ อพบเส นตั ดให เกิ ดความแม นยํ านั้ น หุ นยนต จะต องเคลื่ อนท่ี ตรงไปข างหน าเล็ กน อยจากนั ้นสั ่งให หุ นยนต เลี ้ยว ในขณะที ่เลี ้ยวจะต องตรวจสอบตั วตรวจจั บเส นในท่ี นี้ ค ือ แผงวงจร ZX-03 ในด านที่ เลี้ ยวว า พบเส นตั ดทั้ งแถบแล วหรื อไม หากพบแล วถื อว า การเลี้ ยวน้ั นสมบู รณ ก็ จะเคลื่ อนท่ี ตรงต อไป ในรู ปท่ี A14-1แสดงลั กษณะการทํ างานของหุ นยนต เมื่ อกระทํ าฟ งก ชั่ น R90()

ฟ งก ชั่ นนี้ จะถู กเรี ยกใช เมื่ อหุ นยนต POP-BOT XT เคลื่ อนท่ี ไปพบเส นตั ด

Page 168: POP-BOT XT_TH

168XT

ร ูปที ่ A14-1 การทํ างานของหุ นยนต เมื ่อกระท ําฟ งก ชั ่น R90() เพ่ื อให การเลี ้ยวขวาแม นย ําข้ึ น

(A14.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A14-1

(A14.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

(A14.3) น ําหุ นยนต POP-BOT XT วางไว คร อมเส น เป ดสว ิตช จ ายไฟแก หุ นยนต กดสว ิตช OK เพื ่อเริ ่มต นการท ํางาน

หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ตามเส นอย างต อเน่ื องเมื่ อพบเส นตั ด หุ นยนต จะเลี้ ยวขวาพร อมทั้ งส งเสี ยง “ติ้ ด” ออกมาทุ กครั้ ง

Page 169: POP-BOT XT_TH

XT 169

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint L,R;/* โปรแกรมย อยเลี้ ยวขวาเมื่ อเจอทางแยก */void R90(){

fd(60); // เคลื่ อนที่ ตรงไปข างหน าเล็ กน อยsound(1500,100);while(analog(1)>500) // หมุ นตั วไปทางขวา จนกระทั่ งตั วตรวจจั บเส นด านขวาพบสี ดํ า{

sr(60);}while(analog(1)<500) // หมุ นขวาต อไป จนกระทั่ งตั วตรวจจั บเส นด านขวาพบสี ขาว{

sr(60);}

}void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcd(1,1,"Moving..."); // แสดงข อความการทํ างาน

}void loop(){

L=analog(0); // อ านและเก็ บค าจากตั วตรวจจั บเส นด านซ ายR=analog(1); // อ านและเก็ บค าจากตั วตรวจจั บเส นด านขวาif (L<500&&R<500) // พบเส นตั ดสี ดํ าหรื อไม {

R90(); // เรี ยกโปรแกรมย อยเลี้ ยวขวา 90 องศา}else if(L>500&&R>500) // ตรวจสอบว า หุ นยนต คร อมเส นอยู หรื อไม {

fd(60); // ถ ายั งคร อมเส นอยู ควบคุ มให เคลื่ อนที่ ตรงต อไปด วยช วงเวลาสั้ นๆ}else if(L<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางขวา{

sl(60); // หมุ นตั วทางซ ายเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}else if(R<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางซ าย{

sr(60); // หมุ นตั วทางขวาเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}}

โปรแกรมที ่ A14-1 ไฟล SimpleMaze.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บควบค ุมหุ นยนต POP-BOT XT เคลื ่อนที ่ตามเส นสี ด ําและเลี ้ยวขวาเมื ่อพบเส นต ัด

Page 170: POP-BOT XT_TH

170XT

XT

ในกรณ ีหุ นยนต เคลื ่อนท่ี ตามเส นต องการตรวจจ ับทางแยกท่ี ม ีความซ ับซ อนเพิ ่มขึ ้น เช น เมื ่อพบทางแยกท่ี 1 ต องเลี้ ยวซ าย เมื่ อพบทางแยกท่ี 2 ต องเลี้ ยวขวา เมื่ อพบทางแยกท่ี 3 ให เคลื่ อนท่ี ตรงไป หรื อเมื่ อพบทางแยกท่ี 4 จะต องกลั บมาเลี้ ยวขวา ผู ใช งานจะต องสร างตั วแปรขึ้ นมาเพื่ อช วยในการตรวจนั บทางแยก

เมื่ อใดก็ ตามที่ ตรวจพบทางแยก ตั วแปรที่ ใช ตรวจนั บทางแยกจะเพิ่ มค าขึ้ น 1 ค า หลั งจากนั้ น ตรวจสอบค าของตั วแปรนี้ ว า เป นค าของทางแยกท่ี ต องเลี้ ยวไปทิ ศทางใด จากนั้ นก็ เรี ยกโปรแกรมการเลี้ ยวซ ายหรื อขวาหรื อตรงไปมาทํ างานต อไป

(A15.1) สร างสนามทดสอบตามรู ปโดยใช เทปพั นสายไฟสี ดํ าติ ดลงบนแผ นพลาสจิ กลู กฟู กหรื อพลาสวู ด ขนาด90x120 ซม. หร ือขนาดอื ่นก็ ได ตามต องการ แต ควรม ีขนาดใหญ เพ ียงพอให หุ นยนต สามารถเคลื ่อนท่ี ได โดยสะดวก

(A15.2) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A15-1

(A15.3) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ป ดสวิ ตช ปลดสาย USB ออก

Page 171: POP-BOT XT_TH

XT 171

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint L,R,x=0;

/* โปรแกรมย อยเล้ี ยวขวาเมื่ อพบทางแยก */void R90(){

fd(60); // เคลื่ อนที่ ตรงไปข างหน าเล็ กน อยsound(1500,100);while(analog(1)>500) // หมุ นตั วไปทางขวา จนกระทั่ งตั วตรวจจั บเส นด านขวาพบสี ดํ า{

sr(60);}while(analog(1)<500) // หมุ นขวาต อไป จนกระทั่ งตั วตรวจจั บเส นด านขวาพบสี ขาว{

sr(60);}

}

/* โปรแกรมย อยเล้ี ยวซ ายเมื่ อพบทางแยก */void L90(){

fd(60); // เคลื่ อนที่ ตรงไปข างหน าเล็ กน อยsound(1500,100);while(analog(0)>500) // หมุ นตั วไปทางซ าย จนกระทั่ งตั วตรวจจั บเส นด านซ ายพบสี ดํ า{

sl(60);}while(analog(0)<500) // หมุ นซ ายต อไป จนกระทั่ งตั วตรวจจั บเส นด านซ ายพบสี ขาว{

sl(60);}

}

void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcd(1,1,"Moving..."); // แสดงข อความการทํ างาน

}void loop(){

L=analog(0); // อ านและเก็ บค าจากตั วตรวจจั บเส นด านซ ายR=analog(1); // อ านและเก็ บค าจากตั วตรวจจั บเส นด านขวา

Page 172: POP-BOT XT_TH

172XT

if (L<500&&R<500) // พบเส นตั ดสี ดํ า (ทางแยก) หรื อไม {

if(x==6) // ตรวจสอบการนั บทางแยก ครบ 1 รอบแล วหรื อไม {

x=0; // ถ าครบ ล างค าการนั บทางแยก}x++; // เพิ่ มค า x ขึ้ นหนึ่ งค าเพื่ อนั บทางแยกif (x==3) // เป นทางแยกที่ 3 หรื อไม {

R90(); // ถ าเป นทางแยกที่ 3 ให เลี้ ยวขวา}else{

L90(); // ถ าไม ใช ทางแยกที่ 3 ให เลี้ ยวซ าย}

}else if(L>500&&R>500) // ตรวจสอบว า หุ นยนต คร อมเส นอยู หรื อไม {

fd(60); // ถ ายั งคร อมเส นอยู ควบคุ มให เคลื่ อนที่ ตรงต อไปด วยช วงเวลาสั้ นๆ}else if(L<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางขวา{

sl(60); // หมุ นตั วทางซ ายเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}else if(R<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางซ าย{

sr(60); // หมุ นตั วทางขวาเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}}ส วนเพิ่ มเติ มจากโปรแกรม

สนามที่ ใช ในการทดสอบมี ทางแยกเดี ยวที่ เมื่ อพบแล วต องเลี้ ยวขวา นั่ นคื อ ทางแยกที่ 3 ส วนทางแยกอื่ นๆ เมื่ อหุ นยนต ตรวจพบ ให ทํ าการเลี้ ยวซ ายทั้ งหมด การกํ าหนดเงื่ อนไขในการทํ างานคื อ ตรวจสอบว าทางแยกที่ พบ เป นทางแยกที่ ต องเลี้ ยวขวาหรื อไม ถ าใช เรี ยกโปรแกรมย อยเลี้ ยวขวา [R90()] มาทํ างาน แต ถ าไม ใช เรี ยกโปรแกรมย อยเลี้ ยวซ าย [L90()]มาทํ างานแทน

โปรแกรมที ่ A15-1 ไฟล MultipleCrossingTrack.ino โปรแกรมภาษา C ของ Arduino1.0 ส ําหร ับควบค ุมหุ นยนต POP-BOT XT เคลื ่อนที ่ตามเส นและตรวจจ ับทางแยกที ่ซ ับซ อน

Page 173: POP-BOT XT_TH

XT 173

(A15.4) น ําหุ นยนต POP-BOT XT วางไว คร อมเส น เป ดสว ิตช จ ายไฟแก หุ นยนต กดสว ิตช OK เพื ่อเริ ่มต นการท ํางาน

หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ตามเส นอย างต อเน่ื องเมื่ อพบทางแยกท่ี 1, 2, 4, 5, 6, 7 และ 8หุ นยนต จะเลี้ ยวซ ายท้ั งหมด และจะเลี้ ยวขาวเมื่ อพบทางแยกท่ี 3 ทุ กครั้ งที่ พบทางแยก หุ นยนต จะขั บเสี ยง “ติ้ ด”ออกมาเพื่ อแจ งสถานะการทํ างาน

Page 174: POP-BOT XT_TH

174XT

Page 175: POP-BOT XT_TH

XT 175

XT

อ ีกหนึ ่งต ัวอย างการใช งานอ ินพ ุตอะนาลอกของแผงวงจร POP-XT และฟ งก ชั ่นอ านค าส ัญญาณอะนาลอก ของArduino ค ือ การต ิดต อก ับต ัวตรวจจ ับพ ิเศษที ่ให ผลการทํ างานเป นแรงดั น แต สามารถให ผลการทํ างานเป นค าหร ือปร ิมาณทางฟ ส ิกส ที ่ช ัดเจน โมด ูลว ัดระยะทางด วยแสงอ ินฟราเรด GP2D120 เป นต ัวอย างของต ัวตรวจจ ับที ่ม ีการท ํางานในล ักษณะนี ้ ผลของการตรวจจ ับของ GP2D120 สามารถน ําไปค ํานวณด วยกระบวนการทางซอฟต แวร เพื ่อให ได ผลการทํ างานออกมาเป นระยะทางในหน วยเซนต ิเมตรหร ือนิ ้วได ตามต องการ

การใช งานโมดู ล GP2D120 ในหุ นยนต POP-BOT XT คื อ นํ ามาใช ตรวจจั บวั ตถุ แบบไม สั มผั ส (contactless) รวมไปถึ งสามารถนํ าไปใช ในการค นหาวั ตถุ หรื อสิ่ งกี ดขวางได

11.1 คุ ณสมบั ติ ของ GP2D120 ใช การตรวจจั บระยะทางด วยการสะท อนแสงอิ นฟราเรด

วั ดระยะทางได 4 ถึ ง 30 เซนติ เมตร

ไฟเลี้ ยง 4.5 ถึ ง 5V กระแสไฟฟ า 33 mA

ให เอาต พุ ตเป นแรงดั นในย าน 0.4 ถึ ง 2.4V ที่ ไฟเลี้ ยง +5V

ร ูปที ่ 11-1 แสดงการจ ัดขา ไดอะแกรมเวลาจ ังหวะการท ํางาน และกราฟแสดงการท ํางานของ GP2D120

LED อินฟราเรดตัวสง ตัวรับแสงอินฟราเรด

GNDVout Vcc

GP2D120

วัดครั้งที่ 1 วัดครั้งที่ 2

ไมแนนอน เอาตพุตครั้งที่ 1 เอาตพุตครั้งที่ 2 เอาตพุตครั้งที่ n

วัดครั้งที่ n

38.3ฑ9.6 มิลลิวินาที

5 มิลลิว ินาที

การวัดระยะหาง

แรงดันเอาตพุต

ไฟเล้ียง

* ใช กระดาษเทาขาวรุ น R-27 ของ Kodak ซึ่ งด านขาวมี อั ตราการสะท อนแสง 90% เป นวั ตถุ สํ าหรั บสะท อนแสงเพื่ อวั ดระยะทาง

4 8 12 16 20 24 28 3200

0.4

0.8

1.2

1.6

2.0

2.4

2.8

แรงดันเอาตพุต(V)

ระยะหางจากวัตถุที่ตรวจจับ (cm)

กราฟแสดงการทํ างานของ GP2D120

Page 176: POP-BOT XT_TH

176XT

GP2D120 เป นโมด ูลตรวจจ ับระยะทางแบบอ ินฟราเรดม ีขาต อใช งาน 3 ขาค ือ ขาต อไฟเลี ้ยง (Vcc), ขากราวด (GND) และขาแรงดั นเอาต พ ุต (Vout) การอ านค าแรงดั นจาก GP2D120 จะต องรอให พ นช วงเตร ียมความพร อมของโมด ูลก อน ซึ ่งใช เวลาประมาณ 32.7 ถ ึง 52.9 ม ิลล ิว ินาท ี ด ังนั ้นในการอ านค าแรงด ันจึ งควรรอให พ นช วงเวลาด ังกล าวไปก อน ด ังแสดงข อม ูลเบื ้องต นในร ูปที ่ 10-1

ค าแรงดั นเอาต พุ ตของ GP2D120 ที่ ระยะทาง 30 เซนติ เมตรที่ ไฟเลี้ ยง +5V อยู ในช วง 0.25 ถึ ง 0.55V โดยค ากลางคื อ 0.4V ช วงของการเปลี่ ยนแปลงแรงดั นเอาต พุ ตที่ ระยะทาง 4 เซนติ เมตรคื อ 2.25V 0.3V

11.2 คํ าเตื อนเกี่ ยวกั บสายสั ญญาณของโมดู ล GP2D120เนื ่องจากโมด ูล GPD120 ม ีการจ ัดขาส ัญญาณที ่แตกต างจากจ ุดต อบนแผงวงจรควบค ุมของหุ นยนต POP-BOT

XT แม ว าจะม ีร ูปร างเหม ือนก ันก ็ตาม ด ังนั ้นจ ึงม ีการต อสายส ัญญาณแบบพ ิเศษให แก โมด ูล GP2D120 โดยต อก ับโมด ูลไว แล ว ผู ใช งานเพ ียงนํ าปลายของสายส ัญญาณอ ีกด านหนึ ่งต อเข าก ับจ ุดต อส ัญญาณบนแผงวงจรควบค ุมหล ักได เลยโดยต องไม ถอดสายส ัญญาณที ่ต ิดก ับต ัวโมด ูลและห ามเปลี ่ยนสายส ัญญาณของโมด ูล GP2D120 สล ับก ับสายส ัญญาณของต ัวตรวจจั บแบบอื ่นๆ เด ็ดขาด

11.3 การอ านค าข อม ูลจาก GP2D120 ด วยวงจรแปลงส ัญญาณอะนาลอกเป นด ิจ ิตอลค าแรงด ันเอาต พ ุตจาก GP2D120 จะเปลี ่ยนแปลงตามระยะทางที ่ตรวจวั ดได เช น ว ัดแรงด ัน Vout เท าก ับ 0.5V

จะเท ียบเป นระยะทางได 26 เซนต ิเมตร หร ือที ่ Vout เท าก ับ 2V จะเท ียบเป นระยะห างจากวั ตถุ 6 เซนต ิเมตร เป นต นสามารถสร ุปข อม ูลการเท ียบค า Vout ก ับระยะทางในตารางที ่ 11-1

อย างไรก ็ตาม เพื ่อช วยให การอ านค าจากโมด ูล GP2D120 ทํ าได ง ายขึ ้น จ ึงได สร างไฟล ไลบราร ีส ําหร ับใช งาน

ก ับโมด ูล GP2D120 โดยเฉพาะขึ ้นมา นั ่นคื อไลบราร ี gp2d120_lib.h จะต องผนวกไฟล ไลบราร ีไว ในตอนต นของโปรแกรมก อนใช งานด วยค ําสั ่ง

#include <gp2d120_lib.h>

เนื ่องจากโมด ูล GP2D120 ให ผลการทํ างานเป นแรงด ันไฟตรงที ่ส ัมพ ันธ ก ับระยะทางที ่ตรวจวั ดได ด ังนั ้นในการใช งานจ ึงต องต อโมด ูลตรวจจ ับนี ้เข าก ับอ ินพ ุตสั ญญาณอะนาลอกของ POP-BOT XT นั ่นคื อ พอร ต A0 ถ ึง A7

ฟ งก ชั่ นที่ ใช ในการอ านค าระยะทางที่ วั ดได จากโมดู ล GP2D120 คื อ getdist() มี วิ ธี การใช งานดั งนี้

รู ปแบบ

unsigned int getdist(char adc_ch)

พารามิ เตอร

adc_ch ทํ าหน าที่ รั บการกํ าหนดช องอะนาลอกที่ ใช งานตั้ งแต 0 ถึ ง 7 ตามที่ ได ต อใช งาน

การคื นค า

ระยะทางในหน วยเซนติ เมตร

ตั วอย างที่ 11-1

dist = getdist(3); // อ านค าระยะทางจาก GP2D120 จากช อง An3

Page 177: POP-BOT XT_TH

XT 177

ตารางที่ 11-1 แสดงความสั มพั นธ ระหว างระด ับแรงดั น Vout ของ GP2D120 กั บค าจากวงจรแปลงส ัญญาณอะนาลอกเป นด ิจ ิตอลและระยะทางที ่ว ัดได (ได จากการค ํานวณ)

Page 178: POP-BOT XT_TH

178XT

XT

XT

(A16.1.1) นํ าฉากโลหะ 2x3 รู ยึ ดเข ากั บรู ยึ ดของโมดู ล GP2D120 ทั้ งสองรู โดยใช สกรู 3x10 มม.และนอต 3 มม.ดั งรู ป

(A16.1.2) นํ าโมดู ล GP2D120 ยึ ดเข ากั บบริ เวณด านหน าของหุ นยนต โดยใช สกรู 3x10 มม. และนอต 3 มม.ขั นยึ ดเข ากั บด านหน าของหุ นยนต ดั งรู ป

Page 179: POP-BOT XT_TH

XT 179

(A16.1.3) เสี ยบสายของโมดู ล GP2D120 เข าที่ ตํ าแหน ง 20/A2

จะได หุ นยนต POP-BOT XT ที่ พร อมสํ าหรั บการทํ าภารกิ จตรวจจั บวั ตถุ แบบไม สั มผั ส

โมดู ล GP2D120 ให ผลการตรวจจั บเป นแรงดั นไฟตรงที่ สั มพั นธ กั บระยะทาง การอ านค าของหุ นยนต POP-BOT XT จึ งต องใช คํ าสั่ งอ านค าสั ญญาณอะนาลอก หากค าที่ อ านได มี ค ามากแสดงว า อยู ใกล วั ตถุ ที่ ตรวจจั บ ถ าค าที่ ได น อยแสดงว าวั ตถุ อยู ไกล อย างไรก็ ตาม เพื่ อช วยให หุ นยนต POP-BOT XT สามารถอ านค าระยะห างจากโมดู ล GP2D120 เป นค าในหน วยเซนติ เมตร จึ งเรี ยกใช ไฟล ไลบรารี gp2d120_lib.h

(A16.2.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A16-1

จุ ดต อ 20/A2

โปรแกรมที่ A16-1 ไฟล GP2D120_Reading.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บทดสอบอ านค าจากโมด ูลว ัดระยะทาง GP2D120 ของหุ นยนต POP-BOT XT

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั ก#include <gp2d120_lib.h>int raw,dist;void setup(){

setTextSize(2);glcdMode(1);glcd(1,1,”Press OK”); // แสดงข อความออกหน าจอ GLCDsw_ok_press(); // วนรอจนกระทั่ งกดสวิ ตช glcdClear();

}void loop(){

raw=analog(20); // อ านค าข อมู ลดิ บdist=getdist(20); // อ านค าหน วยเป นเซนติ เมตรglcd(2,1,”RAW Data = %d “,raw); // แสดงค าของข อมู ลดิ บที่ จอแสดงผลglcd(3,1,”Distance = %d CM”,dist); // แสดงค าเซนติ เมตรที่ จอแสดงผลsleep(100);

}

Page 180: POP-BOT XT_TH

180XT

(A16.2.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT จากนั้ นรั นโปรแกรม

(A16.2.3) ทดลองนํ าวั ตถุ มาวางขวางหน าหุ นยนต POP-BOT XT แล วเลื่ อนให เข าใกล หรื อห างออกจากโมดู ลGP2D120 สั งเกตผลการทํ างานผ านจอแสดงผลของหุ นยนต

220 F

100 F

TB6612

ATMega32U4

100

ปรับระยะหางของสิ่งกีดขวางใหเขาใกลและหางออก

ในชวง 4 ถึง 32 เซนตเิมตร

Page 181: POP-BOT XT_TH

XT 181

XT

จากโปรแกรมที่ A16-1 แสดงให เห็ นว า โมดู ล GP2D120 สามารถตรวจจั บวั ตถุ และตรวจสอบระยะห างจากวั ตถุ ได อย างแม นยํ าในระยะ 4 ถึ ง 30 เซนติ เมตร สํ าหรั บในกิ จกรรมนี้ เป นการสั่ งงานให หุ นยนต เคลื่ อนท่ี และเมื่ อหุ นยนต ตรวจพบสิ่ งกี ดขวางอยู ด านหน าในระยะ 10 เซนติ เมตร หุ นยนต POP-BOT XT จะถอยหลั งออกจากสิ่ งกี ดขวางนั้ น แล วเปลี่ ยนทิ ศทางการเคลื่ อนท่ี เพื่ อหลบหลี กสิ่ งกี ดขวางนั้ น

(A17.1) เป ดโปรแกรม Arduino1.0 เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A17-1

(A17.2) จากนั ้นทํ าการคอมไพล แล วอ ัปโหลดไปย ังหุ นยนต POP-BOT XT ปลดสายต อคอมพิ วเตอร ออก

(A17.3) นํ าหุ นยนต POP-BOT XT มาวางบนพื้ น เป ดสวิ ตช เพื่ อรั นโปรแกรม สั งเกตการเคลื่ อนท่ี ของหุ นยนต

หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ตรงไปข างหน าอย างต อเน่ื อง

#include <popxt.h> // ผนวกไฟล ไลบรารี่ หลั กvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,"Let’s go!"); // แสดงข อความพร อมทํ างาน

}void loop(){

fd(70);if(analog(20)>250) // ตรวจพบวั ตถุ ในระยะ 10 เซนติ เมตร{

bk(80); // ถอยหลั งglcdFillScreen(color[random(8)]); // เคลี ยร หน าจอ แล วเปลี่ ยนสี พื้ นจอแสดงผลด วยการสุ มsleep(300);sl(70); // หมุ นตั วไปทางซ าย เพื่ อเปลี่ ยนเส นทางการเคลื่ อนที่ sleep(600);

}}

โปรแกรมที ่ A17-1 ไฟล TouchlessObjectAvoider.ino โปรแกรมภาษา C ของ Arduino1.0 ส ําหร ับทดสอบการทํ างานของหุ นยนต POP-BOT XT ในการตรวจจ ับว ัตถ ุแบบไม ส ัมผ ัส

Page 182: POP-BOT XT_TH

182XT

(A17.4) นํ าวั ตถุ มาวางขวางหน าหุ นยนต แล วสั งเกตการเคลื่ อนท่ี ของหุ นยนต เพื่ อตรวจจั บพบสิ่ งกี ดขวาง

เมื่ อหุ นยนต POP-BOT XT เคลื่ อนท่ี เข าใกล วั ตถุ มากกว า 10 เซนติ เมตร (โดยประมาณ) หุ นยนต จะทํ าการเคลื่ อนท่ี ถอยหลั งเป นเวลา 0.3 วิ นาที ขณะที่ ถอยหลั งมี การแสดงสถานะที่ หน าจอด วยการเปลี่ ยนสี พื้ นของจอแสดงผลแบบสุ ม ม ีด วยกั น 8 สี คื อ สี แดง, สี เขี ยว, สี นํ้ าเงิ น, สี เหลื อง, ส ีดํ า, สี ขาว, สี ฟ า และส ีบานเย็ น จากน้ั นหมุ นตั วไปทางซ าย 0.6 วิ นาที เพื่ อเปลี่ ยนเส นทางการเคลื่ อนท่ี

TB6612

100

TB6612

100

TB6612

100

TB6612

100

TB6612100

1

4 5

2 3

Page 183: POP-BOT XT_TH

XT 183

ในบทนี ้น ําเสนอการควบค ุมเซอร โวมอเตอร ของหุ นยนต POP-BOT XT โดยแผงวงจร POP-XT ของหุ นยนต สามารถขั บเซอร โวมอเตอร ได 3 ตั ว ผ านทางจุ ดต อพอร ต 30 (SV1), 12 (SV2) และ 13 (SV3) ซึ่ งเรี ยกว า เอาต พุ ตเซอร โวมอเตอร

12.1 หลั กการทํ างานของเซอร โวมอเตอร เซอร โวมอเตอร ที ่ใช ในหุ นยนต POP-BOT XT เป นเซอร โวมอเตอร แบบอะนาลอกขนาดเล ็ก บางครั ้งเร ียกว า

R/C เซอร โวมอเตอร โดย R/C มาจากคํ าว า Radio Control เนื่ องจากในอดี ต เซอร โวมอเตอร มั กนํ าไปใช ในการขั บเคลื่ อนกลไกในเครื่ องบิ น, รถ หรื อเรื อที่ บั งคั บด วยคลื่ นวิ ทยุ การกํ าหนดชื่ อ R/C เพื่ อให ทราบถึ งประเภทของงานที่ นํ าเซอร โวมอเตอร นี้ ไปใช นั่ นเอง

เซอร โวมอเตอร เป นอ ุปกรณ แม เหล ็กไฟฟ าแบบหนึ ่งที ่ใช ในการหม ุนต ัวข ับ (actuator) ไปย ังต ําแหน งต างๆ ด วยความแม นย ํา ปกต ิแล วเซอร โวมอเตอร ที ่ย ังไม ได ร ับการปร ับแต งใดๆ นั ้นจะใช งานก ันอยู ในรถ, เร ือ หร ือเครื ่องบ ินบ ังค ับว ิทย ุ เพื ่อทํ าหน าที ่ควบค ุมต ําแหน งของอ ุปกรณ เช น การบ ังค ับเลี ้ยวของรถบ ังค ับว ิทย ุ หร ือใช ส ําหร ับปร ับหางเส ือของเร ือหร ือเครื ่องบ ิน ซึ ่งงานเหล านี ้ต องการแรงบ ิดของมอเตอร ที ่ส ูงพอสมควรด ังนั ้นเซอร โวมอเตอร จ ึงม ีอ ัตราทดที ่มากพอสมควรเพื ่อให สามารถรองร ับงานด ังกล าวได

เซอร โวมอเตอร ม ีม ุมในการหม ุนมาตรฐานคื อ 0 ถ ึง 90 องศา และ 0 ถ ึง 180 องศา ป จจ ุบ ันน ิยมในแบบ 0 ถ ึง180 องศา โดยสามารถด ัดแปลงให หม ุนได ครบรอบ 360 องศาด วย สายต อใช งานมาตรฐานม ี 3 เส นค ือ สายส ัญญาณ(S), สายไฟเลี ้ยง (+V) และสายกราวด (G) โดยในรู ปที่ 12-1 แสดงส วนประกอบต างๆ และการจั ดขาของปลั๊ กหรื อคอนเน็ กเตอร ของเซอร โวมอเตอร

XT

ร ูปที ่ 12-1 แสดงส วนประกอบของเซอร โวมอเตอร

STANDARDSERVO MOTOR

Page 184: POP-BOT XT_TH

184XT

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

12.1.1 คอนเน็ กตอร ของเซอร โวมอเตอร

ร ูปที ่ 12-2 แสดงล ักษณะของคอนเน ็กเตอร ที ่ใช ในการเชื ่อมต อของเซอร โวมอเตอร ม ีด วยก ัน 2 มาตรฐานค ือแบบ S และแบบ J การจ ัดขาจะเหมื อนกั น ความแตกต างค ือ ล ักษณะของคอนเน็ กเตอร และการกํ าหนดส ีของสายส ัญญาณ ส ําหร ับยี ่ห อ Futaba ของญี ่ปุ น กํ าหนดให คอนเน ็กเตอร แบบ J ม ีป กยื ่นออกมาเพิ ่มขึ ้นในด านเด ียวกั บสายส ัญญาณ และกํ าหนดให สายส ัญญาณม ีส ีขาว ส วนแบบ S สายส ัญญาณจะเป นส ีขาว และคอนเน ็กเตอร จะเร ียบเหม ือนก ันทั ้งสองด านของสายเชื ่อมต อ ส วนสายไฟเลี ้ยงเป นส ีแดง และสายกราวด เป นส ีด ําเหม ือนก ันทั ้งสองแบบ

อย างไรก็ ตาม มี ความเป นไปได ที่ ผู ผลิ ตอื่ นๆ อาจกํ าหนดรู ปแบบและสี ของสายสั ญญาณแตกต างออกไปแต การจั ดเรี ยงตํ าแหน งจะเหมื อนกั น

12.1.2 โครงสร างของเซอร โวมอเตอร

ในร ูปที ่ 12-3 แสดงโครงสร างภายในของเซอร โวมอเตอร ส วนประกอบหล ักค ือ มอเตอร ไฟตรงขนาดเล ็ก,ช ุดเฟ องทด, แผงวงจรควบค ุม และต ัวต านทานปร ับค าได (POT : Potentiometer) แกนของมอเตอร ไฟตรงจะต อเข าก ับช ุดเฟ อง เพื ่อลดความเร ็วรอบลง ส งผลให แรงบ ิดที ่แกนหม ุนมากขึ ้น ทั ้งหมดทํ างานร วมก ันภายใต ความส ัมพ ันธ

P = kwg

โดยที่ P คื อ พลั งงานที่ ป อนให แก มอเตอร

k คื อ ค าคงที่

w คื อ ความเร็ วรอบ ในหน วย รอบต อนาที (rpm : round per minute)

g คื อ แรงบิ ดหรื อทอร ค (torque)

ถ าหากพลั งงานที่ จ ายให คงที่ เมื่ อลดความเร็ วรอบลง นั่ นย อมทํ าแรงบิ ดของมอเตอร เพิ่ มขึ้ น

ร ูปที ่ 12-2 ล ักษณะคอนเน ็กเตอร ของเซอร โวมอเตอร

Page 185: POP-BOT XT_TH

XT 185

ร ูปที ่ 12-3 โครงสร างภายในของเซอร โวมอเตอร

การหม ุนของมอเตอร ได ร ับการควบค ุมจากวงจรควบค ุม โดยม ี POT เป นต ัวก ําหนดขอบเขตของแกนหม ุนซึ ่งหากไม ม ีการปร ับแต งใดๆ แกนหม ุนของมอเตอร จะสามารถหม ุนได ในขอบเขต 0 ถ ึง 180 องศา ด ังนั ้นในการปร ับแต งให เซอร โวมอเตอร สามารถข ับแกนหม ุนได รอบต ัวจ ึงม ักจะใช ว ีการถอด POT ออก แล วแทนที ่ด วยต ัวต านทานค าคงที ่ 2 ต ัว หร ือด ัดแปลงให แกนหม ุนของ POT สามารถหม ุนได รอบต ัว

แกนหม ุนของเซอร โวมอเตอร จะม ีส วนปลายเป นร องเฟ อง (spline) เพื ่อให สามารถติ ดต้ั งอ ุปกรณ ที ่ใช ในการเชื ่อมโยงไปย ังต ัวขั บหร ือกลไกอื ่นๆ อ ุปกรณ ที ่ใช เชื ่อมโยงน้ั นเร ียกว า ฮอร น (horn) ซึ ่งม ีด วยก ันหลายร ูปแบบทั ้งแบบเป นแขน, เป นแท ง, กากบาท, แผ นกลม เป นต น สํ าหร ับร องเฟ องของเซอร โวมอเตอร แต ละยี ่ห อก ็ม ีจํ านวนไม เท าก ันโดยของ Hitec จะม ี 24 ร องเฟ อง ส วนของ Futaba ม ี 25 ร องเฟ อง ท ําให ฮอร นของทั ้งสองยี ่ห อใช ร วมก ันไม ได

12.1.3 สั ญญาณพั ลส สํ าหรั บควบคุ มเซอร โวมอเตอร

การควบค ุมเซอร โวมอเตอร ท ําได โดยการสร างส ัญญาณพ ัลส ป อนให ก ับวงจรควบค ุมภายในเซอร โวมอเตอร ด ังในร ูปที ่ 12-4 เริ ่มต นให สร างพ ัลส คาบเวลา 20 ม ิลล ิว ินาท ี แล วปร ับความกว างของพ ัลส ช วงบวก โดยพ ัลส กว าง 1 ม ิลล ิว ินาท ีมอเตอร จะหม ุนไปต ําแหน งซ ายม ือส ุด ถ าส งพ ัลส กว าง 1.5 ม ิลล ิว ินาท ี แกนหม ุนของมอเตอร จะเคลื ่อนที ่ไปย ังต ําแหน งกึ ่งกลาง และถ าส งพ ัลส กว าง 2 ม ิลล ิว ินาท ี แกนหม ุนของมอเตอร จะเคลื ่อนที ่ไปย ังต ําแหน งขวาม ือส ุด

การป อนสั ญญาณพั ลส ที่ มี คาบเวลาช วงบวกต้ั งแต 1.5 ถึ ง 2 มิ ลลิ วิ นาที จะทํ าให เซอร โวมอเตอร หมุ นทวนเข็ มนาฬิ กา โดยถ าค าความกว างพั ลส ยิ่ งห างจาก 1.5 มิ ลลิ วิ นาที มากเท าใด ความเร็ วในการหมุ นก็ จะมากขึ้ นเท านั้ นนั่ นคื อ ความเร็ วสู งสุ ดของการหมุ นทวนเข็ มนาฬิ กาจะเกิ ดข้ึ นเมื่ อสั ญญาณพั ลส ควบคุ มที่ ความกว าง 2 มิ ลลิ วิ นาที

การป อนสั ญญาณพั ลส ที่ มี คาบเวลาช วงบวกต้ั งแต 1 ไปจนถึ ง 1.5 มิ ลลิ วิ นาที ทํ าให เซอร โวมอเตอร หมุ นตามเข็ มนาฬิ กา ซึ่ งถ าค าความกว างพั ลส เข าใกล 1 มิ ลลิ วิ นาที ความเร็ วในการหมุ นของเซอร โวมอเตอร ก็ จะมากนั่ นคื อ ความเร็ วสู งสุ ดของการหมุ นตามเข็ มนาฬิ กาจะเกิ ดข้ึ นเมื่ อสั ญญาณพั ลส ควบคุ มที่ ความกว าง 1 มิ ลลิ วิ นาที

Page 186: POP-BOT XT_TH

186XT

ร ูปที ่ 12-4 แสดงพั ลส ที ่ใช ควบค ุมเซอร โวมอเตอร

STANDARDSERVO MOTOR

STANDARDSERVO MOTOR

STANDARDSERVO MOTOR

Page 187: POP-BOT XT_TH

XT 187

12.1.4 การทํ างานของแผงวงจรควบคุ มในเซอร โวมอเตอร ชนิ ดอะนาลอก

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

ในรู ปที่ 12-5 แสดงไดอะแกรมการทํ างานของแผงวงจรควบคุ มในเซอร โวมอเตอร ชนิ ดอะนาลอก ส ัญญาณพั ลส ควบคุ มถู กส งเข ามาทางอิ นพุ ต จะถู กส งไปยั งวงจรกํ าเนิ ดสั ญญาณพั ลส ภายในด วย โดยมี ความกว างที่ เป นสั ดส วนกั บต ําแหน งของแกนหมุ นในป จจุ บั น ทั้ งสั ญญาณพั ลส ที่ กํ าเนิ ดข้ึ นภายในก ับสั ญญาณพั ลส ควบค ุมจะถ ูกส งไปยั งวงจรเปรี ยบเท ียบ เพื ่อทํ าการหั กล างส ัญญาณ โดยทิ ศทางของส ัญญาณจะขึ้ นอยู ก ับว า ระหว างสั ญญาณพั ลส ควบคุ มทางอิ นพุ ตกั บสั ญญาณพั ลส ภายใน สั ญญาณพั ลส ใดมี ความกว างมากกว า โดยเอาต พุ ตที่ ได เป นสั ญญาณลอจิ ก“0” หรื อ “1” แล วส งไปยั งวงจรขั บมอเตอร แบบ H-บริ ดจ เพื่ อกํ าหนดทิ ศทางการหมุ น ทางด านค าความแตกต างที่ เกิ ดข้ึ นระหว างพั ลส ทั้ งสองสั ญญาณจะถู กส งไปยั งวงจรเพิ่ มความกว างพั ลส เพื่ อสร างสั ญญาณพั ลส สํ าหรั บส งไปขั บมอเตอร ผ านวงจรขั บมอเตอร แบบ H-บริ ดจ โดยความแตกต างของความกว างพั ลส 1% ทํ าให เกิ ดสั ญญาณพั ลส สํ าหร ับข ับมอเตอร ในระด ับ 50% และความเร ็วน้ี จะลดลงเมื ่อแกนหม ุนของมอเตอร เคลื ่อนที ่เข าสู ตํ าแหน งที ่กํ าหนดอั นเป นผลมาจากความแตกต างของความกว างสั ญญาณพั ลส เริ่ มลดลง และหยุ ดลงเมื่ อสั ญญาณพ ัลส ที่ นํ ามาเปรี ยบเที ยบมี ค าความกว างเท ากั น

ร ูปที ่ 12-5 ไดอะแกรมการท ํางานของแผงวงจรควบค ุมในเซอร โวมอเตอร ชน ิดอะนาลอก

Page 188: POP-BOT XT_TH

188XT

12.1.5 วั สดุ ของเฟ องในเซอร โวมอเตอร ชุ ดเฟ องในเซอร โวมอเตอร โดยส วนใหญ ผลิ ตมาจากวั สดุ 3 ชนิ ดคื อ

(1) ไนล อน : เป นวั สด ุที ่นิ ยมนํ ามาใช ผล ิตเฟ องมากที่ ส ุด เนื ่องจากม ีนํ ้าหน ักเบา และม ีเส ียงรบกวนน อยเมื่ อทํ างาน ความทนทานพอสมควร มั กพบในเซอร โวมอเตอร ขนาดเล็ กและราคาถู ก

(2) โลหะ : เฟ องที ่ผล ิตด วยโลหะม ีความทนทานส ูง แข ็งแรง สามารถทนแรงเส ียดทานเมื ่อเฟ องขบก ันได ส ูงมาก ท ําให สามารถน ํามาสร างเซอร โวมอเตอร ที ่ม ีแรงบ ิดส ูงมากได โลหะที ่พบมากที ่ส ุดในการน ํามาผล ิตเฟ องค ือทองเหล ือง และถ าหากม ีงบประมาณมากเพ ียงพอ ควรเล ือกใช เซอร โวมอเตอร ที ่ใช เฟ องที ่ผล ิตจากไทเทเน ียม

(3) คาร บอไนต (Karbonite) : เป นวั สด ุพิ เศษที ่ทํ ามาจากคาร บอน แล วแปรร ูปเป นวั สดุ ที ่คล ายพลาสต ิกHitec เป นผู ที่ น ําเทคโนโลย ีนี ้มาใช เป นวั ตถุ ดิ บในการผลิ ตเฟ อง โดยคาร บอไนต จะมี ความแข ็งแรงและทนทานมากกว าเฟ องไนลอน ในขณะที่ มี นํ้ าหนั กเบา ดั งในเซอร โวมอเตอร สมั ยใหม จึ งนิ ยมใช เฟ องที่ ผลิ ตจากวั สดุ ชนิ ดน้ี

12.1.6 คุ ณสมบั ติ ทางเทคนิ คที่ สํ าคั ญของเซอร โวมอเตอร

ม ี 2 ค าค ือ ความเร ็ว (speed) และ แรงบ ิดหร ือทอร ค (torque) ความเร ็วหมายถ ึง ระยะเวลาที ่ท ําให แกนหม ุนของมอเตอร เคลื ่อนที ่สู ตํ าแหน งม ุมที ่ก ําหนด อาท ิ เซอร โวมอเตอร ม ีความเร ็ว 0.15 ว ินาท ีส ําหร ับ 60 องศา หมายถึ งเซอร โวมอเตอร ต ัวน้ี สามารถข ับให แกนหม ุนเคลื ่อนที ่ไปย ังตํ าแหน งม ุม 60 องศาภายในเวลา 0.15 ว ินาท ี

ส วนแรงบิ ดมั กจะปรากฏในหน วยของออนซ -นิ้ ว (ounce-inches : oz-in) หรื อ กิ โลกรั ม-เซนติ เมตร (kg-cm)เป นคุ ณสมบั ติ ที่ จะบอกต อผู ใช งานว า เซอร โวมอเตอร ตั วนี้ มี แรงในการขั บโหลดที่ มี นํ้ าหนั กในหน วยออนซ ให สามารถเคลื่ อนที่ ไปได 1 นิ้ ว หรื อนํ้ าหนั กในหน วยกิ โลกรั มให เคลื่ อนที่ ไปได 1 เซนติ เมตร (นํ้ าหนั ก 1 ออนซ เท ากั บ 0.028 กิ โลกรั มโดยประมาณ หรื อ 1 กิ โลกรั มเท ากั บ 35.274 ออนซ )

อย างไรก ็ตาม ค าของความเร ็วและแรงบ ิดต องส ัมพ ันธ ก ับแรงด ันไฟเลี ้ยงที ่จ ายให แก เซอร โวมอเตอร ด วย ซึ ่งม ักจะแรงด ัน 4.8 หร ือ 6V นอกจากนั ้นย ังม ีป จจ ัยเกี ่ยวก ับแรงเส ียดทานในระบบเฟ องภายในเซอร โวมอเตอร การหล อลื ่นการเชื ่อมโยงระหว างเฟ องต อเฟ องในช ุดเฟ องทด ที ่ส งผลให ความเร ็วและแรงบ ิดของเซอร โวมอเตอร เปลี ่ยนแปลงไปได

12.2 ฟ งก ชั่ นสํ าหรั บขั บเซอร โวมอเตอร ของหุ นยนต POP-BOT XTการควบค ุมเซอร โวมอเตอร ของหุ นยนต POP-BOT XT จะใช ฟ งก ชั่ นที่ อยู ในไฟล ไลบรารี popxt.h ดั งนี้

servo

เป นฟ งก ชั่ นกํ าหนดตํ าแหน งแกนหมุ นของเซอร โวมอเตอร ควบคุ มได 3 ตั วในเวลาเดี ยวกั น

รู ปแบบvoid servo(unsigned char _ch, int _pos)

พารามิ เตอร _ch - ช องเอาต พุ ตเซอร โวมอเตอร มี ค า 1 ถึ ง 3

_pos - กํ าหนดตํ าแหน งแกนหมุ นของเซอร โวมอเตอร มี ค าในช วง 0 ถึ ง 180 และ -1

ถ ากํ าหนดเป น -1 หมายถึ ง ไม ใช งานเซอร โวมอเตอร ที่ ช องนั้ นๆ

Page 189: POP-BOT XT_TH

XT 189

ในก ิจกรรมนี ้เป นการควบค ุมต ําแหน งแกนหม ุนของเซอร โวมอเตอร ด วยค าที ่อ านได จากปุ ม KNOB บนแผงวงจรควบคุ ม POP-XT

(A18.1) เป ดโปรแกรม Arduino IDE เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A18-1

(A18.2) ทํ าการคอมไพล แล วอ ัปโหลดไปย ังแผงวงจรควบคุ ม POP-XT บนหุ นยนต POP-BOT XT จากนั้ นป ดสวิ ตช ปลดสายดาวน โหลดออก

(A18.3) ต อเซอร โวมอเตอร เข าที่ จุ ดต อเซอร โวมอเตอร SV1 บนแผงวงจรควบคุ ม POP-XT โดยสั งเกตขั้ วต อให ดี สี ดํ าคื อขั้ วลบ, สี แดงเป นขั้ วบวก และสี ขาวหรื อสี เหลื องเป นสายสั ญญาณ (S)

(A18.4) เป ดสวิ ตช เพื่ อจ ายไฟให แก แผงวงจร POP-XT กดสวิ ตช OK เพื่ อเริ่ มการทํ างาน ตามด วยปรั บปถุ ม KNOBบนแผงวงจร POP-XT สั งเกตการทํ างานของเซอร โวมอเตอร

เมื่ อหมุ นปรั บค าของปุ ม KNOB ที่ จอแสดงผลจะแสดงค าของ KNOB และเซอร โวมอเตอร ถู กขั บให แกนหมุ นไปมาตามทิ ศทางของการหมุ นปุ ม KNOB

Page 190: POP-BOT XT_TH

190XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint x;void setup(){

glcdMode(1); // เลื อกการแสดงผลโหมด 1 แสดงผลในแนวนอนsetTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นsw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();

}void loop(){

x=map(knob(),80,1023,0,180); // อ านค าจาก KNOB แปลงเป นค า 0 ถึ ง 180 เก็ บในตั วแปร xglcd(2,1,"Servo = %d ",x); // ส งค าตํ าแหน งของเซอร โวมอเตอร ไปแสดงที่ หน าจอแสดงผลservo(1,x); // ส งค าตํ าแหน งไปยั งเซอร โวมอเตอร ช อง SV1

}

โปรแกรมที่ A18-1 ไฟล ServoKnob.ino โปรแกรมภาษา C ของ Arduino1.0 สํ าหรั บควบคุ มเซอร โวมอเตอร ด วยการปร ับค าแรงด ันอะนาลอกป อนให แก แผงวงจร POP-XT

Page 191: POP-BOT XT_TH

XT 191

XT

(A20.1.1) นํ าฉากโลหะ 2x3 รู จํ านวน 2 ตั วมายึ ดเข าด วยกั นด วยสกรู 3x6 มม. และนอต 3 มม. ดั งรู ป

(A20.1.2) คลายสกรู ที่ ยึ ดก านหมุ นของเซอร โวมอเตอร แล วถอดก านหมุ นออก เก็ บสกรู เกลี ยวปล อยที่ ใช ยึ ดไว จากนั้ นนํ าฉากโลหะยึ ดเข ากั บเซอร โวมอเตอร แล วใช สกรู ขนาด 3x10 มม. ขั นยึ ดดั งรู ป

Page 192: POP-BOT XT_TH

192XT

(A20.1.3) นํ าเซอร โวมอเตอร ยึ ดเข าที่ ด านหน าของหุ นยนต (ดู จากตํ าแหน งที่ วงกลมไว ) โดยใช สกรู 3x10 มม. อี ก2 ตั วกั บนอต 3 มม. ขั นยึ ด

(A20.1.4) ทํ าแขนสํ าหรั บตี โดยใช แท งต อลพาสติ ก 12 รู ยึ ดกั บแกนหมุ นของเซอร โวมอเตอร โดยใช สกรู ยึ ดก านหมุ นที่ ถอดไว จากขั้ นตอนที่ (A20.1.2) มาขั นยึ ดแท งต อให แน น ต อสายของเซอร โวมอเตอร เข าที่ จุ ดต อเอาต พุ ตเซอร โวมอเตอร ช องที่ 1 หรื อ SV1 เพี ยงเท านี้ ก็ จะได หุ นยนต สํ าหรั บภารกิ จ ObjectHitter-BOT

Page 193: POP-BOT XT_TH

XT 193

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint L,R,x=0;void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,"Let’s go!"); // แสดงข อความพร อมทํ างานservo(1,0); // ให เซอร โวไปอยู ที่ ตํ าแหน ง 0 องศาsleep(1000);fd(60); // เริ่ มต นขั บเคลื่ อนหุ นยนต

}void loop(){

if(analog(0)<500) // ตรวจสอบว าเจอเส นตั ด{

ao();servo(1,180); // หมุ นเซอร โวไปท่ี ตํ าแหน ง 180 องศาsleep(1000); // รอให เซอร โวหมุ นไปที่ ตํ าแหน งนั้ นservo(1,0); // หมุ นเซอร โวกลั บมาที่ ตํ าแหน ง 0 องศาwhile(1); // หยุ ดที่ นี่

}}

หล ังจากสร างหุ นยนต POP-BOT XT สํ าหร ับภารก ิจ ObjectHitter-BOT เสร ็จแล ว ลํ าด ับต อไปค ือ การเข ียนโปรแกรมเพื่ อทดสอบการเลคื่ อนท่ี ตามเส นเพื่ อค นหาจุ ดตั ดและควบคุ มการทํ างานของเซอร โวมอเตอร

(A20.2.1) เป ดโปรแกรม Arduino IDE เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A20-1

(A20.2.2) ท ําการคอมไพล แล วอ ัปโหลดไปย ังแผงวงจรควบคุ ม POP-XT บนหุ นยนต POP-BOT XT จากนั้ นป ดสว ิตช ปลดสายดาวน โหลดออก

(A20.2.3) ติ ดเทปสี ดํ าบนพื้ น จากนั้ นนํ าหุ นยนต มาวางให ห างเส นประมาณ 30 ซม.

(A20.2.4) เป ดสวิ ตช เพื่ อจ ายไฟ แล วกดสวิ ตช OK ให หุ นยนต เริ่ มทํ างาน

หุ นยนต POP-BOT XT จะเคลื่ อนท่ี ตรงเข าหาเส นสี ดํ า เมื่ อพบเส น หุ นยนต จะหยุ ดเคลื่ อนท่ี แล วทํ าการข ับเซอร โวมอเตอร ให แกนหม ุนเคลื ่อนที ่ไปยั งต ําแหน ง 180 องศาจากนั ้นหม ุนกล ับมาย ังตํ าแหน ง 0 องศา ม ีล ักษณะอาการคล ายกั บหุ นยนต ทํ าการเหวี่ ยงแขนตี

โปรแกรมที ่ A20-1 ไฟล ServoHitting.ino โปรแกรมภาษา C ของ Arduino ส ําหร ับควบค ุมเซอร โวมอเตอร ของหุ นยนต POP-BOT XT ในภารกิ จ ObjectHitter-BOT

Page 194: POP-BOT XT_TH

194XT

หลั งจากทดสอบการควบคุ มเซอร โวมอเตอร เรี ยบร อย ลํ าดั บต อไปคื อ เขี ยนโปรแกรมเพื่ อปฏิ บั ติ ภารกิ จโดยสนามของภารกิ จน้ี แสดงดั งรู ป

START

STOP

จากจุ ด START หุ นยนต ต องเคลื่ อนท่ี ตามเส น มี สิ่ งที่ ต องทํ า 4 อย างเมื่ อตรวจพบ เส นตั ดคื อ

1. เลี้ ยวซ าย ในทางโปรแกรมต องเขี ยนให หุ นยนต ทํ างานด วยฟ งก ชั่ น L90()

2. เลี้ ยวขวา ในทางโปรแกรมต องเขี ยนให หุ นยนต ทํ างานด วยฟ งก ชั่ น R90()

3. เดิ นตรง ในทางโปรแกรมต องเขี ยนให หุ นยนต ทํ างานด วยฟ งก ชั่ น FF()

4. ตี วั ตถุ ที่ วางอยู ที่ ปลายเส นรู ปตั ว T แล วหมุ นตั วกลั บ ในทางโปรแกรมต องเขี ยนให หุ นยนต ทํ างานด วยฟ งก ชั่ น hit()

เมื ่อพิ จารณาจากสนามของภารกิ จนี ้ จะพบว า หุ นยนต จะเคลื ่อนที ่และท ํางานตามฟ งก ชั ่นเหม ือนๆ ก ันท้ั ง4 ทางแยกของสนาม ดั งนั้ นผู พั ฒนาโปรแกรมสามารถวนทํ างาน 4 รอบเพื่ อปฏิ บั ติ ตามเงื่ อนไขได โดยกํ าหนดตั วแปรขึ้ นมาตั วหน่ึ ง (y) สํ าหรั บนั บการเกิ ดขึ้ นซ้ํ าของเหตุ การณ และกํ าหนดตั วแปรอี กตั วหน่ึ ง (x) สํ าหรั บนั บทางแยก ในการทํ าภารกิ จ 1 รอบ จะมี เหตุ การณ ที่ เกิ ดขึ้ นเมื่ อพบทางแยกดั งนี้

Page 195: POP-BOT XT_TH

XT 195

1. พบทางแยกครั้ งที่ หน่ึ ง หุ นยนต เลี้ ยวซ าย

2. พบทางแยกครั้ งที่ สอง หุ นยนต ตี วั ตถุ แล วหมุ นตั วกลั บ จากนั้ นเคลื่ อนท่ี ตรง

3. พบทางแยกครั้ งที่ สาม หุ นยนต เคลื่ อนท่ี ตรงข ามทางแยกไป

4. พบทางแยกครั้ งที่ สี่ หุ นยนต ตี วั ตถุ แล วหมุ นตั วกลั บ จากนั้ นเคลื่ อนท่ี ตรง

5. พบทางแยกครั้ งที่ ห า หุ นยนต เลี้ ยวขวา

(A20.3.1) เป ดโปรแกรม Arduino IDE เขี ยนโปรแกรมภาษา C ตามโปรแกรมที่ A20-2

(A20.3.2) ทํ าการคอมไพล แล วอ ัปโหลดไปย ังแผงวงจรควบค ุม POP-XT บนหุ นยนต POP-BOT XT จากนั ้นป ดสว ิตช ปลดสายดาวน โหลดออก

Page 196: POP-BOT XT_TH

196XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint L,R,x=0,y=0;/* ฟ งก ชั่ นเดิ นตรงเมื่ อเจอทางแยก */void FF(){

fd(60);sleep(300);

}/* ฟ งก ชั่ นเลี้ ยวขวาเมื่ อเจอทางแยก */void R90(){

fd(60); // เคลื่ อนที่ ตรงไปด านหน าเล็ กน อยsound(1500,100);while(analog(1)>500) // วนเลี้ ยวขวาจนกระทั่ งเซนเซอร ด านขวาเจอสี ดํ า{

sr(60);}while(analog(1)<500) // วนเลี้ ยวขวาต อไปกระท่ั งเซนเซอร ด านขวาเจอสี ขาว{

sr(60);}

}/*ฟ งก ชั่ นเลี้ ยวซ ายเมื่ อเจอทางแยก */void L90(){

fd(60); // เคลื่ อนที่ ตรงไปด านหน าเล็ กน อยsound(1500,100);while(analog(0)>500) // วนเลี้ ยวซ ายจนกระทั่ งเซนเซอร ด านซ ายเจอสี ดํ า{

sl(60);}while(analog(0)<500) // วนเลี้ ยวซ ายต อไปกระท่ั งเซนเซอร ด านซ ายเจอสี ขาว{

sl(60);}

}/* ฟ งก ชั่ นตี กระป องและหมุ นตั วกลั บ */void hit(){

bk(100); // ถอยหลั งเล็ กน อยsleep(50);ao(); // หยุ ดขั บมอเตอร servo(1,180); // ขั บเซอร โวมอเตอร ให แกนหมุ นไป 180 องศาsleep(1000);servo(1,0);bk(60); // ขั บเซอร โวมอเตอร ให แกนหมุ นกลั บไปยั งตํ าแหน ง 0 องศาsleep(200);R90(); // หมุ นขวา 90 องศา

}

Page 197: POP-BOT XT_TH

XT 197

void setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษรเป น 2 เท าglcd(1,1,"Press OK"); // แสดงข อความเริ่ มต นglcd(2,1,"to Start");sw_ok_press(); // ตรวจสอบการกดสวิ ตช OKglcdClear();glcd(1,1,"Let’s go!"); // แสดงข อความพร อมทํ างาน

}void loop(){

L=analog(0); // เก็ บค าตั วตรวจจั บเส นด านซ ายR=analog(1); // เก็ บค าตั วตรวจจั บเส นด านขวาif (L<500&&R<500) // พบเส นตั ดสี ดํ าหรื อไม {

if(x==5) // ตรวจสอบการนั บแยกครบ 1 รอบ{

x=0; // ถ าครบแล ว ทํ าการเคลี ยร ค าการนั บแยกy++; // เพิ่ มค าแขนย อยทางแยกif (y==4) // ถ าหุ นยนต เคลื่ อนที่ ครบทั้ ง 4 แขนของสนาม{

ao(); // หยุ ดการทํ างานของหุ นยนต servo (1,-1); // หยุ ดการทํ างานของเซอร โวมอเตอร while(1);

}}x++; // เพิ่ มค า x ขึ้ นหนึ่ งค า เพื่ อนั บทางแยกif (x==1) // แยกที่ 1 เลี้ ยวซ าย{

L90();}else if(x==2||x==4) // แยกที่ 2 หรื อ 4 ตี วั ตถุ {

hit();}else if (x==3) // แยกที่ 3 เคลื่ อนที่ ตรงเพื่ อข ามทางแยก{

FF();}else if (x==5) // แยกที่ 5 เลี้ ยวขวา{

R90();}

}

Page 198: POP-BOT XT_TH

198XT

โปรแกรมที ่ A20-1 ไฟล ObjectHitterBOT.ino โปรแกรมภาษา C ของ Arduino ส ําหร ับควบค ุมการเคลื ่อนที ่ตามเส นและข ับเซอร โวมอเตอร ของหุ นยนต POP-BOT XT ในภารก ิจ ObjectHitter-BOT

(A20.3.4) เป ดสวิ ตช เพื่ อจ ายไฟ แล วกดสวิ ตช OK ให หุ นยนต เริ่ มทํ างาน

else if(L>500&&R>500) // ตรวจสอบว า หุ นยนต คร อมเส นอยู หรื อไม {

fd(60); // ถ ายั งคร อมเส นอยู ควบคุ มให เคลื่ อนที่ ตรงต อไปด วยช วงเวลาสั้ นๆ}else if(L<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางขวา{

sl(60); // หมุ นตั วทางซ ายเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}else if(R<500) // ตรวจพบว า หุ นยนต เคลื่ อนที่ เอี ยงไปทางซ าย{

sr(60); // หมุ นตั วทางขวาเล็ กน อย เพื่ อให กลั บมาคร อมเส นsleep(20);

}}

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