POP-XT 1
ArduinoPOP-XT กฤษดา ใจเย็น วรพจน กรแกววัฒนกุล ชัยวัฒน ลิ้มพรจิตรวิไล Innovative Experiment Co.,Ltd INEX Education Centre
2 POP-XT
สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต
ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกตใชในการทดลอง เกียวกั ่ บการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโครคอนโทรลเลอร ในแนวทางใหมทีใช ่ กิจกรรมโครงงานวิทยาศาสตรประยุกตเปนสือ่ 2. สถาบันการศึกษา โรงเรียนในระดับมัธยมศึกษาที่มีการเรียนการสอนในวิชาตามกลุมสาระวิ ชาวิทยาศาสตร เทคโนโลยี วิศวกรรม และคณิตศาสตร (STEM) 3. วิทยาลัยและมหาวิทยาลัยทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกสหรือภาควิชาวิศวกรรมอิเล็กทรอนิกสและ คอมพิวเตอร 4. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาตามกลุมสาระวิ ชาวิทยาศาสตร เทคโนโลยี วิศวกรรม และคณิตศาสตร (STEM), ไมโครคอนโทรลเลอร รวมถึงวิทยาศาสตรประยุกตทีต่ องการบูรณาการความ รูทางอิ เล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรมคอมพิวเตอร--การทดลองทางวิทยาศาสตร ในระดับมัธยม ศึกษา อาชีวศึกษา และปริญญาตรี ดําเนินการจัดพิมพและจําหนายโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด 108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260 โทรศัพท 0-2747-7001-4 โทรสาร 0-2747-7005
รายละเอียดที่ปรากฏในหนังสือเลมนีได ้ ผานการตรวจทานอยางละเอียดและถวนถี่ เพือให ่ มีความสมบูรณและ ถูกตองมากทีสุ่ ดภายใตเงือนไขและเวลาที ่ พึ่ งมีกอนการจัดพิมพเผยแพร ความเสียหายอันอาจเกิดจากการนําขอมูล ในหนังสือเลมนีไปใช ้ ทางบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด มิไดมีภาระในการรับผิดชอบแตประการใด ความผิดพลาดคลาดเคลือนที ่ อาจมี ่ และไดรับการจัดพิมพเผยแพรออกไปนัน้ ทางบริษัทฯ จะพยายามชีแจงและแก ้ ไข ในการจัดพิมพครังต ้ อไป
POP-XT 3
ในการเรียนรูวิ ทยาการสมัยใหมมีแนวคิดหนึงที ่ ได ่ รับการยอมรับอยางกวางขวาง นันคื ่ อ แนวคิดดาน STEM ศึกษา หรือ STEM Education ประกอบดวย วิทยาศาสตร (Science), เทคโนโลยี (Technology), วิศวกรรม (Engineering) และคณิตศาสตร (Mathematic) เพือให ่ ผูเรี ยนไดศึกษากระบวนการทางวิทยาศาสตรและเทคโนโลยีสมัยใหมทีจะต ่ อง อาศัยทักษะพืนฐานสํ ้ าคัญทัง้ 4 ดานมาบูรณาการกัน เพือก ่ อใหเกิดความรู ความเขาใจในเรืองนั ่ นๆ ้ อยางถูกตอง ไมโครคอนโทรลเลอร (microcontroller) และระบบสมองกลฝงตัว (embedded system) ถูกนํามาเปน สวนหนึงของกระบวนการ ่ STEM ศึกษาในระดับมัธยมศึกษา เนืองจากในสั ่ งคมสมัยใหมมีอุปกรณเครืองใช ่ จํานวนมาก ในชีวิตประจําวันทีมี่ วงจรและอุปกรณอิเล็กทรอนิกสเขาไปเกียวข ่ อง การเรียนรูของนั กเรียนเพือทํ ่ าความเขาใจและตอยอด ไปสูการพั ฒนาเปนโครงงานวิทยาศาสตรสมัยใหมทีมี่ ความเกียวข ่ องกับระบบควบคุมอัตโนมัติ อันมีไมโครคอนโทรลเลอร เปนสวนหนึงของหั ่ วใจหลักจึงเปนเปาหมายหนึงที ่ แสดงถึ ่ งความสัมฤทธิผลของการเรี ์ ยนรู STEM ศึกษา แผงวงจรไมโครคอนโทรลเลอร POP-XT (จาก INEX : www.inex.co.th) และซอฟตแวรระบบเปด (open source) ทีใช ่ ในการพัฒนาโปรแกรมควบคุมดวยภาษา 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++ ดําเนินการโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด การจัดหาสือการเรี ่ ยนรูนี เป ้ นไปในรูปแบบสมัครใจ การบริการเกียวกั ่ บการจัดหา และซอมแซมอุปกรณอยูภายใต ความรับผิดชอบของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด
4 POP-XT
การนําเสนอขอมูลเกียวกั ่ บขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้ เกิดจากความตอง การทีจะอธิ ่ บายกระบวนการและหลักการทํางานของอุปกรณในภาพรวมดวยถอยคําทีง่ ายเพื่อสราง ความเขาใจแกผูอ าน ดังนันการแปลคํ ้ าศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราช บัณฑิตยสถาน และมีหลายๆ คําทียั่ งไมมีการบัญญัติอยางเปนทางการ คณะผูเขี ยนจึงขออนุญาต บัญญัติศัพทขึนมาใช ้ ในการอธิบาย โดยมีขอจํากัดเพืออ ่ างอิงในหนังสือเลมนีเท ้ านัน้ สาเหตุหลักของขอชี้แจงนี้มาจากการรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัวและ เทคโนโลยีหุนยนต สําหรับการศึกษาเพือนํ ่ ามาเรียบเรียงเปนภาษาไทยนันทํ ้ าไดไมงายนัก ทางคณะผู เขียนตองทําการรวบรวมและทดลองเพือให ่ แนใจวา ความเขาใจในกระบวนการทํางานตางๆ นันมี ้ ความ คลาดเคลือนน ่ อยทีสุ่ ด เมือต ่ องทําการเรียบเรียงออกมาเปนภาษาไทย ศัพททางเทคนิคหลายคํามีความหมายทีทั่ บซอน กันมาก การบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตร ดังนันหากมี ้ ความ คลาดเคลือนหรื ่ อผิดพลาดเกิดขึน้ ทางคณะผูเขี ยนขอนอมรับและหากไดรับคําอธิบายหรือชีแนะจากท ้ าน ผูรู จะได ทําการชีแจงและปรั ้ บปรุงขอผิดพลาดทีอาจมี ่ เหลานันโดยเร็ ้ วทีสุ่ ด ทังนี ้ ้เพื่อใหการพัฒนาสื่อทางวิชาการ โดยเฉพาะอยางยิงกั ่ บความรูของเทคโนโลยีสมัยใหม สามารถดําเนินไปไดอยางตอเนื่อง ภายใตการมีสวนรวมของผูรูในทุ กภาคสวน
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
6 POP-XT
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)
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 มีไลบรารีฟงกชันภาษาซีสําหรับติดตอกับฮารดแวรจํานวนมาก ไวให ทําใหเขียนโปรแกรมสังงานอุ ่ ปกรณตางๆ ไดงาย โดยไมจําเปนตองศึกษาลงไปในรายละเอียด ของไมโครคอนโทรลเลอรมากนัก แตถาหากมีความตองการพัฒนาในระดับทีสู่ งขึนก็ ้ สามารถนํา POPXT ไปใชรวมกับเครื่องมือพัฒนาโปรแกรมรวมถึงคอมไพเลอรอืนๆ ่ ไดเชนกัน สวนประกอบทั้งหมดของแผงวงจร 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)
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
10 POP-XT
PF1 A4 22
PF5 A2 20
+Vm
PF7 A0 18
SWITCH ON
+5V K3 BATT 4.8-7.2V 3
PF0 A5 23
PF4 A3 21
+
PF6 A1 19
L1 10H 1
C6 100F 10V
C5 0.1 F
+USB
44 43 42 41 40 39 38 37 36 35 34 1 33 32 2 31 3 4
IC1 ATMega32U4 (TQFP44)
UGnd 5 UCap
VBus PB0
C1 1F
6 7
30 29 28 27 26
8 17 PB1 9 15 PB2 10 16 PB3 11 14
PE2 PC7 PC6 PB6 PB5 PB4 PD7 PD6 PD4 AVcc GND
Pxx
C12 0.1F
4
1,2,3
G
RST + 17
+5V
+5V Q1 KRC102
R5 4k7
19 18
+Vm
+Vm PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +Vm +Vm
CR1 16MHz
24 23 22 21 20 19 18 17 16 15 14 13
IC2 TB6612FNG
+5V 3
4 5
6 7
+Vm
8 9 10 11 12
A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1
1 2
C3 10 F 16V
PC6
SDA PD1
0 RXD
6
PD2
1
TXD PD3
4
A7 PD7
ADIR
R8 1k
R7 1k
5
7
APWM 9 PB5
BDIR
10 BPWM
SV3
GND +Vm 12
SV2
GND +Vm 30
SV1
PB6
-+ 2
SCL PD0
GND +Vm 13 PE6
-+
3
A
B
DC. MOTOR OUTPUT
A6 PD4
+5V
+3.3V IC5 LM1117-3.3V
GLCD 128x160 pixel
C14 10F 16V
21-character 16-line
C16 10F 16V
C15 0.1F
R11 4.7k PB0 R13 4.7k
31
21 20
12 6
PE2
RST
SP1 PIEZO Speaker
16
4 30
R12 4.7k
R15 4.7k
R14 4.7k
+5V R11 1k
1 2 3 4 5 6 7 8 9 10 11 12 13 14
PB2
R17 4.7k
N/C GND CS Vcc Vcc CLK MISO D/C /RST GND LEDA LEDK GND N/C
PB1
8
R16 4.7k
R9 4.7
+3.3V
VR1 KNOB
SW5 OK
PE2 +3.3V
R18 4.7k +3.3V
R10 4.7k RST C17 0.1F
รูปที่ 1-2 วงจรสมบูรณของแผงวงจรควบคุม POP-XT
D1 1N4148
C18 0.1F
PB4
SW3 RESET
R11 1k
31
+Vm
11
15
REF 23 22
A8
R3 4k7
17
7 GND
2 0 1
PB4
C9 0.1 F
ISP SW2 RESET
+
14 3
8
+5V
C2 0.01F
15 16
13 5 11
C8 0.1 F
R6 4k7
Q2 KRC102
GND GND
31
8
C13 220F 10V
10 9
PB7 RST Vcc GND XTAL2 XTAL1 PD0 PD1 PD2 PD3 PD5
25 24 23 12 13 14 15 16 17 18 19 20 21 22
R4 4k7 LED1 BLUE
5
SPI Ext.
PE6 UVcc DD+
R1 R2 27 27
VUSB DD+ ID GND
AVcc GND AREF PF0 PF1 PF4 PF5 PF6 PF7 GND Vcc
C4
+5V 0.1 F
4
2
IC4 NCP1450 - 5.0
xx C7 0.1F
1
5,6,7,8 C11 470F 16V Q3 FDS6680A
3
4
+5V
K1 mini B-USB USB port
IC3 2 KIA278R05
C10 470F 16V
+5V
+5V D1 MBRS340
POP-XT 11
1.2 คุณสมบัติของอุปกรณเอาตพุต 1.2.1 แผงวงจรไฟแสดงผล : ZX-LED ใช LED ขนาด 8 มิลลิเมตร ตองการลอจิก “1” ในการขับใหสวาง มีวงจรแสดงในรูปที่ 1-3
LED1 R1 (Default = 510)
S
+
Q1 KRC102 (DTC114)
รูปที่ 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 มิลลิเมตร)
12 POP-XT
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 นิ้ว
STANDARD SERVO MOTOR
1.3 คุณสมบัติของชุดอุปกรณตรวจจับสัญญาณ 1.3.1 แผงวงจรสวิตช : ZX-SWITCH01
D
ZX-SWITCH01
มีวงจรแสดงในรูปที่ 1-4 ประกอบดวยสวิตชพรอมไฟแสดงผล ใหเอาตพุตคือ หากมีการกดสวิตช จะสงลอจิก “0” (ระดับแรงดัน 0V) และไฟสีแดงติด
LED1
Indicator
+V
R2 10k R1 510
R3 220
DATA
Signal output S1 GND Switch
รูปที่ 1-4 รูปรางและวงจรของแผงวงจรสวิตช
POP-XT 13
แผงวงจรสวิตช ZX-SWITCH01ใหผลการทํางานเปนสัญญาณดิจิตอล “1” (ไมกดสวิตช) หรือ “0” (กดสวิตช) จึงตอใชงานกับแผงวงจรไมโครคอนโทรลเลอร POP-XT ไดทุกจุดตอ โดยจุดตอพอรต ใดทีใช ่ งานตองกําหนดใหทํางานเปนพอรตอินพุตดิจิตอลดวย
1.3.2 แผงวงจรตรวจจับแสง : ZX-LDR ใชตรวจจับแสงสวาง เลือกเอาตพุตได 2 แบบคือ แรงดันเอาตพุตเพิม่ เมื่อแสงตกกระทบ
+ +
แรงดันเอาตพุตลดลง เมื่อแสงตกกระทบ
มีวงจรและรูปรางของแผงวงจรแสดงในรูปที่ 1-5 แผงวงจรตรวจจับแสง ZX-LDR ใหผลการทํางานเปนแรงดันไฟตรง ดังนั้นในการใชงานกับ แผงวงจรไมโครคอนโทรลเลอร POP-XT จึงตองตอสัญญาณเขากับชองอินพุตอะนาลอกทีช่ อง A0 ถึง A7 จากนั้นใชความรูจากการอานคาสัญญาณอะนาลอกเพื่ออานคาจากแผงวงจรตรวจจับนี้ไปใชงาน
+
LDR Light
+
A
เมื่อแสงมากขึ้น แรงดันที่ไดจะลดลง เมื่อแสงมากขึ้น แรงดันที่ไดจะมากขึ้น
ZX-LDR +
10k
S
+
A
+
LDR
S
+
รูปที่ 1-5 รูปรางและวงจรของแผงวงจรตรวจจับแสง ZX-LDR
1.3.3 แผงวงจรตรวจจับแสงสะทอน : ZX-03R มีวงจรและหนาตาของแผงวงจรแสดงในรูปที่ 1-6 เปนแผงวงจรที่ใชในการตรวจสอบการ สะทอนของแสงจากพื้นผิวหรือจากเสน เมื่อจายไฟเลี้ยง LED สีแดงแบบความสวางสูงหรือซูเปอร ไบรตจะติดสว างขับแสงสีแดงออกมาตลอดเวลา สวนตัวรับแสงเปนโฟโตทรานซิสเตอรเบอร SFH310 จะไดรับแสงสีแดงจากการสะทอนกลับจากวัตถุหรือพืนผิ ้ ว โดยปริมาณของแสงทีได ่ รับจะ มากหรือนอยขึ้นอยูกับวา มีวัตถุมากีดขวางหรือไม และวัตถุนั้นมีความสามารถในการสะทอนแสงสี แดงไดดีเพียงไร ซึ่งขึ้นกับลักษณะพื้นผิวและสีของวัตถุ โดยวัตถุสีขาวผิวเรียบจะสะทอนแสงไดดี ทําใหตัวรับแสงไดรับแสงสะทอนมาก สงผลใหแรงดันที่เอาตพุตของวงจรสูงตามไปดวย ในขณะที่ วัตถุสีดําสะทอนแสงไดนอย ทําใหตัวรับแสงสงแรงดันออกมาตํา่ ดวยคุณสมบัติดังกลาวจึงนิยมนําแผง วงจรตรวจจับแสงสะทอนนี้มาใชในการตรวจจับพืนหรื ้ อเสน
14 POP-XT
จุดตอสัญญาณ
LED LED1
+V OUT
SFH310
GND
10k
220
ตัวตรวจจับแสงสะทอน
รูปที่ 1-6หนาตาและวงจรของแผงวงจรตรวจจับแสงสะทอน ZX-03R ดวยการใชแสงสีแดงเปนแสงหลักในการตรวจจับ ทําใหนําตัวตรวจจับแบบนี้ไปใชวัดความ แตกตางของสีบนพื้นผิวไดดวย หรืออาจเรียกวา ทํางานเปนตัวตรวจจับสีอยางงายได แผงวงจรตรวจจับแสงสะทอน ZX-03R ใหผลการทํางานเปนแรงดันไฟตรง ในการใชงานกับ แผงวงจรไมโครคอนโทรลเลอร POP-XT จึงตองตอสัญญาณเขากับชองอินพุตอะนาลอกทีช่ อง A0 ถึง A7 แลวใชความรูจากการอานคาสัญญาณอะนาลอกเพื่ออานคาจากแผงวงจรตรวจจับนี้ไปใชงาน
1.3.3 แผงวงจรตัวตานทานปรับคาไดแบบแกนหมุน : ZX-POTH ใชกําหนดแรงดัน 0 ถึง +5V ตามการหมุนแกน นําไปใชวัดคามุมและระยะทางได มีทั้งแบบ ตัวตังและตั ้ วนอน มีเอาตพุต 2 แบบคือ แรงดันมากขึนเมื ้ ่อหมุนทวนเข็มนาฬิกาหรือ ตามเข็มนาฬิกา มีวงจรและหนาตาของแผงวงจรแสดงในรูปที่ 1-7 ใชงานกับแผงวงจรไมโครคอนโทรลเลอร POP-XT โดยตอสัญญาณเขากับชองอินพุตอะนาลอกที่ชอง A0 ถึง A7 เมื่อหมุนทวนเข็มนาฬิกา แรงดันที่ไดจะมากขึ้น
A
เมื่อหมุนตามเข็มนาฬิกา แรงดันที่ไดจะมากขึ้น
Potentiometer
A
ZX-POTH S + S +
10kB
รูปที่ 1-7 แสดงรูปราง, วงจร และการทํางานของแผงวงจรตัวตานทานปรับคาไดแบบแกนหมุน
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, หนาตาเมือต ่ อสายสัญญาณพรอมใชงานและกราฟคุณสมบัติ
16 POP-XT
1.4 ขอมูลของสายสัญญาณที่ใชประกอบการเรียนรู 1.4.1 สาย JST3AA-8 : สายเชือมต ่ อระหวางแผงวงจร สาย JST3AA-8 ใชเชือมต ่ อระหวางแผงวงจรควบคุม POP-XT กับแผงวงจรตรวจจับและแผง วงจรอุปกรณตางๆ เปนสายแพ 3 เสน ยาว 8 นิ้ว ปลายสายทั้งสองดานติดตังคอนเน็ ้ กเตอรแบบ JST 3 ขา ตัวเมีย ระยะหางระหวางขา 2 มิลลิเมตร มีการจัดขาดังนี้ ระยะหางระหวางขา 2 มม.
ระยะหางระหวางขา 2 มม.
GND S +5V
1.4.2 สาย USB-miniB เปนสายสัญญาณสําหรับเชือมต ่ อระหวางพอรต USB ของคอมพิวเตอรกับแผงวงจร POP-XT
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
18 POP-XT
(2) หนาตางติดตังจะสอบถามชื ้ อที ่ ่จะใชสรางที่ Start Menu ใหคลิก Next หนาตางติดตังจะ ้ แสดงขอสรุปมาให คลิก Install เพื่อเริ่มขั้นตอนการติดตัง้
(3) จากนั้นเปนการติดตังไดรเวอร ้ ใหคลิกปุม Next เพื่อดําเนินการตอไป
(4) หนาตาง Windows secuirty อาจปรากฏขึน้ เพือให ่ ยืนยันการติดตังไดรเวอร ้ คลิกปุม Install
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 ของคอมพิวเตอร
20 POP-XT
(8) กดสวิตช OK คางไว จากนัน้ เปดสวิตชจายไฟใหแกแผงวงจร POP-XT แลวปลอยสวิตช OK
100 F
ATMega32U4
220 F
100 TB6612
ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา
ใหการติดตั้งไดรเวอรอาจมีขอผิดพลาดได (9) หลังจากปลอยสวิตช OK ทีมุ่ มขวาลางของคอมพิวเตอรจะแจงวา ตรวจพบฮารดแวรตัวใหม สอบถามถึงตําแหนงของไฟลไดรเวอร Arduino Leonardo Bootloader ทีต่ องการติดตัง้ ใหคลิก เลือก ที่ชอง Install from a list or specific location (Advanced) จากนั้นคลิกที่ปุม Next (10) หนาตางคนหาไดรเวอรแบบอัตโนมัติหรือหาดวยตนเองภายในคอมพิวเตอรปรากฏขึนมา ้ ใหเลือก Browse my computer for driver software อันเปนการเลือกคนหาไดรเวอรดวยตนเอง
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
22 POP-XT
(16) จะพบรายการ Ports คลิ กที่หนาหัวขอ Ports เพื่อดูรายละเอียด จะเห็นชือ่ Arduino Leonardo (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)
POP-XT 23
(4) เลือกพอรตที่ใชในการติดตอ โดยเลือกที่ Tools > Serial port > COMxxx . จากตัวอยาง คือ COM3.
(5) อัปโหลดโคด โดยคลิกที่ปุม
หรือเลือกเมนู File > Upload
(6) เมื่อการอัปโหลดเสร็จสิ้น จะมีขอความ Done uploading ปรากฏขึ้นที่แถบแสดงสถานะ ดานลางของหนาตางโปรแกรม ที่จอแสดงผลของ POP-XT แสดงขอความ Hello World เปนการแสดงวา แผงวงจร POP-XT พรอมใชงานแลว 100 F
ATMega32U4
HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015
100
220 F
TB6612
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 ดังแสดงตําแหนงตามรูป
POP-XT 25
(4) ที่หนาตาง Device Manager จะพบอุปกรณ Arduino Leonardo ที่มีเครื่องหมาย ! ติดอยู ซึ่งหมายถึง การติดไดรเวอรของอุปกรณตัวนี้ยังไมสมบูรณ ใหคลิกเมาสปุมขวาที่อุปกรณตัวนี้ แลว เลือก Update Driver Software..
(5) หนาตางคนหาไดรเวอรแบบอัตโนมัติหรือหาดวยตนเองภายในคอมพิวเตอรปรากฏขึ้นมา ใหเลือก Browse my computer for driver software อันเปนการเลือกคนหาไดรเวอรดวยตนเอง
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 นั้นขึ้นอยูกับการลงทะเบียนของ คอมพิวเตอรแตละเครื่อง ซึ่งอาจแตกตางกัน
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 เพื่อเริ่มขั้นตอนการติดตัง้
28 POP-XT
(3) จากนั้นเปนการติดตังไดรเวอร ้ ใหคลิกปุม Next เพื่อดําเนินการตอไป
(4) การติดตังไดรเวอร ้ ขันต ้ นจะเกิดขึน้ รอจนกระทังติ ่ ดตังเสร็ ้ จสิน้ จะปรากฏหนาตางแจงการ ติดตังไดรเวอร ้ เสร็จสมบูรณและแสดงชือของไดรเวอร ่ ทีติ่ ดตังลงไป ้ ในทีนี่ คื้ อ Arduino LLC คลิกปุม Finish
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
100 F
ATMega32U4
220 F
100 TB6612
ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา
ใหการติดตั้งไดรเวอรอาจมีขอผิดพลาดได
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
POP-XT 31
(6) กระบวนการติดตังไดรเวอร ้ จะเริมขึ ่ น้ รอจนกระทังเสร็ ่ จ คลิกปุม Finish เพือจบการติ ่ ดตัง้
(7) จากนั้นระบบจะรองขอใหติดตังไดรเวอร ้ Arduino Leonardo ใหคลิกเลือกทีช่ อง Install from 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 เพือจบการติ ่ ดตัง้
32 POP-XT
(10) ตรวจสอบตําแหนงของพอรตที่ใชในการติดตอกับซอฟตแวร Arduino ไดที่ Control panel > 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)
POP-XT 33
(4) เลือกพอรตที่ใชในการติดตอ โดยเลือกที่ Tools > Serial port > COMxxx . จากตัวอยาง คือ COM68
(5) อัปโหลดโคด โดยคลิกที่ปุม
หรือเลือกเมนู File > Upload
(6) รอจนกระทั่งการอัปโหลดเสร็จสิ้น จะมีขอความ Done uploading ปรากฏขึ้นที่แถบแสดง สถานะดานลางของหนาตางโปรแกรม (7) ที่จอแสดงผลของ POP-XT แสดงขอความ Hello World เปนการแสดงวา นับจากนี้แผง วงจร POP-XT พรอมใชงาน
100 F
ATMega32U4
HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRR Row09 RRRRRRRRRR Row010 RRRRRRRRRRR Row011 RRRRRRRRRRRR Row012 RRRRRRRRRRRRR Row013 RRRRRRRRRRRRRR Row014 RRRRRRRRRRRRRRR Row015
100
220 F
TB6612
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
100 F
ATMega32U4
220 F
100 TB6612
ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา
ใหการติดตั้งไดรเวอรอาจมีขอผิดพลาดได จากนั้นดําเนินการตามขั้นตอนที่ (4) ถึง (9) ของหัวขอ 2.2.2 ในบทนี้ และกระทําแบบเดียว กันนี้ หากมีการเปลี่ยนตําแหนงพอรต USB ที่ใชในการเชือมต ่ อ
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 ที่ตามมาขางหลังอาจจะมีชือใด ่ ๆ อยูก็ได ใหเลือกใชการสื่อสารอนุกรมจากอุปรณตัวนี้
36 POP-XT
2.4 สวนประกอบของหนาจอโปรแกรม Arduino1.0.x เมือเรี ่ ยกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 2-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้ ่ างๆ ในการใชงานโปรแกรม เมนู (Menu) ใชเลือกคําสังต แถบเครืองมื ่ อ (Toolbar) เปนการนําคําสังที ่ ่ใชงานบอยๆ มาสรางเปนปุม เพื่อใหเรียกใช คําสังได ่ รวดเร็วขึ้น
แถบเลือกโปรแกรม (Tabs) เป นแถบที่ ใชเลื อกไฟล โปรแกรมแตละตัว (กรณีที่เขียน โปรแกรมขนาดใหญประกอบดวยไฟลหลายตัว)
พืนที ้ ่เขียนโปรแกรม (Text editor) เปนพื้นที่สําหรับเขียนโปรแกรมภาษา C/C++
เมนู (Menu) แถบเครืองมื ่ อ (Tools bar) แถบเลือกโปรแกรม (Tab)
พืนที ้ สํ่ าหรับเขียนโปรแกรม (Text Editor)
พืนที ้ แสดงสถานะการทํ ่ างาน (Message area)
รูปที่ 3-1 แสดงสวนประกอบของโปรแกรม Arduino1.0
Serial Monitor คลิกเพือเป ่ ดหนาตาง สําหรับรับและสงขอมูล อนุกรมระหวางฮารดแวร Arduino กับคอมพิวเตอร
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
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 : ตัดขอความที่เลือกไวไปเก็บในคลิปบอรดของโปรแกรม
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 : สั่งเปดโฟลเดอรที่เก็บสเก็ตชบุกปจจุบัน
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 ใชบันทึกไฟลสเก็ตชบุกที ่เขียนขึ้น
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()มักเปนคําสังอ ่ านคาอินพุต ประมวลผล สั่งงานเอาตพุต ฯลฯ สวนกําหนดคาเริมต ่ น เชน ตัวแปร จะตองเขียนไวทีส่ วนหัวของโปรแกรม กอนถึงตัวฟงกชัน่ นอก จากนันยั ้ งตองคํานึงถึงตัวพิมพเล็ก-ใหญของตัวแปรและชือฟ ่ งกชันให ่ ถูกตองดวย
42 POP-XT
3.1.1 สวนของฟงกชัน่ setup() ฟงกชันนี ่ ้จะเขียนที่สวนตนของโปรแกรม ทํางานเมื่อโปรแกรมเริ่มตนเพียงครังเดี ้ ยว ใชเพื่อ กําหนดคาของตัวแปร, โหมดการทํางานของขาตางๆ หรือเริ่มตนเรียกใชไลบรารี ฯลฯฯ ตัวอยางที่ 3-1 int buttonPin = 3; void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }
ในขณะที่โปรแกรมภาษา C มาตรฐานทีเขี ่ ยนบน AVR GCC (เปนโปรแกรมภาษา C ทีใช ่ คอมไพเลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้ int main(void) { init(); setup(); for (;;) loop(); return ; }
ตรงกับ void
setup()
ตรงกับ void
loop()
POP-XT 43
3.1.2 สวนของฟงกชัน่ loop() หลังจากทีเขี ่ ยนฟงกชัน่ setup()ทีกํ่ าหนดคาเริมต ่ นของโปรแกรมแลว สวนถัดมาคือฟงกชัน่ ่ อ จะทํางานตามฟงกชันนี ่ ้วนตอเนื่องตลอดเวลา ภายในฟงกชัน่ loop() ซึ่งมีการทํางานตรงตามชือคื นี้จะมีโปรแกรมของผูใช เพื่อรับคาจากพอรต ประมวล แลวสั่งเอาตพุตออกขาตางๆ เพื่อควบคุมการ ทํางานของบอรด ตัวอยางที่ 3-2 int buttonPin = 3; // กําหนดชือตั ่ วแปรใหขาพอรต 3 และชนิดของตัวแปร void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } // ลูปตรวจสอบการกดสวิตชที่ขาพอรตซึ่งถูกประกาศดวยตัวแปร buttonPin void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }
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) หามเขียนผิดเปน = เชน ่ แล ้ ว x จะมีคาเทา if(x=10) คําสั่งที่เขียนผิดในแบบนี้ ผลการทดสอบจะเปนจริงเสมอ เมื่อผานคําสังนี กับ 10 ทําใหการทํางานของโปรแกรมผิดเพี้ยนไป ไมเปนตามที่กําหนดไว นอกจากนั้นยังใชคําสัง่ if ควบคุมการแยกเสนทางของโปรแกรม โดยใชคําสัง่ if...else ไดดวย
POP-XT 45
3.2.2 คําสั่ง
if...else
ใชทดสอบเพื่อกําหนดเงื่อนไขการทํางานของโปรแกรมไดมากกวาคําสั่ง if ธรรมดา โดย สามารถกําหนดไดวา ถาเงือนไขเป ่ นจริงใหทําอะไร ถาเปนเท็จใหทําอะไร เชน ถาคาอินพุตอะนาลอก ที่อานไดนอยกวา 500 ใหทําอะไร ถาคามากกวาหรือเทากับ 500 ใหทําอีกอยาง เขียนคําสังได ่ ดังนี้ ตัวอยางที่ 3-3 if (pinFiveInput < 500) { // คําสังเพื ่ ่อทํางานอยางหนึง่ เนื่องมาจาก pinFiveInput มีคานอยกวา 500 } else { // คําสังเพื ่ ่อทํางานอีกอยางหนึง่ เนื่องมาจาก pinFiveInput มีคามากวาหรือเทากับ 500 }
หลังคําสัง่ else สามารถตามดวยคําสัง่ if ทําใหรูปแบบคําสังกลายเป ่ น if...else...if เปน การทดสอบเงือนไขต ่ างๆ เมื่อเปนจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ ตัวอยางที่ 3-4 if (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 ตัวสุดทาย
46 POP-XT
3.2.3 คําสั่ง
for()
คําสังนี ่ ใช ้ เพือสั ่ งให ่ คําสังที ่ อยู ่ ภายในวงเล็ บปกกาหลัง for มีการทํางานซํากั ้ นตามจํานวนรอบ ที่ตองการ คําสังนี ่ ้มีประโยชนมากสําหรับการทํางานใดๆ ที่ตองทําซํากั ้ นและทราบจํานวนรอบของ การทําซํ้าที่แนนอน มักใชคูกับตัวแปรอะเรยในการเก็บสะสมคาที่อานไดจากขาอินพุตอะนาลอก หลายๆ ขาที่มีหมายเลขขาตอเนื่องกัน รูปแบบของคําสัง่ for() แบงได 3 สวนดังนี้ for (initialization; condition; increment) { //statement(s); } เริ่มตนดวย initialization ใชกําหนดคาเริ่มตนของตัวแปรควบคุมการวนรอบ ในการทํางาน แตละรอบจะทดสอบ condition ถาเงือนไขเป ่ นจริงจะกระทําคําสังในวงเล็ ่ บปกกา แลวมาเพิมหรื ่ อลดคา ตัวแปรตามทีสั่ ่งใน increment แลวทดสอบเงื่อนไขอีก ทําซําจนกว ้ าเงื่อนไขเปนเท็จ ตัวอยางที่ 3-5 for (int i=1; i <= 8; i++) { // คําสังเพื ่ ่อทํางานโดยใชคาของตัวแปร i และวนทํางานจนกระทั่งคาของตัวแปร i มากกวา 8; }
คําสัง่ for ของภาษา C จะยืดหยุนกว าคําสัง่ for ของภาษาคอมพิวเตอรอืนๆ ่ โดยสามารถละเวน บางสวนหรือทั้งสามสวนของคําสัง่ for ได อยางไรก็ตามยังคงตองมีเซมิโคลอน
POP-XT 47
3.2.4 คําสั่ง
switch-case
ใชทดสอบเงือนไขเพื ่ อกํ ่ าหนดการทํางานของโปรแกรม ถาตัวแปรที่ทดสอบตรงกับเงื่อนไข ใดก็ใหทํางานตามที่กําหนดไว พารามิเตอร var ตัวแปรที่ตองการทดสอบวาตรงกับเงื่อนไขใด default ถาไมตรงกับเงื่อนไขใดๆ เลยใหทําคําสังต ่ อทายนี้ ่ อไปเรื่อยๆ break คําสั่งหยุดการทํางาน ใชเขียนตอทาย case ตางๆ ถาไมไดเขียน โปรแกรมจะวนทํางานตามเงือนไขต
ตัวอยางที่ 3-6 switch (var) { case 1: // คําสังเพื ่ ่อทํางาน เมื่อคาของตัวแปรเทากับ 1 break; case 2: // คําสังเพื ่ ่อทํางาน เมื่อคาของตัวแปรเทากับ 2 break; default: // ถาหากคาของตัวแปรไมใช 1 และ 2 ใหกระทําคําสังในส ่ วนนี้ }
48 POP-XT
3.2.5 คําสั่ง while เปนคําสังวนรอบ ่ โดยจะทําคําสังที ่ เขี่ ยนในวงเล็บปกกาอยางตอเนือง ่ จนกวาเงือนไขในวงเล็ ่ บของ คําสัง่ while() จะเปนเท็จ คําสังที ่ ให ่ ทําซําจะต ้ องมีการเปลียนแปลงค ่ าตัวแปรทีใช ่ ทดสอบ เชน มีการ เพิมต ่ าตัวแปร หรือมีเงือนไขภายนอกเช ่ นอานคาจากเซ็นเซอรไดเรียบรอยแลวใหหยุดการอานคา มิฉะนัน้ เงือนไขในวงเล็ ่ บของ while() เปนจริงตลอดเวลา ทําใหคําสัง่ while ทํางานวนไมรูจบ รูปแบบคําสั่ง while(expression) { // statement(s); } พารามิเตอร expression เปนคําสังทดสอบเงื ่ ่อนไข (ถูกหรือผิด)
ตัวอยางที่ 3-7 var = 0; while(var < 200) { // คําสังเพื ่ ่อทํางาน โดยวนทํางานทั้งสิน้ 200 รอบ var++; }
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-8 y = y + 3; x = x - 7; i = j * 6; r = r / 5;
เทคนิคสําหรับการเขียนโปรแกรม เลือกขนาดของตัวแปรใหใหญพอสําหรับเก็บคาผลลัพธที่มากที่สุดของการคํานวณ ่ าใดตัวแปรทีเก็ ่ บจะมีการวนซําค ้ ากลับ และวนกลับอยางไร ตัวอยางเชน ตองทราบวาทีค (0 ไป 1) หรือ (0 ไป -32768) ่ องการเศษสวนใหใชตัวแปรประเภท float แตใหระวังผลลบ เชน สําหรับการคําณวณทีต ตัวแปรมีขนาดใหญ คํานวณไดชา ใชตัวกระทํา cast เชน (int)myfloat ในการเปลี่ยนประเภทของตัวแปรชัวคราวขณะที ่ ่ โปรแกรมทํางาน
50 POP-XT
3.3.2 ตัวกระทํา % หารเอาเศษ ใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษไมสามารถใชงานกับ ตัวแปรเลขทศนิยม (float) รูปแบบคําสั่ง result = value1 % value2; พารามิเตอร value1 - เปนตัวแปรประเภท byte,char,int หรือ long value2 - เปนตัวแปรประเภท byte,char,int หรือ long
ผลที่ได เศษจากการหารคาเลขจํานวนเต็ม เปนขอมูลชนิดเลขจํานวนเต็ม
ตัวอยางที่ 3-9 x = 7 % 5; x = 9 % 5; x = 5 % 5; x = 4 % 5;
// x now contains 2 // x now contains 4 // x now contains 0 // 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 เทานัน้
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-11 if (x > 0 && x < 5) { // ... } ใหคาเปนจริงเมือ่ x มากกวา 0 และนอยกวา 5 (มีคา 1 ถึง 4)
3.5.2 && (ตรรกะ หรือ) ใหคาเปนจริง เมือผลการเปรี ่ ยบเทียบพบวา มีตัวแปรตัวใดตัวหนึงเป ่ นจริงหรือเปนจริงทังคู ้ ตัวอยางที่ 3-12 if (x > 0 || y > 0) { // ... } ใหผลเปนจริงเมือ่ x หรือ y มีคามากกวา 0
52 POP-XT
3.5.3 ! (ใชกลับผลเปนตรงกันขาม) ใหคาเปนจริง เมื่อผลการเปรียบเทียบเปนเท็จ ตัวอยางที่ 3-13 if (!x) { // ... } ใหผลเปนจริงถา x เปนเท็จ (เชน ถา x = 0 ใหผลเปนจริง)
3.5.4 ขอควรระวัง ระวังเรื่องการเขียนโปรแกรม ถาตองการใชตัวกระทําตรรกะและ ตองเขียนเครื่องหมาย && ถาลืมเขียนเปน & จะเปนตัวกระทําและระดับบิตกับตัวแปร ซึ่งใหผลที่แตกตาง เชนกันในการใชตรรกะหรือใหเขียนเปน || (ขีดตังสองตั ้ วติดกัน) ถาเขียนเปน | (ขีดตังตั ้ วเดียว) จะหมายถึงตัวกระทําหรือระดับบิตกับตัวแปร ตัวกระทํา NOT ระดับบิต (~) จะแตกตางจากตัวกลับผลใหเปนตรงขาม (!) เลือกใชใหถูกตอง ตัวอยางที่ 3-14 if (a >= 10 && a <= 20){} // ใหผลการทํางานเปนจริงเมือ่ a มีคาอยูระหวาง 10 ถึง 20
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 0 1 0 1 —————————— 0 0 0 1
Operand1 Operand2 Returned result
ใน Arduino ตัวแปรประเภท int จะมีขนาด 16 บิต ดังนั้นเมือใช ่ ตัวกระทําระดับบิต AND จะมี การกระทําตรรกะและพรอมกันกับขอมูลทั้ง 16 บิต ดังตัวอยางในสวนของโปรแกรมตอไปนี้ ตัวอยางที่ 3-15 int a = 92; // เทากับ 0000000001011100 ฐานสอง int b = 101; // เทากับ 0000000001100101 ฐานสอง int c = a & b; // ผลลัพธคือ 0000000001000100 ฐานสองหรือ 68 ฐานสิบ ในตัวอยางนีจะนํ ้ าขอมูลทั้ง 16 บิตของตัวแปร a และ b มากระทําทางตรรกะ AND แลวนําผลลัพธที่ไดทั้ง 16 บิตไปเก็บที่ตัวแปร c ซึงได ่ คาเปน 01000100 ในเลขฐานสองหรือเทากับ 68 ฐานสิบ
นิยมใชตัวกระทําระดับบิต AND เพือใช ่ เลือกขอมูลบิตที่ตองการ (อาจเปนหนึงบิ ่ ตหรือหลาย บิต) จากตัวแปร int ซึ่งการเลือกเพียงบางบิตนี้จะเรียกวา masking
54 POP-XT
3.6.2 ตัวกระทําระดับบิต OR (|) คําสั่งระดับบิต OR ของภาษาซีเขียนไดโดยใชเครื่องหมาย |หนึ่งตัว โดยตองเขียนระหวาง นิพจนหรือตัวแปรทีเป ่ นเลขจํานวนเต็ม สําหรับการทํางานใหนําขอมูลแตละบิตของตัวแปรทังสองตั ้ ว มากระทําทางตรรกะ OR โดยมีกฎดังนี้ ถาอินพุตตัวใดตัวหนึงหรื ่ อทังสองตั ้ วเปน “1” เอาตพุตเปน “1” กรณีทีอิ่ นพุตเปน “0” ทังคู ้ เอาต พุตจึงจะเปน “0” ดังตัวอยางตอไปนี้ 0 0 1 1 0 1 0 1 —————————— 0 1 1 1
Operand1 Operand2 Returned result
ตัวอยางที่ 3-16 สวนของโปรแกรมแสดงการใชตัวกระทําระดับบิต OR int a = 92; // เทากับ 0000000001011100 ฐานสอง int b = 101; // เทากับ 0000000001100101 ฐานสอง int c = a | b; // ผลลัพธคือ 0000000001111101 ฐานสอง หรือ 125 ฐานสิบ
ตัวอยางที่ 3-17 โปรแกรมแสดงการใชตัวกระทําระดับบิต AND และ OR ตัวอยางงานที่ใชตัวกระทําระดับบิต AND และ OR เปนงานที่โปรแกรมเมอรเรียกวา Read-Modify-Write on a port สําหรับไมโครคอนโทรลเลอร 8 บิต คาทีอ่ านหรือเขียนไปยังพอรตมีขนาด 8 บิต ซึงแสดงค ่ าอินพุตที่ขาทั้ง 8 ขา การเขียนคาไปยังพอรตจะเขียนคาครังเดี ้ ยวไดทั้ง 8 บิต ตัวแปรชือ่ PORTD เปนคาที่ใชแทนสถานะของขาดิจิตอลหมายเลข 0,1,2,3,4,5,6,7 ถาบิตใดมีคาเปน 1 ทําใหขานันมี ้ คาลอจิกเปน HIGH (อยาลืมกําหนดใหขาพอรตนันๆ ้ ทํางานเปนเอาตพุตดวยคําสัง่ pinMode() กอน) ดังนัน้ ถากําหนดคาให PORTD = B00110001; ก็คือตองการใหขา 2,3 และ 7 เปน HIGH ในกรณีนีไม ้ ตองเปลี่ยนคา สถานะของขา 0 และ 1 ซึงปกติ ่ แลวฮารดแวรของ Arduino ใชในการสือสารแบบอนุ ่ กรม ถาไปเปลียนค ่ าแลวจะกระทบ ตอการสือสารแบบอนุ ่ กรม อัลกอริธึมสําหรับโปรแกรมเปนดังนี้ อานคาจาก PORTD แลวลางคาเฉพาะบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต AND) นําคา PORTD ที่แกไขจากขางตนมารวมกับคาบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต OR) เขียนเปนโปรแกรมไดดังนี้ int i; // counter variable int j;
POP-XT 55
void setup() { DDRD = DDRD | B11111100; // กําหนดทิศทางของขาพอรต 2 ถึง 7 ดวยคา 11111100 Serial.begin(9600); } void loop() { for (i=0; i<64; i++) { PORTD = PORTD & B00000011; // กําหนดขอมูลไปยังขาพอรต 2 ถึง 7 j = (i << 2); PORTD = PORTD | j; Serial.println(PORTD, BIN); // แสดงคาของ PORTD ที่หนาตาง Serial montior delay(100); } }
3.6.3 คําสั่งระดับบิต Exclusive OR (^) เปนโอเปอรเตอรพิเศษทีไม ่ คอยไดใชในภาษา C/C++ ตัวกระทําระดับบิต exclusive OR (หรือ XOR) จะเขียนโดยใชสัญลักษณเครื่องหมาย ^ ตัวกระทํานี้มีการทํางานใกลเคียงกับตัวกระทําระดับ บิต OR แตตางกันเมื่ออินพุตเปน “1” ทั้งคูจะใหเอาตพุตเปน “0” แสดงการทํางานไดดังนี้ 0 0 1 1 0 1 0 1 —————————— 0 1 1 0
Operand1 Operand2 Returned result
หรือกลาวไดอีกอยางวา ตัวกระทําระดับบิต XOR จะใหเอาตพุตเปน “0” เมื่ออินพุตทั้งสอง ตัวมีคาเหมือนกัน และใหเอาตพุตเปน “1” เมื่ออินพุตทั้งสองมีคาตางกัน ตัวอยางที่ 3-18 int x = 12; int y = 10; int z = x ^ y;
// คาเลขฐานสองเทากับ 1100 // คาเลขฐานสองเทากับ 1010 // ผลลัพธเทากับ 0110 ฐานสองหรือ 6 ฐานสิบ
ตัวกระทําระดับบิต XOR จะใชมากในการสลับคาบางบิตของตัวตัวแปร int เชน กลับจาก “0” เปน “1” หรือกลับจาก “1” เปน “0” เมื่อใชตัวกระทําระดับบิต XOR ถาบิตของ mask เปน “1” ทําใหบิตนั้นถูกสลับคา ถา mask มีคาเปน “1” บิตนั้นมีคาคงเดิม ตัวอยางตอไปนี้เปนโปรแกรมแสดงการสั่งใหขาดิจิตอล 5 มีการกลับ ลอจิกตลอดเวลา
56 POP-XT
ตัวอยางที่ 3-19 void setup() { DDRD = DDRD | B00100000; } void loop() { PORTD = PORTD ^ B00100000; delay(100); }
// กําหนดขา 5 เปนเอาตพุต // กลับลอจิกที่ขา 5
3.6.4 ตัวกระทําระดับบิต NOT (~) ตัวกระทําระดับบิต NOT จะเขียนโดยใชสัญลักษณเครื่องหมาย ~ ตัวกระทํานี้จะใชงานกับ ตัวถูกกระทําเพียงตัวเดียวที่อยูขวามือ โดยทําการสลับบิตทุกบิตใหมีคาตรงกันขามคือ จาก “0” เปน “1” และจาก “1” เปน “0” ดังตัวอยาง 0 1 ————— 1 0
Operand1 ~ Operand1
int a = 103; int b = ~a;
// binary: 0000000001100111 // binary: 1111111110011000
เมือกระทํ ่ าแลว ทําใหตัวแปร b มีคา -104 (ฐานสิบ) ซึงคํ ่ าตอบทีได ่ ติดลบเนืองจากบิ ่ ตที่มีความ สําคัญสูงสุด (บิตซายมือสุด) ของตัวแปร int อันเปนบิตแจงวาตัวเลขเปนบวกหรือลบ มีคาเปน “1” แสดงวา คาทีได ่ นีติ้ ดลบ โดยในคอมพิวเตอรจะเก็บคาตัวเลขทังบวกและลบตามระบบทู ้ คอมพลีเมนต (2’s complement) การประกาศตัวแปร int ซึงมี ่ ความหมายเหมือนกับการประกาศตัวแปรเปน signed int ตองระวัง คาของตัวแปรจะติดลบได
POP-XT 57
3.6.5 คําสั่งเลือนบิ ่ ตไปทางซาย (<<) และเลือนบิ ่ ตไปทางขวา (>>) ในภาษา C/C++ มีตัวกระทําเลื่อนบิตไปทางซาย << และเลื่อนบิตไปทางขวา >> ตัวกระทํา นี้จะสั่งเลื่อนบิตของตัวถูกกระทําทีเขี ่ ยนดานซายมือไปทางซายหรือไปทางขวาตามจํานวนบิตที่ระบุ ไวในดานขวามือของตัวกระทํา รูปแบบคําสั่ง variable << number_of_bits variable >> number_of_bits พารามิเตอร variable เปนตัวแปรเลขจํานวนเต็มที่มีจํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประเภท byte, int หรือ long)
ตัวอยางที่ 3-20 int a = 5; int b = a << 3; int c = b >> 3;
// เทากับ 0000000000000101 ฐานสอง // ไดผลลัพธเปน 0000000000101000 ฐานสองหรือ 40 // ไดผลลัพธเปน 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 << 3 ... 1 << 8 1 << 9 1 << 10 ...
== == == ==
1 2 4 8
== 256 == 512 == 1024
เมือสั ่ งเลื ่ อนตั ่ วแปร x ไปทางขวามือจํานวน y บิต (x >> y) จะมีผลแตกตางกันขึนกั ้ บประเภท ของตัวแปร ถา x เปนตัวแปรประเภท int คาทีเก็ ่ บไดมีทังค ้ าบวกและลบ โดยบิตซายมือสุดจะเปน sign bit หรือบิตเครืองหมาย ่ ถาเปนคาลบ คาบิตซายมือสุดจะมีคาเปน 1 กรณีนีเมื ้ อสั ่ งเลื ่ อนบิ ่ ตไปทางขวามือ
58 POP-XT
แลว โปรแกรมจะนําคาของบิตเครืองหมายมาเติ ่ มใหกับบิตทางซายมือสุด ปรากฏการณนีเรี้ ยกวา sign extension มีตัวอยางดังนี้ ตัวอยางที่ 3-22 int x = -16; int y = x >> 3;
// เทากับ 1111111111110000 ฐานสอง // เลือนบิ ่ ตของตัวแปร x ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 1111111111111110 ฐานสอง
ถาตองการเลือนบิ ่ ตไปทางขวามือแลวใหคา 0 มาเติมยังบิตซายมือสุด (ซึงเกิ ่ ดกับกรณีทีตั่ วแปร เปนประเภท unsigned int) ทําไดโดยใชการเปลี่ยนประเภทตัวแปรชัวคราว ่ (typecast) เพื่อเปลี่ยนให ตัวแปร x เปน unsigned int ชัวคราวดั ่ งตัวอยางตอไปนี้ ตัวอยางที่ 3-23 int x = -16; // เทากับ 1111111111110000 ฐานสอง int y = unsigned(x) >> 3; // เลือนบิ ่ ตของตัวแปร x (แบบไมคิดเครื่องหมาย) ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 0001111111111110 ฐานสอง
ถาหากระมัดระวังเรื่อง sign extension แลว ก็จะใชตัวกระทําเลื่อนบิตไปทางขวามือสําหรับ หารคาตัวแปรดวย 2 ยกกําลังตางๆ ไดดังตัวอยาง ตัวอยางที่ 3-24 int x = 1000; int y = x >> 3;
// หารคาของ 1000 ดวย 8 (มาจาก 23) ทําให y = 125
POP-XT 59
3.7 ไวยากรณภาษาของ Arduino 3.7.1 ; (เซมิโคลอน - semicolon) ใชเขียนแจงวา จบคําสัง่ ตัวอยางที่ 3-25 int a = 13;
บรรทัดคําสั่งที่ลืมเขียนปดทายดวยเซมิโคลอน จะทําใหแปลโปรแกรมไมผาน โดยตัวแปร ภาษาอาจจะแจงใหทราบวา ไมพบเครื่องหมายเซมิโคลอน หรือแจงเปนการผิดพลาดอื่นๆ บางกรณี ที่ตรวจสอบบรรทัดทีแจ ่ งวาเกิดการผิดพลาดแลวไมพบที่ผิด ใหตรวจสอบบรรทัดกอนหนานั้น
3.7.2 { } (วงเล็บปกกา - curly brace) เครื่องหมายวงเล็บปกกา เปนสวนสําคัญของภาษาซี ใชในการกําหนดขอบเขตการทํางานใน แตละชวง วงเล็บปกกาเปด { จะตองเขียนตามดวยวงเล็บปกกาปด } ดวยเสมอ หรือเรียกวา วงเล็บตอง ครบคู ในซอฟตแวร Arduino IDE ที่ใชเขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบ คูของเครื่องหมายวงเล็บ ผูใช งานเพียงแคคลิกทีวงเล็ ่ บ มันจะแสดงวงเล็บที่เหลือซึ่งเปนคูของมั น สําหรับโปรแกรมเมอรมือใหมและโปรแกรมเมอรที่ยายจากภาษา BASIC มาเปนภาษา C มัก จะสับสนกับการใชเครืองหมายวงเล็ ่ บ แททีจริ ่ งแลวเครืองหมายป ่ กกาปดนีเที ้ ยบไดกับคําสัง่ RETURN ของ subroutine (function) หรือแทนคําสัง่ ENDIF ในการเปรียบเทียบ และแทนคําสัง่ NEXT ของคํา สั่งวนรอบ FOR เนืองจากมี ่ การใชวงเล็บปกกาไดหลากหลาย ดังนันเมื ้ อต ่ องการเขียนคําสังที ่ ต่ องใชเครืองหมาย ่ วงเล็บ เมื่อเขียนวงเล็บเปดแลวใหเขียนเครื่องหมายวงเล็บปดทันที ถัดมาจึงคอยเคาะปุม Enter ใน ระหวางเครืองหมายวงเล็ ่ บเพือขึ ่ นบรรทั ้ ดใหม แลวเขียนคําสังที ่ ต่ องการ ถาทําไดตามนีวงเล็ ้ บจะครบ คูแนนอน สําหรับวงเล็บทีไม ่ ครบคู ทําใหเกิดความผิดพลาดในขณะคอมไพลโปรแกรม ถาเปนโปรแกรม ขนาดใหญจะหาที่ผิดไดยาก ตําแหนงที่อยูของเครื่องหมายวงเล็บแตละตัวจะมีผลอยางมากตอ ไวยากรณของภาษาคอมพิวเตอร การยายตําแหนงวงเล็บไปเพียงหนึ่งหรือสองบรรทัด ทําใหตัว โปรแกรมทํางานผิดไป
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 */
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 กอน ปกติเปนไฟลที่ผูใชสรางขึ้นเอง
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-28 char var = 'x'; var คือชื่อของตัวแปรประเภท char ที่ตองการ x คือคาที่ตองการกําหนดใหกับตัวแปร ในที่นีเป ้ นตัวอักษรหนึ่งตัว
3.8.2 byte : ตัวแปรประเภทตัวเลข 8 บิตหรือ 1 ไบต ตัวแปร byte ใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255 ตัวอยางที่ 3-29 byte 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 คือคาที่ตองการกําหนดใหกับตัวแปร
POP-XT 63
ตัวอยางที่ 3-30 int ledPin = 13; // กําหนดใหตัวแปร ledPIn มีคาเทากับ 13 เมือตั ่ วแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตํ่าสุดที่เก็บได และ เมือมี ่ คานอยกวาคาตํ่าสุดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้
ตัวอยางที่ 3-31 int x x = -32,768; x = x - 1; x = 32,767; x = x + 1;
// เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลียนจาก ่ -32,768 เปน 32,767 // เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลียนจาก ่ 32,767 เปน -32,768
3.8.4 unsigned int : ตัวแปรประเภทเลขจํานวนเต็มไมคิดเครืองหมาย ่ ตัวแปรประเภทนี้คลายกับตัวแปร int แตจะเก็บเลขจํานวนเต็มบวกเทานั้น โดยเก็บคา 0 ถึง 65,535 (216 -1) รูปแบบคําสั่ง unsigned int var = val; พารามิเตอร var คือชื่อของตัวแปร int ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร
ตัวอยางที่ 3-32 unsigned int ledPin = 13; // กําหนดใหตัวแปร ledPIn มีคาเทากับ 13 แบบไมคิดเครื่องหมาย
เมื่อตัวแปรมีคาสูงสุดจะลนกลับไปคาตําสุ ่ ดหากมีการเพิ่มคาตอไป และเมื่อมีคาตําสุ ่ ดจะลน กลับเปนคาสูงสุดเมื่อมีการลดคาตอไปอีก ดังตัวอยาง ตัวอยางที่ 3-33 unsigned int x x = 0; x = x - 1; // เมื่อกระทําคําสังแล ่ ว คาของ x จะเปลียนจาก ่ 0 เปน 65535 x = x + 1; // เมื่อกระทําคําสังแล ่ ว คาของ x จะเปลียนจาก ่ 65535 กลับไปเปน 0
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-34 long 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-35 unsigned long time;
// กําหนดใหตัวแปร time เปนแบบ undigned long (ไมคิดเครื่องหมาย)
POP-XT 65
3.8.7 float : ตัวแปรประเภทเลขทศนิยม เปนตัวแปรสําหรับเก็บคาเลขเลขทศนิยม ซึ่งนิยมใชในการเก็บคาสัญญาณอะนาล็อกหรือคา ที่ตอเนื่อง เนื่องจากสามารถเก็บคาไดละเอียดกวาตัวแปร int ตัวแปร float เก็บคาไดจาก -4.4028235 x 1038 ถึง 4.4028235 x 1038 โดยหนึ่งตัวจะกินพื้นที่หนวยความจํา 32 บิต (4 ไบต) ในการคํานวณคณิตศาสตรกับตัวแปร float จะชากวาการคํานวณของตัวแปร int ดังนั้นจึง พยายามหลีกเลี่ยงการคํานวณกับตัวแปร float ในกรณีกระทําคําสังวนรอบที ่ ต่ องทํางานดวยความเร็ว สูงสุดของฟงก ชั่ นทางเวลาที่ตองแมนยําอยางมาก โปรแกรมเมอรบางคนจะทําการแปลงตัวเลข ทศนิยมใหเปนเลขจํานวนเต็มกอนแลวจึงคํานวณเพือให ่ ทํางานไดเร็วขึน้ รูปแบบคําสั่ง float var = val; พารามิเตอร var คือชื่อของตัวแปร float ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร
ตัวอยางที่ 3-36 float myfloat; float sensorCalbrate = 1.117;
ตัวอยางที่ 3-37 int 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.7976931348623157 x 10308 ใน Arduino มีหนวยความจําจํากัด จึงไมใชตัวแปรประเภทนี้
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 ตัว ่ อ \0 Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความ แลวปดทายดวยตัวอักษรปด นันคื Str4 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ่ าพูด จากตัวอยาง ไมไดกําหนดขนาดตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร ่ าพูด และขนาดของตัวแปร จากตัวอยาง Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ประกาศไว 8 ตัว ่ ่ยาวมากกวานี้ Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผื่อไวสําหรับขอความอืนที
3.8.9.1 การเพิมตั ่ วอักษรแจงวาจบขอความ (null termination) ในตัวแปรสตริงของภาษา C กําหนดใหตัวอักษรสุดทายเปนตัวแจงการจบขอความ (null string) ซึ่งก็คือตัวอักษร \0 ในการกําหนดขนาดของตัวแปร (คาในวงเล็บเหลี่ยม) จะตองกําหนดให เทากับจํานวนตัวอักษร + 1 ดังในตัวแปร Str2 และ Str3 ในตัวอยางที่ 3-38 ที่ขอความ Arduino มีตัว อักษร 7 ตัว ในการประกาศตัวแปรตองระบุเปน [8] ในการประกาศตัวแปรสตริง ตองเผื่อพื้นที่สําหรับเก็บตัวอักษรแจงวาจบขอความ มิฉะนั้น คอมไพเลอรจะแจงเตือนวาเกิดการผิดพลาด ในตัวอยางที่ 3-38 ตัวแปร Str1 และ Str6 เก็บขอความ ไดสูงสุด 14 ตัวอักษร
3.8.9.2 เครื่องหมายคําพูดขีดเดียวและสองขีด ปกติแลวจะกําหนดคาตัวแปรสตริงภายในเครื่องหมายคําพูด เชน "Abc" สําหรับตัวแปรตัว อักษร (char) จะกําหนดคาภายในเครื่องหมายคําพูดขีดเดียว 'A'
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];
68 POP-XT
3.8.10.2 อะเรยและคําสั่งวนรอบ for โดยทัวไปจะพบการใช ่ งานตัวแปรอะเรยภายในคําสัง่ for โดยใชคาตัวแปรนับรอบของคําสั่ง for เปนคาดัชนีของตัวแปรอะเรย ดังตัวอยางตอไปนี้ ตัวอยางที่ 3-40 int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); // แสดงคาสมาชิกของตัวแปรอะเรยที่หนาตาง Serial monitor } ตัวอยางโปรแกรมการใชงานตัวแปรอะเรยที่สมบูรณดูไดในตัวอยาง KnightRider ในหัวขอ Tutorials ในเว็บไซต www.arduino.cc POP-Note การกําหนดคาคงที่เลขจํานวนเต็มเปนเลขฐานตางๆ ของ Arduino คาคงทีเลขจํ ่ านวนเต็มก็คือตัวเลขทีคุ่ ณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัวเลขเหลานี้ จะเปนเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอื่นจะตองใชเครื่องหมายพิเศษระบ เชุ น ฐาน ตัวอยาง 10 (decimal) 123 2 (binary) B1111011 8 (octal) 0173 16 (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-XT 69
3.9 ขอบเขตของตัวแปร ตัวแปรในภาษา C ที่ใชใน Arduino จะมีคุณสมบัติที่เรียกวา “ขอบเขตของตัวแปร” (scope) ซึ่งแตกตางจากภาษา BASIC ซึ่งตัวแปรทุกตัวมีสถานะเทาเทียมกันหมดคือ เปนแบบ global
3.9.1 ตัวแปรโลคอลและโกลบอล ตัวแปรแบบโกลบอล (global variable) เปนตัวแปรที่ทุกฟงกชันในโปรแกรมรู ่ จัก โดยตอง ประกาศตัวแปร นอกฟงกชัน่ สําหรับตัวแปรแบบโลคอลหรือตัวแปรทองถิ่นเปนตัวแปรที่ประกาศ ตัวแปรอยูภายในเครื่องหมายวงเล็บปกกาของฟงกชัน่ และรูจั กเฉพาะภายในฟงกชันนั ่ ้น เมื่อโปรแกรมเริ่มมีขนาดใหญและซับซอนมากขึ้น การใชตัวแปรโลคอลจะมีประโยชนมาก เนืองจากแน ่ ใจไดวามีแคฟงกชันนั ่ นเท ้ านันที ้ สามารถใช ่ งานตัวแปร ชวยปองกันการเกิดการผิดพลาด เมื่อฟงกชันทํ ่ าการแกไขคาตัวแปรที่ใชงานโดยฟงกชันอื ่ ่น ตัวอยางที่ 3-41 int gPWMval; void setup() {} void loop() { int i; float f; }
// ทุกฟงกชันมองเห็ ่ นตัวแปรนี้
// ตัวแปร i จะถูกมองเห็นและใชงานภายในฟงกชัน่ loop เทานัน้ // ตัวแปร f จะถูกมองเห็นและใชงานภายในฟงกชัน่ loop เทานัน้
3.9.2 ตัวแปรสแตติก (static) เปนคําสงวน (keyword) ทีใช ่ ตอนประกาศตัวแปรทีมี่ ขอบเขตใชงานแคภายในฟงกชันเท ่ านัน้ โดยตางจากตัวแปรโลคอลตรงที่ตัวแปรแบบโลคอลจะถูกสรางและลบทิ้งทุกครั้งที่เรียกใชฟงกชัน่ สําหรับตัวแปรสแตติกเมือจบการทํ ่ างานของฟงกชันค ่ าตัวแปรจะยังคงอยู (ไมถูกลบทิง) ้ เปนการรักษา คาตัวแปรไวระหวางการเรียกใชงานฟงกชัน่ ตัวแปรที่ประกาศเปน static จะถูกสรางและกําหนดคาในครั้งแรกที่เรียกใชฟงกชัน่
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-42 int i; float f; f = 4.6; i = (int) f; ในการเปลี่ยนประเภทตัวแปรจาก float เปน int คาที่ไดจะถูกตัดเศษออก ดังนัน้ (int)4.6 จึงกลายเปน 4
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); } }
72 POP-XT
3.12 คําสงวนของ Arduino คําสงวนคือ คาคงที่ ตัวแปร และฟงกชันที ่ ่ไดกําหนดไวเปนสวนหนึ่งของภาษา C ของ Arduino หามนํา คําเหลานี้ไปตังชื ้ อตั ่ วแปร สามารถแสดงไดดังนี้ # Constants
# Datatypes
HIGH LOW INPUT OUTPUT SERIAL DISPLAY PI HALF_PI TWO_PI LSBFIRST MSBFIRST CHANGE FALLING RISING false true null
boolean byte char class default do double int long private protected public return short signed static switch throw try unsigned void
# 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
# Methods/Fucntions sw_ok sw_ok_press analog knob glcd glcdChar glcdString glcdMode glcdGetMode glcdFlip glcdGetFlip colorRGB setTextColor setTextBackgroundColor setTextSize 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 = atan atan2 & &= | |= boolean byte case ceil char char class , // ?: constrain cos {} — default delay delayMicroseconds / /** . else == exp false float float floor for < <= HALF_PI if ++
POP-XT 73 != int << < <= log && ! || ^ ^= loop max millis min % /*
* new null () PII return >> ; Serial Setup sin sq sqrt = switch tan this true
TWO_PI void while Serial begin read print write println available digitalWrite digitalRead pinMode analogRead analogWrite attachInterrupts detachInterrupts beginSerial
serialWrite serialRead serialAvailable printString printInteger printByte printHex printOctal printBinary printNewline pulseIn shiftOut
74 POP-XT
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-1 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 void setup() { pinMode(ledPin, OUTPUT); // กําหนดเปนเอาตพุต } void loop() { digitalWrite(ledPin, HIGH); // LED ติดสวาง delay(1000); // หนวงเวลา 1 วินาที digitalWrite(ledPin, LOW); // LED ดับ delay(1000); // หนวงเวลา 1 วินาที }
76 POP-XT
4.1.1.2 digitalWrite(pin,value) สั่งงานใหขาพอรตมีคาสถานะเปนลอจิกสูง (HIGH หรือ “1”) หรือลอจิกตํ่า (LOW หรือ “0”) พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร POP-XT (คาเปน int) value - มีคา HIGH หรือ LOW ตัวอยางที่ 4-2 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 void 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-3 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 int inPin = 23; // ตอ ZX-SWITCH01 ที่พอรตหมายเลข 23 int val = 0; // กําหนดเตัวแปรสําหรับเก็บคาที่อานไดจากอินพุต void setup() { pinMode(ledPin, OUTPUT); // กําหนดใหพอรต 4 เปนเอาตพุต pinMode(inPin, INPUT); // กําหนดใหพอรต 23 เปนอินพุต }
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)
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-4 void setup() { Serial.begin(9600); // เปดพอรตอนุกรม กําหนดอัตราบอดเปน 9600 บิตตอวินาที }
4.2.1.2 int
Serial.available()
ใชแจงวาไดรับขอมูลตัวอักษร (characters) แลว และพรอมสําหรับการอานไปใชงาน คาทีส่ งกลับจากฟงกชัน่ จํานวนไบตที่พรอมสําหรับการอานคา โดยเก็บขอมูลในบัฟเฟอรตัวรับ ถาไมมีขอมูล จะมีคาเปน 0 ถามีขอมูล ฟงกชันจะคื ่ นคาที่มากกวา 0 โดยบัฟเฟอรเก็บขอมูลไดสูงสุด 128 ไบต
POP-XT 79
4.2.1.3
int Serial.read()
ใชอานคาขอมูลทีได ่ รับจากพอรตอนุกรม คาทีส่ งกลับจากฟงกชัน่ เปนเลข int ที่เปนไบตแรกของขอมูลที่ไดรับ (หรือเปน -1 ถาไมมีขอมูล) ตัวอยางที่ 4-5 int incomingByte = 0; void setup() { Serial.begin(9600); // เปดพอรตสื่อสาร กําหนดอัตราบอดเปน 9600 บิตตอวินาที } void loop() // วนสงขอมูลเมื่อไดรับขอมูลเขามา { if (Serial.available() > 0) // อานขอมูลอนุกรม { incomingByte = Serial.read(); // เก็บขอมูลที่อานไดไวในตัวแปร Serial.print("I received: "); // พิมพขอความออกไปยังหนาตาง Serial Monitor Serial.println(incomingByte, DEC); // พิมพขอมูลที่รับไดออกไปยังหนาตาง Serial Monitor } } ในตัวอยางนี้ เลือกใชอัตราบอด 9600 บิตตอวินาที ถามีขอมูลเขามาจะเก็บไวในตัวแปร incomingByte แลวนําไปแสดงผลที่หนาตาง Serial Monitor โดยตอทายขอความ I received :..... เมื่อรันโปรแกรม ใหเปดหนาตาง Serial Monitor โดยคลิกที่ปุม
เลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending และคลิกทํา เครืองหมายที ่ ช่ อง Autoscroll จากนันป ้ อนอักษร a แลวคลิกปุม Send
ซึงอยู ่ ที่มุมขวาของหนาตางหลัก
เมือแผงวงจร ่ POP-XT ไดรับขอมูล จะสงคาของ ตัวอักษรในรูปของเลขฐานสิบกลับมา อักษร a มี รหัสแอสกี้เทากับ 61 เมื่อแปลงเปนเลขฐานสิบ จะไดคาเปน 97
4.2.1.4 Serial.flush() ใชลางบัฟเฟอรตัวรับขอมูลของพอรตอนุกรมใหวาง
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
POP-XT 81
Serial.write(b) เปนคําสังพิ ่ มพคาตัวแปร b ขนาด 1 ไบต เดิมทีคําสังนี ่ ้ จะเปน Serial.print(b,BYTE) ตังแต ้ Arduino 1.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-6 int 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);
82 POP-XT
// แสดงขอมูลดิบ ซึ่งตองผานการหารดวย 4 เนื่องจากฟงกชัน่ analogRead() คืนคา 0 ถึง 1023 // แตตัวแปรแบบไบตรับคาไดเพียง 255 Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.println(); // ขึนบรรทั ้ ดใหม delay(10); // หนวงเวลา 10 มิลลิวินาที } ตัวอยางนีแสดงการพิ ้ มพขอมูลจากฟงกชัน่ Serial.Print() ในรูปแบบตางๆ แสดงผานหนาตาง Serial Monitor
ตองเลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending และคลิกทํา เครืองหมายที ่ ่ชอง Autoscroll ดวย จึงจะไดผลการทํางานที่ถูกตอง เทคนิคสําหรับการเขียนโปรแกรม Serial.print() จะตัดเศษเลขทศนิยมเหลือเปนเลขจํานวนเต็ม ทําใหสวนทศนิยมหายไป ทางแกไข ทางหนึงคื ่ อ คูณเลขทศนิยมดวย 10, 100, 1000 ฯลฯ ขึนอยู ้ กั บจํานวนหลักของเลขทศนิยม เพือแปลงเลขทศนิ ่ ยม เปนจํานวนเต็มกอนแลวจึงสงออกพอรตอนุกรม จากนันที ้ ฝ่ งภาครั บใหทําการหารคาทีรั่ บไดเพือแปลงกลั ่ บเปนเลข ทศนิยม
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 เปนเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ 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 - ตัวแปรสตริงที่เก็บขอความสําหรับสงออกพอรตอนุกรม
84 POP-XT
ตัวอยางที่ 4-7 int 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 ดวย จึงจะไดผลการทํางานที่ถูกตอง
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-8 int ledPin = 4; // ตอแผงวงจร ZX-LED เขาที่พอรต 4 int analogPin = 0; // ตอแผงวงจร ZX-POTH เขาที่พอรตอินพุต A0 int val = 0; // กําหนดตัวแปรรับคาอะนาลอก int threshold = 512; // กําหนดคาอางอิง void setup() { pinMode(ledPin, OUTPUT); // กําหนดใหพอรต 4 เปนเอาตพุต } void loop() { val = analogRead(analogPin); // อานคาอินพุตอะนาลอก A0 if (val >= threshold) { digitalWrite(ledPin, HIGH); // ขับ LED } else { digitalWrite(ledPin, LOW); // ดับ LED } } ตัวอยางนีจะสั ้ ่งใหพอรต 4 เปนลอจิก “1” เมื่ออานคาจากพอรตอินพุต A0 แลวมีคามากกวาหรือเทากับ คาอางอิงทีกํ่ าหนดไว (ในตัวอยาง คาอางอิงหรือ threshold = 255) แตถามีคานอยกวา พอรต 4 จะเปนลอจิก “0” ทําให LED ดับ
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-9 int ledPin = 3; int analogPin = 0; int val = 0; int threshold = 512; void setup() { pinMode(ledPin, OUTPUT); } void loop() { val = analogRead(analogPin); analogWrite(ledPin, val / 4);
// ตอแผงวงจร ZX-LED เขาที่พอรต 3 // ตอแผงวงจร ZX-POTH เขาที่พอรตอินพุต A0 // กําหนดตัวแปรรับคาอะนาลอก // กําหนดคาอางอิง // กําหนดใหพอรต 3 เปนเอาตพุต // เก็บขอมูลที่อานไดจากอินพุตอะนาลอกลงในตัวแปร // ปรับคาที่ไดจากการแปลงสัญญาณ 0 ถึง 1023 // เปนคา 0 ถึง 255 แลวสงไปยังพอรตเอาตพุตอะนาลอก
} ตัวอยางนีเป ้ นการควบคุมความสวางของ LED ที่ตอกับพอรต 3 ใหเปนไปตามคาที่อานไดจากแผงวงจร ZX-POTH (แผงวงจรตัวตานทานปรับคาได) ที่ตอกับพอรต A0
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-10 int 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
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 คือ ลอจิกตํ่า value = HIGH
value = LOW
เริ่มการนับเวลา
หยุดการนับเวลา
รูปที่ 4-11 การทํางานของฟงกชั่น pulseIn
เริ่มการนับเวลา
หยุดการนับเวลา
POP-XT 89
คาทีส่ งกลับจากฟงกชัน่ คาบเวลาของพัลสในหนวยไมโครวินาที ตัวอยางที่ 4-12 int 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-13 long time; void setup() { Serial.begin(9600); } void loop() { Serial.print(“Time: “); time = millis(); // อานคาเวลา Serial.println(time); // แสดงคาเวลา Serial.flush(); delay(1000); }
90 POP-XT
4.5.2
delay(ms)
เปนฟงกชันชะลอการทํ ่ างาน หรือหนวงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยมิลลิวินาที พารามิเตอร ms - ระยะเวลาที่ตองการหนวงเวลา หนวยเปนมิลลิวินาที (1000 ms เทากับ 1 วินาที) ตัวอยางที่ 4-14 int ledPin = 4; // ตอแผงวงจร OBEC-LED กับพอรต 4 void setup() { pinMode(ledPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop() { digitalWrite(ledPin, HIGH); // ขับ LED delay(1000); // หนวงเวลา 1 วินาที digitalWrite(ledPin, LOW); // ดับ LED delay(1000); // หนวงเวลา 1 วินาที }
4.5.3
delayMicroseconds(us)
เปนฟงกชันชะลอการทํ ่ างานหรือหนวงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยไมโคร วินาที เพือให ่ หนวงเวลาไดอยางแมนยํา ฟงกชันนี ่ จะหยุ ้ ดการทํางานของอินเตอรรัปต ทําใหการทํางาน บางอยาง เชน การรับขอมูลจากพอรตอนุกรม หรือการเพิ่มคาทีจะส ่ งกลับคืนโดยฟงกชัน่ milis() จะไมเกิดขึ้น ดังนั้นควรจะใชฟงกชันนี ่ สํ้ าหรับการหนวงเวลาสันๆ ้ ถาตองการหนวงเวลานานๆ แนะ นําใหใชฟงกชัน่ delay() แทน พารามิเตอร us - คาหนวงเวลาในหนวยไมโครวินาที (1000 ไมโครวินาที = 1 มิลลิวินาที และหนึงล ่ านไมโครวินาที = 1 วินาที) ตัวอยางที่ 4-15 int outPin = 4; // ตอแผงวงจร OBEC-LED กับพอรต 4 void setup() { pinMode(outPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop() { digitalWrite(outPin, HIGH); // ขับ LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวินาที digitalWrite(outPin, LOW); // ดับ LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวินาที } จากตัวอยางนี้ กําหนดใหพอรต 4 ทํางานเปนเอาตพุตเพื่อสงสัญญาณพัลสที่มีคาบเวลา 100 ไมโครวินาที คํ าเตื อน ฟงก ชั่นนี้ทํ างานอย างแมนยําในช วงตั้งแต 3 ไมโครวิ นาที ขึ้นไป ไมอาจประกันไดวา delayMicroseconds จะทํางานไดอยางเที่ยงตรงสําหรับคาหนวงเวลาที่ตํากว ่ านี้
POP-XT 91
4.6 ฟงกชันทางคณิ ่ ตศาสตร 4.6.1
min(x, y)
หาคาตัวเลขทีน่ อยทีสุ่ ดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวที่สอง เปนขอมูลประเภทใดก็ได คาทีส่ งกลับจากฟงกชัน่ คาที่นอยที่สุดของตัวเลขสองตัวที่ให ตัวอยางที่ 4-16 sensVal = min(sensVal, 100); ตัวอยางนีจะได ้ คาของ sensVal ที่ไมเกิน 100 กลับจากฟงกชัน่
4.6.2
max(x, y)
หาคาตัวเลขทีมากที ่ ่สุดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวที่สอง เปนขอมูลประเภทใดก็ได คาทีส่ งกลับจากฟงกชัน่ คาที่มากที่สุดของตัวเลขสองตัวที่ให ตัวอยางที่ 4-17 sensVal = max(senVal, 20); จากตัวอยางนี้ คาของ sensVal จะมีคาอยางนอย 20
4.6.3
abs(x)
หาคาสัมบูรณ (absolute) ของตัวเลข พารามิเตอร x - ตัวเลข คาทีส่ งกลับจากฟงกชัน่ x เมื่อ x มีคามากกวาหรือเทากับศูนย (x มีคาเปนบวกหรือศูนย) -x เมื่อ x มีคานอยกวาศูนย (x มีคาติดลบ)
92 POP-XT
4.6.4
constrain(x, a, b)
ปดคาตัวเลขทีน่ อยกวาหรือมากกวาใหอยูในช วงทีกํ่ าหนด พารามิเตอร x - ตัวเลขที่ตองการปดคาใหอยูในชวงที่กําหนด สามารถเปนขอมูลชนิดใดก็ได a - คาตําสุ ่ ดของชวงที่กําหนด b - คาสูงสุดของชวงที่กําหนด คาทีส่ งกลับจากฟงกชัน่ x เมื่อ x มีคาอยูระหวาง a และ b a เมือ่ x มีคานอยกวา a b เมื่อ x มีคามากกวา b ตัวอยางที่ 4-18 sensVal = constrain(sensVal, 10, 150); จากตัวอยางนี้ คาของ sensVal จะอยูในชวง 10 ถึง 150
4.7 ฟงกชันเกี ่ ่ยวกับตัวเลขสุม 4.7.1
randomSeed(seed)
ใชกําหนดตัวแปรสําหรับสรางตัวเลขสุม โดยสามารถใชตัวแปรไดหลากหลายรูปแบบ โดยทัว่ ไปจะใชคาเวลาปจจุบัน (จากฟงกชัน่ milis()) แตสามารถใชคาอยางอืนได ่ เชน คาทีได ่ เมือผู ่ ใช กดสวิตช หรือคาสัญญาณรบกวนที่อานไดจากขาอินพุตอะนาลอก พารามิเตอร seed เปนคาตัวเลขแบบ long int ตัวอยางที่ 4-19 long randNumber; void setup() { Serial.begin(19200); } void loop() { randomSeed(analogRead(0)); randNumber = random(300); Serial.println(randNumber); } ในตัวอยางนี้ กําหนดใหเกิดการสุมตั วเลขเมืออ ่ านคาจากอินพุตอะนาลอกชอง 0 ยานของตัวเลขสุมคือ 0 ถึง 300 เมือสุ ่ มตัวเลขแลว ใหแสดงคานันที ้ ่หนาตาง Serial Monitor
POP-XT 93
4.7.2
long random(max), long random (min,max)
ใชสรางตัวเลขสุมเสมื อน (pseudo-random numbers) เพือนํ ่ าไปใชในโปรแกรม กอนใชฟงกชัน่ นี้จะตองเรียกใชฟงกชัน่ randomSeed() กอน พารามิเตอร min กําหนดคาตัวเลขสุมไมนอยกวาคานี้ (เปนออปชั่นเพิ่มเติม) max กําหนดคาสูงสุดของตัวเลขสุม คาทีส่ งกลับจากฟงกชัน่ คืนคาเปนตัวเลขสุมในชวงที่กําหนด (เปนตัวแปร long int) ตัวอยางที่ 4-20 long randNumber; void setup() { Serial.begin(9600); } void loop() { randomSeed(analogRead(0)); // สุมค าจากการอานคาอินพุตอะนาลอก randNumber = random(50,300); // สุมค าในชวง 50 ถึง 300 Serial.println(randNumber); Serial.flush(); delay(50); } เมื่อรันโปรแกรมนี้ คาที่ไดจากจะอยูในชวง 50 ถึง 300 แมวาจะปรับคาแรงดันอินพุตที่พอรต A0 เปน 0 หรือ +5V (ซึ่งปกติมีคา 0 ถึง 1023) ทั้งนีเป ้ นผลมาจากฟงกชัน่ random(min,max)
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 อาจสูญหายได
POP-XT 95
พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปต (เปน int) function - ฟงกชันที ่ ่จะกระโดดไปทํางานเมื่อเกิดอินเตอรรัปต ไมรับคาพารามิเตอรและไมมีการคืนคา mode - เลือกประเภทสัญญาณที่ใชกระตุนให เกิดการอินเตอรรัปต LOW เกิดอินเตอรรัปตเมื่อขาสัญญาณเปนลอจิก “0” CHANGE เกิดอินเตอรรัปตเมื่อมีการเปลี่ยนแปลงลอจิก RISING เกิดอินเตอรรัปตเมือมี ่ การเปลี่ยนลอจิก “0” เปน “1” FALLING เกิดอินเตอรรัปตเมื่อมีการเปลียนลอจิ ่ ก “1” เปน “0” ตัวอยางที่ 4-21 int 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)
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
98 POP-XT
5.3 ขันตอนการพั ้ ฒนาโปรแกรมภาษา C/C++ เพือควบคุ ่ มแผงวงจร POP-XT ขันตอนการพั ้ ฒนาโปรแกรมสําหรับแผงวงจรไมโครคอนโทรลเลอร POP-XT แสดงเปนแผน ภาพดังรูปที่ 5-1 ติดตั้งซอฟตแวร - Arduino1.0 ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีทงั้ สวน ของเท็กซเอดิเตอรสําหรับเขียนโปรแกรม, คอมไพเลอร และ ซอฟตแวรสําหรับโปรแกรมไมโครคอนโทรลเลอร - ไดรเวอรของแผงวงจร POP-XT ซึง่ เปนหนึง่ ในอนุกรมของบอรด Unicon ที่เขากันไดกบั Arduino Leonardo
สรางไฟลสเก็ตช เขียนโปรแกรมภาษา C บน Arduino IDE คอมไพล อัปโหลดโปรแกรม พอรต USB
อัปโหลดโปรแกรมผานพอรต USB 1. ตอสาย USB-miniB เขากับพอรต USB และแผงวงจร POP-XT 2. ตรวจสอบตําแหนง USB Serial port (COMx) ที่เกิดขึน้ 3. เลือกฮารดแวรเปน POP-XT ซึ่งเขากันไดกับ ฮารดแวร Arduino Leonardo 4. ทําการอัปโหลดโปรแกรม
รันโปรแกรม หลังจากอัปโหลดโปรแกรมเสร็จสมบูรณแลว กดสวิตช RESET บนแผงวงจร POP-XT จากนัน้ ระบบจะเริ่มทํางานทันที
รูปที่ 5-1 แสดงผังงานของการพัฒนาโปรแกรมเพือควบคุ ่ มการทํางานของแผงวงจรไมโครคอนโทรลเลอร POP-XT ดวยภาษา C/C++ โดยใช Arduino1.0.x
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 ครังแรกจะต ้ องกําหนดคาของฮารดแวรทีใช ่ งานรวมดวย ซึง่ ประกอบดวย การเลือกแผงวงจรไมโครคอนโทรลเลอรทีใช ่ และเลือกพอรตอนุกรมของคอมพิวเตอร ที่ตองการเชือมต ่ อ เมื่อกําหนดคาแลว ครั้งตอไปที่เปดโปรแกรมจะนําคาทีกํ่ าหนดไวมาใชงานทันที
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
POP-XT 101
5.4.2 ทดลองสรางไฟลสเก็ตชตัวอยาง Arduino จะเรียกโปรแกรมทีเขี ่ ยนขึนว ้ า สเก็ตช (Sketch) เริมต ่ นสรางไฟลสเก็ตชดวยคําสัง่ New (1) คลิกเลือกเมนู File > New จากนั้นพิมพโคดตัวอยางดังตอไปนี้ #include <popxt.h> void setup() { glcd(1,0,"Hello World"); } void loop() {}
// ผนวกไฟลไลบรารี POP-XT // แสดงขอความที่จอแสดงผล GLCD สี
(2) บันทึกเปนไฟลชือ่ HelloWorld.ino
(3) คอมไพลโปรแกรม เลือกเมนู Sketch > Verify/Compile ดังรูปหรือคลิกที่ปุม
(4) เมือคอมไพล ่ โปรแกรมแลว ทีแถบแสดงสถานะและหน ่ าตางแสดงผลการคอมไพล ซึงเป ่ น หนาตางสีดําอยูด านลางของโปรแกรม ที่แถบแสดงสถานะจะปรากฏขอความ Done compiling และ หนาตางแสดงผลแสดงขอความวา Binary sketch size: 11006 bytes (of a 30720 byte maximum) ดังรูป แสดงวาโปรแกรมภาษาเครื่องที่ไดจากการคอมไพลมีขนาด 11,006 ไบต จากขนาดของหนวยความ จําแฟลชของไมโครคอนโทรลเลอรทั้งหมดที่ใชงานได 30,720 ไบต
102 POP-XT
5.4.3 อัปโหลดโปรแกรมไปยังแผงวงจร POP-XT หลังจากที่คอมไพลโปรแกรมเสร็จสมบูรณแลว ขั้นตอนตอมาเปนการอัปโหลดโปรแกรม ภาษาเครื่องไปยังแผงวงจร POP-XT ในซอฟตแวร Arduino เรี ยกกระบวนการการสงขอมูลของ โปรแกรมภาษา C ที่คอมไพลแลวไปยังฮารดแวรวา อัปโหลด (upload) ซึ่งแตกตางจากการพัฒนา โปรแกรมของไมโครคอนโทรลเลอรอื่นๆ ซึ่งเรียกวา การดาวนโหลด (download) มีขันตอนโดยสรุ ้ ปดังนี้ (1) เปดสวิตชของแผงวงจร POP-XT ตอสาย USB เขากับคอมพิวเตอร
ตอกับพอรต USB ของคอมพิวเตอร สาย USB-miniB F 0 2 2 F 0 0 1
0 0 1
คอมพิวเตอร
ATMega32U4
TB6612
แผงวงจร POP-XT
(2) อัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกที่ปุม Upload
หรือเลือกที่เมนู File >
POP-XT 103
(3) รอจนการอัปโหลดเสร็จสิ้น โปรแกรมจะเริ่มทํางานทันที หรือกดสวิตช RESET อีกครั้ง โปรแกรม HelloWorld เปนการสงขอความ Hello World ออกไปที่บรรทัด 1 คอลัมน 0 ของจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT
ทั้งหมดนี้ คือการเตรียมการและตัวอยางการพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับแผงวงจรไมโครคอนโทรลเลอร POP-XT ในขั้นตน ในการพัฒนาโปรแกรมควบคุมแผงวงจร POP-XT ของกิจกรรมถัดไปนับจากนี้จะใชขั้นตอนในการพัฒนาโปรแกรมและอัปโหลดหรือดาวน โหลดโปรแกรมในลักษณะเดียวกัน จะเห็นไดวา การพัฒนาโปรแกรมภาษา C/C++ สําหรับไมโคร คอนโทรลเลอรดวย Arduino มีความสะดวกและสามารถดําเนินการขั้นตอนทั้งหมดภายในหนาตาง การทํางานหลักเพียงหนาตางเดียว
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-BOT XT ตองรอใหตัวควบคุมพรอมทํางานเสียกอน ซึงใช ่ เวลาประมาณ 10 วินาทีหลังจากเปดไฟเลียงหรื ้ อหลัง จากการกดสวิตช RESET หากมีการอัปโหลดกอนทีแผงวงจร ่ POP-XT จะพรอมทํางาน อาจทําใหเกิด ความผิดพลาดในการเชือมต ่ อ หรือโคดทีอั่ ปโหลดลงไปไมทํางานตามทีควรจะเป ่ น แตจะไมสงผลจนทํา ใหแผงวงจรเกิดความเสียหาย สิงที ่ เกิ ่ ดขึนมี ้ เพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานัน้
106 POP-XT
(A1.1.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-1 แลวบันทึกไฟล (A1.1.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร
ตอกับพอรต USB ของคอมพิวเตอร สาย USB-miniB F 0 2 2 F 0 0 1
0 0 1
คอมพิวเตอร
ATMega32U4
TB6612
แผงวงจร POP-XT
(A1.1.3) เลือกชนิดหรือรุนของฮารดแวรใหถูกตอง โดยเลือกที่เมนู Tools > Board > POP-XT ดังรูป
POP-XT 107
#include <popxt.h> // ผนวกไลบรารีหลัก void setup() { glcd(1,0,"Hello World"); // แสดงขอความบนจอแสดงผล } void loop() { } คําอธิบายโปรแกรม โปรแกรมนี้จะทํางานโดยสงขอความ Hello World ออกไปแสดงผลที่บรรทัด 1 คอลัมน 0 ของจอ แสดงผล จะทํางานเพียงครั้งเดียว จึงเขียนโปรแกรมไวที่ตําแหนงของ void setup() เทานัน้
โปรแกรมที่ A1-1 ไฟล HelloWorld.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT (A1.1.4) เลือกพอรตอนุกรมสําหรับติดตอกับแผงวงจร POP-XT หรือหุนยนต POP-BOT XT โดยเลือก ทีเมนู ่ Tools > Serial Port ดังรูป (ตําแหนงของพอรตทีใช ่ เชื่อมตออาจแตกตางกันในคอมพิวเตอร แตละเครื่อง)
(A1.1.5) คอมไพลและอัปโหลดไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม
หรือเลือกทีเมนู ่ File > Upload
ทีหน ่ าจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความ Hello World Hello
100 F
World
ATMega32U4
220 F
100 TB6612
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() {} คําอธิบายโปรแกรม ในโปรแกรมนี้เพิมเติ ่ มคําสั่งสําหรับการใชงานจอแสดงผลอีก 3 คําสั่งคือ 1. glcdFillScreen เปนคําสั่งกําหนดสีพืนหลั ้ งของจอแสดงผล 2. setTextColor สําหรับกําหนดสีใหแกตัวอักษร 3. setTextBackground สําหรับกําหนดสีพืนหลั ้ งของตัวอักษร เมื่อตั้งคาของจอแสดงผลแลว จึงทําการสงขอความ Row ตามดวยหมายเลขบรรทัดซึงมาจากการ ่ เพิมค ่ าของตัวแปร i และมีการเลือนตํ ่ าแหนงตามคาของ i ดวย ดังนันที ้ บรรทั ่ ดแรก ขอความ Row0 ถูกแสดง ที่คอลัมน 0 ที่บรรทัด 2 แสดงขอความ Row 1 ที่คอลัมน 1 ไลไปตามลําดับจนถึงบรรทัด 15 (บรรทัดที่ 16) จะแสดงเปน Row 15 ที่คอลัมน 15
โปรแกรมที่ A1-2 ไฟล MultipleTextline.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT
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 เรียงไปบรรทัดละขอความ 100 F
ATMega32U4
Row00 Row01 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015
100
220 F
TB6612
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
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 จอแสดงขอความแนวตัง้ ตัวอักษรขนาด 3 เทา
M = 1 หมุนการแสดงผลไป 90 องศาทางขวา ตัวอักษรขนาด 4 เทา
M = 2 หมุนการการแสดงผลไป 180 องศา M = 3 หมุนการแสดงผลไป 270 องศา จะไดภาพที่กลับหัวเมื่อเทียบกับ M = 0 ตัวอักษรขนาด 5 เทา ตัวอักษรขนาด 4 เทา
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)
เปน
คําสั่งสรางพื้นสี่เหลี่ยม เปนคําสังลากเส ่ น ่ นวง color) เปนคําสังวาดเส
glcdLine(int x1, int y1, int x2, int y2,uint color) glcdCircle(int x, int y, int radius,uint
กลม glcdFillCircle(int x, int y, int radius,uint color)
เปนคําสังสร ่ าง
พืนที ้ วงกลม ่ เปนการเคลียรหนาจอแสดงผล โดยทดสอบเขียนโปรแกรมไดดังโปรแกรมที่ A1-4 แลวอัปโหลดเพือทดสอบการทํ ่ างานไปยัง แผงวงจร POP-XT จะไดผลดังรูป glcdClear(uint color)
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); } for (i=0;i<128;i+=4) { glcdLine(0,0,i,160,GLCD_RED); } 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); }
// ผนวกไฟลไลบรารีหลัก
// เคลียรหนาจอและพื้นหลังเปนสีดํา
// วาดเสนสีขาวจากพิกัด 0,0 ไปยังจุดที่กําหนด
// วาดเสนสีแดงจากพิกัด 0,0 ไปยังจุดที่กําหนด // วาดเสนกรอบสีเหลี ่ ่ยมสีนําเงิ ้ น // สรางวงกลมพื้นสีเขียว // สรางวงกลมพื้นสีเหลือง // สรางวงกลมพื้นสีบานเย็น // สรางวงกลมพื้นสีฟา // วาดเสนรอบวงกลมสีเขียว // วาดเสนรอบวงกลมสีนําเงิ ้ น // วาดเสนรอบวงกลมสีเหลือง // วาดเสนรอบวงกลมเสนสีฟา // สรางรูปสีเหลี ่ ่ยมสีเหลือง
โปรแกรมที่ A1-4 ไฟล Simplegraphic.ino สําหรับทดสอบการแสดงผลของแผงวงจร POP-XT
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
POP-XT 115
(A1.5.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม File > Upload
หรือเลือกทีเมนู ่
(A1.5.4) รันโปรแกรม ดูผลการทํางานทีจอแสดงผลของแผงวงจร ่ POP-XT ทีจอแสดงผลแสดงเป ่ นรูปการตูนหนายิมนาน ้ 1 วินาที แลวหมุนไปครั้งละ 90 องศา แลววน กลับมาทีหน ่ าเริ่มตน จะวนแสดงผลไปตลอดเวลา
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
POP-XT 117
#include <popxt.h> void setup() {} void loop() { sound(500,500); sound(2500,500); }
// ผนวกไฟลไลบรารีหลัก
// ขับเสียงที่มีความถี่ 500Hz นาน 0.5 วินาที // ขับเสียงที่มีความถี่ 2500Hz นาน 0.5 วินาที
โปรแกรมที่ A2-2 ไฟล SoundTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POP-XT แบบกําหนดความถีและเวลาได ่
118 POP-XT
ในระบบควบคุมพืนฐานจะต ้ องมีการปรับตังค ้ า มีเมนู มีสวิตชในการสังงานต ่ างๆ บนแผงวงจร POP-XT ก็มีสวนติดตตอกับผูใช งานดวยเชนกัน ประกอบดวยปุม KNOB สําหรับปรับเลือกรายการ และสวิตช OK สําหรับยืนยันการเขาสูรายการทางเลื อกนั้นๆ 100 F
ATMega32U4
220 F
100 TB6612
เขียนโปรแกรมที่ 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
POP-XT 119
#include <popxt.h> void setup() { glcdClear; setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); beep(); glcdClear; } void loop() { if (sw_ok()) { sound(500,500); } glcd(1,0,"Knob value"); setTextSize(3); glcd(2,2,"%d ",knob()); setTextSize(2); }
// ผนวกไฟลไลบรารีหลัก // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // ขับเสียง “ติด” ้ ออกลําโพง // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // ตรวจสอบการกดสวิตช OK // หากมีการกดสวิตช ขับเสียงความถี่ 500 Hz นาน 0.5 วินาที // แสดงขอความที่จอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาที่อานไดจากการปรับปุม KNOB ที่หนาจอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ
โปรแกรมที่ A3-1 ไฟล KnobSwitchTest.ino สําหรับทดสอบอานคาจากปุม KNOB และสวิตช OK
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 LED
LED OBEC-LED
OBEC-LED S
S
+
+ S
+
+ S
100 F
A TM e g a 3 2 U 4
220 F
TB 6 6 1 2
100
(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 ทังสองชุ ้ ดติดและ ดับสลับกันไปอยางตอเนือง ่
POP-XT 121
#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); } void loop() { out(4,1); out(6,0); sleep(400); out(4,0); out(6,1); sleep(400); }
// ผนวกไฟลไลบรารีหลัก // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอ GLCD // วนรอการกดสวิตช OK
// ทําให LED ที่ตออยูกั บพอรต 4 ติดสวาง // ทําให LED ที่ตออยูกั บพอรต 6 ดับ // ทําให LED ที่ตออยูกั บพอรต 4 ดับ // ทําให LED ที่ตออยูกั บพอรต 6 ติดสวาง
โปรแกรมที่ A4-1 ไฟล LEDTest.ino สําหรับทดสอบการขับอุปกรณเอาตพุตอยางงาย
122 POP-XT
POP-XT 123
การพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับแผงวงจรไมโครคอนโทรลเลอร POPXT ดําเนินการภายใตการสนับสนุนของไฟลไลบรารี popxt.h ทั้งนี้เพื่อชวยลดขั้นตอนและความซับ ซอนในการเขียนโปรแกรมควบคุมสวนตางๆ ของฮารดแวรลง เนื่องจากตองการใหความสําคัญไป อยูที ่การเขียนโปรแกรมสําหรับรองรับการเรียนรูและกิ จกรรมการแขงขัน โครงสรางของไฟลไลบรารี popxt.h แสดงดังรูป
124 POP-XT
7.1 ไลบรารียอยภายในไฟลไลบรารี popxt.h บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับแสดงผลขอความ, ตัวเลข และสรางภาพกราฟกสีที่ จอแสดงผลแบบกราฟก LCD สีของ POP-BOT XT (ยังไมรองรับการทํางานกับไฟลรูปภาพ) ่ าสังสํ ่ าหรับการหนวงเวลา sleep บรรจุฟงกชันและคํ in _out บรรจุ ฟ งก ชั่ นและคํ าสั่ งสําหรั บอ านค าอิ นพุ ตดิจิ ตอลและสงคาออกทางขา พอรตเอาตพุตดิจิตอล ่ าสังสํ ่ าหรับอานคาจากอินพุตอะนาลอกที่ตอกับตัวตรวจจับ analog บรรจุฟงกชันและคํ sound บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับสรางเสียงเพือขั ่ บออกลําโพง motor บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับขับมอเตอรไฟตรง servo บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับขับเซอรโวมอเตอร serial บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับสือสารข ่ อมูลอนุกรมผานทางพอรต USB และผาน ทางขาพอรต TxD และ RxD ของแผงวงจร POP-XT ในการเรียกใชงานชุดคําสังย ่ อยตางๆ เพือการพั ่ ฒนาโปรแกรมควบคุมหุนยนต POP-BOT XT ผูพั ฒนาตองผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง glcd
#include <popxt.h>
เพือประ ่ กาศใหใหตัวแปลภาษาหรือคอมไพเลอรรูจักชุดคําสังย ่ อยตางๆ ที่กําลังจะถูกเรียกใช
งานจากไฟลไลบรารี popxt.h
POP-XT 125
7.2 รายละเอียดของฟงกชันหรื ่ อคําสังหลั ่ กในไฟลไลบรารี popxt.h 7.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-2 int x=20; glcd(1,2,”Value = %d”,x);
Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07
// แสดงตัวอักษรและตัวเลขบนบรรทัดเดียวกัน // เริมต ่ นที่คอลัมน 2 ของบรรทัด 1 (บรรทัดที่ 2) 100 F
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 บิตของสีแดงใหตัวแปร colors glcdFillScreen(colors); // นําคาไปแสดงเปนสีพื้นของจอแสดงผล } void loop() {}
100 F
ATMega32U4
Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015
100
220 F
TB6612
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-4 glcdFillScreen(color[5]) // กําหนดใหพื้นหลังเปนสีขาว ตัวอยาง 7-5 glcdFillScreen(GLCD_BLUE) // กําหนดใหพื้นหลังเปนสีนําเงิ ้ น
128 POP-XT
7.2.1.4 setTextColor เปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชัน่ glcd() โดยคาตังต ้ นกําหนดเปนสีขาว รูปแบบ
void setTextColor(unsigned int newColor) พารามิเตอร newColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-6 setTextColor(GLCD_YELLOW); // กําหนดใหสีของตัวอักษรเปนสีเหลือง
7.2.1.5 setTextBackgroundColor เปนฟงกชันกํ ่ าหนดสีของพื้นหลังตัวอักษร โดยคาตังต ้ นเปนสีดํา สีของพื้นหลังตัวอักษรจะ เปนคนละสวนกับสีของพืนจอภาพ ้ (screen background) ซึงต ่ องกําหนดคาผานฟงกชัน่ glcdFillScreen รูปแบบ
void setTextBackgroundColor(unsigned int newColor) พารามิเตอร newColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-7 setTextBackgroundColor(GLCD_GREEN); // กําหนดใหสีพื้นหลังตัวอักษรเปนสีเขียว
100 F
ATMega32U4
Hello World RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015
100
220 F
TB6612
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-9 glcdFillScreen(GLCD_BLUE); // กําหนดสีพื้นหลังของจอภาพเปนสีนําเงิ ้ น
[จอภาพสีดํา]
[จอภาพสีนําเงิ ้ น]
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); } void loop() { glcdClear(); glcdMode(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(); }
// ขนาดตัวอักษร 2 เทา // เคลียรหนาจอ // โหมด 0 องศา // แสดงขอความ // รอกดสวิตชเขาโหมดตอไป
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() {}
132 POP-XT
7.2.1.10 getTextColor เปนคําสังคื ่ นคาสีปจจุบันของตัวอักษร รูปแบบ
unsigned int getTextColor() การคืนคา textColor เปนคาสีแสดงอยูในรู ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB() ตัวอยางที่ 7-12 unsigned int color; color=getTextColor(); // นําคาสีของตัวอักษรเก็บไวที่ตัวแปร color
7.2.1.11 getTextBackgroundColor เปนคําสังคื ่ นคาสีพื้นหลังของตัวอักษรในปจจุบัน รูปแบบ
unsigned int getTextBackgroundColor() การคืนคา textBackgroundColor เปนคาสีแสดงอยูในรู ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB() ตัวอยางที่ 7-13 unsigned int color; color=getTextBackgroundColor(); // นําคาสีพื้นหลังของตัวอักษรเก็บในตัวแปร color
7.2.1.12 getTextSize คืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติ รูปแบบ
unsigned int getTextSize() การคืนคา textSize เปนคาจํานวนเทาของขนาดตัวอักษร ตัวอยางที่ 7-14 unsigned int textSize; textSize=getTextSize(); // นําคาจํานวนเทาของขนาดของตัวอักษรเก็บในตัวแปร textSize
POP-XT 133
7.2.1.13 glcdGetMode เปนคําสังคื ่ นคาของโหมดทิศทางการแสดงผลในปจจุบัน รูปแบบ
unsigned int glcdGetMode() การคืนคา mode เปนคาของโหมดทิศทางการแสดงผล เปนตัวเลข 0 ถึง 3 เพื่อแสดงผลในทิศทาง 0 องศา, หมุน 90 องศา, หมุน 180 องศา และหมุน 270 องศาตามลําดับ ตัวอยางที่ 7-15 unsigned 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() {}
134 POP-XT
7.2.1.18 glcdRect เปนฟงกชันลากเส ่ นจากพิกัดทีกํ่ าหนดมายังพิกัดปลายทาง รูปแบบ
void glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned int height,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() {}
POP-XT 135
7.2.1.19 glcdFillRect เปนการระบายสีพืนของรู ้ ปสีเหลี ่ ยม ่ โดยกําหนดจุดเริมต ่ นและความกวางยาวของรูปสีเหลี ่ ยม ่ ที่ตองการ ฟงกชันนี ่ ้เปนการสรางรูปสี่เหลี่ยมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชัน่ glcdRect เปนการวาดรูปกรอบสี่เหลี่ยมที่กําหนดสีของเสนกรอบได แตภายในกรอบไมมีสี รูปแบบ
void glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned int height,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() {}
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() {}
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() {}
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() {}
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() {}
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-23 sleep(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 ไมโครวินาที
POP-XT 141
7.2.3 ฟงกชันเกี ่ ่ยวกับเสียง 7.2.3.1 beep เปนฟงกชันกํ ่ าเนิดเสียง “ติด” ๊ มีความถี่ 500Hz นาน 100 มิลลิวินาที เพื่อขับออกลําโพงเปยโซ ของ POP-BOT XT รูปแบบ
void beep()
ตัวอยางที่ 7-25 beep();
// กําเนิดเสียงความถี่ 500Hz นาน 100 มิลลิวินาที
7.2.3.2 sound เปนฟงกชันกํ ่ าเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณได รูปแบบ
void sound(int freq,int time)
พารามิเตอร freq - กําหนดความถีสั่ ญญาณเสียง มีคา 0 ถึง 32,767 time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767 ตัวอยางที่ 7-26 sound(1200,500); // กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที
142 POP-XT
7.2.4 ฟงกชันเกี ่ ่ยวกับพอรตอินพุตเอาตพุต 7.2.4.1 in เปนฟงกชันอ ่ านคาสถานะลอจิกของพอรตทีกํ่ าหนด เปนหนึ่งในฟงกชันการอ ่ านและเขียนคา กับพอรตอินพุตเอาตพุตของหุนยนต POP-BOT XT รูปแบบ
char in(x) พารามิเตอร x - กําหนดขาพอรตที่ตองการอานคา การคืนคา เปน 0 หรือ 1 ตัวอยางที่ 7-27 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ x = in(2); // อานคาดิจิตอลจากพอรตดิจิตอล 2 มาเก็บไวที่ตัวแปร x
7.2.4.2 out เปนฟงกชันกํ ่ าหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนด รูปแบบ out(char _bit,char _dat) พารามิเตอร _bit - กําหนดขาพอรตที่ตองการ ตัวอยางที่ 7-28 out(4,1); // กําหนดใหขาพอรต 4/A6 เปนเอาตพุตดิจิตอลและมีคาเปน “1” out(6,0); // กําหนดใหขาพอรต 6/A7 เปนเอาตพุตดิจิตอลและมีคาเปน “0”
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-29 int val=0; // กําหนดคาตัวแปรสําหรับเก็บคาอะนาลอก val=knob(); // อานคาจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT เก็บในตัวแปร val
144 POP-XT
7.2.5.3 sw_ok() เปนฟงกชันตรวจสอบสถานะสวิ ่ ตช OK บนแผงวงจร POP-XT โดยใหสถานะ “เปนจริง” เมือ่ มีการกดสวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตช รูปแบบ
unsigned char sw_ok() การคืนคา 1 (เปนจริง) เมื่อมีการกดสวิตช 0 (เปนเท็จ) เมือไม ่ มีการกดสวิตช หมายเหตุ การกดสวิตช OK มีผลทําใหคาที่อานไดจาก Knob เปน 0 ดวย ตัวอยางที่ 7-30 if(sw_ok()) { beep(); // เมือกดสวิ ่ ตช OK จะมีเสียง “ติด” ้ ดังออกลําโพง }
7.2.5.4 sw_ok_press() เปนฟงกชันวนตรวจสอบการกดสวิ ่ ตช OK บนแผงวงจร POP-XT ตองรอจนกระทั่งสวิตชถูก ปลอยหลังจากการกดสวิตชจึงจะผานฟงกชันนี ่ ้ไปกระทําคําสังอื ่ ่นๆ ตัวอยางที่ 7-31 ........ sw_ok_press(); ......
// รอจนกระทั่งเกิดกดสวิตช OK
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-32 motor(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-34 motor_stop(1); // หยุดขับมอเตอรชอง A motor_stop(2); // หยุดขับมอเตอรชอง B ตัวอยางที่ 7-35 motor_stop(ALL); // มอเตอรทั้ง 2 ชองหยุดทํางานพรอมกัน
146 POP-XT
7.2.6.3 fd
[ใชกับหุนยนต POP-BOT XT]
มาจากคําวา forward เปนฟงกชันกํ ่ าหนดใหหุนยนต POP-BOT XT เคลื่อนที่ไปขางหนา รูปแบบ
fd(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตังแต ้ 0 ถึง 100 ตัวอยางที่ 7-36 fd(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 เปอรเซ็นต
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 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตังแต ้ 0 ถึง 100 ตัวอยางที่ 7-39 bk2(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-40 tl(60); // กําหนดใหหุนยนตเลียวซ ้ ายดวยความเร็ว 60 เปอรเซ็นต tr(100); // กําหนดใหหุนยนตเลียวขวาด ้ วยความเร็ว 100 เปอรเซ็นต
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-41 sl(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); ao(); }
// หุนยนตเคลื่อนที่ไปขางหนาดวยความเร็วสูงสุด // เปนเวลา 2 วินาที // กําหนดใหมอเตอรหยุดทํางาน หุนยนตจะหยุดเคลื่อนที่ทันที
7.2.7 ฟงกชันเกี ่ ่ยวกับการขับเซอรโวมอเตอร ในไฟลไลบรารีนี้มี 1 ฟงกชันคื ่ อ servo เปนฟงกชันกํ ่ าหนดตําแหนงแกนหมุนของเซอรโว มอเตอร ควบคุมได 3 ตัว รูปแบบ
void servo(unsigned char _ch, int _pos)
พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 1 ถึง 3 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรที่ชองนันๆ ้
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-43 uart_set_baud(4800); // กําหนดอัตราบอดในการสือสารข ่ อมูลเปน 4,800 บิตตอวินาที
150 POP-XT
7.2.8.4 uart_available เปนฟงกชันตรวจสอบการรั ่ บขอมูลเขามาของโมดูล UART0 เมือติ ่ ดตอกับคอมพิวเตอร รูปแบบ
unsigned char uart_available(void)
การคืนคา - เปน “0” เมือยั ่ งไมมีขอมูลเขามา - มากกวา 0 เมือมี ่ ขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระที่ไดรับ ตัวอยางที่ 7-44 char 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!"); // แสดงขอความเพื่อตอบสนองตอการตรวจพบวามีการคีย a sleep(1000); // หนวงเวลาแสดงขอความประมาณ 1 วินาที } else { glcdClear; // เคลียรขอความที่จอแสดงผล } } }
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 อยางไรก็ตาม ตองคํานึงดวยวา เมืออั ่ ตราบอดสูงขึนอาจส ้ งผลกระทบตอความถูกตองในการสือสารข ่ อมูล
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-47 char x =uart1_available(); // ตรวจสอบวามีขอมูลเขามาทางภาครับของโมดูล UART1 หรือไม // ถา x มีคามากกวา 0 แสดงวามีขอมูลเขามาแลว ควรอานออกไปดวยฟงกชัน่ uart1_getkey ทันที
7.2.8.9 uart1_getkey เปนฟงกชันอ ่ านขอมูลจากบัฟเฟอรตัวรับของโมดูล UART1 รูปแบบ
char uart1_getkey(void) การคืนคา - เปน 0 เมือยั ่ งไมมีการรับอักขระใดๆ - เปนคาของอักขระที่รับไดในรูปแบบของรหัสแอสกี้
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
154 POP-XT
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 จะพรอมทํางาน อาจทําใหเกิดความผิดพลาดใน การเชือมต ่ อ หรือโคดที่อัปโหลดลงไปไมทํางานตามที่ควรจะเปน แตจะไมสงผลจนทําใหแผงวงจร เกิดความเสียหาย สิ่งทีเกิ ่ ดขึ้นมีเพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานั้น
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 ทังสองชุ ้ ดติดและดับสลับกันไปอยางตอเนื่อง LED
LED OBEC-LED
OBEC-LED S
S
+
+ S
+
+ S
100 F
A TM e g a 3 2 U 4
220 F
TB 6 6 1 2
100
รูปที่ 8-1 แสดงการตออุปกรณเพือทดสอบการขั ่ บอุปกรณเอาตพุตอยางงายของแผงวงจร POP-XT
POP-XT 157
#include <popxt.h> void setup() {} void loop() { out(4,1); out(6,0); sleep(400); out(4,0); out(6,1); sleep(400); }
// ผนวกไฟลไลบรารีหลัก
// ทําให LED ที่ตออยูกั บพอรต 4 ติดสวาง // ทําให LED ที่ตออยูกั บพอรต 6 ดับ // ทําให LED ที่ตออยูกั บพอรต 4 ดับ // ทําให LED ที่ตออยูกั บพอรต 6 ติดสวาง
โปรแกรมที่ 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
158 POP-XT
#include <popxt.h> void setup() {} void loop() { sound(500,500); sound(2500,500); }
// ผนวกไฟลไลบรารีหลัก
// ขับเสียงความถี่ 500Hz นาน 0.5 วินาที ออกลําโพง // ขับเสียงความถี่ 2500Hz นาน 0.5 วินาที ออกลําโพง
โปรแกรมที่ 8-3 ไฟล popXT_SoudTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POPXT แบบกําหนดความถีและเวลาได ่ (8.1.8) เขียนโปรแกรมที่ 8-3 บันทึกไฟลชื่อ popXT_SoundTest แลวอัปโหลดโปรแกรม เพื่อทดสอบ การทํางานอีกครั้ง จะไดยินสัญญาณเสียง 2 ความถี่ดังสลับกันออกจากลําโพงของแผงวงจร POP-XT
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 วินาที แลวกลับ มาติดสวางใหม เปนเชนนีไปตลอดการทํ ้ างาน จนกวาจะมีการรีเซตระบบ หรือปดเปดจายไฟเลี้ยง ใหม LED 100 F
S
+
+ S A TM e g a 3 2 U 4
220 F
TB 6 6 1 2
100
รูปที่ 8-2 การตออุปกรณเพื่อทดสอบการอานคาสวิตช OK บนแผงวงจร POP-XT
160 POP-XT
#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_OK_press(); glcdClear(); } void loop() { if (sw_OK()) { out(4,0); delay(2000); } out(4,1); }
// ผนวกไฟลไลบรารีหลัก // กําหนดขนาดตัวอักษร 2 เทา // แสดงขอความออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา
// ตรวจสอบการกดสวิตช OK // ดับ LED ที่จุดตอพอรต 4 // นาน 2 วินาที // ขับ 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)
POP-XT 161
ZX-Switch01 D
100 F
+ S +
S
Counter A TM e g a 3 2 U 4
27 220 F
TB 6 6 1 2
100
รูปที่ 8-3 การตออุปกรณเพือทดสอบการอ ่ านคาสวิตชจากจุดตอพอรตของแผงวงจร POP-XT (8.2.8) กดสวิตชทีแผงวงจร ่ ZX-SWITCH01 ทีต่ อกับพอรต 18 สังเกตการทํางานทีจอแสดงผลของ ่ แผงวงจร POP-XT ทีจอแสดงผลจะเริ ่ ่มตนแสดงคาการนับจํานวนการกดสวิตช โดยเริ่มจาก 0 คาจะเปลี่ยนทัน ทีที่ มี่ การกดสวิตชทีพอร ่ ต 18 และจะทําการับคาตอไปได ก็ตอเมื่อมีการปลอยสวิตช แลวกดใหม หากสวิตชยังถูกกดคาง คาการนับจะไมมีการเปลี่ยนแปลง จนกวาสวิตชจะถูกปลอย และกดเขามา ใหม จากทังสองปฏิ ้ บัติการผูพั ฒนาสามารถนําไปประยุกตใชงานสวิตชหลายๆ ตัวพรอมกันและมี ความสามารถทีแตกต ่ างกันไปแลวแตจุดประสงค เชน สวิตชบางตัวสามารถกําหนดใหเมื่อกดสวิตช คางแลวสามารถเพิมค ่ าหรือลดคาขอมูลทีกํ่ าหนดได ในขณะทีสวิ ่ ตชบางตัวอาจกําหนดใหไมสามารถ กดคางได เปนตน
162 POP-XT
#include <popxt.h> int i=0; void setup() { setTextSize(2); glcd(1,3,"Start"); sw_ok_press(); glcdClear(); glcd(1,2,"COUNTER"); setTextSize(3); glcd(3,3,"0"); } void loop() { if (in(18)==0) { i=i++; glcd(3,3,"%d",i); while(in(18)==0) delay(5); } } คําอธิบายโปรแกรม
// ผนวกไฟลไลบรารีหลัก // ประกาศตัวแปรเก็บคาการนับ // กําหนดขนาดตัวอักษร 2 เทา // แสดงขอความ Start ออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // แสดงขอความ COUNTER เพื่อแจงชือการทดลอง ่ // กําหนดขนาดตัวอักษร 3 เทา // กําหนดคาเริมต ่ นเปน 0
// ตรวจสอบการกดสวิตชที่พอรต 18 // เพิ่มคาตัวนับ // แสดงคาการนับ // ตรวจสอบการปลอยสวิตช
โปรแกรมนีใช ้ ฟงกชัน่ in ในการตรวจจับและอานคาจากการกดสวิตชทีพอร ่ ต 18 โดยตรงสอบวาทีพอร ่ ต 16 เปนลอจิก “0” หรือไม ถาใชแสดงวา มีการกดสวิตชเปดขึน้ จากนั้นจะทําการเพิมค ่ าตัวนับ แลวนํามาแสดง ผลที่จอแสดงผลกราฟก LCD ของแผงวงจร POP-XT คําสัง่ while(in(18)==0) และ dealy(5); ทําหนาที่ลดสัญญาณรบกวนที่เกิดจากการกดสวิตช โดยจะ ตรวจสอบวา มีการปลอยสวิตชแลวหรือไม ถาไม ก็จะวนทํางานอยูที่คําสังนั ่ ้น ชวยใหไมเกิดการนับคาโดยไม ตั้งใจขึน้ ดังนั้นการกดสวิตชที่พอรต 18 ในแตละครังจึ ้ งมีความแนนอนสูง
โปรแกรมที่ 8-5 ไฟล popXT_SwitchTest.ino โปรแกรมภาษา C/C++ สําหรับทดลองใชงานสวิตชในการ สรางเครืองนั ่ บจํานวนอยางงาย
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
A
ZX-POTH POTENTIOMETER
100 F
Analog
0 ATMega32U4
Volts
0.000
220 F
100 TB6612
รูปที่ 8-4 แสดงการตออุปกรณเพือทดสอบการอ ่ านคาจากอินพุตอะนาลอกอันเปนพืนฐานของการอ ้ านคา จากตัวตรวจจับสัญญาณไฟฟา
164 POP-XT
#include <popxt.h> int val; float volts; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(0,2,"Analog"); val = analog(0); setTextSize(3); glcd(1,2,"%d ",val); setTextSize(2); glcd(5,3,"Volts"); volts = (float(val)*5)/1024; setTextSize(3); glcd(4,1,"%f",volts); setTextSize(2); }
// ผนวกไฟลไลบรารีหลัก
// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ
// แสดงขอความที่จอแสดงผล // อานคาของสัญญาณชอง A0 มาเก็บไวที่ตัวแปร val // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความ Volts // แปลงขอมูลเปนหนวยแรงดัน // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาแรงดันความละเอียดทศนิยม 3 ตําแหนง // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ
โปรแกรมที่ 8-6 ไฟล popXT_AnalogTest.ino โปรแกรมภาษา C/C++ สําหรับอานคาสัญญาณอะนาลอก จากพอรตอินพุตอะนาลอกของแผงวงจร 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)
POP-XT 165
ในตัวอยางนีเป ้ นการนําขอมูลทีได ่ จากการแปลงสัญญาณไฟฟาซึงมาจากการปรั ่ บคาของ ZXPOTH) แผงวงจรตัวตานทานปรับคาไดมากําหนดเงื่อนไขในการเปด/ปด LED เพื่อใหเห็นแนวทาง ในการประยุกตใชงานเบื้องตน (8.3.5) เชือมต ่ อแผงวงจร ZX-LED เขากับจุดตอพอรต 4 และตอเอาตพุตปรับแรงดันเพิมเมื ่ อหมุ ่ นตาม ตามเข็มนาฬิกาของแผงวงจร ZX-POTH กับจุดตอพอรต A0 ของแผงวงจร POP-XT ตามรูปที่ 8-5 (8.3.6) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_AnalogSwitch พิมพโปรแกรมที่ 8-7
LED
A
ZX-POTH POTENTIOMETER
100 F
Analog control Switch
S
+
+ S
A TM e g a 3 2 U 4
108 TB 6 6 1 2
220 F
100
รูปที่ 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 ติดสวาง
166 POP-XT
#include <popxt.h> int val=0; void setup() { glcdClear(); setTextSize(2); glcd(1,2,"Analog"); glcd(2,2,"control"); glcd(3,2,"Switch"); } void loop() { val = analog(0); if(val>512) { setTextSize(4); setTextColor(GLCD_RED); glcd(3,1,"%d ",val); out(4,1); } else { setTextSize(4); setTextColor(GLCD_WHITE); glcd(3,1,"%d ",val); out(4,0); } setTextSize(2); } คําอธิบายโปรแกรม
// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรเก็บคาทีได ่ จากการแปลงสัญญาณแลว
// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความที่จอแสดงผล
// อานคาของสัญญาณชอง A0 มาเก็บไวที่ตัวแปร val // ตรวจสอบวาคาที่อานไดมากกวา 512 หรือไม // เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // เปลียนเปนสีแดง // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // ถาคา val มากกวา 512 ทําการขับ LED ที่พอรต 4
// เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // แสดงตัวอักษรสีขาว // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // ถาคา val นอยกวา 512 ทําการปด LED ที่พอรต 4 // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ
สัญญาณไฟฟาจากแผงวงจรตัวตานทานปรับคาไดจะถูกอานดวยคําสัง่ analog() เก็บไวที่ตัวแปร val เพื่อนําไปตรวจสอบและสงไปแสดงผลยังจอแสดงผลกราฟก LCD สี หากคาที่ได นอยกวา 512 ตัวเลขที่แสดง ผลยังเปนสีขาว และสงขอมูล “0” ไปยังพอรต 4 ทําให LED ที่ตออยูไมทํางาน เมื่อคาของ val มากกวา 512 ตัวเลขแสดงผลจะเปลียนเป ่ นสีแดง และมีการสงขอมูล “1” ไปยังพอรต 4 ทําให LED ที่ตออยูติดสวาง
โปรแกรมที่ 8-7 ไฟล popXT_AnalogSwitch.ino โปรแกรมภาษา C/C++ สําหรับอานคาสัญญาณไฟฟาเพือนํ ่ ามาควบคุมอุปกรณเอาตพุต
POP-XT 167
ในตัวอยางนีเป ้ นการตอยอดจากตัวอยางที่ 8-2 หัวขอที่ 2 โดยเปลียนจากการปรั ่ บคาของ ZXPOTH แผงวงจรตัวตานทานปรับคาไดเปนการตรวจจับแสงโดยใชแผงวงจรตัวตานทานแปรคาตาม แสดงหรือ 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 A
ZX-LDR Light
+
+
LED 100 F
Night Switch S
+
+ S A TM e g a 3 2 U 4
98
TB 6 6 1 2
220 F
100
รูปที่ 8-6 การตออุปกรณเพือทดสอบการทํ ่ างานของแผงวงจรตรวจจับแสงเพือใช ่ กําหนดเงือนไขในการ ่ เปด-ปดอุปกรณเอาตพุต
168 POP-XT
#include <ipst.h> int val=0; void setup() { glcdClear(); setTextSize(2); setTextColor(GLCD_YELLOW); glcd(1,2,"Night"); glcd(2,2,"Switch"); } void loop() { val = analog(2); if(val<100) { setTextSize(4); setTextColor(GLCD_WHITE); glcd(3,1,"%d ",val); out(4,1); } else { setTextSize(4); setTextColor(GLCD_BLUE); glcd(3,1,"%d ",val); out(4,0); } setTextSize(2); } คําอธิบายโปรแกรม
// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรสําหรับเก็บคาที่ไดจากการแปลงสัญญาณ
// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความที่จอแสดงผล
// อานคาของสัญญาณชอง A2 มาเก็บไวที่ตัวแปร val // ตรวจสอบวาคาที่อานไดมากกวา 512 หรือไม // เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // เปลียนเปนสีขาว // แสดงคาที่อานไดจากจุดตอ A2 ที่หนาจอแสดงผล // ถาคา val นอยกวา 100 ทําการขับ LED ที่พอรต 4
// เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // แสดงตัวอักษรสีนําเงิ ้ น // แสดงคาที่อานไดจากจุดตอ A2 ที่หนาจอแสดงผล // ถาคา val มากกวา 100 ทําการปด LED ที่พอรต 4 // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ
ในโปรแกรมนีจะตรวจสอบค ้ าจากแผงวงจรตรวจจับแสงทีอ่ านดวยคําสัง่ analog(2); เก็บไวทีตั่ วแปร val หากคาที่ไดมากกวา 100 ตัวเลขที่แสดงผลเปนสีนํ้าเงิน และสงขอมูล “0” ไปยังพอรต 4 ทําให LED ที่ตออยูไม ทํางาน เมื่อคาของ val นอยกวา 100 ตัวเลขแสดงผลจะเปลียนเป ่ นสีขาว และมีการสงขอมูล “1” ไปยังพอรต 4 ทําให LED ที่ตออยูติดสวาง
โปรแกรมที่ 8-8 ไฟล popXT_NightSwitch.pde โปรแกรมภาษา C/C++ สําหรับควบคุมการเปดปดอุปกรณ เอาตพุตดวยแสง
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) ก็ได
170 POP-XT
ในตัวอยางนีเป ้ นการนําไอซีวัดอุณหภูมิเบอร 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 บิตได โดยมีความคลาดเคลือนตํ ่ ่า
รูปที่ 8-7 การจัดขาของ MCP9701, หนาตาเมือต ่ อสายสัญญาณพรอมใชงานและกราฟคุณสมบัติ
POP-XT 171
สวนประกอบของสายวัดอุณหภูมิ MCP9701
รูปที่ 8-8 แนวทางการใชงานไอซีวัดอุณหภูมิ MCP9701 ทีมาในรู ่ ปของสายวัดอุณหภูมิ
172 POP-XT
#include <popxt.h> int val,i; float Temp; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(1,2,"Digital"); glcd(2,2,"THERMO"); glcd(3,3,"METER"); val=0; for (i=0;i<20;i++) { val = val+analog(4); } val = val/20; Temp = (float(val)*0.25) - 20.51 ; setTextSize(3); setTextColor(GLCD_YELLOW); glcd(3,1,"%f",Temp); setTextColor(GLCD_WHITE); setTextSize(2); glcd(6,2,"Celsius"); delay(500);
// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรเก็บคาที่อานไดจาก MCP9701 // ประกาศตัวแปรคาอุณหภูมืในแบบทศนิยม // เคลียรจอแสดงผล // เลือกขนาดตัวอักษร 2 เทา
// แสดงขอความเริมต ่ น
// กําหนดรอบการอานคาจาก MCP9701 รวม 20 ครั้ง // อานคาจากอินพุต A4 // หาคาเฉลียจากการอ ่ านคา 20 ครั้ง // แปลงคาเปนอุณหภูมิในหนวยองศาเซลเซียส // เปลียนขนาดตั ่ วอักษรเปน 3 เทา // เปลียนสีตัวอักษรเปนสีเหลือง // แสดงคาอุณหภูมิดวยความละเอียดทศนิยม 3 ตําแหนง // เปลียนสีตัวอักษรเปนสีขาว // เปลียนขนาดตั ่ วอักษรเปน 2 เทา // แสดงหนวยองศาเซลเซียส // หนวงเวลากอนเริมต ่ นการอานคาในรอบใหม
} คําอธิบายโปรแกรม ในโปรแกรมนี้หัวใจสําคัญคือ การคํานวณเพื่อเปลี่ยนขอมูลดิจิตอลทีได ่ จากการแปลงแรงดันเอาตพุต ของไอซี MCP9701 เปนคาอุณหภูมิในหนวยองศาเซลเซียส กระบวนการจะเริมจากการอ ่ านและแปลงคาของ แรงดันไฟตรงที่จุดตอ A4 ซึ่งไดมาจากการทํางานของไอซี MCP9701 มาเก็บไวในตัวแปร val จากนันนํ ้ าขอมูล ที่ไดมาคํานวณดวยสูตร Temp = (val x 0.25) - 20.51 จากนั้นนําคาอุณหภูมิไดมาแสดงผลดวยความละเอียด ทศนิยม 3 ตําแหนง
โปรแกรมที่ 8-9 : ไฟล popXT_TempMeter.ino โปรแกรมภาษา C/C++ สําหรับพัฒนาแผงวงจร POP-XT เปนเครืองวั ่ ดอุณหภูมิระบบตัวเลขอยางงาย
POP-XT 173
100 F
Digital THERMO METER A TM e g a 3 2 U 4
26.740 Celsius 220 F
TB 6 6 1 2
100
รูปที่ 8-9 การตออุปกรณเพื่อใชงานแผงวงจร POP-XT กับไอซีวัดอุณหภูมิ MCP9701 (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)
174 POP-XT
ZX-03R
ในตัวอยางนีเป ้ นการนําแผงวงจรตรวจจับแสงสะทอน ZX-03R มาเชื่อมตอกับแผงวงจร POPXT เพื่อตรวจสอบวา สีของพื้นผิวอยางงาย
100 F
Color Reading A TM e g a 3 2 U 4
497 220 F
TB 6 6 1 2
100
รูปที่ 8-10 การตออุปกรณเพือตรวจสอบสี ่ ของพื้นผิวอยางงาย #include <popxt.h> int reflect = 0; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(1,2,"Color"); glcd(2,2,"Reading"); reflect=analog(0); setTextSize(3); setTextColor(GLCD_YELLOW); glcd(3,1, "%d", reflect); setTextColor(GLCD_WHITE); setTextSize(2); sleep(200); }
// ผนวกไฟลไลบรารหลัก // เคลียรจอแสดงผล // เลือกขนาดตัวอักษร 2 เทา // แสดงขอความเริมต ่ น // อานคาการตรวจจับแสงสะทอนจากชอง A0 // เปลียนขนาดตั ่ วอักษรเปน 3 เทา // เปลียนสีตัวอักษรเปนสีเหลือง // แสดงคาแสงสะทอน // เปลียนสีตัวอักษรเปนสีขาว
โปรแกรมที่ 8-10 ไฟล popXT_ColorReading.ino โปรแกรมภาษา C/C++สําหรับอานคาแสงสะทอนจาก พืนผิ ้ วทีมี่ สีแตกตางกันของแผงวงจร ZX-03R มาแสดงผลทีแผงวงจร ่ POP-XT
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
176 POP-XT
ตัวอยางนีเป ้ นการเขียนโปรแกรมเพือควบคุ ่ มใหแผงวงจร POP-XT ขับมอเตอรไฟตรงอยางงาย (8.7.1) เชื่อมตอมอเตอรไฟตรง 2 ตัวเขากับเอาตพุตมอเตอรไฟตรงชอง A และ B ของแผงวงจร POPXT ดังรูปที่ 8-11 100 F
A TM e g a 3 2 U 4
220 F
TB 6 6 1 2
100
รูปที่ 8-11 การตออุปกรณเพือทดสอบการขั ่ บมอเตอรไฟตรงพืนฐานของแผงวงจร ้ POP-XT #include <popxt.h> void setup() {} void loop() { motor(1,30); motor(2,30); sleep(3000); motor(1,-30); motor(2,-30); sleep(3000); }
// ผนวกไฟลไลบรารีหลัก
// ขับมอเตอรชอง 1 ดวยกําลัง 70% ของกําลังสูงสุด // ขับมอเตอรชอง 2 ดวยกําลัง 70% ของกําลังสูงสุด // หนวงเวลา 3 วินาทีกอนกลับทิศทางการหมุนของมอเตอร // ขับมอเตอรชอง 1 ดวยกําลัง 70% มีทิศทางการหมุนตรงขามกับคากําลังที่เปนบวก // ขับมอเตอรชอง 2 ดวยกําลัง 70% มีทิศทางการหมุนตรงขามกับคากําลังที่เปนบวก // หนวงเวลา 3 วินาทีกอนกลับทิศทางการหมุนของมอเตอร
โปรแกรมที่8-11 ไฟล popXT_MotorTest.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับมอเตอรไฟตรง ของแผงวงจรหลัก POP-XT
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); motor(2,30); sleep(3000); motor_stop(1); motor_stop(2); sleep(3000); }
// ผนวกไฟลไลบรารีหลัก
// ขับมอเตอรชอง 1 ดวยกําลัง 30% ของกําลังสูงสุด // ขับมอเตอรชอง 2 ดวยกําลัง 30% ของกําลังสูงสุด // หนวงเวลา 3 วินาที // หยุดขับมอเตอรชอง 1 // หยุดขับมอเตอรชอง 2 // หนวงเวลา 3 วินาที
โปรแกรมที่ 8-12 ไฟล popXT_MotorTest02.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับและ หยุดขับมอเตอรไฟตรงของแผงวงจร POP-XT
178 POP-XT
ตัวอยางนีเป ้ นการเขียนโปรแกรมควบคุมแกนหมุนของเซอรโวมอเตอรโดยใชแผงวงจร POPXT โดยตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร 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 วินาที 100 F
A TM e g a 3 2 U 4
220 F
STANDARD SERVO MOTOR TB 6 6 1 2
100
รูปที่ 8-12 การตออุปกรณเพือทดสอบการขั ่ บและควบคุมเซอรโวมอเตอรของแผงวงจร POP-XT
POP-XT 179
#include <popxt.h> void setup() {} void loop() { servo(1,60); sleep(1000); servo(1,120); sleep(1000); }
// ผนวกไฟลไลบรารีหลัก
// ขับเซอรโวมอเตอรชอง 1 ไปยังตําแหนง 60 องศา // หนวงเวลา 1 วินาที // ขับเซอรโวมอเตอรชอง 1 ไปยังตําแหนง 120 องศา // หนวงเวลา 1 วินาที
โปรแกรมที่ 8-13 ไฟล popXT_ServoTest01.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับเซอรโว มอเตอรของแผงวงจร POP-XT
ตัวอยางนีเป ้ นการเขียนโปรแกรมเพือปรั ่ บตําแหนงแกนหมุนของเซอรโวมอเตอร ดวยการปรับ ปุม KNOB บนแผงวงจร POP-XT (8.8.5) ยังคงใชการตออุปกรณตามรูปที่ 8-12 ในการทดสอบ (8.8.6) สรางไฟลสเก็ตชขึนใหม ้ ตั้งชื่อเปน popXT_ServoTest02 พิมพโปรแกรมที่ 8-14 #include <popxt.h> int x; void setup() { glcdMode(1); setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcdClear(); } void loop() { x=map(knob(),80,1023,0,180); glcd(2,1,"Servo = %d ",x); servo(1,x); }
// ผนวกไฟลไลบรารีหลัก
// เลือกการแสดงผลโหมด 1 แสดงผลในแนวนอน // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK
// อานคาจาก KNOB แปลงเปนคา 0 ถึง 180 เก็บในตัวแปร x // สงคาตําแหนงของเซอรโวมอเตอรไปแสดงที่หนาจอแสดงผล // สงคาตําแหนงไปยังเซอรโวมอเตอรชอง SV1
โปรแกรมที่ 8-14 ไฟล popXT_ServoTest02.ino โปรแกรมภาษา C/C++ ของ Arduino1.0 สําหรับควบคุม เซอรโวมอเตอรดวยการปรับคาแรงดันอะนาลอกปอนใหแกแผงวงจร POP-XT
180 POP-XT
(8.8.6) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.8.7) รันโปรแกรม กดสวิตช OK เพื่อเริ่มการทํางาน ตามดวยปรับปุม KNOB บนแผงวงจร POPXT สังเกตการทํางานของเซอรโวมอเตอร เมื่อหมุนปรับคาของปุม KNOB ทีจอแสดงผลจะแสดงค ่ าของ KNOB และเซอรโวมอเตอร ถูกขับใหแกนหมุนไปมาตามทิศทางของการหมุนปุม KNOB F 0 2 2 F 0 0 1
0 0 1
Servo
=
116
ATMega32U4
STANDARD SERVO MOTOR
TB6612