180
POP-XT 1 Arduino POP-XT กฤษดา ใจเย็น วรพจน กรแกววัฒนกุล ชัยวัฒน ลิ้มพรจิตรวิไล Innovative Experiment Co.,Ltd INEX Education Centre

POP-XT Educationkit manual

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: POP-XT Educationkit manual

POP-XT 1

ArduinoPOP-XT

กฤษดา ใจเย็ น

วรพจน กรแก ววั ฒนกุ ล

ชั ยวั ฒน ลิ้ มพรจิ ตรวิ ไล

Innovative Experiment Co.,Ltd

INEX Education Centre

Page 2: POP-XT Educationkit manual

2 POP-XT

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

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

2. สถาบั นการศึ กษา โรงเรี ยนในระดั บมั ธยมศึ กษาที่ มี การเรี ยนการสอนในวิ ชาตามกลุ มสาระวิ ชาวิ ทยาศาสตร เทคโนโลย ี ว ิศวกรรม และคณิ ตศาสตร (STEM)

3. ว ิทยาล ัยและมหาว ิทยาล ัยที ่ม ีการเป ดการเร ียนการสอนว ิชาอ ิเล ็กทรอน ิกส หร ือภาคว ิชาว ิศวกรรมอ ิเล ็กทรอน ิกส และคอมพ ิวเตอร

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

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

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

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

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

Page 3: POP-XT Educationkit manual

POP-XT 3

ในการเร ียนรู ว ิทยาการสม ัยใหม ม ีแนวค ิดหนึ ่งที ่ได ร ับการยอมร ับอย างกว างขวาง นั ่นค ือ แนวค ิดด าน STEM ศ ึกษา

หร ือ STEM Education ประกอบด วย ว ิทยาศาสตร (Science), เทคโนโลย ี (Technology), ว ิศวกรรม (Engineering)และคณ ิตศาสตร (Mathematic) เพื ่อให ผู เร ียนได ศ ึกษากระบวนการทางว ิทยาศาสตร และเทคโนโลย ีสม ัยใหม ที ่จะต องอาศ ัยท ักษะพื ้นฐานส ําค ัญทั ้ง 4 ด านมาบ ูรณาการก ัน เพื ่อก อให เก ิดความรู ความเข าใจในเรื ่องนั ้นๆ อย างถ ูกต อง

ไมโครคอนโทรลเลอร (microcontroller) และระบบสมองกลฝ งต ัว (embedded system) ถ ูกนํ ามาเป นส วนหนึ ่งของกระบวนการ STEM ศ ึกษาในระด ับม ัธยมศ ึกษา เนื ่องจากในส ังคมสม ัยใหม ม ีอ ุปกรณ เครื ่องใช จ ํานวนมากในช ีว ิตประจ ําว ันที ่ม ีวงจรและอ ุปกรณ อ ิเล ็กทรอน ิกส เข าไปเกี ่ยวข อง การเร ียนรู ของน ักเร ียนเพื ่อท ําความเข าใจและต อยอดไปสู การพ ัฒนาเป นโครงงานว ิทยาศาสตร สม ัยใหม ที ่ม ีความเกี ่ยวข องก ับระบบควบค ุมอ ัตโนม ัต ิ อ ันม ีไมโครคอนโทรลเลอร เป นส วนหนึ ่งของห ัวใจหล ักจ ึงเป นเป าหมายหนึ ่งที ่แสดงถ ึงความส ัมฤทธิ ์ผลของการเร ียนรู STEM ศ ึกษา

แผงวงจรไมโครคอนโทรลเลอร POP-XT (จาก INEX : www.inex.co.th) และซอฟต แวร ระบบเป ด (opensource) ที ่ใช ในการพ ัฒนาโปรแกรมควบค ุมด วยภาษา C/C++ ที ่ชื ่อ Arduino (www.arduino.cc) เป นหนึ ่งในทางเล ือกเพื ่อสน ับสน ุนการเร ียนรู ไมโครคอนโทรลเลอร อย างง าย ก อให เก ิดกระบวนการค ิดเพื ่อพ ัฒนาโครงงานว ิทยาศาสตร สม ัยใหม ที ่ม ีความเกี ่ยวข องก ับระบบควบค ุมอ ัตโนม ัต ิขนาดเล ็ก เพื ่อให ผู เร ียนสามารถบรรล ุจ ุดประสงค ของการเร ียนรู STEM ศ ึกษา ได อย างม ีประส ิทธ ิภาพ

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

แนวค ิด STEM ศ ึกษาม ิได จํ าก ัดขอบเขตของผู เร ียนไว ในระด ับม ัธยมศ ึกษาเท านั ้น ในระด ับอาช ีวศ ึกษาหร ือระด ับปร ิญญาตร ีช วงต นก ็สามารถเร ียนรู และน ําแนวค ิด STEM ศ ึกษาไปต อยอดได อาจกล าวให เข าใจง ายๆ ว า STEMศ ึกษาค ือ สาระความรู ด านพื ้นฐานทางว ิศวกรรมก ็ได เพราะม ิได จ ําก ัดเฉพาะด านไฟฟ า อ ิเล ็กทรอน ิกส คอมพ ิวเตอร เท านั ้น STEM ม ีฐานความรู ที ่กว างไปถ ึงความรู ทางกลศาสตร ท ักษะการใช เครื ่องม ือ การค ํานวณ สถ ิต ิ เคม ี ช ีวว ิทยาด ังนั ้นการเร ียนรู ไมโครคอนโทรลเลอร และฝ กห ัดการเข ียนโปรแกรมด วยภาษา C/C++ จ ึงน ําไปประย ุกต ใช ให เข าก ับองค ความรู พื ้นฐานต างๆ ได อย างลงต ัว และตอบโจทย การพ ัฒนากระบวนการค ิดได เป นที ่ประจ ักษ

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

Page 4: POP-XT Educationkit manual

4 POP-XT

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

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

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

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

Page 5: POP-XT Educationkit manual

POP-XT 5

บทที่ 1 แนะนํ าอุ ปกรณ ทางฮาร ดแวร ....................................................................................7

บทที่ 2 แนะน ําและต ิดตั ้งซอฟต แวร Arduino 1.0..................................................................17

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

บทที่ 4 ฟ งก ชั ่นพื ้นฐานของ Arduino......................................................................................75

บทที่ 5 การพั ฒนาโปรแกรมสํ าหร ับแผงวงจร POP-XT ด วย Arduino 1.0........................97

บทที่ 6 ทดสอบการควบค ุมฮาร ดแวร ของแผงวงจร POP-XT .......................................... 105

บทที่ 7 ไลบราร ีสํ าหร ับการพ ัฒนาโปรแกรมของแผงวงจร POP-XT................................123

บทที่ 8 ตั วอย างการทดลองใช งานแผงวงจร POP-XT ติ ดต อกั บอ ุปกรณ ภายนอก........155

Page 6: POP-XT Educationkit manual

6 POP-XT

Page 7: POP-XT Educationkit manual

POP-XT 7

ในการเร ียนรู ไมโครคอนโทรลเลอร เพื ่อพ ัฒนาโครงงานสํ าหร ับหน ังส ือเล มนี ้ เล ือกใช อ ุปกรณ ดั งต อไปนี้

1. แผงวงจรไมโครคอนโทรลเลอร POP-XT ที่ ติ ดตั้ งกะบะถ าน AA แบบ 4 ก อน

2. แผงวงจรไฟแสดงผล ZX-LED จํ านวน 2 ชุ ด

3. แผงวงจรสวิ ตช ZX-SWITCH01 จํ านวน 2 ชุ ด

4. แผงวงจรตรวจจั บแสง ZX-LDR

5. แผงวงจรตรวจจั บแสงสะท อน ZX-03R

6. แผงวงจรตั วต านทานปรั บค าได ZX-POTH

7. ไอซี วั ดอุ ณหภู มิ MCP9701 พร อมสายต อ

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

9. เซอร โวมอเตอร

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

โดยมี การจั ดอุ ปกรณ ดั งกล าวในชื่ อ ชุ ดเรี ยนรู ไมโครคอนโทรลเลอร POP-XT Educatioin kit(www.inex.co.th) นอกจากนั ้นเนื ้อหาการเร ียนรู ในหน ังส ือเล มนี ้ย ังใช ได ก ับช ุดหุ นยนต POP-BOT XTท ุกรุ นได ด วย หากการทดลองต องใช อ ุปกรณ เพิ ่มเต ิมจากช ุดหุ นยนต ผู สนใจสามารถสั ่งซื ้อได ก ับบร ิษ ัทอิ นโนเวตี ฟ เอ็ กเพอริ เมนต จํ ากั ด (www.inex.co.th)

Page 8: POP-XT Educationkit manual

8 POP-XT

1.1 คุ ณสมบั ติ ของแผงวงจรควบคุ มหลั ก POP-XT

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

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

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

จุ ดต อพอร ตแบบ JST 3 ขา 12 จุ ดสํ าหรั บต ออุ ปกรณ ตรวจจั บและอุ ปกรณ ต อพ วง

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

มี สวิ ตช RESET

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

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

มี วงจรควบคุ มไฟเลี้ ยง +5V แบบสวิ ตชิ่ ง

จุ ดต อพอร ตอิ นพุ ตเอาต พุ ตดิ จิ ตอลหรื ออะนาลอก 8 ช อง คื อ A0 ถึ ง A7 (ตรงกั บขา 18 ถึ ง23 สํ าหรั บขา A0 ถึ ง A5, 4 และ 6 สํ าหรั บขา A6 และ A7)

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

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

Page 9: POP-XT Educationkit manual

POP-XT 9

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

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

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

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

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

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

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

Page 10: POP-XT Educationkit manual

10 POP-XT

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

PE6

IC1ATMega32U4

(TQFP44)

UVccD-

D+UGnd

UCap

VBusPB0PB1PB2PB3

PB7

RS

TV

ccG

ND

XTAL2

XTAL1

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

SV1

SV2

13

+VmGND

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

m

PW

MA

+V

m

+V

m

PW

MB

BIN

2

BIN

1

GN

D

STB

Vcc

AIN

1

AIN

2

+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

C20.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

+

12

GND+Vm

30

GND+Vm

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

GLCD128x160 pixel

21-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-XT Educationkit manual

POP-XT 11

Q1KRC102

(DTC114)

R1(Default = 510)

LED1

+

S

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

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

สํ าคั ญม ีดั งนี้

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

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

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

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

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

ขนาด (กว าง x ยาว x สู ง) 22 x 70 x 19 มิ ลลิ เมตร (ไม รวมความยาวของแกน 10 มิ ลลิ เมตร)

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

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

Page 12: POP-XT Educationkit manual

12 POP-XT

รู ปที่ 1-4 ร ูปร างและวงจรของแผงวงจรสว ิตช

DATAR3220

R210k

R1510

LED1

S1

Switch

Indicator

Signal output

GND

+V

ZX-S

WIT

CH

01 D

1.2.3 เซอร โวมอเตอร แบบมาตรฐาน

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

ต องการไฟเลี้ ยงในย าน +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 นิ้ ว

STANDARDSERVO MOTOR

1.3 คุ ณสมบั ติ ของชุ ดอุ ปกรณ ตรวจจั บสั ญญาณ1.3.1 แผงวงจรสวิ ตช : ZX-SWITCH01

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

ให เอาต พุ ตคื อ หากมี การกดสวิ ตช จะส งลอจิ ก “0” (ระดั บแรงดั น 0V) และไฟสี แดงติ ด

Page 13: POP-XT Educationkit manual

POP-XT 13

A ZX-LDR

10k

LDR

+

+

+S

+S

LDRLight

A เม่ือแสงมากขึ้นแรงดันท่ีไดจะลดลง

เม่ือแสงมากขึ้นแรงดันท่ีไดจะมากขึ้น+

+

รู ปที่ 1-5 ร ูปร างและวงจรของแผงวงจรตรวจจั บแสง ZX-LDR

แผงวงจรสวิ ตช ZX-SWITCH01ให ผลการท ํางานเป นส ัญญาณดิ จิ ตอล “1” (ไม กดสวิ ตช ) หรื อ“0” (กดสว ิตช ) จ ึงต อใช งานก ับแผงวงจรไมโครคอนโทรลเลอร POP-XT ได ท ุกจ ุดต อ โดยจ ุดต อพอร ตใดที ่ใช งานต องกํ าหนดให ทํ างานเป นพอร ตอิ นพุ ตดิ จิ ตอลด วย

1.3.2 แผงวงจรตรวจจั บแสง : ZX-LDRใช ตรวจจั บแสงสว าง เลื อกเอาต พุ ตได 2 แบบคื อ

+ แรงดั นเอาต พุ ตเพิ่ ม เมื่ อแสงตกกระทบ

+ แรงดั นเอาต พุ ตลดลง เมื่ อแสงตกกระทบ

มี วงจรและรู ปร างของแผงวงจรแสดงในรู ปที ่ 1-5

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

1.3.3 แผงวงจรตรวจจั บแสงสะท อน : ZX-03R

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

Page 14: POP-XT Educationkit manual

14 POP-XT

ร ูปที ่ 1-6 หน าตาและวงจรของแผงวงจรตรวจจ ับแสงสะท อน ZX-03R

10k

LED1

220

+V

GND

OUTSFH310

ต ัวตรวจจั บแสงสะท อน

จ ุดต อสั ญญาณ LED

Potentiometer

A เมื่อหมุนทวนเข็มนาฬิกาแรงดันที่ไดจะมากขึ้น

เมื่อหมุนตามเข็มนาฬิกาแรงดันที่ไดจะมากขึ้น

A ZX-POTH

10kB

+

S

+

S

รู ปที่ 1-7 แสดงรู ปร าง, วงจร และการท ํางานของแผงวงจรต ัวต านทานปรั บค าได แบบแกนหมุ น

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

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

1.3.3 แผงวงจรตั วต านทานปรั บค าได แบบแกนหมุ น : ZX-POTHใช กํ าหนดแรงดั น 0 ถึ ง +5V ตามการหมุ นแกน นํ าไปใช วั ดค ามุ มและระยะทางได มี ทั้ งแบบ

ต ัวตั ้งและตั วนอน มี เอาต พ ุต 2 แบบคื อ แรงดั นมากขึ ้นเมื่ อหมุ นทวนเข็ มนาฬิ กาหร ือ ตามเข ็มนาฬ ิกา

ม ีวงจรและหน าตาของแผงวงจรแสดงในร ูปที ่ 1-7 ใช งานกั บแผงวงจรไมโครคอนโทรลเลอร POP-XT โดยต อสั ญญาณเข ากั บช องอิ นพุ ตอะนาลอกที่ ช อง A0 ถึ ง A7

Page 15: POP-XT Educationkit manual

POP-XT 15

1.3.4 ไอซี วั ดอุ ณหภู มิ MCP9701

เป นอ ุปกรณ ตรวจจ ับและว ัดอ ุณหภ ูม ิที ่ให ผลการท ํางานเป นแรงด ันไฟฟ าแบบเชิ งเส น ร ับรู การเปลี่ ยนแปลงของอุ ณหภู มิ ภายในเวลาไม ถึ ง 2 วิ นาที เชื่ อมต อกั บอิ นพุ ตอะนาลอก A0 ถ ึง A6 ของแผงวงจรหล ัก IPST-SE ได ทั นที ในรู ปที่ 1-8 แสดงการจ ัดขาและกราฟค ุณสมบั ต ิของไอซี ว ัดอ ุณหภ ูมิ เบอร MCP9701

คุ ณสมบั ติ ทางเทคนิ คของ MCP9701 ที่ ควรทราบ

เป นไอซี วั ดอ ุณหภู มิ ในกลุ มเทอร มิ สเตอร แบบแอกตี ฟที่ ให ผลการทํ างานแบบเชิ งเส น

ย านวั ด -40 ถึ ง +125 องศาเซลเซี ยส

ผลการวั ดอ างอิ งกั บหน วยขององศาเซลเซี ยสโดยตรง

ความผิ ดพลาดเฉลี่ ย 2 องศาเซลเซี ยส

ย านไฟเลี้ ยง +3.1 ถึ ง +5.5V กิ นกระแสไฟฟ าเพี ยง 6uA ใช แบตเตอรี่ เป นแหล งจ ายไฟได

ค าแรงดั นเอาต พุ ต 500mV (ที่ 0๐C) ถึ ง 2.9375V (ที่ 125๐)

ค าแรงดั นเอาต พ ุตต อการเปลี่ ยนแปลงอ ุณหภู มิ 19.5mV/๐C ใช งานกั บวงจรแปลงส ัญญาณอะนาลอกเป นดิ จิ ตอลความละเอี ยดตั้ งแต 8 บิ ตได โดยมี ความคลาดเคลื่ อนตํ่ า

ไม ต องการอุ ปกรณ ภายนอกต อเพิ่ มเติ มเพื่ อชดเชยการทํ างาน

ร ูปที ่ 1-8 การจั ดขาของ MCP9701, หน าตาเมื ่อต อสายสั ญญาณพร อมใช งานและกราฟคุ ณสมบั ติ

Page 16: POP-XT Educationkit manual

16 POP-XT

1.4 ข อมู ลของสายสั ญญาณที่ ใช ประกอบการเรี ยนรู

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 17: POP-XT Educationkit manual

POP-XT 17

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

2.1 การต ิดตั ้งซอฟต แวร Arduino และไดรเวอร USB ส ําหร ับว ินโดวส 7 และ 8

2.1.1 ติ ดตั้ งซอฟต แวร Arduino 1.0.x

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

(1) น ําแผ นซ ีด ีรอมที ่มาก ับช ุดอ ุปกรณ ใส เข าไปในซ ีด ีรอมไดรฟ เข าไปที ่โฟลเดอร D:\Robotics\POP-BOT_POP-BOT XT\Software\Windows ด ับเบิ ้ลคล ิกที ่ไฟล arduino1.0.4release_setup130421.exe(ต ัวเลขเวอร ช ันอาจเปลี ่ยนแปลงตามการปร ับปร ุง) จะปรากฎหน าต างต อนร ับสู การต ิดตั ้งให คล ิก Nextหน าต างต ิดตั ้งจะสอบถามต ําแหน งการต ิดตั ้งโปรแกรมให กด Next

Page 18: POP-XT Educationkit manual

18 POP-XT

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

(3) จากนั้ นเป นการติ ดตั้ งไดรเวอร ให คลิ กปุ ม Next เพื่ อดํ าเนิ นการต อไป

(4) หน าต าง Windows secuirty อาจปรากฏขึ ้น เพื ่อให ย ืนย ันการต ิดตั ้งไดรเวอร คล ิกปุ ม Install

Page 19: POP-XT Educationkit manual

POP-XT 19

กรณี ใช ว ินโดวส 7 หน าต างแจ งเต ือนเพื ่อย ืนย ันนี ้อาจเก ิดขึ ้น 2 ครั ้ง ให คล ิกย ืนย ันที ่ปุ มหรื อช อง l this driver software anyway ทั้ งสองครั้ ง

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

(6) ป ดสว ิตช ของแผงวงจร POP-XT บรรจ ุแบตเตอรี ่ AA จํ านวน 4 ก อน ลงในแผงวงจร POP-XT

(7) ต อสาย USB-miniB เข าที ่จ ุดต อพอร ต USB ส วนปลายอ ีกด านของสาย USB ต อเข าก ับพอร ตUSB ของคอมพิ วเตอร

Page 20: POP-XT Educationkit manual

20 POP-XT

(8) กดสว ิตช OK ค างไว จากนั ้น เป ดสว ิตช จ ายไฟให แก แผงวงจร POP-XT แล วปล อยสว ิตช OK

220 F

100 F

TB6612

ATMega32U4

100

ขั ้นตอนนี ้สํ าค ัญมาก จะต องกดสว ิตช OK ค างไว ก อนเป ดสว ิตช จ ายไฟ ม ิเช นนั ้น จะท ําให การติ ดตั้ งไดรเวอร อาจมี ข อผิ ดพลาดได

(9) หล ังจากปล อยสว ิตช OK ที ่ม ุมขวาล างของคอมพ ิวเตอร จะแจ งว า ตรวจพบฮาร ดแวร ต ัวใหม สอบถามถ ึงตํ าแหน งของไฟล ไดรเวอร Arduino Leonardo Bootloader ที ่ต องการต ิดตั ้ง ให คล ิก เล ือกที่ ช อง Install from a list or specific location (Advanced) จากนั้ นคลิ กที่ ปุ ม Next

(10) หน าต างค นหาไดรเวอร แบบอ ัตโนม ัต ิหร ือหาด วยตนเองภายในคอมพ ิวเตอร ปรากฏขึ ้นมาให เลื อก Browse my computer for driver software อั นเป นการเลื อกค นหาไดรเวอร ด วยตนเอง

Page 21: POP-XT Educationkit manual

POP-XT 21

(11) ระบุ ตํ าแหน งของไดรเวอร ไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x64 ในกรณี เป นวิ นโดวส 64 บ ิต หรื อ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณ ีเป นวิ นโดวส 32 บิ ต จากนั้ นกด Next

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

(13) ระบบจะใช เวลาสั กครู เพื่ อติ ดตั้ งไดรเวอร ของ Arduino Leonardo Bootloader

(14) จากนั ้น จะมี การร องขอให ต ิดตั ้งไดรเวอร Arduino Leonardo ต อเนื ่องกั น ให ดํ าเน ินการขั้ นตอนที่ (9) ถึ ง (12)

(15) ตรวจสอบต ําแหน งของพอร ตที ่ใช ในการเชื ่อมต อ โดยคล ิกเมาส ปุ มขวาที ่ My Computerเลื อก Properties > Control panel > Device Manager

Page 22: POP-XT Educationkit manual

22 POP-XT

(16) จะพบรายการ Ports คลิ กที่ หน าหั วข อ Ports เพื่ อดู รายละเอี ยด จะเห็ นชื่ อ ArduinoLeonardo (COMxx) ให จ ําหมายเลขพอร ต COM นี ้เพื ่อใช ในการอ ัปโหลดโปรแกรมต อไป จากต ัวอย างได เป นพอร ต COM3

2.1.2 ทดสอบอั ปโหลดโปรแกรม

(1) เป ดซอฟต แวร Arduino 1.0.x (ตามเอกสารนี้ เป นเวอร ชั น 1.0.4)

(2) เลื อกไฟล ตั วอย าง จาก File > Example > POP-BOT XT > HelloWorld

(3) เลื อกชื่ อของแผงวงจร โดยไปที่ Tools > Board > POP-XT (Caterina)

Page 23: POP-XT Educationkit manual

POP-XT 23

(4) เลื อกพอร ตที่ ใช ในการติ ดต อ โดยเลื อกที่ Tools > Serial port > COMxxx . จากตั วอย างคื อ COM3.

(5) อั ปโหลดโค ด โดยคลิ กที่ ปุ ม หรื อเลื อกเมนู File > Upload

(6) เมื่ อการอั ปโหลดเสร็ จสิ้ น จะมี ข อความ Done uploading ปรากฏขึ้ นที่ แถบแสดงสถานะด านล างของหน าต างโปรแกรม

ที่ จอแสดงผลของ POP-XT แสดงข อความ Hello World เป นการแสดงว า แผงวงจร POP-XTพร อมใช งานแล ว

220 F

100 F

TB6612

ATMega32U4

100

HelloRWorld

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRRRow015

Page 24: POP-XT Educationkit manual

24 POP-XT

2.1.3 การแก ไขป ญหาในกรณี ที่ เกิ ดไม สามารถอั ปโหลดโปรแกรมหรื อซอฟต แวร Arduino ไม พบการเชื่ อมต อกั บแผงวงจร POP-XT

โดยปกติ ควรเชื่ อมต อพอร ต USB ของคอมพิ วเตอร กั บแผงวงจร POP-XT ที่ ตํ าแหน งเดิ ม หากต องการเปลี ่ยนช องต อของพอร ต USB ก ็สามารถท ําได ท ันท ี แต อาจเก ิดเหต ุการณ ที ่ซอฟต แวร Arduinoไม พบฮาร ดแวร ทํ าให ติ ดต อกั บแผงวงจร POP-XT ไม ได มี แนวทางในการแก ไขดั งนี้

(1) ต อสาย USB-miniB เข าที่ แผงวงจรกั บพอร ต USB ของคอมพิ วเตอร ) เป ดสวิ ตช จ ายไฟให แก แผงวงจร POP-XT

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

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

Page 25: POP-XT Educationkit manual

POP-XT 25

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

(5) หน าต างค นหาไดรเวอร แบบอ ัตโนมั ต ิหร ือหาด วยตนเองภายในคอมพิ วเตอร ปรากฏขึ้ นมาให เลื อก Browse my computer for driver software อั นเป นการเลื อกค นหาไดรเวอร ด วยตนเอง

Page 26: POP-XT Educationkit manual

26 POP-XT

(6) ระบ ุตํ าแหน งของไดรเวอร ไปที ่ C:\Arduino\drivers\Unicon POP-XT Driver\x64 ในกรณ ีเป นวิ นโดวส 64 บิ ต หรื อ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณี เป นวิ นโดวส 32บิ ต จากนั้ นกด Next

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

(8) ระบบจะใช เวลาส ักครู เพื ่อต ิดตั ้งไดรเวอร จากนั ้นที ่หน าต าง Device Manager จะแสดงชื ่ออุ ปกรณ Arduino Leonardo (COMxx) โดยหมายเลขของ COM นั้ นขึ้ นอยู กั บการลงทะเบี ยนของคอมพิ วเตอร แต ละเครื่ อง ซึ่ งอาจแตกต างกั น

Page 27: POP-XT Educationkit manual

POP-XT 27

2.2 การติ ดตั้ งซอฟต แวร และไดรเวอร USB สํ าหรั บวิ นโดวส XP

2.2.1 ติ ดตั้ งซอฟต แวร Arduinoซอฟต แวร ที ่มาพร อมก ับแผงวงจร POP-XT ประกอบด วย ซอฟต แวร Arduino 1.0 ที ่บรรจุ

ไดรเวอร และข อม ูลส ําหร ับต ิดต อก ับแผงวงจร POP-XT ซึ ่งเข าก ันได ก ับฮาร ดแวร Arduino Leonardo, ไฟล ไลบราร ีของแผงวงจร POP-XT ที ่ชื ่อ popxt.h และโปรแกรมต ัวอย าง ม ีขั ้นตอนการต ิดตั ้งด ังนี ้

(1) นํ าแผ นซี ดี รอมที่ มากั บชุ ดอุ ปกรณ ใส เข าไปในซี ดี รอมไดรฟ เข าไปที่ D:\Robotics\POP-BOT_POP-BOT XT\Software\Windows ด ับเบิ ้ลคล ิกที ่ไฟล arduino1.0.4release_setup130421.exe(ต ัวเลขเวอร ช ันอาจเปลี ่ยนแปลงตามการปร ับปร ุง) จะปรากฎหน าต างต อนร ับสู การต ิดตั ้งให คล ิก Nextหน าต างต ิดตั ้งจะสอบถามต ําแหน งการต ิดตั ้งโปรแกรมให กด Next

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

Page 28: POP-XT Educationkit manual

28 POP-XT

(3) จากนั้ นเป นการติ ดตั้ งไดรเวอร ให คลิ กปุ ม Next เพื่ อดํ าเนิ นการต อไป

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

Page 29: POP-XT Educationkit manual

POP-XT 29

2.2.2 ติ ดตั้ งไดรเวอร ให กั บแผงวงจร POP-XT สํ าหรั บวิ นโดวส XP

ส ําหร ับว ินโดวส XP จะม ีขั ้นตอนและหน าต างของการต ิดตั ้งไดรเวอร ที ่แตกต างไปจากว ินโดวส 7 และ 8 ด ังนี ้

(1) ป ดสวิ ตช ของแผงวงจร POP-XT จากนั้ น บรรจุ แบตเตอรี่ AA จํ านวน 4 ก อน ลงในแผงวงจร POP-XT

(2) ต อสาย USB-miniB เข าที ่จ ุดต อพอร ต USB ส วนปลายอ ีกด านของสาย USB ต อเข าก ับพอร ตUSB ของคอมพิ วเตอร

(.3) กดสว ิตช OK ค างไว จากนั ้น เป ดสว ิตช จ ายไฟให แก แผงวงจร POP-XT แล วปล อยสว ิตช OK

220 F

100 F

TB6612

ATMega32U4

100

ขั ้นตอนนี ้สํ าค ัญมาก จะต องกดสว ิตช OK ค างไว ก อนเป ดสว ิตช จ ายไฟ ม ิเช นนั ้น จะท ําให การติ ดตั้ งไดรเวอร อาจมี ข อผิ ดพลาดได

Page 30: POP-XT Educationkit manual

30 POP-XT

(4) หล ังจากปล อยสว ิตช OK ที ่ม ุมขวาล างของคอมพ ิวเตอร จะแจ งว า ตรวจพบฮาร ดแวร ต ัวใหม สอบถามถ ึงตํ าแหน งของไฟล ไดรเวอร Arduino Leonardo Bootloader ที ่ต องการต ิดตั ้ง ให คล ิก เล ือกที่ ช อง Install from a list or specific location (Advanced) จากนั้ นคลิ กที่ ปุ ม Next

(5) เล ือกตํ าแหน งของไดรเวอร ไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณี เป นวิ นโดวส 32 บิ ต หรื อ C:\Arduino\drivers\Unicon POP-XT Driver\x64 กรณี เป นวิ นโดวส XPรุ น 64 บิ ต แล วคลิ กปุ ม Next

Page 31: POP-XT Educationkit manual

POP-XT 31

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

(7) จากนั้ นระบบจะร องขอให ต ิดตั้ งไดรเวอร Arduino Leonardo ให คล ิกเลื อกที ่ช อง Installfrom a list or specific location (Advanced) จากนั้ นคลิ กที่ ปุ ม Next เพื่ อผ านขั้ นตอนนี้ ไป

(8) เล ือกตํ าแหน งของไดรเวอร ไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณี เป นวิ นโดวส 32 บิ ต หรื อ C:\Arduino\drivers\Unicon POP-XT Driver\x64 กรณี เป นวิ นโดวส XPรุ น 64 บิ ต แล วคลิ กปุ ม Next

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

Page 32: POP-XT Educationkit manual

32 POP-XT

(10) ตรวจสอบตํ าแหน งของพอร ตที่ ใช ในการติ ดต อกั บซอฟต แวร Arduino ได ที่ Controlpanel > System > Hardware > Device Manager > Port จากตั วอย างได ตํ าแหน งพอร ตเป น COM68

2.2.3 ทดสอบอั ปโหลดโปรแกรม

(1) เป ดซอฟต แวร Arduino 1.0.x (ตามเอกสารนี้ เป นเวอร ชั น 1.0.4)

(2) เลื อกไฟล ตั วอย าง จาก File > Example > POP-BOT XT > HellWorld

(3) เลื อกชื่ อของแผงวงจร โดยไปที่ Tools > Board > POP-XT (Caterina)

Page 33: POP-XT Educationkit manual

POP-XT 33

(4) เลื อกพอร ตที่ ใช ในการติ ดต อ โดยเลื อกที่ Tools > Serial port > COMxxx . จากตั วอย างคื อ COM68

(5) อั ปโหลดโค ด โดยคลิ กที่ ปุ ม หรื อเลื อกเมนู File > Upload

(6) รอจนกระทั่ งการอั ปโหลดเสร็ จสิ้ น จะมี ข อความ Done uploading ปรากฏขึ้ นที่ แถบแสดงสถานะด านล างของหน าต างโปรแกรม

(7) ที่ จอแสดงผลของ POP-XT แสดงข อความ Hello World เป นการแสดงว า นั บจากนี้ แผงวงจร POP-XT พร อมใช งาน

220 F

100 F

TB6612

ATMega32U4

100

HelloRWorld

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRRRow015

Page 34: POP-XT Educationkit manual

34 POP-XT

2.2.4 ติ ดตั้ งไดรเวอร ให กั บแผงวงจร POP-XT สํ าหรั บวิ นโดวส XP กรณี ที่ เปลี่ ยนพอร ต USB

โดยปกติ ควรเชื่ อมต อพอร ต USB ของคอมพิ วเตอร กั บแผงวงจร POP-XT ที่ ตํ าแหน งเดิ ม หากต องการเปลี ่ยนช องต อของพอร ต USB ในกรณ ีของว ินโดวส XP จะต องทํ าการต ิดตั ้งไดรเวอร ใหม โดยใช วิ ธี การเดี ยวกั บหั วข อ 2.2 ดั งนี้

(1) ป ดสวิ ตช ของแผงวงจร POP-XT บรรจุ แบตเตอรี่ AA 4 ก อน ลงในแผงวงจร POP-XT

(2) ต อสาย USB-miniB เข าที ่จ ุดต อพอร ต USB ส วนปลายอ ีกด านของสาย USB ต อเข าก ับพอร ตUSB ของคอมพิ วเตอร

(3) กดสว ิตช OK ค างไว จากนั ้น เป ดสว ิตช จ ายไฟให แก แผงวงจร POP-XT แล วปล อยสว ิตช OK

220 F

100 F

TB6612

ATMega32U4

100

ขั ้นตอนนี ้สํ าค ัญมาก จะต องกดสว ิตช OK ค างไว ก อนเป ดสว ิตช จ ายไฟ ม ิเช นนั ้น จะท ําให การติ ดตั้ งไดรเวอร อาจมี ข อผิ ดพลาดได

จากนั้ นดํ าเนิ นการตามขั้ นตอนที่ (4) ถึ ง (9) ของหั วข อ 2.2.2 ในบทนี้ และกระทํ าแบบเดี ยวกั นนี้ หากมี การเปลี่ ยนตํ าแหน งพอร ต USB ที่ ใช ในการเชื่ อมต อ

Page 35: POP-XT Educationkit manual

POP-XT 35

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

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

(1) ค ัดลอกไฟล Arduino 0102 MacOSX 20121113.dmg จากแผ นซ ีด ีรอมไปไว ที ่หน า Desktop

(2) จากนั้ นดั บเบิ ลคลิ กไฟล Arduino 0102 MacOSX 20121113.dmg แล วดํ าเนิ นการตามคํ าแนะนํ าที่ ปรากฏขึ้ นมา

(3) เมื ่อต ิดตั ้งแล ว เป ดซอฟต แวร Arduino ขึ ้นมา ไปที ่เมน ู Tools เล ือก Board เป นรุ น POP-XT

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

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

Page 36: POP-XT Educationkit manual

36 POP-XT

2.4 ส วนประกอบของหน าจอโปรแกรม Arduino1.0.x

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

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

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

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

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

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

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

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

เมนู (Menu)

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

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

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

Page 37: POP-XT Educationkit manual

POP-XT 37

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

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

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

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

Page 38: POP-XT Educationkit manual

38 POP-XT

2.4.1 เมนู บาร

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

2.4.1.1 เมนู File

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

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

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

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

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

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

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

Upload : ใช อ ัปโหลดโปรแกรมไปย ังแผงวงจรไมโครคอนโทรลเลอร POP-XT หร ือฮาร ดแวร ของ Arduino Leonardo

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

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

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

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

2.4.1.2 เมนู Edit

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

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

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

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

Page 39: POP-XT Educationkit manual

POP-XT 39

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

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

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

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

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

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

2.4.1.3 เมนู Sketch

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

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

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

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

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

2.4.1.4 เมนู Tools

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

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

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

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

Page 40: POP-XT Educationkit manual

40 POP-XT

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

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

2.4.2 เมนู Help

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

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

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

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

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

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

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

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

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

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

Page 41: POP-XT Educationkit manual

POP-XT 41

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

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

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

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

3.1 โครงสร างโปรแกรมของ Arduino

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

void setup()

และ

void loop()

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

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

Page 42: POP-XT Educationkit manual

42 POP-XT

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

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

ตั วอย างที่ 3-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 ที่ ใช คอมไพเลอร แบบ GCC สํ าหรั บไมโครคอนโทรลเลอร AVR) จะเขี ยนได ดั งน้ี

int main(void){

init();setup();for (;;)

loop();return ;

}

ตรงกั บ void setup()

ตรงกั บ void loop()

Page 43: POP-XT Educationkit manual

POP-XT 43

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

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

ตั วอย างที่ 3-2int buttonPin = 3; // กํ าหนดชื่ อตั วแปรให ขาพอร ต 3 และชนิ ดของตั วแปรvoid setup(){

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

}// ลู ปตรวจสอบการกดสวิ ตช ที่ ขาพอร ตซ่ึ งถู กประกาศด วยตั วแปร buttonPinvoid loop(){

if (digitalRead(buttonPin) == HIGH)serialWrite('H');elseserialWrite('L');delay(1000);

}

Page 44: POP-XT Educationkit manual

44 POP-XT

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

3.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 45: POP-XT Educationkit manual

POP-XT 45

3.2.2 คํ าสั่ ง if...elseใช ทดสอบเพื่ อกํ าหนดเงื่ อนไขการทํ างานของโปรแกรมได มากกว าคํ าสั่ ง if ธรรมดา โดย

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

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

// คํ าสั่ งเพื่ อทํ างานอย างหนึ่ ง เน่ื องมาจาก pinFiveInput มี ค าน อยกว า 500}else{

// คํ าสั่ งเพื่ อทํ างานอี กอย างหนึ่ ง เน่ื องมาจาก pinFiveInput มี ค ามากว าหรื อเท ากั บ 500 }

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

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

// คํ าสั่ งเพื่ อทํ างานอย างหนึ่ ง เน่ื องมาจาก pinFiveInput มี ค าน อยกว า 500}else if (pinFiveInput >= 1000){

// คํ าสั่ งเพื่ อทํ างานอี กอย างหนึ่ ง เน่ื องมาจาก pinFiveInput มี ค ามากกว าหรื อเท ากั บ 1000}else{

// คํ าสั่ งเพื่ อกํ าหนดให ทํ างานต อไปในกรณี ที่ pinFiveInput ไม ได มี ค าน อยกว า 500// และมากกว าหรื อเท ากั บ 1000 (นั่ นคื อ จะมี การกระทํ าคํ าสั่ งในโปรแกรมย อยนี้ เม่ื อตั วแปรมี ค าอยู // ระหว าง 501 ถึ ง 999 (ฐานสิ บ)

}

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

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

Page 46: POP-XT Educationkit manual

46 POP-XT

3.2.3 คํ าสั่ ง for()คํ าสั ่งนี ้ใช เพื ่อสั ่งให คํ าสั ่งที ่อยู ภายในวงเล็ บป กกาหล ัง for ม ีการท ํางานซํ ้าก ันตามจ ํานวนรอบ

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

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

for (initialization; condition; increment){

//statement(s);}

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

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

// คํ าสั่ งเพื่ อทํ างานโดยใช ค าของตั วแปร i และวนทํ างานจนกระทั่ งค าของตั วแปร i มากกว า 8;}

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

Page 47: POP-XT Educationkit manual

POP-XT 47

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

ใดก็ ให ทํ างานตามที่ กํ าหนดไว

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

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

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

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

case 1:// คํ าสั่ งเพื่ อทํ างาน เม่ื อค าของตั วแปรเท ากั บ 1

break;case 2:

// คํ าสั่ งเพื่ อทํ างาน เม่ื อค าของตั วแปรเท ากั บ 2break;default:

// ถ าหากค าของตั วแปรไม ใช 1 และ 2 ให กระทํ าคํ าสั่ งในส วนนี้ }

Page 48: POP-XT Educationkit manual

48 POP-XT

3.2.5 คํ าสั่ ง while

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

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

while(expression){

// statement(s);}

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

ตั วอย างที่ 3-7var = 0;while(var < 200){

// คํ าสั่ งเพื่ อทํ างาน โดยวนทํ างานทั้ งสิ้ น 200 รอบvar++;

}

Page 49: POP-XT Educationkit manual

POP-XT 49

3.3 ตั วกระทํ าทางคณิ ตศาสตร

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

3.3.1 ตั วกระทํ าทางคณิ ตศาสตร บวก ลบ คู ณ และหารใช หาค าผลรวม ผลต าง ผลค ูณ และผลหารค าของต ัวถ ูกกระทํ าสองต ัว โดยให คํ าตอบม ีประเภทตรงก ับต ัว

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

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

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

result = value1 + value2;result = value1 - value2;result = value1 * value2;result = value1 / value2;

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

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

ตั วอย างที่ 3-8y = y + 3;x = x - 7;i = j * 6;r = r / 5;

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

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

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

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

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

Page 50: POP-XT Educationkit manual

50 POP-XT

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

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

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

result = value1 % value2;พารามิ เตอร

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

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

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

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

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

ตั วอย างที่ 3-10// ตรวจสอบค าของตั วตรวจจั บ 10 ครั้ งต อการทํ างาน 1 รอบvoid loop(){

i++;if ((i % 10) == 0) // หารค าของ i ด วย 10 แล วตรวจสอบเศษการหารเป น 0 หรื อไม {

x = analogRead(sensPin); // อ านค าจากตั วตรวจจั บ 10 ครั้ ง}

}ในตั วอย างนี้ เป นการนํ าคํ าสั่ ง % มาใช กํ าหนดรอบของการทํ างาน โดยโปรแกรมวนทํ างานเพื่ ออ านค าจนกว า

ผลการหารเอาเศษของคํ าสั่ ง i % 10 จะเท ากั บ 0 ซึ่ งจะเกิ ดขึ้ นเมื่ อ i = 10 เท านั้ น

Page 51: POP-XT Educationkit manual

POP-XT 51

3.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)

3.5 ตั วกระทํ าทางตรรกะ

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

3.5.1 && (ตรรกะ และ)ให ค าเป นจริ งเมื่ อผลการเปรี ยบเที ยบทั ้งสองข างเป นจร ิงทั้ งคู

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

// ...}

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

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

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

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

Page 52: POP-XT Educationkit manual

52 POP-XT

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

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

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

3.5.4 ข อควรระวั ง

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

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

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

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

// ให ผลการทํ างานเป นจริ งเมื่ อ a มี ค าอยู ระหว าง 10 ถึ ง 20

Page 53: POP-XT Educationkit manual

POP-XT 53

3.6 ตั วกระทํ าระดั บบิ ต

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

3.6.1 ตั วกระทํ าระดั บบิ ต AND (&)คํ าสั่ ง 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 บิ ต ดั งตั วอย างในส วนของโปรแกรมต อไปนี้

ตั วอย างที่ 3-15int a = 92; // เท ากั บ 0000000001011100 ฐานสองint b = 101; // เท ากั บ 0000000001100101 ฐานสองint c = a & b; // ผลลั พธ คื อ 0000000001000100 ฐานสองหรื อ 68 ฐานสิ บ

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

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

Page 54: POP-XT Educationkit manual

54 POP-XT

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

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

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

0 0 1 1 Operand1

0 1 0 1 Operand2

——————————

0 1 1 1 Returned result

ตั วอย างที่ 3-16ส วนของโปรแกรมแสดงการใช ตั วกระทํ าระดั บบิ ต ORint a = 92; // เท ากั บ 0000000001011100 ฐานสองint b = 101; // เท ากั บ 0000000001100101 ฐานสองint c = a | b; // ผลลั พธ คื อ 0000000001111101 ฐานสอง หรื อ 125 ฐานสิ บ

ตั วอย างที่ 3-17โปรแกรมแสดงการใช ตั วกระทํ าระดั บบิ ต AND และ OR

ตั วอย างงานที่ ใช ตั วกระทํ าระดั บบิ ต AND และ OR เป นงานที่ โปรแกรมเมอร เรี ยกว า Read-Modify-Write ona 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)

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

int i; // counter variableint j;

Page 55: POP-XT Educationkit manual

POP-XT 55

void setup(){

DDRD = DDRD | B11111100; // กํ าหนดทิ ศทางของขาพอร ต 2 ถึ ง 7 ด วยค า 11111100Serial.begin(9600);

}void loop(){

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

PORTD = PORTD & B00000011; // กํ าหนดข อมู ลไปยั งขาพอร ต 2 ถึ ง 7j = (i << 2);PORTD = PORTD | j;Serial.println(PORTD, BIN); // แสดงค าของ PORTD ที่ หน าต าง Serial montiordelay(100);

}}

3.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” เมื่ ออิ นพุ ตทั้ งสองมี ค าต างกั น

ตั วอย างที่ 3-18int x = 12; // ค าเลขฐานสองเท ากั บ 1100int y = 10; // ค าเลขฐานสองเท ากั บ 1010int z = x ^ y; // ผลลั พธ เท ากั บ 0110 ฐานสองหรื อ 6 ฐานสิ บ

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

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

Page 56: POP-XT Educationkit manual

56 POP-XT

ตั วอย างที่ 3-19void setup(){

DDRD = DDRD | B00100000; // กํ าหนดขา 5 เป นเอาต พุ ต}void loop(){

PORTD = PORTD ^ B00100000; // กลั บลอจิ กที่ ขา 5delay(100);

}

3.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 57: POP-XT Educationkit manual

POP-XT 57

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

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

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

variable << number_of_bitsvariable >> number_of_bits

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

หรื อ long)

ตั วอย างที่ 3-20int a = 5; // เท ากั บ 0000000000000101 ฐานสองint b = a << 3; // ได ผลลั พธ เป น 0000000000101000 ฐานสองหรื อ 40int c = b >> 3; // ได ผลลั พธ เป น 0000000000000101 ฐานสองหรื อ 5 ฐานสิ บ

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

หายไปเนื่ องจากถู กเลื ่อนหายไปทางซ ายมื อ

int a = 5; // เท ากั บ 0000000000000101ฐานสองint b = a << 14; // ได ผลลั พธ เป น 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 ค าที ่เก ็บได ม ีทั ้งค าบวกและลบ โดยบ ิตซ ายม ือส ุดจะเป น signbit หร ือบ ิตเครื ่องหมาย ถ าเป นค าลบ ค าบ ิตซ ายม ือส ุดจะม ีค าเป น 1 กรณ ีนี ้เมื ่อสั ่งเลื ่อนบ ิตไปทางขวาม ือ

Page 58: POP-XT Educationkit manual

58 POP-XT

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

ตั วอย างที่ 3-22int x = -16; // เท ากั บ 1111111111110000 ฐานสองint y = x >> 3; // เลื่ อนบิ ตของตั วแปร x ไปทางขวา 3 ครั้ ง

// ได ผลลั พธ เป น 1111111111111110 ฐานสอง

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

ตั วอย างที่ 3-23int x = -16; // เท ากั บ 1111111111110000 ฐานสองint y = unsigned(x) >> 3; // เลื่ อนบิ ตของตั วแปร x (แบบไม คิ ดเครื่ องหมาย) ไปทางขวา 3 ครั้ ง

// ได ผลลั พธ เป น 0001111111111110 ฐานสอง

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

ตั วอย างที่ 3-24int x = 1000;int y = x >> 3; // หารค าของ 1000 ด วย 8 (มาจาก 23) ทํ าให y = 125

Page 59: POP-XT Educationkit manual

POP-XT 59

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

3.7.1 ; (เซมิ โคลอน - semicolon)ใช เขี ยนแจ งว า จบคํ าสั่ ง

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

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

3.7.2 { } (วงเล็ บป กกา - curly brace)เครื่ องหมายวงเล็ บป กกา เป นส วนสํ าคั ญของภาษาซี ใช ในการกํ าหนดขอบเขตการทํ างานใน

แต ละช วง

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

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

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

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

Page 60: POP-XT Educationkit manual

60 POP-XT

ตํ าแหน งที่ ใช วงเล็ บป กกาฟ งก ชั่ น (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)}

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

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

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

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

Page 61: POP-XT Educationkit manual

POP-XT 61

3.7.4 #defineเป นคํ าสั ่งที ่ใช งานมากในการกํ าหนดค าคงที ่ให ก ับโปรแกรม เนื่ องจากเป นการกํ าหนดค าที ่ไม

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

รู ปแบบ

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

ตั วอย างที่ 3-26#define ledPin 3 // เป นการกํ าหนดให ตั วแปร ledPin เท ากั บค าคงที่ 3

ท ายคํ าสั่ ง #define ไม ต องมี เครื่ องหมายเซมิ โคลอน

3.7.5 #include

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

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

#include <file>#include “file”

ตั วอย างที่ 3-27#include <stdio.h>#include “popxt.h”

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

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

Page 62: POP-XT Educationkit manual

62 POP-XT

3.8 ตั วแปร

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

3.8.1 char : ตั วแปรประเภทตั วอั กขระเป นตั วแปรที่ มี ขนาด 1 ไบต (8 บิ ต) มี ไว เพื่ อเก็ บค าตั วอั กษร ตั วอั กษรในภาษา C จะเขี ยนอยู

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

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

char sign = ' ';ตั วอย างที่ 3-28char var = 'x';

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

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

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

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

ตั วอย างที่ 3-29byte b = B10010; // แสดงค าของ b ในรู ปของเลขฐานสอง (เท ากั บ 18 เลขฐานสิ บ)

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

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

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

int var = val;พารามิ เตอร var คื อช่ื อของตั วแปรประเภท int ที่ ต องการval คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

Page 63: POP-XT Educationkit manual

POP-XT 63

ตั วอย างที่ 3-30int ledPin = 13; // กํ าหนดให ตั วแปร ledPIn มี ค าเท ากั บ 13

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

ตั วอย างที่ 3-31int xx = -32,768;x = x - 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก -32,768 เป น 32,767x = 32,767;x = x + 1; // เมื่ อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก 32,767 เป น -32,768

3.8.4 unsigned int : ตั วแปรประเภทเลขจํ านวนเต็ มไม คิ ดเครื่ องหมายตั วแปรประเภทนี้ คล ายกั บตั วแปร int แต จะเก็ บเลขจํ านวนเต็ มบวกเท านั้ น โดยเก็ บค า 0 ถึ ง

65,535 (216 -1)

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

พารามิ เตอร var คื อช่ื อของตั วแปร int ที่ ต องการval คื อค าที่ ต องการกํ าหนดให กั บตั วแปร

ตั วอย างที่ 3-32unsigned int ledPin = 13; // กํ าหนดให ตั วแปร ledPIn มี ค าเท ากั บ 13 แบบไม คิ ดเครื่ องหมาย

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

ตั วอย างที่ 3-33unsigned int xx = 0;x = x - 1; // เม่ื อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก 0 เป น 65535x = x + 1; // เม่ื อกระทํ าคํ าสั่ งแล ว ค าของ x จะเปลี่ ยนจาก 65535 กลั บไปเป น 0

Page 64: POP-XT Educationkit manual

64 POP-XT

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

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

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

long var = val;พารามิ เตอร var คื อช่ื อของตั วแปร long ที่ ต องการ

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

ตั วอย างที่ 3-34long time; // กํ าหนดให ตั วแปร time เป นแบบ long

3.8.6 unsigned long : ต ัวแปรประเภทเลขจ ํานวนเต ็ม 32 บ ิต แบบไม ค ิดเครื ่องหมายเป นตั วแปรเก็ บค าเลขจํ านวนเต็ มบวก ตั วแปรหนึ่ งตั วกิ นพื้ นที่ หน วยความจํ า 32 บิ ต (4 ไบต )

เก็ บค าได จาก 0 ถึ ง 4,294,967,295 หรื อ 232 - 1

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

unsigned long var = val;พารามิ เตอร var คื อช่ื อของตั วแปร unsigned long ที่ ต องการ

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

ตั วอย างที่ 3-35unsigned long time; // กํ าหนดให ตั วแปร time เป นแบบ undigned long (ไม คิ ดเครื่ องหมาย)

Page 65: POP-XT Educationkit manual

POP-XT 65

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

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

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

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

float var = val;พารามิ เตอร var คื อช่ื อของตั วแปร float ที่ ต องการ

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

ตั วอย างที่ 3-36float myfloat;float sensorCalbrate = 1.117;

ตั วอย างที่ 3-37int x;int y;float z;x = 1;y = x / 2; // y เท ากั บ 0 ไม มี การเก็ บค าของเศษที่ ได จากการหารz = (float)x / 2.0; // z เท ากั บ 0.5

เม่ื อมี การใช ตั วแปรแบบ float ตั วเลขที่ นํ ามากระทํ ากั บตั วแปรแบบ float นี้ จะต องเป นเลขทศนิ ยมด วยจากตั วอย างคื อ เลข 2 เม่ื อนํ ามาทํ างานกั บตั วแปร x ที่ เป นแบบ float เลข 2 จึ งต องเขี ยนเป น 2.0

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

เป นต ัวแปรทศน ิยมความละเอ ียดสองเท า ม ีขนาด 8 ไบต ค าส ูงส ุดที ่เก ็บได ค ือ 1.7976931348623157x 10308 ใน Arduino ม ีหน วยความจ ําจ ําก ัด จ ึงไม ใช ต ัวแปรประเภทนี ้

Page 66: POP-XT Educationkit manual

66 POP-XT

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

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

ตั วอย างที่ 3-38 ตั วอย างการประกาศตั วแปรสตริ ง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 string ให เองจนครบ (จากตั วอย างประกาศไว 8 ตั ว แต ข อความมี 7 ตั วอั กษร จึ งมี การเติ มnull string ให อี ก 1 ตั ว

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

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

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

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

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

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

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

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

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

Page 67: POP-XT Educationkit manual

POP-XT 67

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

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

ตั วอย างที่ 3-39 ตั วอย างการประกาศตั วแปรอะเรย int myInts[6];int myPins[] = {2, 4, 8, 3, 6};int mySensVals[6] = {2, 4, -8, 3, 2};char message[6] = “hello”;

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

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

ในการประกาศตั วแปรอะเรย ผู พั ฒนาโปรแกรมสามารถประกาศและกํ าหนดขนาดของตั วแปรอะเรย ได ในพร อมกั นดั งตั วอย างการประกาศตั วแปร mySensVals ที่ ประกาศทั้ งขนาดและกํ าหนดค า

ตั วอย างสุ ดท ายเป นการประกาศอะเรย ของตั วแปร message ที่ เป นแบบ char มี ตั วอั กษร 5 ตั วคื อ helloแต การกํ าหนดขนาดของตั วแปรจะต องเผื ่อที่ ส ําหรั บเก ็บตั วอ ักษรแจ งจบข อความด วย จึ งทํ าให ค าด ัชนี ต องกํ าหนดเป น 6

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

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

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

การกํ าหนดค าให กั บตั วแปรอะเรย ทํ าได ดั งนี้

mySensVals[0] = 10;

การเรี ยกค าสมาชิ กของต ัวแปรอะเรย ทํ าได ดั งนี้

x = mySensVals[4];

Page 68: POP-XT Educationkit manual

68 POP-XT

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

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

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

Serial.println(myPins[i]); // แสดงค าสมาชิ กของตั วแปรอะเรย ที่ หน าต าง Serial monitor}

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

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

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

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

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

ตั วอย าง 101 = 101 มาจาก (1* 102) + (0 * 101) + (1 * 100) = 100 + 0 + 1 = 101

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

ตั วอย าง B101 = 5 ฐานสิ บ มาจาก (1 * 22) + (0 * 21) + (1 * 20) = 4 + 0 + 1 = 5

เลขฐานสองจะใช งานได ไม เกิ น 8 บิ ต (ไม เกิ น 1 ไบต ) มี ค าจาก 0 (B0) ถึ ง 255 (B11111111)

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

ตั วอย าง 0101 = 65 ฐานสิ บ มาจาก (1 * 82) + (0 * 81) + (1 * 80) = 64 + 0 +1 = 65

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

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

ตั วอย าง 0x101 = 257 ฐานสิ บ มาจาก (1 * 162) + (0 * 161) + (1 * 160) = 256 + 0 + 1 = 257

POP-Note

Page 69: POP-XT Educationkit manual

POP-XT 69

3.9 ขอบเขตของตั วแปร

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

3.9.1 ตั วแปรโลคอลและโกลบอลตั วแปรแบบโกลบอล (global variable) เป นตั วแปรที่ ทุ กฟ งก ชั่ นในโปรแกรมรู จั ก โดยต อง

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

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

ตั วอย างที่ 3-41int gPWMval; // ทุ กฟ งก ชั่ นมองเห็ นตั วแปรนี้ void setup(){}void loop(){

int i; // ตั วแปร i จะถู กมองเห็ นและใช งานภายในฟ งก ชั่ น loop เท านั้ นfloat f; // ตั วแปร f จะถู กมองเห็ นและใช งานภายในฟ งก ชั่ น loop เท านั้ น

}

3.9.2 ตั วแปรสแตติ ก (static)เป นค ําสงวน (keyword) ที ่ใช ตอนประกาศตั วแปรที ่มี ขอบเขตใช งานแค ภายในฟ งก ชั ่นเท านั ้น

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

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

Page 70: POP-XT Educationkit manual

70 POP-XT

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

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

3.10.1 HIGH, LOW : ใช กํ าหนดค าทางตรรกะในการอ านหรื อเขี ยนค าให กั บขาพอร ตดิ จิ ตอล ค าที่ เป นได มี 2 ค าคื อ HIGH หรื อ LOW

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

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

3.10.2 INPUT, OUTPUT : กํ าหนดทิ ศทางของขาพอร ตดิ จิ ตอลขาพอร ตดิ จิ ตอลทํ าหน าที่ ได 2 อย างคื อ เป นอิ นพุ ตและเอาต พุ ต

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

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

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

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

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

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

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

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

ตั วอย างที่ 3-42int i;float f;f = 4.6;i = (int) f;ในการเปลี่ ยนประเภทตั วแปรจาก float เป น int ค าที่ ได จะถู กตั ดเศษออก ดั งนั้ น (int)4.6 จึ งกลายเป น 4

Page 71: POP-XT Educationkit manual

POP-XT 71

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

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

รู ปแบบค ําส่ั งเขี ยนได สองแบบดั งนี้

sizeof(variable)sizeof variable

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

ตั วอย างที่ 3-43ตั วกระทํ า 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 72: POP-XT Educationkit manual

72 POP-XT

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

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

HIGH

LOW

INPUT

OUTPUT

SERIAL

DISPLAY

PI

HALF_PI

TWO_PI

LSBFIRST

MSBFIRST

CHANGE

FALLING

RISING

false

true

null

# Literal Constants

GLCD_RED

GLCD_GREEN

GLCD_BLUE

GLCD_YELLOW

GLCD_BLACK

GLCD_WHITE

GLCD_SKY

GLCD_MAGENTA

# Port Constants

DDRB

PINB

PORTB

DDRC

PINC

PORTC

DDRD

PIND

PORTD

# Names

popxt

# Datatypes

boolean

byte

char

class

default

do

double

int

long

private

protected

public

return

short

signed

static

switch

throw

try

unsigned

void

# Methods/Fucntions

sw_ok

sw_ok_press

analog

knob

glcd

glcdChar

glcdString

glcdMode

glcdGetMode

glcdFlip

glcdGetFlip

colorRGB

setTextColor

setTextBackgroundColorsetTextSize

getTextColor

getTextBackgroundColor

getTextSize

glcdFillScreen

glcdClear

glcdPixel

glcdRect

glcdFillRect

glcdLine

glcdCircle

glcdFillCircle

glcdArc

getdist

in

out

motor

motor_stop

fd

bk

fd2

bk2

tl

tr

sl

sr

servo

sound

beep

uart_set_baud

uart_get_baud

uart_putc

uart_puts

uart

uart_available

uart_getkey

uart1_set_baud

uart1_get_baud

uart1_putc

uart1_puts

uart1

uart1_available

uart1_getkey

uart1_flush

# Other

abs

acos+=+[]asin=atanatan2&&=||=

booleanbytecaseceilcharcharclass,//?:constrain

cos{}—defaultdelaydelayMicroseconds//**.else==exp

falsefloatfloatfloorfor<<=HALF_PIif++

Page 73: POP-XT Educationkit manual

POP-XT 73

!=int<<<<=log&&!||^^=loop

maxmillismin-%/*

*new

null()PIIreturn>>;SerialSetupsinsqsqrt-=

switchtanthistrue

TWO_PIvoid

whileSerialbeginreadprintwriteprintlnavailabledigitalWritedigitalReadpinModeanalogRead

analogWriteattachInterruptsdetachInterruptsbeginSerial

serialWriteserialRead

serialAvailableprintStringprintIntegerprintByteprintHexprintOctalprintBinaryprintNewlinepulseIn

shiftOut

Page 74: POP-XT Educationkit manual

74 POP-XT

Page 75: POP-XT Educationkit manual

POP-XT 75

ทางผู จั ดทํ าซอฟต แวร Arduino IDE (www.arduino.cc) ได จั ดเตรี ยมฟ งก ชั่ นพื้ นฐาน เช นฟ งก ชั่ นเกี ่ยวก ับขาพอร ตอิ นพุ ตเอาต พ ุตดิ จิ ตอล, อิ นพุ ตเอาต พุ ตอะนาลอก เป นต น ด ังนั้ นในการเข ียนโปรแกรมจ ึงเรี ยกใช ฟ งก ชั่ นเหล านี ้ได ท ันที

นอกจากฟ งก ชั ่นพื ้นฐานเหล านี ้แล ว นั กพ ัฒนาท านอื ่นๆ ที ่ร วมในโครงการ Arduino นี ้ก ็ได เพิ ่มไลบราร ีอื ่นๆ เช น ไลบราร ีควบคุ มมอเตอร , การต ิดต อกั บอุ ปกรณ บั ส I2C ฯลฯ ในการเรี ยกใช งานต องเพิ่ มบรรทั ด #include เพื ่อผนวกไฟล ที่ เหมาะสมก อน จึ งจะเรี ยกใช ฟ งก ชั ่นได สํ าหรั บช ุดบอร ดสมองกล OBEC kit ก็ มี ไฟล ไลบรารี พิ เศษของตั วเองเช นกั น จะได กล าวถึ งในบทต อๆ ไป

ในบทนี ้จะอธิ บายถึ งการเรี ยกใช ฟ งก ชั่ นและตั วอย างโปรแกรมสํ าหร ับทํ าการทดลอง โดยใช ชุ ดบอร ดสมองกลและอุ ปกรณ เชื่ อมต อ OBEC kit เป นอุ ปกรณ หลั กในการทดลอง

4.1 ฟ งก ชั่ นอิ นพุ ตเอาต พุ ตดิ จิ ตอล (Digital I/O)4.1.1 คํ าอธิ บายและการเรี ยกใช ฟ งก ชั่ น4.1.1.1 pinMode(pin,mode)

ใช กํ าหนดขาพอร ตใดๆ ให เป นพอร ตดิ จิ ตอล

พาราม ิเตอร

pin - หมายเลขขาพอร ตของแผงวงจร POP-XT (ค าเป น int)

mode - โหมดการท ํางานเป น INPUT (อ ินพ ุต) หร ือ OUTPUT (เอาต พ ุต) (ค าเป น int) ต องใช ต ัวพ ิมพ ใหญ เท านั ้น

ตั วอย างที่ 4-1int ledPin = 4; // ต อ ZX-LED ที่ พอร ตหมายเลข 4void setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดเป นเอาต พุ ต}void loop(){

digitalWrite(ledPin, HIGH); // LED ติ ดสว างdelay(1000); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // LED ดั บdelay(1000); // หน วงเวลา 1 วิ นาที

}

Page 76: POP-XT Educationkit manual

76 POP-XT

4.1.1.2 digitalWrite(pin,value)

สั่ งงานให ขาพอร ตมี ค าสถานะเป นลอจิ กสู ง (HIGH หรื อ “1”) หรื อลอจิ กตํ่ า (LOW หรื อ “0”)พาราม ิเตอร

pin - หมายเลขขาพอร ตของแผงวงจร POP-XT (ค าเป น int)value - มี ค า HIGH หรื อ LOW

ตั วอย างที่ 4-2int ledPin = 4; // ต อ ZX-LED ที่ พอร ตหมายเลข 4void setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดเป นเอาต พุ ต}void loop(){

digitalWrite(ledPin, HIGH); // LED ติ ดสว างdelay(500); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // LED ดั บdelay(500); // หน วงเวลา 1 วิ นาที

}กํ าหนดให พอร ตหมายเลข 4 เป น HIGH (มี ลอจิ กเป น “1”) หน วงเวลา 0.5 วิ นาที แล วจึ งสั่ งให กลั บเป น

LOW (มี ลอจิ กเป น “0”) อี กครั้ ง วนเช นนี้ ไปตลอด

4.1.1.3 int digitalRead(pin)

อ านค าสถานะของขาที่ ระบุ ไว ว ามี ค าเป น HIGH หรื อ LOW

พาราม ิเตอร

pin - ขาพอร ตที่ ต องการอ านค า ซึ่ งต องเป นขาพอร ตดิ จิ ตอล มี ค าได จาก 0 ถึ ง 31 หรื อเป นตั วแปรที่ มี ค าอยู ในช วง 0 ถึ ง 31 ก็ ได

ค าที่ ส งกลั บ

เป น HIGH หรื อ LOW

ตั วอย างที่ 4-3int ledPin = 4; // ต อ ZX-LED ที่ พอร ตหมายเลข 4int inPin = 23; // ต อ ZX-SWITCH01 ที่ พอร ตหมายเลข 23int val = 0; // กํ าหนดเตั วแปรสํ าหรั บเก็ บค าที่ อ านได จากอิ นพุ ตvoid setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดให พอร ต 4 เป นเอาต พุ ตpinMode(inPin, INPUT); // กํ าหนดให พอร ต 23 เป นอิ นพุ ต

}

Page 77: POP-XT Educationkit manual

POP-XT 77

void loop(){

val = digitalRead(inPin); // อ านค าจากพอร ตอิ นพุ ตdigitalWrite(ledPin, val); // แสดงค าที่ อ านได ที่ พอร ตเอาต พุ ต ในที่ นี่ คื อ พอร ต 4

}

เม่ื อไม กดสวิ ตช สถานะที่ พอร ต 23 เป น “1” ทํ าให พอร ต 4 มี สถานะเป น”1” เช นกั น LED ที่ ต อกั บพอร ต4 จึ งติ ดสว าง เม่ื อกดสวิ ตช สถานะลอจิ กที่ พอร ต 23 จะเป น “0” พอร ต 4 จึ งมี สถานะเป น “0” เช นกั นLED ที่ ต ออยู จึ งดั บ

4.1.2 การใช งานพอร ตเอาต พุ ตดิ จิ ตอลของแผงวงจรหลั ก POP-XT

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

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

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

4.1.2.2 การกํ าหนดโหมดของขาพอร ต

ก อนใช งานต องก ําหนดโหมดการท ํางานของขาพอร ตด ิจ ิตอล ให เป นอ ินพ ุตหร ือเอาต พ ุต ก ําหนดได จากฟ งก ชั ่น pinMode()ม ีร ูปแบบด ังนี ้

pinmode(pin,mode);

เม่ื อ pin คื อ หมายเลขขาที่ ต องการ

Mode คื อ โหมดการทํ างาน (INPUT หรื อ OUTPUT)

หลั งจากที่ กํ าหนดให เป นเอาต พุ ตแล วเมื่ อต องการเขี ยนค าไปยั งขานั้ นๆ ให เรี ยกใช ฟ งก ชั่ นdigitalWrite() โดยมี รู ปแบบดั งนี้

digitalWrite(pin,value);

เม่ื อ pin คื อหมายเลขขาที่ ต องการ

value สถานะลอจิ กที่ ต องการ (HIGH หรื อ LOW)

Page 78: POP-XT Educationkit manual

78 POP-XT

4.2 ฟ งก ชั่ นเก่ี ยวกั บการสื่ อสารผ านพอร ตอนุ กรม

ใช สํ าหรั บสื่ อสารข อมู ลระหว างฮาร ดแวร Arduino (ในที่ นี้ คื อแผงวงจร POP-XT )ก ับคอมพ ิวเตอร จะกระทํ าผ านโมดู ลเช่ื อมต อพอร ต USB ที ่มี อยู ภายในต ัวไมโครคอนโทรลเลอร หลั กเบอร ATmega32U4

นอกจากนี้ แผงวงจร POP-XT ยั งมี พอร ตสํ าหรั บสื่ อสารข อมู ลอนุ กรมหรื อ UART อี กหนึ่ งชุ ดนั่ นคื อ UART ซึ่ งใช พอร ตหมายเลข 0 เป นขา RxD สํ าหรั บรั บข อมู ลอนุ กรม และพอร ตหมายเลข 1เป นขา TxD ส ําหร ับส งข อม ูลอน ุกรม โดย UART นี ้จะใช สํ าหร ับเชื ่อมต ออ ุปกรณ สื ่อสารข อม ูลอน ุกรมทั้ งแบบมี สายหรื อไร สายอย างบลู ทู ธ หรื อ XBEE ด วยระดั บสั ญญาณ TTL (0 และ +5V)

4.2.1 คํ าอธิ บายและการเรี ยกใช ฟ งก ชั่ น

4.2.1.1 Serial.begin(int datarate)

กํ าหนดค าอั ตราบอดของการรั บส งข อมู ลอนุ กรม ในหน วยบิ ตต อวิ นาที (bits per second : bpsหรื อ baud) ในกรณี ที่ ติ ดต อกั บคอมพิ วเตอร ให ใช ค าต อไปนี้ 300, 1200, 2400, 4800, 9600, 14400,19200, 28800, 38400, 57600 หรื อ 115200

พาราม ิเตอร

Int datarate ในหน วยบิ ตต อวิ นาที (baud หรื อ bps)

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

Serial.begin(9600); // เป ดพอร ตอนุ กรม กํ าหนดอั ตราบอดเป น 9600 บิ ตต อวิ นาที }

4.2.1.2 int Serial.available()

ใช แจ งว าได รั บข อมู ลตั วอั กษร (characters) แล ว และพร อมสํ าหรั บการอ านไปใช งาน

ค าที่ ส งกลั บจากฟ งก ชั่ น

จํ านวนไบต ที่ พร อมสํ าหรั บการอ านค า โดยเก็ บข อมู ลในบั ฟเฟอร ตั วรั บ

ถ าไม มี ข อมู ล จะมี ค าเป น 0

ถ ามี ข อมู ล ฟ งก ชั่ นจะคื นค าที่ มากกว า 0 โดยบั ฟเฟอร เก็ บข อมู ลได สู งสุ ด 128 ไบต

Page 79: POP-XT Educationkit manual

POP-XT 79

4.2.1.3 int Serial.read()

ใช อ านค าข อมู ลที ่ได รั บจากพอร ตอน ุกรม

ค าที่ ส งกลั บจากฟ งก ชั่ น

เป นเลข int ที่ เป นไบต แรกของข อมู ลที่ ได รั บ (หรื อเป น -1 ถ าไม มี ข อมู ล)

ตั วอย างที่ 4-5int incomingByte = 0;void setup(){

Serial.begin(9600); // เป ดพอร ตส่ื อสาร กํ าหนดอั ตราบอดเป น 9600 บิ ตต อวิ นาที }void loop() // วนส งข อมู ลเม่ื อได รั บข อมู ลเข ามา{

if (Serial.available() > 0) // อ านข อมู ลอนุ กรม{

incomingByte = Serial.read(); // เก็ บข อมู ลที่ อ านได ไว ในตั วแปรSerial.print("I received: "); // พิ มพ ข อความออกไปยั งหน าต าง Serial MonitorSerial.println(incomingByte, DEC); // พิ มพ ข อมู ลที่ รั บได ออกไปยั งหน าต าง Serial Monitor

}}ในตั วอย างนี้ เลื อกใช อั ตราบอด 9600 บิ ตต อวิ นาที ถ ามี ข อมู ลเข ามาจะเก็ บไว ในตั วแปร incomingByteแล วนํ าไปแสดงผลที่ หน าต าง Serial Monitor โดยต อท ายข อความ I received :.....

เม่ื อรั นโปรแกรม ให เป ดหน าต าง Serial Monitor โดยคลิ กที่ ปุ ม ซึ่ งอยู ที่ มุ มขวาของหน าต างหลั ก

เมื่ อแผงวงจร POP-XT ได รั บข อมู ล จะส งค าของตั วอั กษรในรู ปของเลขฐานสิ บกลั บมา อั กษร a มี รหั สแอสกี้ เท ากั บ 61 เม่ื อแปลงเป นเลขฐานสิ บจะได ค าเป น 97

4.2.1.4 Serial.flush()

ใช ล างบ ัฟเฟอร ตั วรั บข อมู ลของพอร ตอนุ กรมให ว าง

เลื อกอั ตราบอดของหน าต าง Serial Monitor เป น9600baud, เลื อก No line Ending และคลิ กทํ าเครื่ องหมายที ่ช อง Autoscroll จากนั ้นป อนอั กษรa แล วคลิ กปุ ม Send

Page 80: POP-XT Educationkit manual

80 POP-XT

4.2.1.5 Serial.print(data)

ใช ส งข อมู ลออกทางพอร ตอน ุกรม

พาราม ิเตอร

Data - เป นข อมู ลเลขจํ านวนเต็ ม ได แก char, int หรื อเลขทศนิ ยมที่ ตั ดเศษออกเป นเลขจํ านวนเต็ ม

รู ปแบบฟ งก ชั่ น

คํ าสั่ งนี ้สามารถเขี ยนได หลายรู ปแบบ

Serial.print(b)

เป นการเข ียนค ําสั ่งแบบไม ได ระบ ุร ูปแบบ จะพ ิมพ ค าต ัวแปร b เป นเลขฐานส ิบ โดยพ ิมพ ต ัวอ ักษรรห ัส ASCIIดั งตั วอย าง

int b = 79;Serial.print(b);พิ มพ ข อความ 79

Serial.print(b, DEC)

เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสิ บ โดยพิ มพ ตั วอั กษรตามรหั ส ASCII ดั งตั วอย าง

int b = 79;Serial.print(b);พิ มพ ข อความ 79

Serial.print(b, HEX)

เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสิ บหก โดยพิ มพ ตั วอั กษรตามรหั ส ASCII ดั งตั วอย างint b = 79;Serial.print(b, HEX);พิ มพ ข อความ 4F

Serial.print(b, OCT)

เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานแปด โดยพิ มพ ตั วอั กษรตามรหั ส ASCII ดั งตั วอย างint b = 79;Serial.print(b, OCT);พิ มพ ข อความ 117

Serial.print(b, BIN)

เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสอง โดยพิ มพ ตั วอั กษรตามรหั ส ASCII ดั งตั วอย างint b = 79;Serial.print(b, BIN);พิ มพ ข อความ 1001111

Page 81: POP-XT Educationkit manual

POP-XT 81

Serial.write(b)

เป นคํ าสั่ งพิ มพ ค าตั วแปร b ขนาด 1 ไบต เดิ มที คํ าสั่ งนี้ จะเป น Serial.print(b,BYTE) ตั้ งแต Arduino1.0 ข้ึ นมา ได ยกเลิ กคํ าสั่ ง Serial.print(b,BYTE) และให ใช คํ าสั่ ง Serial.write(b) แทน ดั งตั วอย าง

int b = 79;Serial.write(b);พิ มพ ตั วอั กษร O ซ่ึ งมี ค าตามตาราง ASCII เท ากั บ 79 ให ดู ข อมู ลจากตารางรหั สแอสกี้ เพิ่ มเติ ม

Serial.print(str)

เป นคํ าสั่ งพิ มพ ค าข อความในวงเล็ บ หรื อข อความที่ เก็ บในตั วแปร str ดั งตั วอย างSerial.print(“Hello World!”);พิ มพ ข อความ Hello World

พาราม ิเตอร

b - ไบต ข อมู ลที่ ต องการพิ มพ ออกทางพอร ตอนุ กรม

str - ตั วแปรสตริ งที่ เก็ บข อความสํ าหรั บส งออกพอร ตอนุ กรม

ตั วอย างที่ 4-6int analogValue = 0; // กํ าหนดตั วแปรเก็ บค าสั ญญาณอะนาลอกvoid setup(){

Serial.begin(9600); // เป ดพอร ตอนุ กรม กํ าหนดอั ตราบอดเป น 9600 บิ ตต อวิ นาที }void loop(){

analogValue = analogRead(0); // อ านค าสั ญญาณอะนาลอกช อง 0// โดยต อแผงวงจร ZX-POTH เข าที่ จุ ดต อ A0

// แสดงผลที่ หน าต าง Serial Monitor ในหลายรู ปแบบSerial.print(analogValue); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บSerial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.print(analogValue, DEC); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บSerial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.print(analogValue, HEX); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บหกSerial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.print(analogValue, OCT); // แสดงเป นรหั สแอสกี้ ของเลขฐานแปดSerial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.print(analogValue, BIN); // แสดงเป นรหั สแอสกี้ ของเลขฐานสองSerial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.write(analogValue/4);

Page 82: POP-XT Educationkit manual

82 POP-XT

// แสดงข อมู ลดิ บ ซ่ึ งต องผ านการหารด วย 4 เน่ื องจากฟ งก ชั่ น analogRead() คื นค า 0 ถึ ง 1023// แต ตั วแปรแบบไบต รั บค าได เพี ยง 255Serial.print("\t"); // คั่ นด วยแท็ บ (tab)Serial.println(); // ขึ้ นบรรทั ดใหม delay(10); // หน วงเวลา 10 มิ ลลิ วิ นาที

}ต ัวอย างนี ้แสดงการพ ิมพ ข อม ูลจากฟ งก ชั ่น Serial.Print() ในร ูปแบบต างๆ แสดงผ านหน าต าง Serial Monitor

ต องเลื อกอั ตราบอดของหน าต าง Serial Monitor เป น 9600baud, เลื อก No line Ending และคลิ กทํ าเครื่ องหมายที่ ช อง Autoscroll ด วย จึ งจะได ผลการทํ างานที่ ถู กต อง

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

Serial.print() จะตั ดเศษเลขทศนิ ยมเหล ือเป นเลขจํ านวนเต ็ม ท ําให ส วนทศน ิยมหายไป ทางแก ไขทางหนึ ่งค ือ คู ณเลขทศน ิยมด วย 10, 100, 1000 ฯลฯ ขึ ้นอยู ก ับจํ านวนหล ักของเลขทศน ิยม เพื ่อแปลงเลขทศนิ ยมเป นจ ํานวนเต ็มก อนแล วจ ึงส งออกพอร ตอน ุกรม จากนั ้นที ่ฝ งภาคร ับให ทํ าการหารค าที ่ร ับได เพื ่อแปลงกล ับเป นเลขทศน ิยม

Page 83: POP-XT Educationkit manual

POP-XT 83

4.2.1.6 Serial.println(data)

เป นฟ งก ชั ่นพ ิมพ (หร ือส ง) ข อม ูลออกทางพอร ตอน ุกรมตามด วยรห ัส carriage return (รห ัส ASCIIหมายเลข 13 หร ือ \r) และ linefeed (รห ัส ASCII หมายเลข 10 หร ือ \n) เพื ่อให เก ิดการเลื ่อนบรรท ัดและขึ ้นบรรท ัดใหม หล ังจากพ ิมพ ข อความ มี ร ูปแบบเหม ือนคํ าสั ่ง Serial.print()

รู ปแบบฟ งก ชั่ น

Serial.println(b)

เป นค ําสั ่งพ ิมพ ข อมู ลแบบไม ได ระบ ุร ูปแบบ จะพ ิมพ ค าต ัวแปร b เป นเลขฐานส ิบ ตามด วยรห ัสอ ักษร carriagereturn และ linefeed ดั งตั วอย างต อไปนี้

Serial.println(b, DEC)เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสิ บ ตามด วยรหั สอั กษร carriage return และ linefeed

Serial.println(b, HEX)เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสิ บหก ตามด วยรหั สอั กษร carriage return และ linefeed

Serial.println(b, OCT)เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานแปด ตามด วยรหั สอั กษร carriage return และ linefeed

Serial.println(b, BIN)เป นคํ าสั่ งพิ มพ ค าตั วแปร b เป นตั วเลขฐานสอง ตามด วยรหั สอั กษร carriage return และ linefeed

Serial.println(b, BYTE)เป นคํ าสั่ งพิ มพ ค าตั วแปร b ขนาด 1 ไบต ตามด วยรหั สอั กษร carriage return และ linefeed

Serial.println(str)เป นคํ าสั่ งพิ มพ ค าข อความในวงเล็ บหรื อข อความ ที่ เก็ บในตั วแปร str ตามด วยรหั สอั กษร carriage returnและ linefeed

Serial.println()เป นคํ าสั่ งพิ มพ รหั ส carriage return และ linefeed

พาราม ิเตอร

b - ไบต ข อมู ลที่ ต องการพิ มพ ออกทางพอร ตอนุ กรม

str - ตั วแปรสตริ งที่ เก็ บข อความสํ าหรั บส งออกพอร ตอนุ กรม

Page 84: POP-XT Educationkit manual

84 POP-XT

ตั วอย างที่ 4-7int analogValue = 0; // ประกาศตั วแปรสํ าหรั บเก็ บค าอะนาลอกvoid setup(){

Serial.begin(9600); // เป พอร ตอนุ กรมและเลื อกอั ตราบอดเป น 9600 บิ ตต อวิ นาที }void loop(){

analogValue = analogRead(0); // อ านค าอิ นพุ ตอะนาลอกช อง 0// ต อแผงวงจร ZX-POTH กั บพอร ตอิ นพุ ตอะนาลอก A0

// แสดงผลในรู ปแบบต างๆSerial.println(analogValue); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บSerial.println(analogValue, DEC); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บSerial.println(analogValue, HEX); // แสดงเป นรหั สแอสกี้ ของเลขฐานสิ บหกSerial.println(analogValue, OCT); // แสดงเป นรหั สแอสกี้ ของเลขฐานแปดSerial.println(analogValue, BIN); // แสดงเป นรหั สแอสกี้ ของเลขฐานสองSerial.write(analogValue); // แสดงค าในรู ปแบบข อมู ลระดั บไบต Serial.println();Serial.flush();delay(10); // หน วงเวลา 10 มิ ลลิ วิ นาที

}

ต องเลื อกอั ตราบอดของหน าต าง Serial Monitor เป น 9600baud, เลื อก No line Endingและคลิ กทํ าเครื่ องหมายที่ ช อง Autoscroll ด วย จึ งจะได ผลการทํ างานที่ ถู กต อง

Page 85: POP-XT Educationkit manual

POP-XT 85

4.3 ฟ งก ชั่ นอิ นพุ ตเอาต พุ ตอะนาลอก

4.3.1 คํ าอธิ บายและการเรี ยกใช ฟ งก ชั่ น

4.3.1.1 int analogRead(pin)

อ านค าจากขาพอร ตที ่ก ําหนดให เป นอ ินพ ุตอะนาลอกของแผงวงจรหล ัก POP-XT โดยแผงวงจรPOP-XT มี วงจรแปลงส ัญญาณอะนาลอกเป นดิ จ ิตอลความละเอี ยด 10 บิ ตในต ัว จ ึงแปลงค าแรงด ันอ ินพุ ต 0 ถึ ง +5V ให เป นข อมู ลตั วเลขจํ านวนเต็ มระหว าง 0 ถึ ง 1023

พาราม ิเตอร

pin - หมายเลขของขาอิ นพุ ตอะนาลอก มี ค า 0 ถึ ง 5 หรื อเป นตั วแปรที่ ใช แทนค า 0 ถึ ง 5

ค าที่ ส งกลั บ

เลขจํ านวนเต็ มจาก 0 ถึ ง 1023

หมายเหต ุ

สํ าหรั บขาที่ เป นอิ นพุ ตอะนาลอกไม จํ าเป นต องประกาศแจ งว าเป นอิ นพ ุตหรื อเอาต พุ ต

ตั วอย างที่ 4-8int ledPin = 4; // ต อแผงวงจร ZX-LED เข าที่ พอร ต 4int analogPin = 0; // ต อแผงวงจร ZX-POTH เข าที่ พอร ตอิ นพุ ต A0int val = 0; // กํ าหนดตั วแปรรั บค าอะนาลอกint threshold = 512; // กํ าหนดค าอ างอิ งvoid setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดให พอร ต 4 เป นเอาต พุ ต}void loop(){

val = analogRead(analogPin); // อ านค าอิ นพุ ตอะนาลอก A0if (val >= threshold){

digitalWrite(ledPin, HIGH); // ขั บ LED}else{

digitalWrite(ledPin, LOW); // ดั บ LED}

}ตั วอย างนี้ จะส่ั งให พอร ต 4 เป นลอจิ ก “1” เม่ื ออ านค าจากพอร ตอิ นพุ ต A0 แล วมี ค ามากกว าหรื อเท ากั บค าอ างอ ิงที ่กํ าหนดไว (ในต ัวอย าง ค าอ างอ ิงหร ือ threshold = 255) แต ถ าม ีค าน อยกว า พอร ต 4 จะเป นลอจ ิก“0” ทํ าให LED ดั บ

Page 86: POP-XT Educationkit manual

86 POP-XT

4.3.1.2 analogWrite(pin, value)

ใช เขี ยนค าอะนาลอกไปยั งพอร ตที่ กํ าหนดไว เพื่ อสร างสั ญญาณ PWM

พาราม ิเตอร

pin - หมายเลขขาพอร ตของแผงวงจรหลั ก POP-XT

value - เป นค าดิ วตี้ ไซเกิ ลมี ค าระหว าง 0 ถึ ง 255

เม่ื อค าเป น 0 แรงดั นของขาพอร ตที่ กํ าหนดจะเป น 0V เม่ื อมี ค าเป น 255 แรงดั นที่ ขาพอร ตจะเป น +5Vสํ าหรั บค าระหว าง 0 ถึ ง 255 จะทํ าให ขาพอร ตที่ กํ าหนดไว มี ค าแรงดั นเปลี่ ยนแปลงในย าน 0 ถึ ง +5V

ค าที่ ส งกลั บจากฟ งก ชั่ น

เลขจํ านวนเต็ มจาก 0 ถึ ง 255

หมายเหต ุ

ขาพอร ตที่ ใช สร างสั ญญาณ PWM ด วยฟ งก ชั่ น analogWrite() ของแผงวงจร POP-XT มี 5 ขาคื อ ขา 3,5, 9, 10 และ 11 สํ าหรั บขาอื่ นๆ จะต องเขี ยนค าดิ จิ ตอลเป นกํ าหนดเป น 0 หรื อ +5V เน่ื องจากขา 5, 9, 10 และ 11ถู กต อเข ากั บวงจรขั บมอเตอร และลํ าโพงแล ว จึ งเหลื อเพี ยงขาพอร ต 3 เท านั้ นที่ ใช ในการทดสอบค ําสั่ ง analogWrite ได อย างไรก็ ตามขาพอร ต 3 ก็ ยั งทํ าหน าที่ เป นขาพอร ตบั ส I2C ด วย ดั งนั้ นในการใช งานจริ ง จะต องเลื อกหน าที่ การทํ างานของพอร ต 3 ให ชั ดเจนว า จะเป นพอร ตเอาต พุ ตอะนาลอกหรื อทํ าหน าที่ เป นขาสั ญญาณ SCL เพื่ อเชื่ อมต อบั ส I2C

ผู ใช งานสามารถนํ าสั ญญาณที่ ได จากคํ าสั่ งนี้ ไปใช ในการปรั บความสว างของ LED หรื อต อขยายกระแสเพื ่อต อปรั บความเร็ วของมอเตอร ได หล ังจากเร ียกใช คํ าสั่ งนี ้แล วที ่ขาพอร ตที่ กํ าหนดจะมี สั ญญาณ PWM ส งออกมาอย างต อเนื่ อง จนกว าจะมี การเรี ยกคํ าสั่ ง analogWrite (หรื อเรี ยกคํ าสั่ งdigitalRead หรื อ digitalWrite ที่ ขาเดี ยวกั น)

ตั วอย างที่ 4-9int ledPin = 3; // ต อแผงวงจร ZX-LED เข าที่ พอร ต 3int analogPin = 0; // ต อแผงวงจร ZX-POTH เข าที่ พอร ตอิ นพุ ต A0int val = 0; // กํ าหนดตั วแปรรั บค าอะนาลอกint threshold = 512; // กํ าหนดค าอ างอิ งvoid setup(){

pinMode(ledPin, OUTPUT); // กํ าหนดให พอร ต 3 เป นเอาต พุ ต}void loop(){

val = analogRead(analogPin); // เก็ บข อมู ลที่ อ านได จากอิ นพุ ตอะนาลอกลงในตั วแปรanalogWrite(ledPin, val / 4); // ปรั บค าที่ ได จากการแปลงสั ญญาณ 0 ถึ ง 1023

// เป นค า 0 ถึ ง 255 แล วส งไปยั งพอร ตเอาต พุ ตอะนาลอก}ตั วอย างนี้ เป นการควบคุ มความสว างของ LED ที่ ต อกั บพอร ต 3 ให เป นไปตามค าที่ อ านได จากแผงวงจรZX-POTH (แผงวงจรตั วต านทานปรั บค าได ) ที่ ต อกั บพอร ต A0

Page 87: POP-XT Educationkit manual

POP-XT 87

4.4 ฟ งก ชั่ นพอร ตอิ นพุ ตเอาต พุ ตขั้ นสู ง (Enhanced I/O)

4.4.1 shiftOut(dataPin, clockPin, bitOrder, value)

เป นฟ งก ชั่ นสํ าหรั บเลื่ อนข อมู ลขนาด 1 ไบต (8 บิ ต) ออกจากขาพอร ตที่ กํ าหนดไว สามารถกํ าหนดได ว า จะให เริ่ มเลื่ อนบิ ตข อม ูลจากบิ ตที่ มี ความสํ าคั ญสู งสุ ด (MSB หรื อบิ ตซ ายสุ ด) หรื อบิ ตที่ มี ความสํ าคั ญตํ่ าสุ ด (LSB - บิ ตขวาสุ ด) โดยบิ ตของข อมู ลจะออกที่ ขา dataPin และใช อี กหนึ่ งขาคื อclockPin เป นตั วกํ าหนดจั งหวะการเลื่ อนข อมู ล

การส งข อมู ลว ิธ ีที ่ว านี ้เร ียกว า การส งข อม ูลอน ุกรมแบบโปรโตคอลซ ิงโครน ัส ซึ ่งเป นว ิธ ีทั ่วไปที ่ไมโครคอนโทรเลอร ใช ต ิดต อก ับต ัวตรวจจ ับหร ือไมโครคอนโทรลเลอร ต ัวอื ่น อ ุปกรณ ทั ้งสองต ัวต องท ํางานประสานก ัน (ซ ิงโครไนซ ก ัน) และต ิดต อก ันที ่ความเร ็วส ูงส ุด เนื ่องจากอ ุปกรณ ทั ้งสองต ัวจะใช ส ัญญาณนาฬ ิกาเด ียวก ัน จะเร ียกชื ่ออ ีกอย างว า เป นการสื ่อสารแบบ SPI (synchronous peripheral interface)

พาราม ิเตอร

dataPin - พอร ตที่ กํ าหนดให เป นเอาต พุ ตเพื่ อส งข อมู ลออก (ตั วแปรชนิ ด int)

clockPin - พอร ตที ่กํ าหนดให ทํ าหน าที ่ส งสั ญญาณนาฬิ กาเพื ่อกํ าหนดจ ังหวะการเลื ่อนข อมู ลของ dataPin

bitOrder - กํ าหนดลํ าดั บการเลื่ อนบิ ตข อมู ล เลื อกได ว าเป น MSBFIRST หรื อ LSBFIRST

value - ไบต ข อมู ลที่ ต องการส งแบบอนุ กรม

พอร ตที่ เป น dataPin และ clockPin จะต องก ําหนดให เป นเอาต พุ ตก อน ด วยการเรี ยกใช ฟ งก ชั ่น pinMode

4.4.1.1 การเขี ยนโปรแกรมที่ ผิ ดพลาดที่ พบบ อยของฟ งก ชั่ น shiftOut

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

ตั วอย างที่ 4-10int data;int clock;int cs;...digitalWrite(cs, LOW);data = 500;shiftOut(data, clock, MSBFIRST, data)digitalWrite(cs, HIGH);

ข อมู ลที่ ต องการเลื่ อนเท ากั บ 500 ดั งนั้ นจึ งมี ขนาด 2 ไบต (เพราะ 1 ไบต เก็ บค าได สู งสุ ด 256 ค า) แต เน่ื องจากในโปรแกรมเลื่ อนเพี ยง 1 ไบต ค าที่ ได จึ งเท ากั บ 244 เน่ื องจากข อมู ล 8 บิ ตบนของตั วแปรdata มี ค าเท ากั บ 244

Page 88: POP-XT Educationkit manual

88 POP-XT

ในตั วอย างที่ 4-11 เป นการแก ไขโปรแกรมเพื่ อให สามารถเลื ่อนข อมู ลได อย างถู กต อง

ตั วอย างที่ 4-11ในกรณี ที่ ต องการเลื่ อนบิ ต MSB ก อน เขี ยนโปรแกรมได ดั งนี้ data = 500;shiftOut(data, clock, MSBFIRST, (data >> 8)); // เลื่ อนข อมู ลไบต สู งshiftOut(data, clock, MSBFIRST, data); // เลื่ อนข อมู ลไบต ตํ่ า

ในกรณี ที่ ต องการเลื่ อนบิ ต LSB ก อน เขี ยนโปรแกรมได ดั งนี้ data = 500;shiftOut(data, clock, MSBFIRST, data); // เลื่ อนข อมู ลไบต ตํ่ าshiftOut(data, clock, MSBFIRST, (data >> 8)); // เลื่ อนข อมู ลไบต สู ง

4.4.2 unsigned long pulseIn(pin, value)

ใช อ านคาบเวลาของพั ลส (ไม ว าเป น HIGH หรื อ LOW) ที่ เกิ ดขึ้ นที่ pin (ขาพอร ตอิ นพุ ตดิ จ ิตอล) ที่ กํ าหนด เช น ถ าก ําหนด value เป น HIGH ค ําสั ่ง pulseIN() จะรอให ขาที ่ก ําหนดไว ม ีสถานะเป น HIGH เพื ่อเริ ่มจ ับเวลา และจ ับเวลาต อไปจนกว าสถานะของขานั ้นจะเป น LOW จ ึงหย ุดจ ับเวลา ค าที ่ฟ งก ชั ่นค ืนกล ับมาเป นคาบเวลาของพ ัลส ในหน วยไมโครว ินาท ี แสดงการท ํางานในร ูปที ่ 4 - 1

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

พาราม ิเตอร

pin - ขาพอร ตที่ ต องการอ านค าคาบเวลาพั ลส (ตั วแปรชนิ ด int)

value - ระดั บสั ญญาณที่ ต องการตรวจจั บ กํ าหนดเป น HIGH หรื อ LOW (ตั วแปรชนิ ด int) โดย HIGHคื อ ลอจิ กสู ง และ LOW คื อ ลอจิ กตํ่ า

รู ปที ่ 4-11 การทํ างานของฟ งก ชั่ น pulseIn

value = HIGH value = LOW

เริ่มการนับเวลา

หยุดการนับเวลา

เริ่มการนับเวลา

หยุดการนับเวลา

Page 89: POP-XT Educationkit manual

POP-XT 89

ค าที่ ส งกลั บจากฟ งก ชั่ น

คาบเวลาของพั ลส ในหน วยไมโครวิ นาที

ตั วอย างที่ 4-12int pin = 7;unsigned long duration;void setup(){

pinMode(pin, INPUT);}void loop(){

duration = pulseIn(pin, HIGH);}ฟ งก ชั่ นนี้ ไม มี กลไกการหมดเวลา ถ าไม มี พั ลส เกิ ดขึ้ น จะวนรอไปตลอดเวลา ทํ าให โปรแกรมค างได

4.5 ฟ งก ชั่ นเก่ี ยวกั บเวลา (Time)

4.5.1 unsigned long millis()

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

ค าที่ ส งกลั บจากฟ งก ชั่ น

ค าเวลาในหน วยเป นมิ ลลิ วิ นาที ตั้ งแต เร่ิ มรั นโปรแกรมป จจุ บั น คื นค าเป น unsigned long ค าตั วเลขจะเกิ ดการโอเวอร โฟลว (ค าเกิ นแล วกลั บเป นศู นย ) เมื่ อเวลาผ านไปประมาณ 9 ชั่ วโมง

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

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

Serial.print(“Time: “);time = millis(); // อ านค าเวลาSerial.println(time); // แสดงค าเวลาSerial.flush();delay(1000);

}

Page 90: POP-XT Educationkit manual

90 POP-XT

4.5.2 delay(ms)

เป นฟ งก ชั ่นชะลอการท ํางาน หร ือหน วงเวลาของโปรแกรมตามเวลาที ่ก ําหนดในหน วยม ิลล ิว ินาท ี

พาราม ิเตอร

ms - ระยะเวลาที่ ต องการหน วงเวลา หน วยเป นมิ ลลิ วิ นาที (1000 ms เท ากั บ 1 วิ นาที )

ตั วอย างที่ 4-14int ledPin = 4; // ต อแผงวงจร OBEC-LED กั บพอร ต 4void setup() {

pinMode(ledPin, OUTPUT); // กํ าหนดเป นพอร ตเอาต พุ ต}void loop() {

digitalWrite(ledPin, HIGH); // ขั บ LEDdelay(1000); // หน วงเวลา 1 วิ นาที digitalWrite(ledPin, LOW); // ดั บ LEDdelay(1000); // หน วงเวลา 1 วิ นาที

}

4.5.3 delayMicroseconds(us)

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

พาราม ิเตอร

us - ค าหน วงเวลาในหน วยไมโครวิ นาท ี (1000 ไมโครวิ นาท ี = 1 ม ิลล ิวิ นาท ี และหนึ ่งล านไมโครวิ นาท ี = 1 วิ นาท ี)

ตั วอย างที่ 4-15int outPin = 4; // ต อแผงวงจร OBEC-LED กั บพอร ต 4void setup() {

pinMode(outPin, OUTPUT); // กํ าหนดเป นพอร ตเอาต พุ ต}void loop() {

digitalWrite(outPin, HIGH); // ขั บ LEDdelayMicroseconds(50); // หน วงเวลา 50 ไมโครวิ นาที digitalWrite(outPin, LOW); // ดั บ LEDdelayMicroseconds(50); // หน วงเวลา 50 ไมโครวิ นาที

}จากตั วอย างนี้ กํ าหนดให พอร ต 4 ทํ างานเป นเอาต พ ุตเพื่ อส งสั ญญาณพั ลส ที่ มี คาบเวลา 100 ไมโครวิ นาที

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

Page 91: POP-XT Educationkit manual

POP-XT 91

4.6 ฟ งก ชั่ นทางคณิ ตศาสตร

4.6.1 min(x, y)

หาค าตั วเลขที ่น อยที ่สุ ดของตั วเลขสองตั ว

พาราม ิเตอร

x - ตั วเลขตั วแรก เป นข อมู ลประเภทใดก็ ได

y - ตั วเลขตั วที่ สอง เป นข อมู ลประเภทใดก็ ได

ค าที่ ส งกลั บจากฟ งก ชั่ น

ค าที่ น อยที่ สุ ดของตั วเลขสองตั วที่ ให

ตั วอย างที่ 4-16sensVal = min(sensVal, 100);ตั วอย างนี้ จะได ค าของ sensVal ที่ ไม เกิ น 100 กลั บจากฟ งก ชั่ น

4.6.2 max(x, y)

หาค าตั วเลขที ่มากที่ สุ ดของตั วเลขสองตั ว

พาราม ิเตอร

x - ตั วเลขตั วแรก เป นข อมู ลประเภทใดก็ ได

y - ตั วเลขตั วที่ สอง เป นข อมู ลประเภทใดก็ ได

ค าที่ ส งกลั บจากฟ งก ชั่ น

ค าที่ มากที่ สุ ดของตั วเลขสองตั วที่ ให

ตั วอย างที่ 4-17sensVal = max(senVal, 20);จากตั วอย างนี้ ค าของ sensVal จะมี ค าอย างน อย 20

4.6.3 abs(x)

หาค าสั มบู รณ (absolute) ของตั วเลขพาราม ิเตอร

x - ตั วเลข

ค าที่ ส งกลั บจากฟ งก ชั่ น

x เม่ื อ x มี ค ามากกว าหรื อเท ากั บศู นย (x มี ค าเป นบวกหรื อศู นย )

- x เม่ื อ x มี ค าน อยกว าศู นย (x มี ค าติ ดลบ)

Page 92: POP-XT Educationkit manual

92 POP-XT

4.6.4 constrain(x, a, b)

ป ดค าตั วเลขที ่น อยกว าหรื อมากกว าให อยู ในช วงที ่กํ าหนดพาราม ิเตอร

x - ตั วเลขที่ ต องการป ดค าให อยู ในช วงที่ กํ าหนด สามารถเป นข อมู ลชนิ ดใดก็ ได

a - ค าตํ่ าสุ ดของช วงที่ กํ าหนด

b - ค าสู งสุ ดของช วงที่ กํ าหนด

ค าที่ ส งกลั บจากฟ งก ชั่ น

x เม่ื อ x มี ค าอยู ระหว าง a และ b

a เมื่ อ x มี ค าน อยกว า a

b เม่ื อ x มี ค ามากกว า b

ตั วอย างที่ 4-18sensVal = constrain(sensVal, 10, 150);จากตั วอย างนี้ ค าของ sensVal จะอยู ในช วง 10 ถึ ง 150

4.7 ฟ งก ชั่ นเก่ี ยวกั บตั วเลขสุ ม

4.7.1 randomSeed(seed)ใช กํ าหนดต ัวแปรส ําหร ับสร างต ัวเลขสุ ม โดยสามารถใช ต ัวแปรได หลากหลายร ูปแบบ โดยทั ่ว

ไปจะใช ค าเวลาป จจ ุบ ัน (จากฟ งก ชั ่น milis()) แต สามารถใช ค าอย างอื ่นได เช น ค าที ่ได เมื ่อผู ใช กดสว ิตช หรื อค าสั ญญาณรบกวนที่ อ านได จากขาอิ นพุ ตอะนาลอก

พาราม ิเตอร

seed เป นค าตั วเลขแบบ long int

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

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

randomSeed(analogRead(0));randNumber = random(300);Serial.println(randNumber);

}

ในตั วอย างนี้ กํ าหนดให เกิ ดการสุ มตั วเลขเมื่ ออ านค าจากอิ นพุ ตอะนาลอกช อง 0 ย านของตั วเลขสุ มคื อ0 ถึ ง 300 เมื่ อสุ มตั วเลขแล ว ให แสดงค านั้ นที่ หน าต าง Serial Monitor

Page 93: POP-XT Educationkit manual

POP-XT 93

4.7.2 long random(max),

long random (min,max)

ใช สร างต ัวเลขสุ มเสม ือน (pseudo-random numbers) เพื ่อนํ าไปใช ในโปรแกรม ก อนใช ฟ งก ชั ่นนี้ จะต องเรี ยกใช ฟ งก ชั่ น randomSeed() ก อน

พาราม ิเตอร

min กํ าหนดค าตั วเลขสุ มไม น อยกว าค านี้ (เป นออปช่ั นเพิ่ มเติ ม)

max กํ าหนดค าสู งสุ ดของตั วเลขสุ ม

ค าที่ ส งกลั บจากฟ งก ชั่ น

คื นค าเป นตั วเลขสุ มในช วงที่ กํ าหนด (เป นตั วแปร long int)

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

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

randomSeed(analogRead(0)); // สุ มค าจากการอ านค าอิ นพุ ตอะนาลอกrandNumber = random(50,300); // สุ มค าในช วง 50 ถึ ง 300Serial.println(randNumber);Serial.flush();delay(50);

}

เม่ื อรั นโปรแกรมนี้ ค าที่ ได จากจะอยู ในช วง 50 ถึ ง 300 แม ว าจะปรั บค าแรงดั นอิ นพุ ตที่ พอร ต A0 เป น 0หรื อ +5V (ซ่ึ งปกติ มี ค า 0 ถึ ง 1023) ทั้ งนี้ เป นผลมาจากฟ งก ชั่ น random(min,max)

Page 94: POP-XT Educationkit manual

94 POP-XT

4.8 ฟ งก ชั่ นเก่ี ยวกั บอิ นเตอร รั ปต จากภายนอกใช ระบุ ว าเมื ่อเก ิดการอิ นเตอร ร ัปต จากภายนอกจะให โปรแกรมกระโดดไปย ังฟ งก ชั่ นใด หร ือ

ถอดการระบ ุฟ งก ชั่ น

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

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

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

4.8.2 อิ นพุ ตรั บสั ญญาณอิ นเตอร รั ปต แผงวงจร POP-XT มี อิ นพุ ตสํ าหรั บรั บสั ญญาณอิ นเตอร รั ปต จากภายนอก 4 ขาคื อ INT0 ถึ ง

INT3 ซึ่ งตรงกั บขา 3, 2, 0 และ 1 ตามลํ าดั บ ซึ่ งใช งานร วมกั บขา SCL และ SDA (ขาสั ญญาณสํ าหรั บติ ดต ออุ ปกรณ ระบบบั ส I2C), RxD, TxD (ขารั บส งข อมู ลอนุ กรม UART1)

4.8.3 attachInterrupt(interrupt, function, mode)

ใช ระบ ุว า เมื ่อขาอ ินพ ุตที ่ร ับส ัญญาณอ ินเตอร ร ัปตจากภายนอกม ีการเปลี ่ยนแปลงจะก ําหนดให ซ ีพ ีย ูกระโดดไปย ังฟ งก ชั ่นใด โดยแผงวงจรหล ัก POP-XT ม ีขาอ ินพ ุตร ับส ัญญาณอ ินเตอร ร ัปต จากภายนอก4 ขาค ือ INT0 ถึ ง INT3 ซึ ่งตรงก ับพอร ต 3,2, 0 และ 1 ตามล ําด ับ ทั ้งย ังตรงก ับพอร ตของบั ส I2C และUART1 ด วย ด ังนั ้น หากเล ือกใช งานพอร ตนี ้อ ินพ ุตอ ินเตอร ร ัปต ก ็จะใช งานพอร ตบั ส I2C หรื อพอร ตอน ุกรม UART1 เพื ่อต ิดต ออ ุปกรณ ภายนอกไม ได

หมายเหต ุ

เม่ื อเกิ ดการอิ นเตอร รั ปต ขึ้ น จะไม สามารถเรี ยกใช ฟ งก ชั่ น milis() และ delay() ได เม่ื อเก ิดการตอบสนองอิ นเตอร รั ปต แล ว ดั งนั้ นข อมู ลที่ เข ามาทางพอร ต UART1 อาจสู ญหายได

Page 95: POP-XT Educationkit manual

POP-XT 95

พาราม ิเตอร

Interrupt - หมายเลขของช องอิ นพุ ตอิ นเตอร รั ปต (เป น int)

function - ฟ งก ชั่ นที่ จะกระโดดไปทํ างานเม่ื อเกิ ดอิ นเตอร รั ปต ไม รั บค าพารามิ เตอร และไม มี การคื นค า

mode - เลื อกประเภทสั ญญาณที่ ใช กระตุ นให เกิ ดการอิ นเตอร รั ปต

LOW เกิ ดอิ นเตอร รั ปต เม่ื อขาสั ญญาณเป นลอจิ ก “0”

CHANGE เกิ ดอิ นเตอร รั ปต เม่ื อมี การเปลี่ ยนแปลงลอจิ ก

RISING เกิ ดอิ นเตอร รั ปต เม่ื อมี การเปลี่ ยนลอจิ ก “0” เป น “1”

FALLING เกิ ดอิ นเตอร รั ปต เม่ื อมี การเปลี่ ยนลอจิ ก “1” เป น “0”

ตั วอย างที่ 4-21int pin = 4;volatile int state = LOW;void setup() {

pinMode(pin, OUTPUT);attachInterrupt(0, blink, CHANGE);

}void loop() {

digitalWrite(pin, state);}void blink(){

state = !state;}ตั วอย างนี้ เลื อกอิ นพุ ตอิ นเตอร รั ปต ช อง 0 กํ าหนดให ไปทํ างานที่ ฟ งก ชั่ น blink เม่ื อเกิ ดอิ นเตอร รั ปต ขึ้ น

4.8.4 detachInterrupt(interrupt)

ยกเลิ กการอิ นเตอร ร ัปต

พาราม ิเตอร

Interrupt - หมายเลขของช องอิ นพุ ตอิ นเตอร รั ปต ที่ ต องการยกเลิ ก (ค าเป น 0 ถึ ง 3)

Page 96: POP-XT Educationkit manual
Page 97: POP-XT Educationkit manual

POP-XT 97

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

5.1 องค ประกอบหลั กทางฮาร ดแวร ที่ ใช ในการพั ฒนาโครงงาน

1. แผงวงจรควบค ุม POP-XT เป นแผงวงจรหล ักที ่ใช ในการประมวลผลและควบค ุมการท ํางานที่ มี จอแสดงผลแบบกราฟ ก LCD สี สํ าหรั บแสดงผลการทํ างาน

2. ช ุดเฟ องข ับมอเตอร ไฟตรงและเซอร โวมอเตอร ทํ าหน าที ่เป นอ ุปกรณ ขั บเคลื ่อนกลไก ทํ าให เก ิดการเคลื่ อนไหว

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

4. อุ ปกรณ โครงสร างและอุ ปกรณ ทางกล

5.2 องค ประกอบหลั กทางซอฟต แวร ที่ ใช ในการพั ฒนาโปรแกรม

ประกอบด วยชุ ดซอฟต แวร พั ฒนาโปรแกรมภาษา C/C++ สํ าหรั บไมโครคอนโทรลเลอร แบบโอเพ นซอร ส (open source) ที่ นํ ามาใช ได โดยไม ต องเสี ยค าใช จ าย มี ข อมู ลโดยสรุ ปดั งนี้

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

Page 98: POP-XT Educationkit manual

98 POP-XT

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

5.3 ขั ้นตอนการพ ัฒนาโปรแกรมภาษา C/C++ เพื ่อควบค ุมแผงวงจร POP-XT

ขั ้นตอนการพ ัฒนาโปรแกรมสํ าหร ับแผงวงจรไมโครคอนโทรลเลอร POP-XT แสดงเป นแผนภาพดั งรู ปที่ 5-1

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

คอมไพล

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

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

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

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

พอรต USB

Page 99: POP-XT Educationkit manual

POP-XT 99

5.4 ทดสอบการทํ างานของแผงวงจร POP-XT

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

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

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

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

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

Page 100: POP-XT Educationkit manual

100 POP-XT

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

เลื อกเมนู Tools > Board > POP-XT ดั งรู ป

5.4.1.2 กํ าหนดพอร ตอนุ กรมที่ ใช ในการติ ดต อ

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

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

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

Page 101: POP-XT Educationkit manual

POP-XT 101

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

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

(1) คลิ กเลื อกเมนู File > New จากนั้ นพิ มพ โค ดตั วอย างดั งต อไปนี้

#include <popxt.h> // ผนวกไฟล ไลบรารี POP-XTvoid setup(){ glcd(1,0,"Hello World"); // แสดงข อความที่ จอแสดงผล GLCD สี }void loop(){}

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

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

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

Page 102: POP-XT Educationkit manual

102 POP-XT

5.4.3 อั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

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

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

(1) เป ดสวิ ตช ของแผงวงจร POP-XT ต อสาย USB เข ากั บคอมพิ วเตอร

สาย USB-miniB

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

คอมพิวเตอร

220F

100F

TB6612

ATMega32U4

100

แผงวงจร POP-XT

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

Upload

Page 103: POP-XT Educationkit manual

POP-XT 103

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

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

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

Page 104: POP-XT Educationkit manual
Page 105: POP-XT Educationkit manual

POP-XT 105

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

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

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

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

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

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

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

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

Page 106: POP-XT Educationkit manual

106 POP-XT

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

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

สาย USB-miniB

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

คอมพิวเตอร

220F

100F

TB6612

ATMega32U4

100

แผงวงจร POP-XT

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

Page 107: POP-XT Educationkit manual

POP-XT 107

(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

ATMega32U4

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 108: POP-XT Educationkit manual

108 POP-XT

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

นอกจากนั้ นคํ าสั่ ง glcd ยั งมี อั กขระพิ เศษเพื่ อระบุ ตํ าแหน งแทนการใช ค าตั วเลข ดั งแสดงในโปรแกรมที่ 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,i,"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 109: POP-XT Educationkit manual

POP-XT 109

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

(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

ATMega32U4

100

Row00

Row01

RRRow02

RRRRow03

RRRRRow04

RRRRRRow05

RRRRRRRow06

RRRRRRRRow07

RRRRRRRRRow08

RRRRRRRRRRow09

RRRRRRRRRRRow010

RRRRRRRRRRRRow011

RRRRRRRRRRRRRow012

RRRRRRRRRRRRRRow013

RRRRRRRRRRRRRRRow014

RRRRRRRRRRRRRRRRow015

Page 110: POP-XT Educationkit manual

110 POP-XT

ขนาดตั วอ ักษรปกติ ที ่แสดงบนจอแสดงผลของแผงวงจร 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 องศา

#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 111: POP-XT Educationkit manual

POP-XT 111

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

(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 112: POP-XT Educationkit manual

112 POP-XT

ฟ งก ชั ่น 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 113: POP-XT Educationkit manual

POP-XT 113

#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 114: POP-XT Educationkit manual

114 POP-XT

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

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

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

#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 115: POP-XT Educationkit manual

POP-XT 115

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

File > Upload

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

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

Page 116: POP-XT Educationkit manual

116 POP-XT

บนแผงวงจร 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

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

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

Page 117: POP-XT Educationkit manual

POP-XT 117

#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 118: POP-XT Educationkit manual

118 POP-XT

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

220 F

100 F

TB6612

ATMega32U4

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 119: POP-XT Educationkit manual

POP-XT 119

#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 120: POP-XT Educationkit manual

120 POP-XT

ในไฟล ไลบรารี popxt.h มี คํ าสั่ ง out(int num,int _dat) ซึ่ งช วยให ส งลอจิ ก “0” หรื อ“1” ออกไปยั งขาพอร ตที่ ต องการได ทํ าให นํ าแผงวงจร POP-XT ไปใช ขั บอุ ปกรณ เอาต พุ ตพื้ นฐานได ง ายขึ้ น ยกตั วอย างง ายที่ สุ ดคื อ ไดโอดเปล งแสงหรื อ LED

ในกิ จกรรมนี้ จึ งนํ าแผงวงจร ZX-LED อั นเป นแผงวงจร LED แสดงผลแบบเดี่ ยวที่ จะติ ดสว างเมื่ อได รั บลอจิ ก “1” และดั บลงเมื่ อได รั บลอจิ ก “0” มาต อกั บแผงวงจร POP-XT เพื่ อทดลองใช งาน

(A4.1) นํ า ZX-LED ชุ ดที่ 1 ต อเข ากั บจุ ดต อพอร ต 6 /A7 และชุ ดที่ 2 ต อกั บจุ ดต อพอร ต 4/A6

220 F

100 F

TB6612

ATMega32U4

100

LED

+ S

+

S

OBEC-LED

LED

+ S

+

SOBEC-LED

(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 ทั้ งสองชุ ดติ ดและดั บสลั บกั นไปอย างต อเนื่ อง

Page 121: POP-XT Educationkit manual

POP-XT 121

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

setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ glcd(1,1,"Press OK"); // แสดงข อความออกหน าจอ GLCDsw_ok_press(); // วนรอการกดสวิ ตช OK

}void loop(){

out(4,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 ติ ดสว างout(6,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 ดั บsleep(400);out(4,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 ดั บout(6,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 ติ ดสว างsleep(400);

}

โปรแกรมที่ A4-1 ไฟล LEDTest.ino สํ าหรั บทดสอบการข ับอุ ปกรณ เอาต พุ ตอย างง าย

Page 122: POP-XT Educationkit manual

122 POP-XT

Page 123: POP-XT Educationkit manual

POP-XT 123

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

โครงสร างของไฟล ไลบรารี popxt.h แสดงดั งรู ป

Page 124: POP-XT Educationkit manual

124 POP-XT

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 125: POP-XT Educationkit manual

POP-XT 125

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 126: POP-XT Educationkit manual

126 POP-XT

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 127: POP-XT Educationkit manual

POP-XT 127

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 128: POP-XT Educationkit manual

128 POP-XT

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

RRRRRRRRRRRRRRRRow015

Hello World

Page 129: POP-XT Educationkit manual

POP-XT 129

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 130: POP-XT Educationkit manual

130 POP-XT

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 131: POP-XT Educationkit manual

POP-XT 131

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 132: POP-XT Educationkit manual

132 POP-XT

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 133: POP-XT Educationkit manual

POP-XT 133

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 134: POP-XT Educationkit manual

134 POP-XT

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 135: POP-XT Educationkit manual

POP-XT 135

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 136: POP-XT Educationkit manual

136 POP-XT

7.2.1.20 glcdLine

เป นฟ งก ชั่ นลากเส นจากจุ ดหนึ่ งไปยั งอี กจุ ดหนึ่ ง กํ าหนดเป นพิ กั ดในแนวแกนนอน (x) และแกนตั้ ง (y)

รู ปแบบvoid glcdLine(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,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 137: POP-XT Educationkit manual

POP-XT 137

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 138: POP-XT Educationkit manual

138 POP-XT

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 139: POP-XT Educationkit manual

POP-XT 139

7.2.1.23 glcdArc

เป นฟ งก ชั ่นวาดส วนโค งของวงกลม โดยระบ ุต ําแหน งจ ุดกึ ่งกลาง ร ัศม ี ต ําแหน งจ ุดเริ ่ม จ ุดสิ ้นส ุดและส ีของเส น

รู ปแบบ

void glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,int end_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 140: POP-XT Educationkit manual

140 POP-XT

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 ไมโครวิ นาที

Page 141: POP-XT Educationkit manual

POP-XT 141

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 142: POP-XT Educationkit manual

142 POP-XT

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 มาเก็ บไว ที่ ตั วแปร 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 143: POP-XT Educationkit manual

POP-XT 143

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

Page 144: POP-XT Educationkit manual

144 POP-XT

7.2.5.3 sw_ok()

เป นฟ งก ชั ่นตรวจสอบสถานะสวิ ตช OK บนแผงวงจร POP-XT โดยให สถานะ “เป นจริ ง” เมื ่อมี การกดสวิ ตช และ “เป นเท็ จ” เมื่ อไม มี การกดสวิ ตช

รู ปแบบ

unsigned char sw_ok()การคื นค า

1 (เป นจริ ง) เม่ื อมี การกดสวิ ตช

0 (เป นเท็ จ) เมื่ อไม มี การกดสวิ ตช

หมายเหตุ การกดสวิ ตช OK มี ผลทํ าให ค าที่ อ านได จาก Knob เป น 0 ด วย

ตั วอย างที่ 7-30if(sw_ok()){

beep(); // เมื่ อกดสวิ ตช OK จะมี เสี ยง “ติ้ ด” ดั งออกลํ าโพง}

7.2.5.4 sw_ok_press()

เป นฟ งก ชั่ นวนตรวจสอบการกดสวิ ตช OK บนแผงวงจร POP-XT ต องรอจนกระทั่ งสว ิตช ถู กปล อยหลั งจากการกดสวิ ตช จึ งจะผ านฟ งก ชั ่นนี้ ไปกระทํ าคํ าสั่ งอื่ นๆ

ตั วอย างที่ 7-31........sw_ok_press(); // รอจนกระทั่ งเกิ ดกดสวิ ตช OK......

Page 145: POP-XT Educationkit manual

POP-XT 145

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% อั นเป นค ากํ าลั งสู งสุ ด

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 ช องหยุ ดทํ างานพร อมกั น

Page 146: POP-XT Educationkit manual

146 POP-XT

7.2.6.3 fd [ใช กั บหุ นยนต POP-BOT XT]

มาจากคํ าว า forward เป นฟ งก ชั่ นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ไปข างหน า

รู ปแบบ

fd(unsigned int speed)พาราม ิเตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

ตั วอย างที่ 7-36fd(60); // สั่ งให หุ นยนต เคลื่ อนที่ ไปข างหน าด วยความเร็ ว 60 เปอร เซ็ นต

7.2.6.4 fd2 [ใช กั บหุ นยนต POP-BOT XT]

มาจากคํ าว า forward2 เป นฟ งก ชั ่นที ่ก ําหนดให หุ นยนต POP-BOT XT เคลื ่อนที ่ไปข างหน าแบบกํ าหนดความเร็ วมอเตอร แยกอ ิสระ

รู ปแบบ

fd2(unsigned int speed1 ,unsigned int speed2)พาราม ิเตอร

speed1 คื อ ค าความเร็ วของมอเตอร A มี ค าตั้ งแต 0 ถึ ง 100%

speed2 คื อ ค าความเร็ วของมอเตอร B มี ค าตั้ งแต 0 ถึ ง 100%

ตั วอย างที่ 7-37

fd2(30,80); // ควบค ุมให หุ นยนต เคลื ่อนที ่เป นวงกลม เนื ่องจากมอเตอร B หม ุนเร็ วกว ามอเตอร A มาก

7.2.6.5 bk [ใช กั บหุ นยนต POP-BOT XT]

มาจากคํ าว า backward เป นฟ งก ชั่ นกํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั ง

รู ปแบบ

bk(unsigned int speed)พาราม ิเตอร

speed คื อเปอร เซ็ นต ความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100

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

bk(90); // กํ าหนดให หุ นยนต POP-BOT XT เคลื่ อนที่ ถอยหลั งด วยความเร็ ว 90 เปอร เซ็ นต

Page 147: POP-XT Educationkit manual

POP-XT 147

7.2.6.6 bk2 [ใช กั บหุ นยนต POP-BOT XT]มาจากคํ าว า 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-BOT XT ซึ ่งอาจแตกต างก ันด านความเร ็วในการหม ุน ให ท ํางานได อย างใกล เค ียงก ันด วยการปร ับค าspeed1 และ speed2

7.2.6.7 tl และ tr [ใช กั บหุ นยนต POP-BOT XT]

มาจากค ําว า turn left และ turn right หร ือเลี ้ยวซ ายและเลี ้ยวขวานั ่นเอง โดยการเลี ้ยวของฟ งก ชั ่นทั ้งสองนี ้จะก ําหนดให มอเตอร ต ัวใดต ัวหนึ ่งของหุ นยนต หย ุดอยู ก ับที ่ จ ุดหม ุนของหุ นยนต จะอยู ที ่ล อของมอเตอร ที ่หย ุดอยู ก ับที ่

รู ปแบบ

tl(unsigned int speed) และ tr(unsigned int speed)พาราม ิเตอร

speed คื อ ค าความเร็ วของมอเตอร มี ค าตั้ งแต 0 ถึ ง 100 เปอร เซ็ นต

ตั วอย างที่ 7-40tl(60); // กํ าหนดให หุ นยนต เลี้ ยวซ ายด วยความเร็ ว 60 เปอร เซ็ นต tr(100); // กํ าหนดให หุ นยนต เลี้ ยวขวาด วยความเร็ ว 100 เปอร เซ็ นต

Page 148: POP-XT Educationkit manual

148 POP-XT

7.2.6.8 sl และ sr [ใช กั บหุ นยนต POP-BOT XT]

มาจากคํ าว า 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 - ช องเอาต พุ ตเซอร โวมอเตอร มี ค า 1 ถึ ง 3_pos - กํ าหนดตํ าแหน งแกนหมุ นของเซอร โวมอเตอร มี ค าในช วง 0 ถึ ง 180 และ -1

ถ ากํ าหนดเป น -1 หมายถึ ง ไม ใช งานเซอร โวมอเตอร ที่ ช องนั้ นๆ

Page 149: POP-XT Educationkit manual

POP-XT 149

7.2.8 ฟ งก ชั่ นเก่ี ยวกั บการสื่ อสารข อมู ลอนุ กรม

เป นไฟล ไลบรารี สน ับสนุ นชุ ดคํ าสั ่งเกี่ ยวกั บการรั บส งข อม ูลผ านโมดู ลสื ่อสารข อมู ลอนุ กรม(UART)

7.2.8.1 การเช่ื อมต อทางฮาร ดแวร

เมื่ อต องการใช งานช อง UART0

ให ต อสายจากจ ุดต อพอร ต USB บนแผงวงจร POP-XT (เป นจ ุดต อเด ียวก ับที ่ใช ในการอ ัปโหลด)เข ากั บพอร ต USB ของคอมพิ วเตอร

เมื่ อต องการใช งานช อง UART1

ต อสายสั ญญาณเข ากั บจุ ดต อ RXD (ขาพอร ต 2) และ TXD (ขาพอร ต 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 150: POP-XT Educationkit manual

150 POP-XT

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 151: POP-XT Educationkit manual

POP-XT 151

เม่ื อรั นโปรแกรมนี ้ ต องเป ดหน าต าง 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 152: POP-XT Educationkit manual

152 POP-XT

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 153: POP-XT Educationkit manual

POP-XT 153

7.3 ไลบราร ีเพิ ่มเต ิมสํ าหร ับใช งาน GP2D120 โมด ูลว ัดระยะทางด วยแสงอ ินฟราเรด

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

สํ าหร ับต ัวตรวจจ ับแบบพ ิเศษที ่มี ในช ุดหุ นยนต POP-BOT XT (รุ น Standard kit) ค ือ 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 154: POP-XT Educationkit manual

154 POP-XT

Page 155: POP-XT Educationkit manual

POP-XT 155

หล ังจากการแนะน ําขั ้นตอนแนวทางการพ ัฒนาโปรแกรมภาษา C/C++ ด วยซอฟต แวร Arduino,ฟ งก ชั ่นพื ้นฐานต างๆ และไฟล ไลบราร ี popxt.h ไปแล วตั ้งแต บทที ่ 2 ถ ึง 7 เพื ่อให การเร ียนรู เป นไปอย างต อเนื ่อง ในบทนี ้จ ึงนํ าเสนอต ัวอย างการทดสอบการท ํางานในส วนต างๆ ที ่ส ําค ัญของแผงวงจร POP-XTเพื ่อเป นแนวทางในการต อยอดสู การพ ัฒนาโปรแกรมเพื ่อสร างโครงงานและหุ นยนต อ ัตโนม ัต ิอย างเต ็มร ูปแบบต อไป

ตั วอย างทดสอบการทํ างานของแผงวงจร POP-XT กั บอุ ปกรณ ภายนอก มี ทั้ งสิ้ น 8 ตั วอย างประกอบด วย

1. ขั บอุ ปกรณ เอาต พุ ตอย างง าย

2. ใช งานสวิ ตช

3. อ านค าสั ญญาณอะนาลอกมาแสดงผลที่ แผงวงจร POP-XT

4. ควบคุ มการเป ดป ด LED ด วยแผงวงจรตรวจจั บแสง

5. เคร่ื องวั ดอุ ณหภู มิ ระบบตั วเลขอย างง าย

6. ตรวจจั บคาวมต างสี ของพื้ นที่

7. ควบคุ มมอเตอร ไฟตรง

8. ขั บเซอร โวมอเตอร

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

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

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

Page 156: POP-XT Educationkit manual

156 POP-XT

ในตั วอย างนี้ น ําแผงวงจร ZX-LED อั นเป นแผงวงจร LED แสดงผลแบบเดี่ ยวที่ จะติ ดสว างเมื่ อได รั บลอจิ ก “1” และดั บลงเมื่ อได รั บลอจิ ก “0” มาต อกั บแผงวงจร POP-XT เพื่ อทดลองใช งาน

(8.1.1) ต อแผงวงจร ZX-LED ชุ ดที่ 1 เข าที่ พอร ต 4 และต อแผงวงจร ZX-LED ชุ ดที่ 2 เข าที่ พอร ต 6ของแผงวงจร POP-XT ดั งรู ปที่ 8-1

(8.1.2) เขี ยนโปรแกรมที่ 8-1 บั นทึ กไฟล ชื่ อ popXT_LED

(8.1.3) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT จากนั้ นทํ าการคอมไพล และอั ปโหลดโปรแกรม

(8.1.4) รั นโปรแกรม สั งเกตการทํ างานของแผงวงจร ZX-LED

เมื่ อรั นโปรแกรม LED บนแผงวงจร ZX-LED ทั้ งสองชุ ดติ ดและดั บสลั บกั นไปอย างต อเนื่ อง

ร ูปที ่ 8-1 แสดงการต ออ ุปกรณ เพ่ื อทดสอบการข ับอ ุปกรณ เอาต พุ ตอย างง ายของแผงวงจร POP-XT

220 F

100 F

TB6612

ATMega32U4

100

LED

+ S

+

S

OBEC-LED

LED

+ S

+

S

OBEC-LED

Page 157: POP-XT Educationkit manual

POP-XT 157

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

out(4,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 ติ ดสว างout(6,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 ดั บsleep(400);out(4,0); // ทํ าให LED ที่ ต ออยู กั บพอร ต 4 ดั บout(6,1); // ทํ าให LED ที่ ต ออยู กั บพอร ต 6 ติ ดสว างsleep(400);

}

โปรแกรมที ่ 8-1 ไฟล popXT_LED.ino สํ าหรั บทดสอบการขั บอ ุปกรณ เอาต พุ ตอย างง าย

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

(8.1.5) เขี ยนโปรแกรมที่ 8-2 บั นทึ กไฟล ชื่ อ popXT_Beep

(8.1.6) เป ดสวิ ตช จ ายไฟแก แผงวงจร POP-XT จากนั้ นทํ าการคอมไพล และอั ปโหลดโปรแกรม

(8.1.7) รั นโปรแกรม

จะได ยิ นเสี ยง “ติ้ ด” ดั งเป นจั งหวะในทุ กๆ 1 วิ นาที จากลํ าโพงของแผงวงจร POP-XT

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

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

Page 158: POP-XT Educationkit manual

158 POP-XT

(8.1.8) เขี ยนโปรแกรมที่ 8-3 บั นทึ กไฟล ชื่ อ popXT_SoundTest แล วอั ปโหลดโปรแกรม เพื่ อทดสอบการทํ างานอี กครั้ ง

จะได ยิ นสั ญญาณเสี ยง 2 ความถี่ ดั งสลั บกั นออกจากลํ าโพงของแผงวงจร POP-XT

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

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

}

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

Page 159: POP-XT Educationkit manual

POP-XT 159

ในตั วอย างนี้ เป นการตรวจสอบการกดสวิ ตช OK บนแผงวงจร POP-XT เพื่ อนํ ามาใช ควบคุ มการทํ างานของแผงวงจร ZX-LED

(8.2.1) ต อแผงวงจร ZX-LED เข ากั บแผงวงจร POP-XT ที่ พอร ต 4 ตามรู ปท่ี 8-2

(8.2.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_OKtest พิ มพ โปรแกรมที่ 8-4 จากนั้ นคอมไพล และอั ปโหลดโปรแกรม

(8.2.3) รั นโปรแกรม สั งเกตการทํ างานของแผงวงจร ZX-LED และทดลองกดสวิ ตช OK บนแผงวงจรPOP-XT สั งเกตการทํ างานของ ZX-LED ทั้ งในจั งหวะที่ มี การกดและไม กดสวิ ตช OK

เมื่ อรั นโปรแกรม LED บนแผงวงจร ZX-LED ติ ดสว าง เมื่ อกดสวิ ตช OK ทํ าให LED ดั บลงนาน 2 วิ นาที จากนั้ นจะกลั บมาติ ดใหม หากกดสวิ ตช OK อี ก LED ก็ จะดั บอี ก 2 วิ นาที แล วกลั บมาติ ดสว างใหม เป นเช นนี้ ไปตลอดการทํ างาน จนกว าจะมี การรี เซตระบบ หรื อป ดเป ดจ ายไฟเล้ี ยงใหม

220 F

100 F

TB6612

ATMega32U4

100

LED

+ S

+

S

รู ปที ่ 8-2 การต ออุ ปกรณ เพ่ื อทดสอบการอ านค าสวิ ตช OK บนแผงวงจร POP-XT

Page 160: POP-XT Educationkit manual

160 POP-XT

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

setTextSize(2); // กํ าหนดขนาดตั วอั กษร 2 เท าglcd(1,1,"Press OK"); // แสดงข อความออกหน าจอแสดงผลsw_OK_press(); // วนรอจนกระทั่ งกดสวิ ตช OKglcdClear(); // เคลี ยร หน าจอแสดงผล กํ าหนดพื้ นหลั งเป นสี ดํ า

}void loop(){

if (sw_OK()) // ตรวจสอบการกดสวิ ตช OK{

out(4,0); // ดั บ LED ที่ จุ ดต อพอร ต 4delay(2000); // นาน 2 วิ นาที

}out(4,1); // ขั บ LED ที่ จุ ดต อพอร ต 4 ให ติ ดสว าง

}

โปรแกรมที ่ L8-4 ไฟล popXT_OKtest.ino โปรแกรมภาษา C/C++ ส ําหร ับทดลองควบค ุม LED ด วยสว ิตช

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

(8.2.4) ต อแผงวงจร ZX-SWITCH01 ก ับจ ุดต อพอร ต 18 (หร ือ A0) ของแผงวงจร POP-XT ด ังร ูปท่ี 8-3

(8.2.5) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_SwitchTest พิ มพ โปรแกรมที่ 8-5 จากนั้ นทํ าการคอมไพล และอั ปโหลดโปรแกรม

(8.2.6) รั นโปรแกรม ทดลองกดสวิ ตช บนแผงวงจร ZX-SWITCH01 แล วสั งเกตผลของการทํ างานที่ จอแสดงผลของแผงวงจร POP-XT

ที่ จอแสดงผลของแผงวงจร POP-XT แสดงข อความ Start ให กดสวิ ตช OK

(8.2.7) กดสวิ ตช OK 1 ครั้ ง แล วปล อย

ที่ จอแสดงผลของแผงวงจร POP-XT แสดงข อความ COUNTER ให เริ่ มการนั บด วยการกดสวิ ตช ที่ ต อกั บพอร ต 18 (หรื อ A0)

Page 161: POP-XT Educationkit manual

POP-XT 161

220 F

100 F

TB6612

ATMega32U4

100

Counter

27

ZX-Switch01

+ S

+

S

D

ร ูปที ่ 8-3 การต ออ ุปกรณ เพ่ื อทดสอบการอ านค าสว ิตช จากจุ ดต อพอร ตของแผงวงจร POP-XT

(8.2.8) กดสวิ ตช ที่ แผงวงจร ZX-SWITCH01 ที่ ต อกั บพอร ต 18 สั งเกตการทํ างานที่ จอแสดงผลของแผงวงจร POP-XT

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

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

Page 162: POP-XT Educationkit manual

162 POP-XT

โปรแกรมที ่ 8-5 ไฟล popXT_SwitchTest.ino โปรแกรมภาษา C/C++ ส ําหร ับทดลองใช งานสว ิตช ในการสร างเครื ่องน ับจํ านวนอย างง าย

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint i=0; // ประกาศตั วแปรเก็ บค าการนั บvoid setup(){

setTextSize(2); // กํ าหนดขนาดตั วอั กษร 2 เท าglcd(1,3,"Start"); // แสดงข อความ Start ออกหน าจอแสดงผลsw_ok_press(); // วนรอจนกระทั่ งกดสวิ ตช OKglcdClear(); // เคลี ยร หน าจอแสดงผล กํ าหนดพื้ นหลั งเป นสี ดํ าglcd(1,2,"COUNTER"); // แสดงข อความ COUNTER เพื่ อแจ งชื่ อการทดลองsetTextSize(3); // กํ าหนดขนาดตั วอั กษร 3 เท าglcd(3,3,"0"); // กํ าหนดค าเริ่ มต นเป น 0

}void loop(){

if (in(18)==0) // ตรวจสอบการกดสวิ ตช ที่ พอร ต 18{

i=i++; // เพิ่ มค าตั วนั บglcd(3,3,"%d",i); // แสดงค าการนั บwhile(in(18)==0) // ตรวจสอบการปล อยสวิ ตช

delay(5);}

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

โปรแกรมนี ้ใช ฟ งก ชั ่น in ในการตรวจจั บและอ านค าจากการกดสว ิตช ที ่พอร ต 18 โดยตรงสอบว าที ่พอร ต16 เป นลอจ ิก “0” หร ือไม ถ าใช แสดงว า ม ีการกดสว ิตช เป ดขึ้ น จากนั้ นจะทํ าการเพิ ่มค าต ัวนั บ แล วนํ ามาแสดงผลที่ จอแสดงผลกราฟ ก LCD ของแผงวงจร POP-XT

คํ าสั่ ง while(in(18)==0) และ dealy(5); ทํ าหน าที่ ลดสั ญญาณรบกวนที่ เกิ ดจากการกดสวิ ตช โดยจะตรวจสอบว า มี การปล อยสวิ ตช แล วหรื อไม ถ าไม ก็ จะวนทํ างานอยู ที่ คํ าสั่ งนั้ น ช วยให ไม เกิ ดการนั บค าโดยไม ตั้ งใจขึ้ น ดั งนั้ นการกดสวิ ตช ที่ พอร ต 18 ในแต ละครั้ งจึ งมี ความแน นอนสู ง

Page 163: POP-XT Educationkit manual

POP-XT 163

เป นตั วอย างการเขี ยนโปรแกรมเพื่ ออ านค าตํ าแหน งของการปรั บหมุ นแกนของตั วต านทานปรั บค าได ของแผงวงจร ZX-POTH ที่ ต อกั บพอร ตอิ นพุ ต A0 ถึ ง A7 ของแผงวงจร POP-XT แล วนํ าค าที่ อ านได มาแสดงที่ จอแสดงผลของ POP-XT โดยผลลั พธ มี ค าในช วง 0 ถึ ง 1,023

(8.3.1) ต อแผงวงจร ZX-POTH เข ากั บแผงวงจร POP-XT ที่ พอร ตอิ นพุ ต A0 ตามรู ปท่ี 8-4

(8.3.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_AnalogTest พิ มพ โปรแกรมที่ 8-6

ร ูปที ่ 8-4 แสดงการต ออ ุปกรณ เพ่ื อทดสอบการอ านค าจากอ ินพุ ตอะนาลอกอ ันเป นพ้ื นฐานของการอ านค าจากต ัวตรวจจ ับส ัญญาณไฟฟ า

220 F

100 FTB6612

ATMega32U4

100

ZX-POTHPOTENTIOMETER

A

Analog

0

0.000

Volts

Page 164: POP-XT Educationkit manual

164 POP-XT

(8.3.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.3.4) รั นโปรแกรม ทดลองหมุ นแกนของตั วต านทานบนแผงวงจรตั วต านทานปรั บค าได ZX-POTHสั งเกตผลการทํ างานผ านทางจอแสดงผลของแผงวงจร POP-XT

ที่ จอแสดงผลกราฟ ก LCD ช วงบนแสดงค าข อม ูลท่ี ได จากการแปลงสั ญญาณที่ จ ุดต อ A0 ซึ่ งต อกั บแผงวงจรตั วต านทานปรั บค าได ZX-POTH โดยมี ค าระหว าง 0 ถึ ง 1023 (เที ยบกั บแรงดั น 0ถึ ง +5V) ถ าปรั บแกนหมุ นมายั งตํ าแหน งกึ่ งกลาง ค าที่ อ านได เป น 512

ที่ ช วงล างของจอแสดงผลกราฟ ก LCD สี แสดงค าแรงดั นไฟตรงในหน วย โวลต (Volts) ที่ ได จากการปร ับค าของต ัวต านทานบนแผงวงจรต ัวต านทานปรั บค าได ZX-POTH โดยม ีค าระหว าง 0.000ถึ ง 4.995 (เที ยบกั บข อมู ล 0 ถึ ง 1023)

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

glcdClear();setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ

}void loop(){

glcd(0,2,"Analog"); // แสดงข อความที่ จอแสดงผลval = analog(0); // อ านค าของสั ญญาณช อง A0 มาเก็ บไว ที่ ตั วแปร valsetTextSize(3); // เลื อกขนาดตั วอั กษรใหญ เป น 3 เท าจากขนาดปกติ glcd(1,2,"%d ",val); // แสดงค าที่ อ านได จากจุ ดต อ A0 ที่ หน าจอแสดงผลsetTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ glcd(5,3,"Volts"); // แสดงข อความ Voltsvolts = (float(val)*5)/1024; // แปลงข อมู ลเป นหน วยแรงดั นsetTextSize(3); // เลื อกขนาดตั วอั กษรใหญ เป น 3 เท าจากขนาดปกติ glcd(4,1,"%f",volts); // แสดงค าแรงดั นความละเอี ยดทศนิ ยม 3 ตํ าแหน งsetTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ

}

โปรแกรมที ่ 8-6 ไฟล popXT_AnalogTest.ino โปรแกรมภาษา C/C++ ส ําหร ับอ านค าส ัญญาณอะนาลอกจากพอร ตอ ินพุ ตอะนาลอกของแผงวงจร POP-XT

Page 165: POP-XT Educationkit manual

POP-XT 165

ในต ัวอย างนี ้เป นการนํ าข อมู ลที ่ได จากการแปลงส ัญญาณไฟฟ าซึ ่งมาจากการปร ับค าของ ZX-POTH) แผงวงจรตั วต านทานปรั บค าได มากํ าหนดเง่ื อนไขในการเป ด/ป ด LED เพื่ อให เห็ นแนวทางในการประยุ กต ใช งานเบ้ื องต น

(8.3.5) เชื ่อมต อแผงวงจร ZX-LED เข าก ับจ ุดต อพอร ต 4 และต อเอาต พ ุตปรั บแรงดั นเพิ ่มเมื ่อหม ุนตามตามเข็ มนาฬิ กาของแผงวงจร ZX-POTH กั บจุ ดต อพอร ต A0 ของแผงวงจร POP-XT ตามรู ปท่ี 8-5

(8.3.6) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_AnalogSwitch พิ มพ โปรแกรมที่ 8-7

220 F

100 F

TB6612

ATMega32U4

100

ZX-POTHPOTENTIOMETER

A

LED

+ S

+

S

Analog

108

control

Switch

ร ูปที ่ 8-5 การต ออุ ปกรณ เพ่ื อทดลองควบค ุมการเป ดป ด LED ด วยแผงวงจรตั วต านทานปรั บค าได

(8.3.7) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.3.8) รั นโปรแกรม ทดลองหมุ นแกนของตั วต านทานบนแผงวงจรตั วต านทานปรั บค าได ZX-POTHสั งเกตผลการทํ างานผ านทางจอแสดงผลของแผงวงจร POP-XT และ LED บนแผงวงจร ZX-LED

เมื่ อปรั บค าที่ แกนของตั วต านทาน สั งเกตผลลั พธ ที่ จอแสดงผล มั นจะแสดงค า 0 ถึ ง 1023

เมื่ อปรั บค าที่ แผงวงจร ZX-POTH ถ ามี ค าน อยกว า 512 ตั วเลขจะเป นสี ขาว และ LED ดั บเมื่ อใดปรั บค าจนได มากกว า 512 ค าตั วเลขที่ จอแสดงผลจะเปล่ี ยนเป นสี แดง และ LED ที่ ต อกั บพอร ต 4 ติ ดสว าง

Page 166: POP-XT Educationkit manual

166 POP-XT

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint val=0; // กํ าหนดตั วแปรเก็ บค าที ่ได จากการแปลงสั ญญาณแล วvoid setup(){

glcdClear();setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ glcd(1,2,"Analog"); // แสดงข อความที่ จอแสดงผลglcd(2,2,"control");glcd(3,2,"Switch");

}void loop(){

val = analog(0); // อ านค าของสั ญญาณช อง A0 มาเก็ บไว ที่ ตั วแปร valif(val>512) // ตรวจสอบว าค าที่ อ านได มากกว า 512 หรื อไม {

setTextSize(4); // เลื อกขนาดตั วอั กษรใหญ เป น 4 เท าจากขนาดปกติ setTextColor(GLCD_RED); // เปลี ยนเป นสี แดงglcd(3,1,"%d ",val); // แสดงค าที่ อ านได จากจุ ดต อ A0 ที่ หน าจอแสดงผลout(4,1); // ถ าค า val มากกว า 512 ทํ าการขั บ LED ที่ พอร ต 4

}else{

setTextSize(4); // เลื อกขนาดตั วอั กษรใหญ เป น 4 เท าจากขนาดปกติ setTextColor(GLCD_WHITE); // แสดงตั วอั กษรสี ขาวglcd(3,1,"%d ",val); // แสดงค าที่ อ านได จากจุ ดต อ A0 ที่ หน าจอแสดงผลout(4,0); // ถ าค า val น อยกว า 512 ทํ าการป ด LED ที่ พอร ต 4

}setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ

}

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

สั ญญาณไฟฟ าจากแผงวงจรตั วต านทานปรั บค าได จะถู กอ านด วยคํ าสั่ ง analog() เก็ บไว ที่ ตั วแปร valเพื่ อนํ าไปตรวจสอบและส งไปแสดงผลยั งจอแสดงผลกราฟ ก LCD สี หากค าที่ ได น อยกว า 512 ต ัวเลขที่ แสดงผลยั งเป นสี ขาว และส งข อมู ล “0” ไปยั งพอร ต 4 ทํ าให LED ที่ ต ออยู ไม ทํ างาน

เมื่ อค าของ val มากกว า 512 ตั วเลขแสดงผลจะเปลี่ ยนเป นสี แดง และมี การส งข อมู ล “1” ไปยั งพอร ต 4ทํ าให LED ที่ ต ออยู ติ ดสว าง

โปรแกรมที ่ 8-7 ไฟล popXT_AnalogSwitch.ino โปรแกรมภาษา C/C++สํ าหร ับอ านค าสั ญญาณไฟฟ าเพ่ื อนํ ามาควบค ุมอ ุปกรณ เอาต พุ ต

Page 167: POP-XT Educationkit manual

POP-XT 167

ในตั วอย างนี้ เป นการต อยอดจากตั วอย างที่ 8-2 หั วข อที่ 2 โดยเปลี่ ยนจากการปรั บค าของ ZX-POTH แผงวงจรตั วต านทานปรั บค าได เป นการตรวจจั บแสงโดยใช แผงวงจรตั วต านทานแปรค าตามแสดงหรื อ ZX-LDR โดยยั งคงใช เง่ื อนไขในการเป ด/ป ด LED ในแบบเดี ยวกั น

(8.4.1) เชื่ อมต อแผงวงจร ZX-LED เข ากั บจุ ดต อพอร ต 4 และต อเอาต พุ ต + หรื อเอาต พุ ตแรงดั นแปรค าตามแสงของแผงวงจร ZX-LDR กั บจุ ดต อพอร ต A2 ของแผงวงจร POP-XT ตามรู ปท่ี 8-6

(8.4.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_NightSwitch พิ มพ โปรแกรมที่ 8-8

(8.4.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

220 F

100 F

TB6612

ATMega32U4

100

LED

+ S

+

S ZX-LDR

Light

A

+ +

Night

98

Switch

ร ูปที ่ 8-6 การต ออ ุปกรณ เพ่ื อทดสอบการท ํางานของแผงวงจรตรวจจ ับแสงเพ่ื อใช ก ําหนดเงื ่อนไขในการเป ด-ป ดอ ุปกรณ เอาต พุ ต

Page 168: POP-XT Educationkit manual

168 POP-XT

โปรแกรมที ่ 8-8 ไฟล popXT_NightSwitch.pde โปรแกรมภาษา C/C++ ส ําหร ับควบค ุมการเป ดป ดอ ุปกรณ เอาต พุ ตด วยแสง

#include <ipst.h> // ผนวกไฟล ไลบรารี หลั กint val=0; // กํ าหนดตั วแปรสํ าหรั บเก็ บค าที่ ได จากการแปลงสั ญญาณvoid setup(){

glcdClear();setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ setTextColor(GLCD_YELLOW);glcd(1,2,"Night"); // แสดงข อความที่ จอแสดงผลglcd(2,2,"Switch");

}void loop(){

val = analog(2); // อ านค าของสั ญญาณช อง A2 มาเก็ บไว ที่ ตั วแปร valif(val<100) // ตรวจสอบว าค าที่ อ านได มากกว า 512 หรื อไม {

setTextSize(4); // เลื อกขนาดตั วอั กษรใหญ เป น 4 เท าจากขนาดปกติ setTextColor(GLCD_WHITE); // เปลี ยนเป นสี ขาวglcd(3,1,"%d ",val); // แสดงค าที่ อ านได จากจุ ดต อ A2 ที่ หน าจอแสดงผลout(4,1); // ถ าค า val น อยกว า 100 ทํ าการขั บ LED ที่ พอร ต 4

}else{

setTextSize(4); // เลื อกขนาดตั วอั กษรใหญ เป น 4 เท าจากขนาดปกติ setTextColor(GLCD_BLUE); // แสดงตั วอั กษรสี นํ้ าเงิ นglcd(3,1,"%d ",val); // แสดงค าที่ อ านได จากจุ ดต อ A2 ที่ หน าจอแสดงผลout(4,0); // ถ าค า val มากกว า 100 ทํ าการป ด LED ที่ พอร ต 4

}setTextSize(2); // เลื อกขนาดตั วอั กษรใหญ เป น 2 เท าจากขนาดปกติ

}

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

ในโปรแกรมนี ้จะตรวจสอบค าจากแผงวงจรตรวจจ ับแสงที ่อ านด วยค ําสั ่ง analog(2); เก ็บไว ที ่ต ัวแปร valหากค าที่ ได มากกว า 100 ตั วเลขที่ แสดงผลเป นสี นํ้ าเงิ น และส งข อมู ล “0” ไปยั งพอร ต 4 ทํ าให LED ที่ ต ออยู ไม ทํ างาน

เมื่ อค าของ val น อยกว า 100 ตั วเลขแสดงผลจะเปลี่ ยนเป นสี ขาว และมี การส งข อมู ล “1” ไปยั งพอร ต 4ทํ าให LED ที่ ต ออยู ติ ดสว าง

Page 169: POP-XT Educationkit manual

POP-XT 169

(8.4.4) ร ันโปรแกรม ทดลองใช ม ือหร ือแผ นกระดาษท ึบแสงบ ังแสงท่ี ส องมาย ังตั วต านทานแปรค าตามแสงหรื อ LDR บนแผงวงจร ZX-LDR สั งเกตการทํ างานของจอแสดงผลบนแผงวงจร POP-XT และLED บนแผงวงจร ZX-LED

หาก ZX-LDR ได รั บแสงมาก สั งเกตได จากค าที่ แสดงบนจอแสดงผล นั่ นคื อ มี ค ามากกว า100 (ตั วเลขเป นสี นํ้ าเงิ น) จะสมมติ สถานการณ ว า เป นตอนกลางวั น จึ งไม มี เป ดไฟส องสว าง ซึ่ งในที่ นี้ ใช LED บนแผงวงจร ZX-LED ทํ าหน าที่ แทน

แต ถ ัาหาก ZX-LDR ได ร ับแสงลดลงจนตํ ่ากว า 100 จะถ ือว า เป นตอนกลางค ืน ระบบจะท ํางานสั ่งให LED ที ่พอร ต 17 ต ิดสว าง จนกว า ZX-LDR จะได ร ับแสงมากเพ ียงพอ ซึ ่งอาจต ีความว า เป นตอนเช าแล ว วงจรข ับ LED หย ุดท ํางาน ทํ าให LED ที ่พอร ต 4 ด ับ

ด ังนั ้น จ ึงอาจเร ียกการท ํางานของปฏ ิบ ัต ิการนี ้ว า สว ิตช สนธยา (Twilight Switch) หร ือสว ิตช กลางค ืน (Night Switch) ก ็ได

Page 170: POP-XT Educationkit manual

170 POP-XT

ร ูปที ่ 8-7 การจั ดขาของ MCP9701, หน าตาเมื ่อต อสายสั ญญาณพร อมใช งานและกราฟคุ ณสมบั ติ

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

รู จั กกั บ MCP9701 ไอซี วั ดอุ ณหภู มิ

เป นอ ุปกรณ ตรวจจ ับและว ัดอ ุณหภ ูม ิที ่ให ผลการท ํางานเป นแรงดั นไฟฟ าแบบเช ิงเส น ร ับรู การเปลี ่ยนแปลงของอ ุณหภ ูม ิภายในเวลาไม ถ ึง 2 ว ินาท ี เชื ่อมต อก ับอ ินพ ุตอะนาลอก A0 ถ ึง A7 ของแผงวงจร POP-XT ได

คุ ณสมบั ติ ทางเทคนิ คของ MCP9701 ที่ ควรทราบ

เป นไอซี วั ดอุ ณหภู มิ ในกลุ มเทอร มิ สเตอร แบบแอกตี ฟที่ ให ผลการทํ างานแบบเชิ งเส น

ย านวั ด -40 ถึ ง +125 องศาเซลเซี ยส

ผลการวั ดอ างอิ งกั บหน วยขององศาเซลเซี ยสโดยตรง

ความผิ ดพลาดเฉลี่ ย 2 องศาเซลเซี ยส

ย านไฟเล้ี ยง +3.1 ถึ ง +5.5V กิ นกระแสไฟฟ าเพี ยง 6uA ใช แบตเตอรี่ เป นแหล งจ ายไฟได

ค าแรงดั นเอาต พุ ต 500mV (ท่ี 0๐C) ถึ ง 2.9375V (ท่ี 125๐)

ค าแรงดั นเอาต พุ ตต อการเปลี่ ยนแปลงอุ ณหภู มิ 19.5mV/๐C ใช งานกั บวงจรแปลงสั ญญาณอะนาลอกเป นดิ จิ ตอลความละเอี ยดต้ั งแต 8 บิ ตได โดยมี ความคลาดเคลื่ อนตํ่ า

Page 171: POP-XT Educationkit manual

POP-XT 171

ส วนประกอบของสายวั ดอ ุณหภ ูม ิ MCP9701

รู ปที่ 8-8 แนวทางการใช งานไอซี ว ัดอุ ณหภู ม ิ MCP9701 ที ่มาในรู ปของสายวั ดอ ุณหภ ูมิ

Page 172: POP-XT Educationkit manual

172 POP-XT

โปรแกรมที ่ 8-9 : ไฟล popXT_TempMeter.ino โปรแกรมภาษา C/C++ สํ าหรั บพั ฒนาแผงวงจร POP-XTเป นเครื ่องว ัดอุ ณหภู ม ิระบบต ัวเลขอย างง าย

#include <popxt.h> // ผนวกไฟล ไลบรารี หลั กint val,i; // กํ าหนดตั วแปรเก็ บค าที่ อ านได จาก MCP9701float Temp; // ประกาศตั วแปรค าอุ ณหภู มื ในแบบทศนิ ยมvoid setup(){

glcdClear(); // เคลี ยร จอแสดงผลsetTextSize(2); // เลื อกขนาดตั วอั กษร 2 เท า

}

void loop(){

glcd(1,2,"Digital"); // แสดงข อความเริ่ มต นglcd(2,2,"THERMO");glcd(3,3,"METER");val=0;for (i=0;i<20;i++) // กํ าหนดรอบการอ านค าจาก MCP9701 รวม 20 ครั้ ง{

val = val+analog(4); // อ านค าจากอิ นพุ ต A4}val = val/20; // หาค าเฉลี่ ยจากการอ านค า 20 ครั้ ง

Temp = (float(val)*0.25) - 20.51 ; // แปลงค าเป นอุ ณหภู มิ ในหน วยองศาเซลเซี ยสsetTextSize(3); // เปลี่ ยนขนาดตั วอั กษรเป น 3 เท าsetTextColor(GLCD_YELLOW); // เปลี ยนสี ตั วอั กษรเป นสี เหลื องglcd(3,1,"%f",Temp); // แสดงค าอุ ณหภู มิ ด วยความละเอี ยดทศนิ ยม 3 ตํ าแหน งsetTextColor(GLCD_WHITE); // เปลี ยนสี ตั วอั กษรเป นสี ขาวsetTextSize(2); // เปลี่ ยนขนาดตั วอั กษรเป น 2 เท าglcd(6,2,"Celsius"); // แสดงหน วยองศาเซลเซี ยสdelay(500); // หน วงเวลาก อนเริ่ มต นการอ านค าในรอบใหม

}

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

ในโปรแกรมนี้ หั วใจสํ าคั ญคื อ การคํ านวณเพื่ อเปลี่ ยนข อมู ลดิ จิ ตอลที่ ได จากการแปลงแรงดั นเอาต พุ ตของไอซี MCP9701 เป นค าอุ ณหภู มิ ในหน วยองศาเซลเซี ยส กระบวนการจะเริ ่มจากการอ านและแปลงค าของแรงด ันไฟตรงที่ จ ุดต อ A4 ซึ่ งได มาจากการท ํางานของไอซี MCP9701 มาเก ็บไว ในตั วแปร val จากนั ้นนํ าข อมู ลที่ ได มาคํ านวณด วยสู ตร Temp = (val x 0.25) - 20.51 จากนั้ นนํ าค าอุ ณหภู มิ ได มาแสดงผลด วยความละเอี ยดทศนิ ยม 3 ตํ าแหน ง

Page 173: POP-XT Educationkit manual

POP-XT 173

(8.5.1) เชื่ อมต อไอซี MCP9701 เข ากั บจุ ดต อพอร ต A4 ของแผงวงจร POP-XT ตามรู ปท่ี 8-9

(8.5.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_TempMeter พิ มพ โปรแกรมที่ 8-9

(8.5.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.5.4) ร ันโปรแกรม ทดลองใช ม ือจ ับที ่ต ัวไอซ ีว ัดอ ุณหภ ูม ิ หร ือนํ าห ัวว ัดอ ุณหภ ูม ิไปแช ในนํ ้าแข ็ง ส ังเกตการทํ างานที่ จอแสดงผลบนแผงวงจร POP-XT

แผงวงจร POP-XT แสดงข อความแจ งหน าที่ การทํ างาน และแสดงค าอุ ณหภู มิ ในหน วยองศาเซลเซี ยส (Celsius) ด วยความละเอี ยดทศนิ ยม 3 ตํ าแหน ง โดยท่ี ค าของอุ ณหภู มิ จะแสดงด วยตั วเลขสี เหลื องขนาดใหญ (3x)

รู ปที่ 8-9 การต ออ ุปกรณ เพ่ื อใช งานแผงวงจร POP-XT ก ับไอซ ีวั ดอ ุณหภู ม ิ MCP9701

220 F

100 F

TB6612

ATMega32U4

100

Digital

26.740

THERMO

METER

Celsius

Page 174: POP-XT Educationkit manual

174 POP-XT

ในตั วอย างนี ้เป นการนํ าแผงวงจรตรวจจั บแสงสะท อน ZX-03R มาเชื่ อมต อก ับแผงวงจร POP-XT เพื่ อตรวจสอบว า สี ของพื้ นผิ วอย างง าย

ร ูปที ่ 8-10 การต ออ ุปกรณ เพ่ื อตรวจสอบส ีของพ้ื นผิ วอย างง าย

#include <popxt.h> // ผนวกไฟล ไลบรารหลั กint reflect = 0;void setup(){

glcdClear(); // เคลี ยร จอแสดงผลsetTextSize(2); // เลื อกขนาดตั วอั กษร 2 เท า

}void loop(){

glcd(1,2,"Color"); // แสดงข อความเริ่ มต นglcd(2,2,"Reading");reflect=analog(0); // อ านค าการตรวจจั บแสงสะท อนจากช อง A0setTextSize(3); // เปลี่ ยนขนาดตั วอั กษรเป น 3 เท าsetTextColor(GLCD_YELLOW); // เปลี ยนสี ตั วอั กษรเป นสี เหลื องglcd(3,1, "%d", reflect); // แสดงค าแสงสะท อนsetTextColor(GLCD_WHITE); // เปลี ยนสี ตั วอั กษรเป นสี ขาวsetTextSize(2);sleep(200);

}

220 F

100 F

TB6612

ATMega32U4

100

ZX-03R

Color

497

Reading

โปรแกรมที ่ 8-10 ไฟล popXT_ColorReading.ino โปรแกรมภาษา C/C++สํ าหร ับอ านค าแสงสะท อนจากพ้ื นผ ิวที ่มี ส ีแตกต างกั นของแผงวงจร ZX-03R มาแสดงผลที่ แผงวงจร POP-XT

Page 175: POP-XT Educationkit manual

POP-XT 175

(8.6.1) เชื่ อมต อแผงวงจร ZX-03R เข ากั บจุ ดต อพอร ต A0 ของแผงวงจร POP-XT ตามรู ปท่ี 8-10

(8.6.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_ColorTest พิ มพ โปรแกรมที่ 8-10

(8.6.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.6.4) เตรี ยมแผ นพลาสติ กทึ บแสงแบบผิ วด านหรื อกระดาษสี ขนาดใหญ กว าแผงวงจร ZX-03Rหลายๆ สี เช น แดง, เหลื อง, เขี ยว, ขาว และดํ า

(8.6.5) นํ าแผงวงจร ZX-03R วางเหนื อแผ นพลาสติ กหรื อกระดาษสี ประมาณ 5 มิ ลลิ มเตร อ านค าที่ ได บนจอแสดงผลของแผงวงจร POP-XT แล วบั นทึ กค าแสงสะท อนที่ อ านได ของพื้ นผิ วแต ละสี

859

560

250

420

125

จากผลการทดสอบแสดงให เห็ นว า ด วยการท ํางานรว มก ันระหว างแผงวงจร POP-XT และแผงวงจรตรวจจั บแสงสะท อน ZX-03 สามารถตรวจสอบสี ของพื้ นผิ วเร ียบด านได พอสมควร แบ งกลุ มของสี ออกได ประมาณ 5 เฉดสี

นอกจากนั้ น อาจใช แผงวงจรตรวจจั บแสงสะท อน ZX-03R ในการตรวจจั บแสงสว างได ด วยโดยหงายตั วตรวจจั บขึ้ นเพื่ อรั บแสงสว างจากภายนอก เนื่ องจากภายใน ZX-03R เลื อกใช โฟโต ทรานซ ิสเตอร แบบตอบสนองต อแสงขาวมาเป นตั วตรวจจ ับแสง โดยค าที ่อ านได เมื ่อร ับแสงจากหลอดฟล ูออเรสเซนต ในห องท ํางานปกติ ค ือ 500 ถึ ง 600 เมื ่อเอามื อบั งแสง ค าที ่ได จะลดลงเหลื อประมาณ200 ถึ ง 300

Page 176: POP-XT Educationkit manual

176 POP-XT

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

motor(1,30); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 70% ของกํ าลั งสู งสุ ดmotor(2,30); // ขั บมอเตอร ช อง 2 ด วยกํ าลั ง 70% ของกํ าลั งสู งสุ ดsleep(3000); // หน วงเวลา 3 วิ นาที ก อนกลั บทิ ศทางการหมุ นของมอเตอร motor(1,-30); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 70% มี ทิ ศทางการหมุ นตรงข ามกั บค ากํ าลั งที่ เป นบวกmotor(2,-30); // ขั บมอเตอร ช อง 2 ด วยกํ าลั ง 70% มี ทิ ศทางการหมุ นตรงข ามกั บค ากํ าลั งที่ เป นบวกsleep(3000); // หน วงเวลา 3 วิ นาที ก อนกลั บทิ ศทางการหมุ นของมอเตอร

}

โปรแกรมที ่ 8-11 ไฟล popXT_MotorTest.ino โปรแกรมภาษา C/C++ ส ําหร ับทดสอบการข ับมอเตอร ไฟตรงของแผงวงจรหล ัก POP-XT

ต ัวอย างนี ้เป นการเข ียนโปรแกรมเพื ่อควบคุ มให แผงวงจร POP-XT ข ับมอเตอร ไฟตรงอย างง าย

(8.7.1) เชื่ อมต อมอเตอร ไฟตรง 2 ตั วเข าก ับเอาต พ ุตมอเตอร ไฟตรงช อง A และ B ของแผงวงจร POP-XT ดั งรู ปที่ 8-11

220 F

100 F

TB6612

ATMega32U4

100

ร ูปที ่ 8-11 การต ออ ุปกรณ เพ่ื อทดสอบการขั บมอเตอร ไฟตรงพ้ื นฐานของแผงวงจร POP-XT

Page 177: POP-XT Educationkit manual

POP-XT 177

(8.7.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_MotorTest พิ มพ โปรแกรมที่ 8-11

(8.7.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.7.4) รั นโปรแกรม

มอเตอร ไฟตรงท่ี ช อง 1 และ 2 หมุ น และมี การหมุ นกลั บทิ ศทางในทุ กๆ 3 วิ นาที

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

(8.7.5) ยั งคงใช การต ออุ ปกรณ ตามรู ปท่ี 8-11 ในการทดสอบการทํ างาน

(8.7.6) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_MotorTest02 พิ มพ โปรแกรมที่ 8-12

(8.7.7) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.7.8) รั นโปรแกรม

มอเตอร ไฟตรงที่ ต อกั บช อง 1 และ 2 ของแผงวงจร POP-XT ถู กขั บหมุ นเป นเวลา 3 วิ นาที แล วหยุ ด 3 วิ นาที จากนั้ นหมุ นอี ก 3 วิ นาที สลั บกั นอย างต อเนื่ อง

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

motor(1,30); // ขั บมอเตอร ช อง 1 ด วยกํ าลั ง 30% ของกํ าลั งสู งสุ ดmotor(2,30); // ขั บมอเตอร ช อง 2 ด วยกํ าลั ง 30% ของกํ าลั งสู งสุ ดsleep(3000); // หน วงเวลา 3 วิ นาที motor_stop(1); // หยุ ดขั บมอเตอร ช อง 1motor_stop(2); // หยุ ดขั บมอเตอร ช อง 2sleep(3000); // หน วงเวลา 3 วิ นาที

}

โปรแกรมที่ 8-12 ไฟล popXT_MotorTest02.ino โปรแกรมภาษา C/C++ สํ าหรั บทดสอบการขั บและหย ุดขั บมอเตอร ไฟตรงของแผงวงจร POP-XT

Page 178: POP-XT Educationkit manual

178 POP-XT

ตั วอย างนี้ เป นการเขี ยนโปรแกรมควบคุ มแกนหมุ นของเซอร โวมอเตอร โดยใช แผงวงจร POP-XT โดยต อเซอร โวมอเตอร เข าที่ จุ ดต อเซอร โวมอเตอร SV1 ให หมุ นไปยั งตํ าแหน ง 60 องศา แล วหยุ ดเพื ่อล ็อกต ําแหน งไว เป นเวลา 5 ว ินาท ี จากนั ้นเปลี่ ยนมาย ังตํ าแหน ง 120 องศา แล วหย ุดล็ อกตํ าแหน งไว 5 วิ นาที เช นกั น จากนั้ นหมุ นแกนกลั บไปยั งตํ าแหน ง 60 องศาอี กครั้ ง สลั บตํ าแหน งไปมาเช นนี้ อย างต อเนื่ อง

(8.8.1) ต อเซอร โวมอเตอร เข ากั บเอาต พุ ตเซอร โวมอเตอร ช อง 1 หรื อ SV1 ดั งรู ปท่ี 8-12

(8.8.2) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_Servo01 พิ มพ โปรแกรมที่ 8-13

(8.8.3) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.8.4) รั นโปรแกรม

แกนหมุ นของเซอร โวมอเตอร จะหมุ นไปมาระหว างตํ าแหน ง 60 และ 120 องศาทุ กๆ 5 ว ินาที

ร ูปที ่ 8-12 การต ออ ุปกรณ เพ่ื อทดสอบการข ับและควบค ุมเซอร โวมอเตอร ของแผงวงจร POP-XT

220 F

100 F

TB6612

ATMega32U4

100

STANDARDSERVO MOTOR

Page 179: POP-XT Educationkit manual

POP-XT 179

ต ัวอย างนี ้เป นการเขี ยนโปรแกรมเพื ่อปรั บตํ าแหน งแกนหมุ นของเซอร โวมอเตอร ด วยการปร ับปุ ม KNOB บนแผงวงจร POP-XT

(8.8.5) ยั งคงใช การต ออุ ปกรณ ตามรู ปท่ี 8-12 ในการทดสอบ

(8.8.6) สร างไฟล สเก็ ตช ขึ้ นใหม ตั้ งชื่ อเป น popXT_ServoTest02 พิ มพ โปรแกรมที่ 8-14

โปรแกรมที ่ 8-13 ไฟล popXT_ServoTest01.ino โปรแกรมภาษา C/C++ สํ าหร ับทดสอบการข ับเซอร โวมอเตอร ของแผงวงจร POP-XT

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

servo(1,60); // ขั บเซอร โวมอเตอร ช อง 1 ไปยั งตํ าแหน ง 60 องศาsleep(1000); // หน วงเวลา 1 วิ นาที servo(1,120); // ขั บเซอร โวมอเตอร ช อง 1 ไปยั งตํ าแหน ง 120 องศาsleep(1000); // หน วงเวลา 1 วิ นาที

}

#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

}

โปรแกรมที ่ 8-14 ไฟล popXT_ServoTest02.ino โปรแกรมภาษา C/C++ ของ Arduino1.0 ส ําหร ับควบค ุมเซอร โวมอเตอร ด วยการปร ับค าแรงดั นอะนาลอกป อนให แก แผงวงจร POP-XT

Page 180: POP-XT Educationkit manual

180 POP-XT

(8.8.6) คอมไพล และอั ปโหลดโปรแกรมไปยั งแผงวงจร POP-XT

(8.8.7) รั นโปรแกรม กดสวิ ตช OK เพื่ อเริ่ มการทํ างาน ตามด วยปรั บปุ ม KNOB บนแผงวงจร POP-XT สั งเกตการทํ างานของเซอร โวมอเตอร

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

220F

100F

TB6612

ATMega32U4

100

STANDARDSERVO MOTOR

Servo = 116