1
1. ทําไมจึงควรใชซอฟตแวร Wiring 1.0 ขอดีของการใชซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ แบบโอเพนซอรสที่ชือ่ Wiring ซึ่ง นํามาใชในชุดกลองสมองกล IPST-MicroBOX Secondary Education (SE) สําหรับหองเรียนวิทยา ศาสตรในระดับมัธยมศึกษาตอนตนตามแนวคิด สสวท. และ สอวน. ดวย มีดังนี้ รองรับกับระบบปฏิบัติการของคอมพิวเตอรทีหลากหลาย ่ ไมวาจะเปนวินโดวส (ทัง้ XP, 7 และ 8), ลีนุกซ และ MAC OSX
ในการดาวนโหลด (อัปโหลด) โปรแกรมไปยังแผงวงจรหลักกระทําผานพอรตอนุกรมของ คอมพิวเตอรโดยตรง หรือผานทางตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม โดยไมตองใชเครือง ่ โปรแกรมภายนอกอีก ทําใหลดขันตอนในการต ้ อพวงเครืองมื ่ อลง
ในการพัฒนาโปรแกรมและดาวนโหลดโคดดําเนินการผานหนาตางหลักเพียงหนาตางเดียว
ไมตองสรางไฟลโปรเจ็กตหรือตังค ้ าทางฮารดแวรหรือ Configuration จึงลดขันตอนการพั ้ ฒนา โปรแกรมลงอยางมาก
Wiring 1.0 เปนซอฟตแวรแบบซอรสเปด ใชงานไดโดยไมมีคาใชจาย และไมจํากัดเวลา รวมถึงมีการปรับปรุงอยางตอเนืองเพื ่ อให ่ ไดซอฟตแวรทีมี่ ประสิทธิภาพสูง ครู-อาจารยทีมี่ ความสนใจ ในการพัฒนาเครื่องมือสามารถนําซอรสโคดไปพัฒนาเปนซอฟตแวรที่ตอบสนองตอการเรียนการ สอนโดยเฉพาะได
มีไลบรารีชวยในการพัฒนาโปรแกรมสําหรับติดตออุปกรณภายนอกมากมาย และใชงานงาย
ชวยลดความผิดพลาดในการแกไขบิตฟวสทีทํ่ าใหตัวไมโครคอนโทรลเลอรไมสามารถทํางาน ได เนืองจากในการใช ่ งานซอฟตแวร Wiring 1.0 ผูพั ฒนาโปรแกรมไมตองตังค ้ าพารามิเตอรใดๆ ทีเกี ่ ยว ่ ของกับไมโครคอนโทรลเลอร จึงลดโอกาสในการทีตั่ วชิปจะถูกล็อกไมใหโปรแกรมลงไดอยางมาก
2
2. เครื่องมือที่ตองใชในการปรับปรุงแผงวงจรหลัก 2.1 เครืองโปรแกรม ่ PX-400 หรือ PX-4000 จะใชในการโปรแกรมตัวไมโครคอนโทรลเลอร ครังแรกเพี ้ ยงครังเดี ้ ยว หลังจากปรับปรุงแลว การดาวนโหลดโคดจากคอมพิวเตอรจะกระทําผานพอร ตอนุกรมของคอมพิวเตอรโดยตรง หรือผานทางตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม ไมตองใชเครื่องโปรแกรม PX-400 หรือ PX-4000 อีกตอไป 2.2 สายตอพอรตอนุกรม CX-4 ซึ่งมีในชุด IPST-MicroBOX อยูแลว (หากใชเครื่องโปรแกรม PX-4000 ไมตองใชสายตอตัวนี้) 2.3 ตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม RS-232 รุน UCON-232S ซึงมี ่ ในชุด IPSTMicroBOX อยูแลว (หากใชเครื่องโปรแกรม PX-4000 ไมตองใชตัวแปลงนี้ในการปรับปรุงตัวชิป) 2.4 แผงวงจรหลัก IPST-MicroBOX 2.5 อะแดปเตอรไฟตรงในยาน +9V ถึง +12V 500mA ซึ่งมีในชุด IPST-MicroBOX อยูแลว
3. ขั้นตอนการปรับปรุงแผงวงจรหลัก IPST-MicroBOX 3.1 ติดตังโปรแกรมซอฟต ้ แวรและไดรเวอร 3.1.1 ระบบปฏิบัติการทีรองรั ่ บ ซอฟตแวรสําหรับพัฒนาโปรแกรมในโครงการ Wiring นีคื้ อ Wiring Development Environment หรือบางครังเรี ้ ยกวา Wiring IDE ทํางานไดกับระบบปฏิบัติการหรือแพล็ตฟอรม (platform) ดังนี้
Mac OS X 10.4 (ทั้งรุนที่ใชซีพีพียูเพาเวอรพีซีและอินเทล)
วินโดวส XP, วินโดวสวิสตา, วินโดวส 7 และ 8
Linux ทั้ง Fedora Core และ Debian (รวมถึง Ubuntu ดวย)
แพล็ตฟอรมอื่นๆ ที่สนับสนุนการทํางานของ Java 1.4 ขึ้นไป
3.1.2 ดาวนโหลดและติดตั้งโปรแกรม (3.1.2.1) ดาวนโหลดซอฟตแวร Wiring 1.0 IPST-SE จากเว็บไซต www.ipst-microbox.com โดยมีไฟลติดตังชื ้ อ่ Wiring1000_IPST_SE_130411.exe (เลขเวอรชันจะเปลียนแปลงตามการปรั ่ บปรุง ลาสุด) หากผูใช งานมีการติดตังซอฟต ้ แวร Wiring 1.0 IPST-SE อยูก อนแลว ขอใหถอนการติตดังออก ้ แลวติดตังเวอร ้ ชันใหมนีลงไปแทน ้ การติดตังใหม ้ นี้ไมสงผลกระทบตอไฟลตัวอยางทีเคยมี ่ เก็บไวใน โฟลเดอร Wiring และเวอรชันใหมนี้ใชงานไดกับ IPST-MicroBOX [SE] และ IPST-MicroBOX เดิม
3
(3.1.2.2) ติดตังซอฟต ้ แวร Wiring 1.0 โดยดับเบิลคลิกไฟล Wiring1000_IPST_SE_130411.exe จากนั้นคลิ กตอบตกลงในแตละขั้นตอนของการติดตั้งเหมือนกับการติดตั้งแอปพลิเคชั่นอื่นๆ ของวินโดวส จนเสร็จสิ้น (3.1.2.4) หลังจากนั้นหนาตางติดตังไดรเวอร ้ USB สําหรับติดตอกับแผงวงจรหลักของ IPSTMicroBOX ปรากฏขึ้น ใหคลิกปุม Install เพื่อเริ่มการติดตังไดรเวอร ้
(3.1.2.5) ทดสอบเปดโปรแกรมโดยเลือกทีเมนู ่ Start > All Programs > Wiring > Wiring1.0 SE จากนั้นครูหนึ่งหนาตางของซอฟตแวร Wiring 1.0 จะปรากฏขึ้น
จากนี้ซอฟตแวร Wiring 1.0 พรอมสําหรับการพัฒนาโปรแกรมแลว
4
ตั วแปลงสัญญาณ UCON-232S
แผงวงจรหลักทีติ่ ดตั้ ง Display-io หรือ Display-Motor
แผงวงจรหลักทีติ่ ดตั้ง Display-io หรือ Display-Motor
สายสัญญาณ CX-4
เครืองโปรแกรม ่ PX-400
เครืองโปรแกรม ่ PX-400
รูปที่ 1 การเชื่อมตออุปกรณเพือปรั ่ บปรุงแผงวงจรหลัก IPST-MicroBOX (ก) กรณีใชเครืองโปรแกรม ่ PX-400 ตองตอผานตัวแปลง UCON-232S และจายไฟดวยอะแดปเตอร (ข) กรณีใชเครืองโปรแกรม ่ PX-4000 และตองจายไฟดวยอะแดปเตอรเชนกัน
3.2 เชื่อมตออุปกรณ (3.2.1) เชือมต ่ ออุปกรณดังรูปที่ 1 โดยตองเสียบแผงวงจร Display-io หรือ Display-Motor ลง บนแผงวงจรหลักของ IPST-MicroBOX (3.2.2) คลิกที่ Start > All Programs > Wiring 1.0 IPST-SE > IPST-MicroBOX > IPST plusplus Upgrade Utility เพือรั ่ นโปรแกรม IPST ++ Upgrade Utility จะปรากฏหนาตางของโปรแกรมตามรูป
5
(3.2.3) จายไฟใหกับบอรด IPST-MicroBOX (3.2.4) ตรวจสอบพอรต USB serial port ที่เกิดจากตัวแปลง UCON-232S หรือจากเครื่อง โปรแกรม PX-4000 ควรมีตําแหนงไมเกิน COM4 ถาเกินตองทําการแกไขใหไมเกิน COM4 (ดูราย ละเอียดการเปลี่ยนตําแหนงพอรต USB serial port จากคูมือของ IPST-MicroBOX เลมที่ 1) (3.2.5) ตรวจสอบไฟแสดงสถานะ READY ของเครื่องโปรแกรม PX-400 ตองติดสวาง สวน กรณีใชเครื่องโปรแกรมรุน PX-4000 สังเกตไฟแสดงผลตองเปนสีเขียว (3.2.6) คลิกปุม Re-Detect IPST-MicroBOX เพือกํ ่ าหนดใหเกิดการเชือมต ่ อระหวางโปรแกรม IPST ++ Upgrade Utility กับเครื่องโปรแกรมและแผงวงจรหลัก IPST-MicroBOX หากการเชือมต ่ อ ถูกตองที่หนาตางหลักของโปรแกรมจะมีปุม Upgrade to IPST-PlusPlus สีสมเกิดขึ้น
(3.2.7) คลิกปุม Upgrade to IPST-PlusPlus แลวรอสักครู ซอฟตแวรจะทําการปรับปรุงเฟรมแวร ของชิปไมโครคอนโทรลเลอร ATmega16 บนแผงวงจรหลักของ IPST-MicroBOX ในขันตอนนี ้ อาจใช ้ เวลาประมาณ 1 ถึง 2 นาที ในระหวางนีไฟแสดงสถานะของเครื ้ องโปรแกรมจะเป ่ นสีแดง
6
(3.2.8) เมื่อการโปรแกรมโคดเพื่อปรับปรุงเฟรมแวรเสร็จสิ้น ไฟแสดงสถานะของเครื่ อง โปรแกรมจะกลับมาเปนสีเขียว ที่จอ LCD แสดงขอความ IPST++ upgrade completed..
และที่หนาตางของโปรแกรมแสดงขอความแจงการอัปเกรดหรือปรับปรุงเฟรมแวร เสร็จสมบูรณ เปนอันเสร็จสิ้นการปรับปรุงแผงวงจรหลัก
หลังจากนีแผงวงจรหลั ้ กของ IPST-MicroBOX ทีติ่ ดตังแผงวงจร ้ Display-io หรือ Display-Motor จะถูกเรียกชือทางฮาร ่ ดแวรใหมสําหรับซอฟตแวร Wiring 1.0 IPST-SE วา IPST++ หรือ IPST plusplus
7
4. การเชื่อมตอกับคอมพิวเตอรหลังจากปรับปรุงแผงวงจรแลว หลังจากปรับปรุงแผงวงจรหลักของ IPST-MicroBOX แลว จะกําหนดเปนชือใหม ่ วา IPST++ จะตองเชื่อมตอกับคอมพิวเตอรผานพอรตอนุกรม (COM) ดวยสาย CX-4 เพี่อใชในการอัปโหลด โปรแกรมและสื่อสารขอมูลกับซอฟตแวร Wiring 1.0 IPST-SE ดังนั้นจึงตองติดตังแผงวงจร ้ Displayio หรือ Display-Motor เสมอ หากคอมพิวเตอรที่ใชงานมีเฉพาะพอรต USB จะตองใชตัวแปลงสัญญาณ USB เปน RS-232 ซึงในชุ ่ ดกลองสมองกล IPST-MIcroBOX ไดเตรียมไวใหแลว นั่นคือแผงวงจร UCON-232S โดยเสียบ UCON-232S เขากับพอรต USB ของคอมพิวเตอร แลวตอสาย CX-4 เขาที่ UCON-232S สวนปลายอีก ดานของสาย CX-4 ตอเขาที่จุดตอแจกโมดูลารบนแผงวงจร Display-io หรือ Display-Motor
สิ่งที่ตองเตรียมเพิ่มอีกหนึ่งอยางคือ แหลงจายไฟ แนะนําใหใชอะแดปเตอรที่มากับชุด IPSTMicroBOX หรือใชแบตเตอรี่ AA 5 กอน (สูงสุดถึง 8 กอน) บรรจุลงในกะบะถาน AA แบบ 5 กอนที่ มากับชุด IPST-BOT หลังจากปรับปรุงฮารดแวรเปน IPST++ แลว เครื่องโปรแกรม PX-400 และ PX-4000 ก็จะไม ตองใชอี กตอไป นอกจากต องการลบหรื อปรั บปรุงเฟร มแวรในตัวชิปไมโครคอนโทรลเลอร ATmega16 ใหมอีกครัง้ หรือเมือต ่ องการกลับไปพัฒนาโปรแกรมดวย AVR Studio และใช AVR Prog ในการโปรแกรมหนวยความจําภายในตัวไมโครคอนโทรลเลอรดวยกระบวนการเดิม
8
5. การทดสอบ (5.1) เปดซอฟตแวร Wiring 1.0 IPST-SE (5.2) เชื่อมตอ IPST++ เขากับคอมพิวเตอร (5.3) พิมพโปรแกรมทดสอบดังนี้ แลวบันทึกชือไฟล ่ เปน ipstTest.pde #include <ipst.h>
// include file for IPST-SE
void setup() { lcd("Welcome to #nWiring 1.0"); } void loop() {}
(5.4) ไปที่เมนู Tools > Board > IPST plusplus ATmega16@16MHz เพื่อเลือกฮารดแวรที่ เชื่อมตอกับซอฟตแวร Wiring 1.0
(5.5) เลือกพอรตเชือมต ่ อ โดยไปที่เมนู Tools > Serial Port > COMxx (ปกติมีคามากกวา COM3 ตรวจสอบไดที่ Control Panel > System > Device Manager > Ports) ตามตัวอยางเปน COM3
9
(5.6) กําหนดใหแผงวงจร IPST++ เขาสูโหมดโปรแกรม โดย (5.6.1) กดสวิตช RESET คางไว แลวกดสวิตช SW1 ตาม (5.6.2) ปลอยสวิตช RESET แลวปลอยสวิตช SW1 ทันทีที่ปลอยสวิตช SW1 แผงวงจร IPST++ จะเขาสูโหมดโปรแกรม
ทุกครั้งที่ตองการอัปโหลดโปรแกรมลงบนแผงวงจร IPST++ จะตองกด สวิตชตามขันตอนนี ้ ้กอนเสมอ (5.7) อัปโหลดโปรแกรม (การสงโคดลงไปยังแผงวงวจรเปาหมายของซอฟตแวร Wiring 1.0 เรียกวา การอัปโหลด - upload ซึ่งตางจากซอฟตแวรอื่นๆที่มักเรียกวา การดาวนโหลด) โดยคลิกที่ปุม หรือเลือกที่เมนู File > Upload to Wiring hardware หรือกดคีย Ctrl + U
10
(5.8) ซอฟตแวร Wiring จะทําการคอมไพล หากไมผิดพลาดจะทําการอัปโหลดโคดไปยังแผง วงจร IPST++ เมื่ออัปโหลดเสร็จสิ้นจะแสดงขอความ Done Uploading
(5.9) ที่จอ LCD ของแผงวงจร IPST++ แสดงขอความ Welcome to Wiring 1.0
หากไดตามนี้แสดงวา แผงวงจร IPST++ พรอมใชงานกับซอฟตแวร Wiring 1.0 แลว (5.10) หากการอัปโหลดลมเหลว จะแสดงหนาตางและมีขอความแจงเตือนดังนี้
11
สาเหตุที่ 1 : แผงวงจรหลักยังอยูในโหมดรัน ทางแกไข - ตองเลือกใหแผงวงจร IPST++ เขาสูโหมดโปรแกรม โดยกดสวิตช RESET คางไว แลวกดสวิตช SW1 คางไวตาม แลวปลอยสวิตช RESET จากนั้นจึงปลอยสวิตช SW1 สาเหตุที่ 2 : แผงวงจรหลักไมทํางานเนื่องจากไมมีไฟเลี้ยง ทางแกไข - ตอไฟเลียงให ้ แกแผงวงจรหลัก จากนันกดสวิ ้ ตช RESET และ SW1 บนแผงวงจรหลัก IPST++ เพื่อเขาสูโหมดโปรแกรม
เพื่อให เครื่องมือและอุปกรณอยูในสภาพที่พรอมทํางานตลอดเวลา สิ่งที่ควรกระทําทุกครั้งที่ใชงาน ชุดกลองสมองกลคือ (1) ปดสวิตช POWER ทุกครั้งที่มีการถอดหรือตอสายเขากับคอมพิวเตอรและชุดโปรแกรม (2) ปดสวิตช POWER ทุกครังที ้ ่มีการตอหรือปลดสายของแผงวงจรตรวจจับสัญญาณหรืออุปกรณใดๆ เขากับแผงวงจรหลัก (3) หลังจากทีทดลองเสร็ ่ จ ควรปดสวิตชกอนทีจะทํ ่ าการปลดสายสัญญาณเพือต ่ อแผงวงจรใหมเขาไป (4) ไมควรปลดหรือตอสายสัญญาณของแผงวงจรใดๆ เขาไปในแผงวงจรหลักในขณะกําลังทํางาน เวน แตมีขันตอนการปฏิ ้ บัติอืนใดที ่ ระบุ ่ เจาะจงวาตองสายสัญญาณในขณะทํางานของการทดลองนันๆ ้ (5) หากมีความผิดพลาดใดๆ เกิดขึน้ ตองปดสวิตชจายไฟทันที (6) ไมใชอะแดปเตอรไฟตรงที่มีแรงดันขาออกเกิน +12V กับแผงวงจหลัก (7) หลังจากเสร็จสิ้นการทดลอง ใหปลดสายเชื่อมตอคอมพิวเตอรและสายของอะแดปเตอรหรือแหลง จายไฟออกจากแผงวงจรหลักเสมอ
13
ในบทนีนํ้ าเสนอขอมูลในขันต ้ นของ Wiring ซึงเป ่ นเครืองมื ่ อทางซอฟตแวรสําหรับพัฒนาการ ทํางานของชุ ดกล องสมอง IPST-MicroBOX ที่ ทําการปรั บปรุ งเป น IPST++ โดยมีขั้นตอน ของกระบวนการในการพัฒนาโปรแกรมดวยซอฟตแวร Wiring สําหรับกลองสมองกล IPSTMicroBOX ทีปรั ่ บปรุงแลวดังรูปที่ 1-1 ติดตั้งซอฟตแวร - Wiring 1.0 ซอฟตแวรเขียนโปรแกรมภาษา C/C++ - ไดรเวอร USB ของแผงวงจรหลัก IPST-SE ----------------------------------------------
ตรวจสอบชองเชื่อมตอคอมพิวเตอร ของแผงวงจร IPST++ - เชื่อมตอแผงวงจร IPST++ เขากับพอรต USB - เลือกเปด Control panel > System > Hardware > Device Manager > Ports ดูที่หัวขอ USB serial port (COMx) - จําตําแหนงของ USB serial port (COMx) โดย x เปนตัวเลข ใดๆ ปกติมีคามากกวา 3 เพื่อเลือกชองติดตอสือ่ สารระหวาง คอมพิวเตอรกบั แผงวงจร IPST++
เตรียมการสรางโปรแกรมควบคุม 1. เปดซอฟตแวร Wiring 1.0 SE สรางไฟลใหม 2. เลือกชนิดของแผงวงจร ทีเ่ มนู Tools > Board > IPSTplusplus > ATmega16@16MHz 3. เลือกชองตอคอมพิวเตอร ที่เมนู Tools > Serial port > COMx โดย x เปนเลขใดๆ ไดมาจากการตรวจสอบตําแหนงที่ Device manager
เขียนโปรแกรมภาษา C/C++ แลวบันทึกไฟล คอมไพล อัปโหลดโปรแกรม โปรแกรมที่แผงวงจร IPST++ เริม่ ทํางาน
รูปที่ 1-1 แผนภาพแสดงขันตอนและกระบวนการเรี ้ ยนรูเพื อใช ่ งานชุดกลองสมองกล IPST-MicroBOX ดวยซอฟตแวร Wiring 1.0 IPST-SE เริมจากด ่ านซาย ตั้งแตการติดตั้งโปรแกรม และการตรวจสอบ การเชือมต ่ อ ระหวางแผงวงจรควบคุมกับคอมพิวเตอร ไลมาทางขวา เริมจากขั ่ นตอนเตรี ้ ยมการสราง โปรแกรมควบคุม, เขียนโปรแกรม, คอมไพลหรือการแปลโปรแกรมภาษา C เปนภาษาเครื่อง, อัปโหลดหรือสงโปรแกรมไปยังแผงวงจร IPST++ จากนันจึ ้ งทําการรันโปรแกรมเพือตรวจสอบการทํ ่ างาน
14
รูปที่ 1-2 หนาตางหลักของซอฟตแวร Wiring IDE ทีใช ่ ในการพัฒนาโปรแกรม
1.1 สวนประกอบของ Wiring IDE Wiring IDE ประกอบดวย 2 สวนทีสํ่ าคัญคือ เท็กซเอดิเตอร (text editor) และ ตัวแปลภาษา C (C compiler) ดานเครืองมื ่ อหรือปุมคํ าสังที ่ ช่ วยในการพัฒนาโปรแกรมก็มีหลากหลาย สรุปดังรูปที่ 1-2
1.1.1 แถบเมนูคําสั่ง : Menu bar ประกอบดวย File, Edit, Sketch, Tools และ Help menu
15
1.1.1.1 เมนู File
New (Ctrl+N) : สรางไฟลใหม ซึ่งในซอฟตแวร Wiring จะเรียกวา สเก็ตช (sketch) โดยจะ ถูกตั้งชื่อเปนวันที่ปจจุบันในรูปแบบ sketch_YYMMDDa เชน sketch_080407a หรือคลิกปุม บนแถบเครืองมื ่ อก็ได Open (Ctrl+O) : เลือกเปดไฟลสเก็ตช หรือคลิกปุม
บนแถบเครื่องมือก็ได
Close (Ctrl+W) : เลือกปดไฟลสเก็ตช Save (Ctrl+S) : บันทึกไฟลสเก็ตชที่เปดอยูในชือเดิ ่ ม ทํางานเหมือนกับการคลิกที่ปุม บนแถบเครื่องมือ Save as... (Ctrl+Shift+O) : บันทึกไฟลสเก็ตชที่เปดอยูในชือใหม ่ ไฟลเดิมจะไมหายไป Upload to Wiring hardware (Ctrl+U) : สงขอมูลของไฟลสเก็ตชในปจจุบันไปยังฮารดแวร Wiring I/O ปกติแลวการทํางานในลักษณะนี้มักจะเรียกวา ดาวนโหลด (donwload) แตสําหรับใน ซอฟตแวร Wiring จะเรียกกระบวนการทํางานนี้วา การอัปโหลด (upload) ทํางานเหมือนกับการคลิ กที่ปุม บนแถบเครื่องมือ Preferences : ปรับแตงการทํางานของ Wiring IDE Quit (Ctrl+Q) : ออกจากโปรแกรม Wiring และปดหนาตางของโปรแกรม Wiring ทั้งหมด
16
1.1.1.2 เมนู Edit เปนเมนูที่บรรจุคําสังต ่ างๆ ที่ใชในการแกไขไฟลสเก็ตชที่พัฒนาบน Wiring IDE
Undo (Ctrl+Z) : ยกเลิกการกระทําคําสังก ่ อนหนานี้หรือที่พิมพลาสุด การยกเลิกคําสัง่ Undo ทําไดโดยเลือก Edit > Redo Redo (Ctrl+Y) : กลับไปทําคําสังที ่ ทํ่ ากอนหนาคําสัง่ Undo คําสังนี ่ จะใช ้ ไดก็ตอเมือได ่ ทําการ Undo ไปแลว Cut (Ctrl+X) : ลบและคัดลอกขอความที่เลือกไปเก็บที่คลิปบอรด ซึ่งทําหนาที่เปนหนวย ความจําชั่วคราวสําหรับพักขอมูล Copy (Ctrl+C) : คัดลอกขอความที่เลือกไปเก็บที่คลิปบอรด Paste (Ctrl+V) : วางขอมูลทีอยู ่ ในคลิ ปบอรดไปยังตําแหนงทีกํ่ าหนดหรือแทนทีข่ อความทีเลื ่ อก Select All (Ctrl+A) : เลือกตัวหนังสือหรือขอความทังหมดในไฟล ้ ทีกํ่ าลังเปดอยูในเท็ กซเอดิเตอร ในขณะนัน้ Find (Ctrl+F) : คนหาขอความภายในไฟลทีเป ่ ดอยูในเท็ กซเอดิเตอร นอกจากนียั้ งคนหาและ แทนที่ดวยขอความอื่นได Find Next (Ctrl+G) : คนหาขอความหรือคําตัวถัดไปภายในไฟลที่เปดอยูในเท็กซเอดิเตอร
17
1.1.1.3 เมนู Sketch เปนเมนูคําสังที ่ ่เกี่ยวของกับการคอมไพลไฟลสเก็ตช
Verify/Compile (Ctrl+R) : เปนคําสังคอมไพล ่ โปรแกรม ทํางานเหมือนกับการกดปุม บนแถบเครื่องมือ Import Library : ใชเลือกผนวกไฟลไลบรารีที่ตองการลงในไฟลสเก็ตช Show Sketch Folder : แสดงโฟลเดอรของไฟลสเก็ตชปจจุบัน Add File : เลือกไฟลโปรแกรมที่ตองการเพิ่มลงไปในไฟลสเก็ตช
18
1.1.1.4 เมนู Tools เปนเมนูคําสังที ่ ่เกี่ยวของกับการเลือกใชเครื่องมือชวยในการพัฒนาโปรแกรม คําสังสํ ่ าคัญที่ ควรทราบมีดังนี้
Auto Format : เลือกใหมีการจัดรูปแบบของโคดใหดูเปนระเบียบ Serial Monitor : เลือกเปดการทํางานและแสดงผลของ Serial Monitor Board : ใชเลือกรุนของฮาร ดแวรทีใช ่ กับ Wiring 1.0 ในทีให ่ เลือก IPST PlusPlus, ATmega16 @ 16MHz Serial Port : ใชเลือกตําแหนงของพอรตคอมพิวเตอรทีใช ่ ติดตอกับฮารดแวรจากหัวขอ Board สําหรับแผงวงจร IPST++ โดยปกติมีคาตังแต ้ COM3 ขึ้นไป
Wiring1.0
19
1.1.1.5 Help
Getting Started : เปดหนาตางเกียวกั ่ บการเริมต ่ นเรียนรูและใช งาน Wiring ของเว็บไซต http:/ /wiring.org.co/learning/tutorials/ จะตองตออินเทอรเน็ต หากตองการดูขอมูล Examples : เลือกเปดไฟลสเก็ตชของโปรแกรมตัวอยาง Reference : เปดหนาตาง Reference ของเว็บไซต Wiring ตองตออินเทอรเน็ต หากตองการดูขอมูล Find in Reference (Ctrl+Shift+F) : เลือกขอความในโคดโปรแกรมของคุณ จากนั้นเลือก Help > Find in Reference โปรแกรมจะนําขอความที่เลือกไปคนหาใน reference ถาคนหาไมพบ จะมีขอความเตือนในหนาตางหลักของโปรแกรม Wiring Hardware : เลือกดูขอมูลของฮารดแวร Wiring I/O ผานทางเครือขายอินเทอรเน็ต Troubleshooting : เปดหนาตางการแกไขปญหาในการใชงาน Wiring ของเว็บไซต Wiring Visit wiring.org.co (Ctrl+5) : เปดเว็บบราวเซอรเพื่อเยี่ยมชมโฮมเพจของ Wiring ที่ http:// wiring.org.co จะตองตออินเตอรเน็ต หากตองการดูขอมูล About Wiring : แสดงขอมูลลิขสิทธิเกี ์ ่ยวกับซอฟตแวร Wiring
20
1.1.2 แถบเครื่องมือ : Toolbar มีฟงกชันพื ่ ้นฐาน 6 ปุม และการทํางานในขั้นตนดังนี้ Run หรือ Compile ใชในการคอมไพลโคดโปรแกรม New ใชสรางไฟลสเก็ตชใหม (ใน Wiring จะเรียกไฟลทีทํ่ าการพัฒนาวา สเก็ตช (sketch) Open เปดไฟลสเก็ตชที่มีอยู Save บันทึกไฟลสเก็ตชปจจุบันใสในโฟลเดอรของไฟลสเก็ตชที่ทํางานอยู ถาตองการ บันทึกในชืออื ่ ่น ใหเลือกใชคําสัง่ Save As จากเมนู File Upload to Wiring hardware ใชสงไฟลสเก็ตชปจจุบันไปสเก็ตชบุกและอัปโหลด โปรแกรมไปยังฮารดแวร Wiring ในทีนี่ คื้ อ แผงวงจร IPST++ (ใน Wiring จะเรียกกระบวนการดาวน โหลดโปรแกรมไปยังฮารดแวรวา อัปโหลด : upload) Serial monitor เปดการเชื่อมตอระหวางแผงวงจร IPST++ กับพื้นที่มอนิเตอรของ Wiring IDE ผานทางพอรตอนุกรมมาตรฐานและพอรตอนุกรมเสมือนที่เกิดจากไดรเวอรของวงจร แปลงสัญญาณพอรต USB เปนพอรตอนุกรมหรือ USB serial port เพื่อดูขอมูลที่สงกลับมาจากแผง วงจร IPST++ ซึ่งมีประโยชนมากในการตรวจสอบการทํางานของโปรแกรม
21
1.1.3 Serial monitor Wiring IDE ไดผนวกเครื่องมือสําหรับแสดงผลและสงขอมูลผานพอรตอนุกรม หรือ USB เพื่อติดตอกับแผงวงจร IPST++ นันคื ่ อ Serial monitor โดยในการเขียนโปรแกรมจะตองบรรจุคําสัง่ Serial.println() ลงในโปรแกรมดวย อยางไรก็ตามกอนการใชคําสั่ง Serial.println()จะตองมีการ กําหนดคาอัตราเร็วในการถายทอดขอมูลหรืออัตราบอดหรือบอดเรต (baud rate) กอน โดยใชคําสัง่ Serial.begin()ซึ่งโดยปกติกําหนดคาเปน 9600 บิตตอวินาที และควรบรรจุคําสัง่ Serial.begin()ให อยูในสวน setup()ของโปรแกรมทุกครั้ง บนแถบเครือง ่ การเรียกใหหนาตาง Serial Monitor ใหทํางาน ทําไดงายมากเพียงคลิกทีปุ่ ม มือ หนาตาง Serial Monitor จะปรากฏขึ้นเพื่อแสดงขอความที่รับมาจากแผงวงจร IPST++ ผานทาง พอรต USB หรือพอรตอนุกรมที่ดานบนของหนาตาง Serial Monitor จะเปนชองสําหรับปอนขอมูล เพื่อสงคาจากโปรแกรมมายังแผงวงจร IPST++
22
1.2 ขั้นตอนการพัฒนาโปรแกรม (1.2.1) ตรวจสอบการติดตังฮาร ้ ดแวรและซอฟตแวรของ Wiring รวมถึงการตังค ้ าของพอรตที่ เชือมต ่ อกับฮารดแวร Wiring I/O ในทีนี่ คื้ อ แผงวงจร IPST++ ของชุดกลองสมองกล IPST-MicroBOX (1.2.2) สรางไฟลใหมดวยการคลิกทีปุ่ ม New บนแถบเครืองมื ่ อหรือเลือกจากเมนู File > New
(1.2.3) พิมพโคดโปรแกรมตอไปนี้ #include <ipst.h> // ผนวกไฟลไลบรารีหลัก "ipst.h" void setup() { lcd("Start C/C++ with #nIPST++ board"); // แสดงขอความเริมต ่ น pinMode(PB1, OUTPUT); // กําหนดใหพอรด PD7 ทํางานเปนเอาตพุต } void loop() { digitalWrite(PB1, HIGH); // สงสัญญาณลอจิก HIGH จากพอรด PB1 ทําให LED ติดสวาง delay(500); // หนวงเวลา 0.5 วินาที digitalWrite(PB1,LOW); // สงสัญญาณลอจิก LOW จากพอรด PB1 ทําให LED ดับ delay(500); // หนวงเวลา 0.5 วินาที }
โปรแกรมนี้ใชในการทดสอบการทํางานเบื้องตนของแผงวงจร IPST++ โดยกําหนดให แสดงขอความที่จอแสดงผลและขับไฟกะพริบ LED 1 ดวงที่จุดตอพอรต PB1
23
ตอเขากับพอรตอนุกรม ของคอมพิวเตอรโดยตรง
สาย CX-4 ปรับความสวางจอแสดงผล ของโมดูล LCD
UCON-232S
ตอสาย CX-4 เขากับ UCON-232S ตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม ในกรณีที่คอมพิวเตอรไมมีพอรตอนุกรม
ตัวตานทาน ปรับคาได KNOB DC input
PORTC
OFF
PA7
PA6
ON
IPST MicroBOX PA4
PA5
GND PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 +5V
SCL
KNOB PA7 LCD
ตอกับพอรต USB ของคอมพิวเตอร
RS-232
SDA
PA0
ATMEGA16
PA2
PA1
+ Vin -
PA3
S t a r t M C / C ++ O w i t h
PD0
PD1
PD7
TxD
PD6
PB4
RxD
PD5
PB2 SW3
PD4
PB0
PB3
SW2
PD3
PB1
SW1 RESET
PD2
I P S T + + y b oa r d o a r d
แผงวงจร Display-io หรือ Display-Motor
แผงวงจรหลัก MicroBOX อยูดานลาง
รูปที่ 1-3การเชือมต ่ อแผงวงจร IPST++ กับคอมพิวเตอรเพือใช ่ งานกับซอฟตแวร Wiring IDE (1.2.4) ไปที่เมนู File เลือกคําสัง่ Save As บันทึกไฟลในชือ่ ipstFirstDemo ตอนนี้จะมีไฟล ipstFirstDemo.pde เกิดขึ้นในโฟลเดอรชือว ่ า ipstFirstDemo
24
(1.2.5) ตรวจสอบการเขียนโปรแกรมดวยการคลิกที่ปุม Run ทีแถบเครื ่ ่องมือหรือเลือกคําสัง่ จากเมนู Sketch > Compile/Verify
หากมีความผิดพลาดเกิดขึ้นจากการคอมไพล จะปรากฏขอความแจงความผิดพลาด ในชองแสดงสถานะและพื้นที่แสดงขอความ ตองทําการแกไขโปรแกรม
หากการคอมไพลถูกตอง ที่ชองแสดงสถานะจะแจงแสดงขอความ Done compiling
(1.2.6) ตอสาย CX-4 เขากับพอรอนุกรมของคอมพิวเตอร หรือตอผานตัวแปลง UCON-232S หากใชงานกับพอรต USB (ดูรูปที่ 1-2 ประกอบ) จากนั้นเปดสวิตชจายไฟเลี้ยง (1.2.7) คลิกที่ปุม Upload to Wiring Hardware บนแถบเครื่องมือ ถาทุกอยางเปนปกติ เมื่อทําการอัปโหลดเสร็จ จะมีขอความแจงที่ชองแสดงสถานะวา Done uploading. RESET to start the new program. และที่พื้นที่แสดงขอความจะแจงกระบวนการและผลคอมไพล รวมถึงขนาดของ ไฟลผลลัพธที่เกิดขึ้น
25
ถามีขอผิดพลาดเกิดขึ้นจะมีขอความแจงในพื้นที่แสดงขอความดานลางของหนาตาง โปรแกรมหลัก
ซึ่งสวนใหญแลวมักเกิดจากการเลือกพอรตอนุกรมไมถูกตอง (1.2.8) หลังจากอัปโหลดโปรแกรมแลว นําแผงวงจร ZX-LED มาตอเขาทีจุ่ ดตอ PB1 เมื่อรัน โปรแกรม แผงวงจรหลัก IPST++ จะทํางานโดยแสดงขอความ Start
C/C++
IPST++
with
board
สวน LED ของแผงวงจร ZX-LED ที่จุดตอ PB1 จะติดดับหรือกะพริบในอัตรา 0.5 วินาทีตอครั้ง ZX-LED
ปรับความสวางจอแสดงผล ของโมดูล LCD
PA4
PA5
GND PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 +5V
SCL
KNOB PA7 LCD
RS-232
SDA
PA2
PA1
PA0
PB1
PB0
PB3
PB2
+ Vin -
PA3
S t a r t M C / C ++ O w i t h I P S T + + y b oa r d o a r d
TxD
PD0
PD1
PD7
PB4
RxD
PD6
SW3
PD5
SW2
PD4
SW1 RESET
PD3
S
S
PD2
ATMEGA16
S
+
IPST MicroBOX
+
PA6
+
DC input
OFF
ON
O
O
O
PA7
+ S
PORTC
+ S + S
26
1.3 ตําแหนงการเก็บไฟลสเก็ตชของ Wiring ผูพั ฒนาโปรแกรมบันทึกไฟลสเก็ตชไวทีใดในพื ่ นที ้ จั่ ดเก็บแฟมขอมูลของคอมพิวเตอรก็ได แต เพืออํ ่ านวยความสะดวกและจดจํางาย Wiring IDE จึงกําหนดคาตังต ้ น (default) ของตําแหนงจัดเก็บ โฟลเดอรของไฟลสเก็ตชที่พัฒนาขึนไว ้ ที่ C:\Documents and Settings\Admin (หรือชื่อผูใช ) \My Documents\Wiring สามารถตรวจสอบรวมถึงกําหนดตําแหนงใหมได โดยไปทีเมนู ่ File > Preference จะปรากฏหนาตาง Preference ขึ้นมาดังรูป หากตองการเปลียนแปลงตํ ่ าแหนงโฟลเดอรทีจั่ ด เก็บไฟลสเก็ตชทีช่ อง Sketchbook location โดยใชเมาสคลิกทีปุ่ มค นหาทางดานขวามือ หรือจะพิมพ ตําแหนงลงไปในชอง Sketchbook location โดยตรงก็ได จากนั้นคลิกปุม OK เพื่อตอบตกลงและ ยืนยันการเปลี่ยนแปลง
สวนพารามิเตอรหรือขอกําหนดอืนๆ ่ แนะนําใหใชตามคาทีกํ่ าหนดมา ทังนี ้ เพื ้ อลดขั ่ นตอนการ ้ พัฒนาโปรแกรมและความผิดพลาดที่อาจเกิดขึ้นไดสําหรับนักพัฒนาโปรแกรมมือใหมหรือผูเริ มต ่ น
27
1.4 ขอกําหนดในการแกไขและบันทึกไฟลสเก็ตช ในกรณีที่ตองการแกไขไฟลสเก็ตชเดิม ตองเปดไฟลสเก็ตชนั้นๆ ขึ้นมา ทําการแกไขโคด โปรแกรม ตรวจสอบไวยกรณดวยการคอมไพล เมื่อเรียบรอยแลว มีทางเลือกในการบันทึกไฟล 2 ทางคือ 1. บันทึกในชือเดิ ่ ม ใหใชคําสัง่ Save 2. บันทึกในชือใหม ่ ดวยคําสัง่ Save As แตไมควรบันทึกทับไฟลสเก็ตชเดิมที่ไมไดถูก เปดขึ้นมา เพราะจะทําใหการเชือมโยงไฟล ่ สับสน และทําใหเกิดความผิดพลาดในการเปดใชงานครัง้ ตอไปได ถาหากมีความตองการบันทึกทับไฟลเก็ตชเดิมทีไม ่ ไดถูกเปดขึนมา ้ จะตองทําการลบโฟลเดอร ของไฟลสเก็ตชนันออกไปเสี ้ ยกอน
28
29
ภาษาที่ ใช ในโปรแกรม Wiring คือภาษา C/C++ และโปรแกรมจะทํางานแบบ C++ บนฮารดแวร Wiring I/O และแผงวงจร IPST++ (ซึ่งก็เปน Wiring I/O แบบหนึ่งที่มีการดัดแปลงให ใชในชุดกลองสมอง IPST-MicroBOX เพื่อนําไปสรางโครงงานและหุนยนต อัตโนมัติ) จุดเดนของ ซอฟตแวร Wiring และการเขียนโปรแกรมดวยภาษา C/C++ คือ ไลบรารีของ Wiring และรูปแบบ ของโปรแกรมจะงายและสามารถใชงานไดโดยไมจําเปนตองเขาใจแนวคิดขั้นสูงเชน คลาส (class), ออบเจ็กต (object) หรือพอยนเตอร (pointer) แตยังสามารถใชฟงกชันเหล ่ านั้ นไดอยู จึงชวยให โปรแกรมสั้นลงและทําความเขาใจไดงายขึ้น
2.1 ภาษา C/C++ ภาษา C/C++ จะเริ่มทํางานที่ฟงกชั่น main() ซึ่งเปนฟงกชันหลั ่ ก เปรียบเทียบรูปแบบของ โปรแกรมภาษา C และ C++ ไดดังนี้ ตัวอยางโปรแกรมในภาษา C #include <stdio.h> int main() { printf(“hello, world\n”); return 0; }
ตัวอยางโปรแกรมในภาษา C++ #include <iostream> // provides std::cout int main() { std::cout << “Hello, world!\n”; }
30
2.2 รูปแบบโปรแกรมภาษา C/C++ ใน Wiring ใน Wiring มีฟงกชันหลั ่ ก 2 ฟงกชันคื ่ อ setup() และ loop() โดยไมตองเขียนฟงกชัน่ main() ขึน้ เองเพราะ wiring จะสรางฟงกชัน่ main() ให โดยภายในฟงกชัน่ main() ทีสร ่ างขึนจะมี ้ โครงสรางดังนี้ int main() { setup(); for(;;) { loop(); } return 0; }
// เรียกฟงกชัน่ setup() ขึนมาทํ ้ างาน // เรียกฟงกชัน่ loop() ขึนมาทํ ้ างาน
ใน Wiring ผูพั ฒนาโปรแกรมไมตองเขียนฟงกชัน่ main() แตจะทําการแกไขเฉพาะฟงกชัน่ setup() และ loop() ซึ่งจําเปนตองมี setup()และ loop() ทุกครั้งที่เขียนโปรแกรมใน wiring
2.2.1 ฟงกชันหลั ่ กของโปรแกรมภาษา C/C++ ใน wiring ในรูปที่ 2-1 แสดงไดอะแกรมการทํางานของฟงกชันหลั ่ กในโปรแกรมของ Wiring Start
ทํางานใน สวนของ setup()
ทํางานใน สวนของ loop()
รูปที่ 2-1 โฟลวชารตแสดงการทํางานของฟงกชันหลั ่ กในโปรแกรมภาษา C/C++ ของ Wiring ซึงประกอบ ่ ดวย setup() และ loop()
31
2.2.1.1 setup() setup() คือฟงกชั่นที่จะทํางานเพียงครั้งเดียวหลังจากโปรแกรมเริ่มทํางาน จึงมักใชในการ กําหนดคาคงทีหรื ่ อประกาศตัวแปรหลักของโปรแกรม
2.2.1.2 loop() loop() คือฟงกชันที ่ ่จะทํางานวนซํ้าหลายครั้ง จะเริ่มทํางานหลังจากทํางานในฟงกชันsetup() ่ เสร็จสิ้นลง ทั้ง setup() และ loop() เปนฟงกชันที ่ ไม ่ มีการคืนคา (void) และเปนฟงกชันที ่ ่ไมมีพารามิเตอร ตัวอยางที่ 2-1 int ledPin = PB1; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
// LED เชื่อมตอกับแผงวงจร IPST++ ที่จุดตอ PB1
// กําหนดใหทํางานเปนขาพอรตเอาตพุต
// ตังค ้ าให LED สวาง // รอเพื่อให LED สวางคางไวประมาณ1วินาที // ตังค ้ าให LED ดับ // รอเพื่อให LED ดับคางไวประมาณ1วินาที
ตัวแปรทีทํ่ าการประกาศใหใชงานเฉพาะในฟงกชัน่ setup() จะไมสามารถใชงานไดในฟงกชัน่ loop() และเชนเดียวกันตัวแปรที่ทําการประกาศในฟงกชัน่ loop() จะไมสามารถใชงานไดในฟงกชัน่ setup() หากตองการใหตัวแปรที่กําหนดใชงานไดในทั้ง 2 ฟงกชั่น ทําไดโดย ประกาศตัวแปรเปน global declaretion นั่นคือ การประกาศตัวแปรระบบ เชน การประกาศ int ledPin = 48 ที่บรรทัดแรก
2.2.2 การใชเซมิโคลอน ; คําสังของโปรแรมภาษา ่ C/C++ จะมีสัญลักษณ ; หรือเซมิโคลอน (semicolon) ตอทายทุกครั้ง ตัวอยางที่ 2-2 int y;
32
2.2.3 การใชวงเล็บปกกา {} (เคอรลีเบรซเซส : curly braces) {} หรือวงเล็บปกกาใชเพือบอกจุ ่ ดเริมต ่ นและจุดสินสุ ้ ดของฟงกชันและสเตตเมนต ่ ซึงอาจมี ่ ได หลายบรรทัด เชน โครงสรางของ for() และ () หรืออาจใชในการใหคาเริมต ่ นแกตัวแปรอะเรย (array) ตัวอยางที่ 2-3 int[] a = { 5, 20, 25, 45, 70 };
2.2.4 การเขียนคอมเมนต (comment) หรือคําอธิบายโปรแกรม คอมเมนตคือขอความที่ไมเกี่ยวของกับโคด อาจเปนขอความที่ผูพัฒนาโปรแกรมเขียนเพื่อ ความเขาใจของตัวเอง หรือใชในการอธิบายการทํางานของโปรแกรมในแตละบรรทัดหรือแตละ ยอหนา คอมไพเลอรจะไมแปลหรือตีความใดๆ ในสวนของคอมเมนต การเขียนคอมเมนตในโปรแกรมภาษา C/C++ มี 2 แบบ คือ // comment
เปนการเขียนคอมเมนตหนึงบรรทั ่ ด
/* comment */
เปนการเขียนคอมเมนตหลายบรรทัด
2.2.5 ไดเร็กตีฟ #include ใชผนวกไฟลไลบรารีเขากับโปรแกรมในไฟลสเก็ตช ไดเร็กตีฟ #include นี้มักถูกเขียนไว บรรทัดบนสุดของโปรแกรมเสมอ รูปแบบ : #include <ชื่อlibaryทีต่ องการinclude> ตัวอยางที่ 2-4 #include <ipst_lcd.h> // เพื่อใหสามารถใชคําสังเกี ่ ่ยวกับโมดูล LCD ได
หมายเหตุ
#include เปนไดเร็กตีฟ จึงไมตองลงทายดวยเซมิโคลอนหรือ ;
33
2.3 ขอมูลและตัวแปร 2.3.1 การประกาศตัวแปร ในการเรียกใชงานขอมูลจําเปนตองมีตัวแปรมาเก็บขอมูลนัน้ ซึงต ่ องมีการประกาศตัวแปรกอน จึงใชงานได โดยปกติมักประกาศตัวแปรไวดานบนสุดของฟงกชันหรื ่ อตอนตนของโปรแกรม ตัวแปร ทีถู่ กประกาศในฟงกชันหนึ ่ งจะไม ่ สามารถเรียกใชไดในอีกฟงกชันหนึ ่ ง่ ตัวแปรชนิดเดียวกันสามารถ ประกาศพรอมกันหลายๆ ตัวได โดยใชเครื่องหมาย , เปนตัวแยก สรุปชนิดของตัวแปรที่ใชในโปรแกรมภาษา C/C++ ใน Wiring ดังนี้ ชนิดของตัวแปร int unsigned int long unsigned long char unsigned char float double boolean byte
คําอธิบาย เก็บตัวแปรชนิดตัวเลขทีไม ่ มีจุดทศนิยม เก็บตัวแปรชนิดตัวเลขทีไม ่ มีจุดทศนิยม เก็บตัวแปรชนิดตัวเลขทีไม ่ มีจุดทศนิยม เก็บตัวแปรชนิดตัวเลขทีไม ่ มีจุดทศนิยม เก็บตัวแปรชนิดตัวอักษร เก็บตัวแปรชนิดตัวอักษร เก็บตัวแปรชนิดตัวเลขทีมี่ จุดทศนิยม เก็บตัวแปรชนิดตัวเลขทีมี่ จุดทศนิยม เก็บตัวแปรชนิด boolean หรือ จริง (true) และ เท็จ (false) เก็บตัวแปรชนิด byte
รูปแบบ : datatype var; โดยที่ datatype คือ ชนิดของตัวแปรจะขึนอยู ้ กั บชนิดของขอมูลทีตั่ วแปรนันเก็ ้ บคา เชน int, float, char var คือ ชื่อของตัวแปร ซึงมี ่ กฏในการตั้งชือตั ่ วแปรดังนี้ (1) ชื่อตัวแปรสามารถใชตัวอักษรหรือตัวเลขหรือเครื่องหมายสัญประกาศ (เครื่องหมายขีดเสน ลาง_ หรือ under scroll) ในการตั้งชือได ่ แตตองขึนต ้ นดวยตัวอักษรภาษาอังกฤษ หรือเครื่องหมายสัญประกาศเทานัน้ (2) ชือตั ่ วแปรไมสามารถเวนวรรคไดและหามมีเครืองหมายต ่ างๆ ยกเวนเครืองหมายสั ่ ญประกาศ ในชือตั ่ วแปร เชน $, %, *, @, +, - ,/, ^ เปนตน (3) ตัวอักษรพิมพใหญและพิมพเล็กมีความแตกตางกัน (case-sensitive) (4) ชือตั ่ วแปรหามเปนคําสงวน เชน begin, end, if เปนตน
ตัวอยางที่ 2-5 int x; char a,b,c;
// ประกาศตัวแปร x เปนตัวแปรชนิดตัวเลขจํานวนเต็ม // ประกาศตัวแปร a, b และ c เปนตัวแปรชนิดตัวอักษร
34
2.3.2 การกําหนดคาใหตัวแปร การกําหนดคาใหตัวแปรทําไดโดยใชเครืองหมาย ่ = (assignment operator) ซึงจะกํ ่ าหนดคาใหตัว แปรไดก็ตอเมือชนิ ่ ดขอมูลและชนิดของตัวแปรนันเป ้ นชนิดเดียวกัน เชน ถาขอมูลเปน interger ตัวแปร ก็ควรจะเปนชนิด interger ดวย การกําหนดคาใหตัวแปรอาจทําพรอมกับการประกาศตัวแปรก็ได รูปแบบ : var = value; โดยที่ value คือ ขอมูลที่จะใหตัวแปรนันเก็ ้ บคา var คือ ชือของตั ่ วแปรที่ตองการจะใหคา
ตัวอยางที่ 2-6 int x = 10; // ประกาศตัวแปร x เปนตัวแปรชนิดตัวเลขจํานวนเต็ม มีคาเริมต ่ นเทากับ 10 x = 20; // กําหนดใหคาตัวแปร x เทากับ 20 หมายเหตุ : ในการประกาศตัวแปรควรกําหนดคาตัวแปรดวยทุกครังเพื ้ ่อปองกันความผิดพลาดของโปรแกรม
2.3.3 ชนิดของขอมูล ในภาษาC/C++มีชนิดของขอมูลอยูหลายแบบดังตอไปนี้
2.3.3.1 int คือขอมูลที่เปนตัวเลขที่ไมมีจุดทศนิยม ขนาดขอมูลที่ตัวแปรชนิด int เก็บไดคือ 32,767 ถึง 32,768 โดยจะเก็บเปนขอมูลขนาด16 บิต ตัวอยางที่ 2-7 int x = 23;
// ประกาศตัวแปร x เปนตัวแปรชนิดตัวเลขจํานวนเต็ม มีคาเริมต ่ นเทากับ 23
2.3.3.2 unsigned int คือขอมูลทีเป ่ นตัวเลขทีไม ่ มีจุดทศนิยมและไมคิดเครืองหมาย ่ ขอมูลทีตั่ วแปรชนิดนีเก็ ้ บไดคือ 0 ถึง 65,535 โดยเก็บเปนขอมูลขนาด16 บิต ตัวอยางที่ 2-8 unsigned int y = 1024; // ประกาศตัวแปร y เปนตัวแปรชนิดตัวเลขจํานวนเต็มไมคิดเครื่องหมาย มีคาเริมต ่ นเทากับ 1024
35
2.3.3.3 long คือชนิดขอมูลที่เปนตัวเลขจํานวนเต็มขนาด 32 บิตแบบคิดเครื่องหมาย ขอมูลที่เก็บไดคือ -2,147,483,648 ถึง 2,147,483,647 ตัวอยางที่ 2-9 long x = 10;
// ประกาศตัวแปร x เปนตัวแปรชนิด long แบบคิดเครื่องหมาย มีคาเริมต ่ นเปน 10
2.3.3.4 unsigned long คือชนิดขอมูลทีเป ่ นตัวเลขจํานวนเต็ม 32 บิตแบบไมคิดเครืองหมาย ่ มีคา 0 ถึง 4,294,967,295 ตัวอยางที่ 2-10 unsigned long y = 1024; // ประกาศตัวแปร y เปนตัวแปรชนิด long แบบไมคิดเครื่องหมาย มีคาเริมต ่ นเทากับ 1024
2.3.3.5 float คือชนิดขอมูลทีเป ่ นตัวเลขทศนิยมขนาด 32 บิต แบบคิดเครืองหมาย ่ เลขทศนิยมมักใชในการ ประมาณคาของอะนาลอกและคาที่ตอเนื่อง เพราะใหคาที่มีความละเอียดและแมนยํามากกวาขอมูล แบบจํานวนเต็ม int ขอมูลที่เก็บไดคือ -3.4028235 x 10+38 ถึง +3.4028235 x 10+38 ตัวอยางที่ 2-11 float x = 2.5;
// ประกาศตัวแปร x เปนตัวแปรชนิดเลขทศนิยมแบบคิดเครืองหมาย ่ มีคาเทากับ 2.5
2.3.3.6 double 10+38
คือชนิดขอมูลทีเป ่ นตัวเลขทศนิยม 64 บิตแบบไมคิดเครืองหมาย ่ มีคา 0 ถึง 1.7976931348623157 x ตัวอยางที่ 2-12 double y = 10.75; // ประกาศตัวแปร y เปนตัวแปรชนิดทศนิยมไมคิดเครื่องหมาย มีคาเทากับ 10.75
2.3.3.7 char คือชนิดขอมูลที่เปนตัวอักษรเชน A, d, และ $ ในรูปแบบ Unicode มีขนาด 1 ไบตหรือ 8 บิต เขียนไดโดยใช ‘ หรืออัญประกาศเดี่ยวหรือซิงเกิลโคต (single quote) ครอมขอมูล ขอมูลชนิด char จะถูกเขารหัสเปนรหัสแอสกี้ (ASCII) มีคาเปนตัวเลขระหวาง -128 ถึง 127 ตัวอยางที่ 2-13 char x = ‘a’;
// ประกาศตัวแปร x เปนตัวแปรชนิดตัวอักษร มีคาเทากับรหัสแอสกีของอั ้ กษร a
36
2.3.3.8 unsigned char คือชนิดขอมูลที่เปนตัวอักษรเชนเดียวกับ char แตคาของขอมูลจะเปนแบบไมคิดเครื่องหมาย จึงมีคาในชวง 0 ถึง 255 ตัวอยางที่ 2-14 unsigned char y = ‘b’; unsigned char z = 200;
// ใหคาตัวแปร z มีคาเริมต ่ นเปน 200
2.3.3.9 byte คือชนิดขอมูลขนาด 8 บิต เก็บคาเปนตัวเลขระหวาง 0 ถึง 255 ชนิดขอมูลแบบนี้มักนําไปใช กับตัวแปรสําหรับรับสงขอมูลจากพอรตอนุกรม (หรือ USB serial port : พอรต USB ที่ทํางานเปน พอรตอนุกรมเสมือน) และแสดงตัวอักษรในรูปแบบที่งายกวาขอมูลชนิด char ตัวอยางที่ 2-15 byte x = 128;
// ประกาศตัวแปร x ที่มีขนาด 8 บิต มีคาเริมต ่ นเทากับ 128
2.3.3.10 boolean คือ ชนิดขอมูลทีมี่ คาเปนจริงและเท็จ ปกติขอมูลชนิด boolean จะใชควบคุมคําสังที ่ ่ใชในการ ตัดสินใจการทํางานของโปรแกรม คาของขอมูลมี 2 คาคือ จริง (true) และ เท็จ (false) ตัวอยางที่ 2-16 boolean x = true; boolean y = false;
37
2.4 อะเรย (Array) อะเรยคือชุดของขอมูล โดยขอมูลนั้นจะเปนชนิดใดก็ได แตในอะเรยชุดเดียวกัน ชนิดของ ขอมูลตองเหมือนกันทั้งชุด ขอมูลแตละคาจะถูกเรียกดวยเลขดัชนี (index) โดยขอมูลแรกสุดคือ [0] ขอมูลถัดมาคือ [1] และเรียกตอกันไป
2.4.1 การประกาศตัวแปรอะเรย การประกาศตัวแปรอะเรย (array) คลายกับการประกาศตัวแปรทัวไป ่ แตตางกันที่ array จะตอง มีเครืองหมาย ่ [ ] ตอทายชือตั ่ วแปรทุกครังเพื ้ อบอกว ่ าตัวแปรนีเป ้ นตัวแปรชนิด array เรามักจะประกาศ ตัวแปร ชนิด array ไวดานบนสุดของฟงกชันหรื ่ อตอนตนของโปรแกรมเชนเดียวกับตัวแปรทั่วไป และตัวแปรชนิด array ทีถู่ กประกาศในฟงกชันหนึ ่ งจะไม ่ สามารถเรียกใชไดในอีกฟงกชันหนึ ่ งเช ่ นกัน การกําหนดคาใหตัวแปรอาจทําพรอมกับการประกาศตัวแปรก็ได โดยขอมูลตองอยูใน { } และแยก แตละขอมูลดวยเครื่องหมาย , รูปแบบ : datatype var[element]; โดยที่ datatype คือ ชนิดขอมูลที่จะใหตัวแปรนันเก็ ้ บคา var คือ ชื่อของตัวแปร element คือจํานวนขอมูลที่เก็บในตัวแปร อาจไมระบุก็ได
ตัวอยางที่ 2-17 float data[5]; char string[]; char string1[7] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘!’, ‘\0’}; // ประกาศตัวแปรชือ่ string1 มีคาเปน hello! char string2[] = “hello there!”; // ประกาศตัวแปรชือ่ string2 มีคาเปน hello there! int numbers[] = { 90, 150, 30 }; // ประกาศตัวแปรชือ่ numbers ซึงเป ่ นตัวแปรชนิด array // โดย numbers[0] มีคาเปน 90, numbers[1] มีคาเปน 150 และ numbers[2] มีคาเปน 30
จากตัวอยางตัวแปรชนิด char สามารถกําหนดใหเปนอะรเยได โดยเรียกวา ชุดตัวอักษร (ขอความ) หรือสายอักขระหรือ string
38
2.4.2 การอานคาจากตัวแปรชนิดอะเรย การอานคาจากตัวแปรชนิดนีต้ องทําทีละตําแหนง ยกเวนการอานคาขอมูลจากอะเรยบางชนิด เชน char สามารถอานไดหลายตําแหนงพรอมกัน ถาตัวแปอะเรยชุดหนึงมี ่ n ขอมูล ตัวแปรชุดนีจะมี ้ คาดัชนีหรือ index ตังแต ้ 0 ถึง n-1 เชน ตัวแปร numbers[3] จะมี 3 ขอมูล และมี index เปน 0 ถึง 2 หากตองการอานคาตัวแปรอะเรย ในตําแหนงที่ n จะตองแทนคาของ index ดวย n-1 โดย n คือขนาดของอะเรย รูปแบบ : var[index] โดยที่ var คือ ชือของตั ่ วแปรอะเรย index คือ ตําแหนงของตัวแปรในชุดตัวแปรอะเรยที่ตองการอานขอมูล
ตัวอยางที่ 2-18 int numbers[3] = { 90, 150, 30 }; // ประกาศตัวแปรชือ่ numbers เปนตัวแปรอะเรย 3 ชุด int x= numbers[1]; // ประกาศตัวแปร x และกําหนดใหมีคาเทากับขอมูลที่ 2 ของ // ตัวแปร numbers ซึ่งเทากับ 150 เนืองจาก ่ index คือ 1
2.4.3 การกําหนดคาใหตัวแปรอะเรย การกําหนดคาใหตัวแปรอะเรยทําไดโดยใชเครื่องหมาย = เชนเดียวกับตัวแปรทั่วไปซึ่งจะ กําหนดคาใหไดก็ตอเมือชนิ ่ ดขอมูลและชนิดของตัวแปรเปนชนิดเดียวกัน รูปแบบ : var[index] = value; โดยที่ var คือ ชือของตั ่ วแปรชนิด array index คือ ตําแหนงของตัวแปรในชุดตัวแปรชนิด array ที่ตองการเก็บขอมูล value คือ ขอมูลที่ตองการเขียนหรือเก็บคา
ตัวอยางที่ 2-19 int numbers[3]; void setup() { numbers[0] = 90; numbers[1] = 150; numbers[2] = 30; } void loop() {}
// ประกาศตัวแปรชือ่ numbers เปนตัวแปรอะเรย 3 ชุด // กําหนดใหตัวแปร numbers ชุด 0 มีคาเทากับ 90 // กําหนดใหตัวแปร numbers ชุด 1 มีคาเทากับ 150 // กําหนดใหตัวแปร numbers ชุด 2 มีคาเทากับ 30
39
2.5 ฟงกชันในซอฟต ่ แวร Wiring ในซอฟตแวร Wiring นอกจากฟงกชันหลั ่ ก 2 ตัวคือ setup() และ loop() แลว ผูพั ฒนาโปรแกรม สามารถสรางฟงกชันเพิ ่ ่มเติมขึ้นมาเพื่อใชงานเองได โดยฟงกชันที ่ ่สรางขึนใหม ้ สามารถเรียกใชจาก ฟงกชัน่ setup() และ loop() หรือจากฟงกชันใดๆ ่ ก็ได ฟงกชันใน ่ Wiring แบงออกเปน 2 ประเภทคือ ฟงกชันที ่ ่เมื่อทํางานจบแลวมีการคืนคา และ ฟงกชันที ่ ่เมื่อทํางานจบแลวไมคืนคา (void) เชน setup() และ loop()
2.5.1 ฟงกชันแบบไม ่ คืนคา : void เปนฟงกชันที ่ ไม ่ ตองการตัวแปรมารองรับเวลาเรียกใช และจะไมมีการใชคําสัง่ return รูปแบบ : void function(parameters) { statements; } โดยที่ function คือ ชือของฟ ่ งกชัน่ ใชหลักการตังชื ้ อเหมื ่ อนกับการตังชื ้ อตั ่ วแปร parameters คือ ขอมูลทีทํ่ าการสงผานระหวางฟงกชัน่ ในบางฟงกชันอาจไม ่ มีพารามิเตอรก็ไดหรือ อาจมีหลายพารามิเตอร โดยแยกแตละพารามิเตอรดวยเครื่องหมาย , ในการประกาศฟงกชันในส ่ วนของพารามิเตอร เหมือนกับการประกาศตัวแปร ฟงกชันที ่ มี่ พารามิเตอรเวลาเรียกใชตองใสคาของพารามิเตอรใหถูกตองดวยทุกครัง้ จํานวน และตําแหนงของพารามิเตอรในตอนรับและสงตองตรงกัน statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
ตัวอยางที่ 2-20 void setup() { pinMode(17, OUTPUT); } void loop() { digitalWrite(17, HIGH); }
40
2.5.2 คําสั่งหลักของฟงกชันแบบคื ่ นคา : return return คือ คําสังที ่ ใช ่ ในการสงขอมูลจากฟงกชันหลั ่ งจากจบการทํางาน โดยขอมูลทีส่ งกลับนัน้ ตองเปนชนิดเดียวกับฟงกชันที ่ ประกาศ ่ ถาหากประกาศฟงกชันเป ่ นชนิด void (ฟงกชันชนิ ่ ดไมคืนคา) จะไมสามารถใชคําสัง่ return ในการสงคาได นอกจากนีคํ้ าสัง่ return ยังใชในการหยุดการทํางานของ ฟงกชันเพื ่ อไม ่ ใหโปรแกรมทํางานในสวนทีเหลื ่ อแลวกลับมายังตําแหนงที่เรียกใชงานฟงกชัน่ รูปแบบ : type function(parameters) { statements; return value; } โดยที่ type คือ ชนิดของฟงกชันซึ ่ ่งดูจากชนิดขอมูลที่ทําการ return ในที่นีคื้ อ value ชนิดของฟงกชัน่ จึงเหมือนกับชนิดตัวแปร function คือ ชือของฟ ่ งกชันใช ่ หลักการตังชื ้ อเหมื ่ อนกับการตังชื ้ อตั ่ วแปร parameters คือ ขอมูลที่ทําการสงผานระหวางฟงกชัน่ statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่ value คือ ขอมูลที่ฟงกชันจะทํ ่ าการคืนคาหลังจากจบการทํางาน
ตัวอยางที่ 2-21 int val = 30; //global declaretion void setup() { Serial.begin(9600); } void loop() { int t = timestwo(val); Serial.println(t); } int timestwo(int dVal) { dVal = dVal * 2; return dVal; } จากตัวอยางฟงกชัน่ timestwo เปนฟงกชันที ่ ่คืนคาเปนเลขจํานวนเต็ม มีพารามิเตอรคือ dVal ซึงเป ่ นตัว แปรชนิด int ดังนันเมื ้ อเรี ่ ยกใชฟงกชัน่ timestwo ที่ฟงกชันloop() ่ จึงมีการสงขอมูลที่เปนชนิด int มาดวย
ตัวแปรที่ทําการประกาศในฟงกชันหนึ ่ ่งจะไมสามารถใชงานไดในอีกฟงกชันหนึ ่ ่ง หากตอง การใหตัวแปรใชงานไดในทั้งสองฟงกชัน่ ทําไดโดยประกาศตัวแปรเปน global นั่นคือ การประกาศ ตัวแปรนอกฟงกชันใดๆ ่ เชน การประกาศ val ดังในตัวอยางที่ 2-21
41
2.6 การทําซํา(Iteration) ้ การกระทําคําสังต ่ างๆ (statement) ภายในบล็อก {} ซํ้าๆ อยางมีเงื่อนไข จะเรียกวา ลูป (loop) คําสังที ่ ่ใชเพื่อการวนลูปคือ for() และ while()
2.6.1 while() while() เปนคําสังที ่ ่ใชสรางลูป การทํางานของ while() จะกระทําคําสังต ่ างๆ หรือ statement ตอเนืองไปเรื ่ อยๆ ่ และวนทําซําต ้ อเนืองจนกว ่ าจะพบการตรวจสอบเงือนไข ่ (expression) แลวเปนจริง ควรจะมีการกําหนดคาเวลาหรือจํานวนของการวนลูป มิเชนนั้นอาจทําใหโปรแกรมจะไมมีวันออก จากลูป while() รูปแบบ : while(expression) { statements; } โดยที่ expression คือ เงือนไขในการตรวจสอบว ่ าจะทําในสวนของสเตตเมนต (statement) หรือไม statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
ตัวอยางที่ 2-22 int i = 0; void setup() { while(i<5) { i++; } j=i; // j จะมีคาเปน 4 } void loop() {}
การใชลูป while() ควรระวังเรืองเงื ่ อนไข ่ เพราะอาจทําใหโปรแกรมไมมีวันออกจากลูป (break out) ดังนั้นลูป while() เหมาะสําหรับการวนลูปที่ไมรูจํ านวนรอบแนชัด
42
2.6.2 for() for() เปนคําสังที ่ ่ใชสรางลูป โครงสรางของคําสัง่ for() มี 3 สวนคือ คาเริ่มตน (init), ตรวจ สอบ (test) และปรับปรุง (update) แตละสวนแบงแยกกันดวยเซมิโคลอน (semi-colon) ; ลูปจะทําซํา้ ตอเนื่องจนกวาผลการตรวจสอบจะออกมาเปนเท็จ ขั้นตอนการทํางานของลูป for() สรุปไดดังนี้ (1) ทํางานในสวนของคาเริ่มตน (init statement) (2) ตรวจสอบคา (test) วา เปนจริงหรือเท็จ (3) ถาเปนจริง จะทํางานตอในขั้นตอน (4) แตถาเปนเท็จจะทํางานในขั้นตอน (6) (4) ทํางานในสวนของสเตตเมนตภายในบล็อก {} (5) ทํางานในสวนของการรปรับปรุงคา (update) แลวกลับไปทํางานในขันตอน ้ (2) อีกครัง้ (6) ออกจากลูป รูปแบบ : for(init; test; update) { statements; } โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operator) และตัวถูกดําเนินการ(operand) init คือ สเตตเมนตที่ทํางานในตอนเริมต ่ นของลูป test คือ ถาผลตรวจสอบออกมาเปนจริง จะทํางานในสวนของ statements update คือ คําสังที ่ ่ตองกระทําเมื่อวนลูปครบหนึงรอบ ่ statements คือ คําสังที ่ ่ตองกระทํา เมื่อผลการตรวจสอบออกมาเปนจริงในแตละรอบ
ตัวอยางที่ 2-23 int i; void setup() { for(i=0; i<10; i=i+1) { digitalWrite(i, HIGH); } } void loop() {}
ดังนั้นลูป loop for() จึงเหมาะสําหรับการวนทํางานที่ทราบจํานวนรอบอยางแนชัด
43
2.6.3 break break เปนคําสั่งที่ใชจบการทํางานของลูป เชน switch(), for(), และ while() จากนั้นจะขาม ไปกระทําคําสังที ่ ่ถัดไปจากนั้น break เปนคําสังที ่ ่หยุดการทํางานของลูปตางๆ เชน for() และ while() แมวาเงือนไขของลู ่ ปจะยังเปนจริงอยูก็ตาม รูปแบบ : break; ตัวอยางที่ 2-24 int i=0; int j; void setup() { while(i<5) { i++; break; } j=i;
// j จะมีคาเปน 1
} void loop() {}
นอกจากนั้น break ยังเปนสวนหนึ่งของคําสัง่ switch() ซึ่งจะอธิบายในสวนถัดไป
44
2.7 เงื่อนไข (Conditionals) การตัดสินใจของโปรแกรมเกิดจากการตรวจสอบเงื่อนไข ฟงกชันที ่ ่ใชในการตัดสินใจหรือ ตรวจสอบเงื่อนไขประกอบดวย switch() และ if()
2.7.1 if...else if() เปนคําสังที ่ ใช ่ ในการตรวจสอบเงือนไข ่ (expression) ถาหากวา ตรวจสอบเงือนไขแล ่ วเปนจริง จะทําคําสังต ่ างๆ (statement) ทีอยู ่ ในบล็ อก {} ของ if() หากเปนเท็จจะไมทําคําสังที ่ อยู ่ ในบล็ อก {} ของ if() ถาหากมีคําสัง่ else รวมดวย โปรแกรมจะเลือกทําคําสังต ่ างๆทีอยู ่ ในบล็ อก {} ของ else โปรแกรม ของคุณอาจมีหรือไมมีในสวนของ else ก็ได ขึนอยู ้ กั บจํานวนของเงือนไขที ่ ต่ องการตรวจสอบ รูปแบบ : if(expression) { statements; } else { statements; } โดยที่ expression คือ เงือนไขในการตรวจสอบว ่ า จะใหกระทําคําสังในส ่ วนของ statement หรือไม statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
ขอควรรู : else ตองใชรวมกับ if() เสมอ แต if() ไมจําเปนตองมี else ก็ได หากตองการตรวจสอบมากกวาหนึ่งเงื่อนไข ใหใชคําสัง่ else if() เพื่อเพิ่มเงื่อนไขอื่นๆ อาจ จะมีการใช else if() มากกวา 1 ครั้งได เมือต ่ องการใชคําสัง่ else จะตองกําหนดไวอยูท ายสุด และโปรแกรมจะทํางานในสวนของ else ก็ตอเมือตรวจสอบเงื ่ อนไขทั ่ ้งหมดแลวพบวา เปนเท็จทั้งหมด ดังนี้ รูปแบบ : if(expression) { statements; } else if(expression) { statements; } else { statements; } โดยที่ expression คือ เงือนไขในการตรวจสอบว ่ าจะกระทําคําสังในส ่ วนของ statement หรือไม statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
45
ตัวอยางที่ 2-25 char letter = ‘b’; void setup() { Serial.begin(9600); if(letter==‘a’) { Serial.println(“Alpha”); } else if(letter==‘b’) { Serial.println(“Bravo”); } else { Serial.println(“None”); } } void loop() {}
// ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 // โปรแกรมจะไมทํางานในสวนนี้ // แสดงขอความ Bravo ใน Serial Monitor ทํางาน // โปรแกรมจะไมทํางานในสวนนี้
2.7.2 switch switch() เปนคําสังที ่ ่ใชในการตัดสินใจเชนเดียวกับ if() โดย switch() เหมาะสําหรับการตัดสิน ใจที่มีทางเลือก 3 ทางขึนไป ้ โดยตัดสินใจจากการตรวจสอบขอมูลในสวนเงื่อนไข (expression) วา ตรงกับขอกําหนด (label) ในกรณี (case) ใด จากนั้นจะกระโดดไปทํางานในสวนนั้นทันที แตละ case ถูกแบงออกจากกันดวยคําสัง่ break ดังนั้นเมื่อจบการทํางานใน caseนั้นๆ แลวจะออกจาก switch() ทันที ไมทํา caseอื่นๆ อีก เมื่อมีการใชคําสัง่ switch() โปรแกรมจะตรวจสอบตั้งแต case แรกจนถึง case สุดทาย หาก ขอมูลในสวนเงื่อนไขไมตรงกับคาใน case ใดๆ และถาโปรแกรมมีการกําหนดการทํางานในขั้นตน หรือ default โปรแกรมจะทํางานในสวนนั้นแทน โดยในสวนของ default จะมีหรือไมมีก็ได รูปแบบ : switch(expression) { case label: statements; break; default: statements; }
โดยที่ expression คือ ขอมูลหรือตัวแปรทีใช ่ เปนเงือนไขในการตรวจ ่ สอบวาตรงกับขอกําหนดหรือ label ในกรณีหรือ caseใด ขอมูลหรือ ตัวแปรที่ใชตองเปนขอมูลชนิด byte, char หรือ int label คือ ขอมูลทีใช ่ ในการเปรียบเทียบ ควรเปนขอมูลชนิดเดียว กับขอมูลหรือตัวแปรที่ใชเปนเงื่อนไข statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
46
ตัวอยางทื่ 2-26 char letter = ‘b’; void setup() { Serial.begin(9600); switch(letter) { case ‘a’: case ‘A’: Serial.println(“Alpha”); break; case ‘b’: case ‘B’: Serial.println(“Bravo”); break; default: Serial.println(“None”); break; } } void loop() { }
// ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600
// โปรแกรมจะไมทํางานในสวนนี้
// แสดงขอความ Bravo ใน Serial Monitor ทํางาน // โปรแกรมจะไมทํางานในสวนนี้
จากตัวอยาง จะเห็นไดวา คําสัง่ case สามารถตรวจสอบไดมากกวาหนึ่งคาพรอมๆ กัน ในที่นี้ คือ ‘a’ และ ‘A’ เพราะในการเขียนโปรแกรมภาษา C/C++ นั้นเปนแบบ case-sensitive คือ ใหความ สนใจในตัวพิมพใหญและตัวพิมพเล็ก
47
2.8 ตัวดําเนินการทางคณิตศาสตร( Mathemetic Operators) ตัวดําเนิ นการทางคณิตศาสตรใชการคํานวณทางคณิตศาสตรในโปรแกรมภาษา C/C++ ของซอฟตแวร Wiring มีดังนี้ สัญลักษณ ชือ่ +
บวก (addition)
-
ลบ (minus)
%
หารเอาเศษ (modulo)
+=
บวกแลวเก็บคาไวทีตั่ วตัง(add ้ assign)
-=
ลบแลวเก็บคาไวทีตั่ วตัง(subtract ้ assign)
/
หาร (divide)
*
คูณ (multiply)
++
เพิ่มคา (increment)
--
ลดคา (decrement)
2.8.1 + บวกคา (Addition) รูปแบบ : value1 + value2
โดยที่ value1 เปนขอมูลชนิด int หรือ float value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-27 int a = 50 + 5; int b = a + 5;
// คาของ a คือ 55 // คาของ b คือ 60
2.8.2 - ลบคา (minus) รูปแบบ : value1 - value2 ตัวอยางที่ 1-28 int c = 50 - 5; int d = c - 5; int e = d - 60;
โดยที่ value1 เปนขอมูลชนิด int หรือ float value2 เปนขอมูลชนิด int หรือ float // คาของ c คือ 45 // คาของ d คือ 40 // คาของ e คือ -20
48
2.8.3 * คูณคา (multiply) รูปแบบ : value1 * value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int, float, byte หรือ char
ตัวอยางที่ 2-29
int e = 50 * 5; int f = e * 5;
// คาของ e คือ 250 // คาของ f คือ 1250
2.8.4 / หารคา (divide) รูปแบบ : value1 / value2 โดยที่ value1 เปนขอมูลชนิด int หรือ float value2 เปนขอมูลชนิด int หรือ float แตตองไมเทากับ 0
ตัวอยางที่ 2-30 int g = 50 / 5; int h = g / 5;
// คาของ g คือ 10 // คาของ h คือ 2
2.8.5 % คํานวณหาเศษของการหาร (modulus) รูปแบบ : value1 % value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int
ตัวอยางที่ 2-31
int a = 20%100; int b = 75%100;
// คาของ a คือ 20 // คาของ b คือ 75
2.8.6 += บวกแลวเก็บคาไวทีตั่ วตั้ง (add assign) ลักษณะการทํางานของคําสังนี ่ คื้ อ รูปแบบ : value1 += value2;
a+=b มีคาเหมือนกับ a = a + b
โดยที่ value1 เปนขอมูลชนิด int หรือ float value2 สามารถเปนขอมูลชนิดใดก็ได แตตองเปนชนิดเดียวกับ value1
ตัวอยางที่ 2-32 int a = 50; int b = 23; a += b;
// คาของ a คือ 73
49
2.8.7 - = ลบแลวเก็บคาไวทีตั่ วตั้ง (subtract assign) ลักษณะการทํางานของคําสังนี ่ ้คือ a - = b มีคาเหมือนกับ a = a - b รูปแบบ : value1 -= value2; โดยที่ value1 และ value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-33 int a = 50; int b = 23; a -= b; // คาของ a คือ 27
2.8.8 ++ เพิมค ่ า (increment) เปนคําสังเพิ ่ ่มคาตัวแปรขึ้นหนึ่งคา ลักษณะการทํางานคือ a++ มีคาเหมือนกับ a = a + 1 รูปแบบ : value++ โดยที่ value เปนขอมูลชนิด int
ตัวอยางที่ 2-34 int a = 0; a++; int b = a;
// คาของ a คือ 0 // คาของ b คือ 1
2.8.9 - - ลดคา (decrement) เปนคําสังลดหรื ่ อลบคาตัวแปรลงหนึ่ง มีลักษณะการทํางานคือ a - - มีคาเหมือนกับ a = a - 1 รูปแบบ : value - โดยที่ value เปนขอมูลชนิด int
ตัวอยางที่ 2-35 int a = 5; a - -; int b = a;
// คาของ a คือ 5 // คาของ b คือ 4
50
2.9 ตัวดําเนินการเชิงเปรียบเทียบ (Relational Operators) ตัวดําเนินการเชิงเปรียบเทียบใชในการเปรียบเทียบคาในซอฟตแวร Wiring มีดังนี้ สัญลักษณ ชือ่ <
นอยกวา (less than)
>=
มากกวาหรือเทากับ (greater than or equal to)
==
เทากัน (equality)
<=
นอยกวาหรือเทากับ (less than or equal to)
>
มากกวา (greater than)
!=
ไมเทากัน (inequality)
โดยใหผลการทํางานเปน จริง (true) หรือ เท็จ (false)
2.9.1 < นอยกวา (less than) เปนคําสังเปรี ่ ยบคานอยกวา หากใช จะคืนคา เปนจริง รูปแบบ : value1 < value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-36 int a = 22; int b = 23; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(a < b) { Serial.print(“variable a is less then variable b “); // แสดงขอความที่หนาตาง Serial Monitor เมื่อคาของ a นอยกวา b } } void loop() {}
51
2.9.2 <= นอยกวาหรือเทากับ (less than or equal to) เปนคําสังเปรี ่ ยบเทียบคานอยกวาหรือเทากับระหวางคาของตัวแปรสองตัว รูปแบบ : value1 <= value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-37 int a = 22; int b = 23; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(a <= b) { Serial.print(“variable a is less or equal to variable b “); // แสดงขอความที่หนาตาง Serial Monitor เมื่อคาของ a นอยกวาหรือเทากับ b } } void loop() {}
2.9.3 > มากกวา (greater than) เปนคําสังเปรี ่ ยบเทียบคามากกวาระหวางคาของตัวแปรสองตัว รูปแบบ : value1 > value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-38 int a = 5; int b = 13; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(b > a) { Serial.print(“variable b is larger the variable a”); // แสดงขอความที่หนาตาง Serial Monitor เมื่อคาของ a มากกวา b } } void loop() {}
52
2.9.4 >= มากกวาหรือเทากับ (greater than or equal to) เปนคําสังเปรี ่ ยบเทียบคานอยกวาเทากับระหวางคาของตัวแปรสองตัว รูปแบบ : value1 >= value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int หรือ float
ตัวอยางที่ 2-39
int a = 23; int b = 23; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(a >= b) { Serial.print(“variable a is greater or equal to variable b “) // แสดงขอความที่หนาตาง Serial Monitor เมือค ่ าของ a มากกวาหรือเทากับ b } } void loop() {}
2.9.5 = = เทากับ (equality) เปนคําสังเปรี ่ ยบเทียบคาเทากับระหวางคาของตัวแปรสองตัว รูปแบบ : value1 == value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int, float, char, byte, boolean
ตัวอยางที่ 2-40 int a = 23; int b = 23; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(a == b) { Serial.print(“variables a and b are equal”); // แสดงขอความที่หนาตาง Serial Monitor เมื่อคาของ a เทากับ b } } void loop() {}
53
2.9.6 != ไมเทากัน (inequality) เปนคําสังเปรี ่ ยบเทียบคาไมเทากันของตัวแปรสองตัว รูปแบบ : value1 != value2 โดยที่ value1 และ value2 เปนขอมูลชนิด int, float, char, byte, boolean
ตัวอยางที่ 2-41 int a = 22; int b = 23; void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับการสือสารข ่ อมูลอนุกรมเปน 9600 if(a != b) { Serial.print(“variable a is not equal to variable b”); // แสดงขอความที่หนาตาง Serial Monitor เมื่อคาของ a ไมเทากับ b } } void loop() {}
54
2.10 ตัวดําเนินการทางตรรกะ (Logical operators) ตัวดําเนินทางตรรกะใชการคํานวณทางตรรกะ เพื่อตรวจสอบคาของตัวแปรสองคา โดยตัว ดําเนินการทางตรรกะในซอฟตแวร Wiring มีดังนี้ สัญลักษณ || && !
ชือ่ การออร (logical OR) การแอนด (logical AND) การนอต (logical NOT)
2.10.1 || การออร (logical OR) ใชเปรียบเทียบคา 2 คา โดยใหผลลัพธเปนคา true เมือค ่ าของตัวแปรตัวใดตัวหนึงเป ่ นจริง ดังนี้ ตัวแปร 1 true true false false
ตัวดําเนินการ || || || ||
ตัวแปร 2 true false true false
ผลลัพธ true true true false
รูปแบบ : expression1 || expression2 โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ(operands)
ตัวอยางที่ 2-42 boolean x = true; boolean y = false; boolean a,b,c,d; void setup() { a = x || y; b = y || x; c = x || x; d = y || y; } void loop() {}
// a ไดผลเปน true // b ไดผลเปน true // c ไดผลเปน true // d ไดผลเปน false
55
2.10.2 && การแอนด (logical AND) ใชเปรียบเทียบคา 2 คา โดยใหผลลัพธเปนคา true เมื่อคาของตัวแปรทั้งสองเปนจริง ดังนี้ ตัวแปร 1 true true false false
ตัวดําเนินการ && && && &&
ตัวแปร 2 true false true false
ผลลัพธ true false false false
รูปแบบ : expression1 && expression2 โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands)
ตัวอยางที่ 2-43 boolean x = true; boolean y = false; boolean a,b,c,d; void setup() { a = x && y; b = y && x; c = x && x; d = y && y; } void loop() {}
// a ไดผลเปน false // b ไดผลเปน false // c ไดผลเปน true // d ไดผลเปน false
2.10.3 ! กลับคาขอมูล (NOT) ใชกลับคาของขอมูลชนิด Boolean ของตัวแปร คืนคาเปน false ถาคาของตัวแปรเปน true และ คืนคาเปน true ถาคาของตัวแปรเปน false ดังนี้ ตัวดําเนินการ ! !
ตัวแปร true false
ผลลัพธ false true
รูปแบบ : !expression โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ(operands)
56
ตัวอยางที่ 2-44 boolean a = true; boolean b = false; boolean c,d; void setup() { c=!a; d=!b; } void loop() {}
//c มีคาเปน false //d มีคาเปน true
2.11 ตัวดําเนินการระดับบิต (Bitwise operators) ตัวดําเนินการระดับบิตใชในการคํานวณขอมูลระดับบิต โดยตองแปลงคาใหอยูในรู ปของเลข ฐานสองกอน แลวเริ่มคํานวณทีละบิตที่ตรงกันของสองขอมูล สัญลักษณ | |= & &= ^ ~ << >>
ชือ่ การออรระดับบิต (bitwise OR) การออรระดับบิตแลวเก็บไวทีตั่ วตัง(bitwise ้ OR and assign) การแอนดระดับบิต (bitwise AND) การแอนดระดับบิตแลวเก็บไวทีตั่ วตัง้ (bitwise AND and assign) การเอ็กคลูซีฟ-ออรระดับบิต (bitwise XOR) กลับบิต (bitwise one’s complement) เลื่อนบิตไปทางซาย (bitwise bit shift left) เลื่อนบิตไปทางขวา (bitwise bit shift right)
57
2.11.1 | การออรระดับบิต (bitwise OR) เปนคําสังเปรี ่ ยบเทียบบิตขอมูล 2 คา (expression) โดยคืนคาเปน “0” ถาบิตที่เปรียบเทียบทั้ง สองมีคาเปน “0” ทั้งคู นอกนั้นจะคืนคาเปน “1” มีรูปแบบการประมวลผลดังนี้ ตัวแปร 1 1 1 0 0
ตัวดําเนินการ | | | |
ตัวแปร 2 1 0 1 0
ผลลัพธ 1 1 1 0
รูปแบบ : expression1 | expression2 โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-45 unsigned int a = 60; unsigned int b = 13; unsigned int c = 0; c = a | b;
// a มีคาเปน 60 ซึงเท ่ ากับ 0011 1100 ฐานสอง // b มีคาเปน 13 ซึ่งเทากับ 0000 1101 ฐานสอง // c มีคาเปน 61 ซึงเท ่ ากับ 0011 1101 ฐานสอง
2.11.2 |= การออรระดับบิตแลวเก็บคาไวทีตั่ วตั้ง (bitwise OR and assign) เปนการออรบิต 2 บิตแลวนําผลการออรนั้นกลับไปเก็บไวที่ตัวแปรทางซายมือหรือตัวตั้ง รูปแบบ : expression1 |= expression2; โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยาง 2-46 unsigned int a = 60; unsigned int b = 13; a |= b;
// a มีคาเปน 60 ซึ่งเทากับ 0011 1100 ฐานสอง // b มีคาเปน 13 ซึ่งเทากับ 0000 1101 ฐานสอง // a มีคาเปน 61 ซึ่งเทากับ 0011 1101 ฐานสอง
58
2.11.3 & การแอนดระดับบิต (bitwise AND) เปนคําสังที ่ ใช ่ ในการเปรียบเทียบบิตขอมูล 2 คา (expression) โดยคืนคาเปน “1” ถาบิตทีเปรี ่ ยบ เทียบทั้งสองมีคาเปน “1” ทั้งคู นอกนั้นจะคืนคาเปน “0” มีรูปแบบการประมวลผลดังนี้ ตัวแปร 1 1 1 0 0
ตัวดําเนินการ & & & &
ตัวแปร 2 1 0 1 0
ผลลัพธ 1 0 0 0
รูปแบบ : expression1 & expression2 โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-47 unsigned int a = 60; unsigned int b = 13; unsigned int c = 0; c = a & b;
// a มีคาเปน 60 ซึ่งเทากับ 0011 1100 ฐานสอง // b มีคาเปน 13 ซึ่งเทากับ 0000 1101 ฐานสอง // c มีคาเปน 12 ซึงเท ่ ากับ 0000 1100 ฐานสอง
2.11.4 &= การแอนดระดับบิตแลวเก็บคาไวทีตั่ วตั้ง (bitwise AND and assign) เปนการออรบิต 2 บิตแลวนําผลการออรนั้นกลับไปเก็บไวที่ตัวแปรทางซายมือหรือตัวตั้ง ดังนั้น a&=b จึงมีคาเหมือนกับ a=a&b รูปแบบ : expression1 &= expression2; โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-48 unsigned int a = 60; unsigned int b = 13; a &= b;
// a มีคาเปน 60 ซึงเท ่ ากับ 0011 1100 ฐานสอง // b มีคาเปน 13 ซึงเท ่ ากับ 0000 1101 ฐานสอง // a มีคาเปน 12 ซึงเท ่ ากับ 0000 1100 ฐานสอง
59
2.11.5 ^ การเอ็กคลูซีฟ-ออรระดับบิต (bitwise XOR) เปนคําสังที ่ ใช ่ ในการเปรียบเทียบบิตขอมูล 2 คา (expression) โดยคืนคาเปน “1” ถาบิตทีเปรี ่ ยบ เทียบทังสองมี ้ คาตางกันจะคืนคาเปน “1” แตถาหากบิตที่เปรียบเทียบมีคาเหมือนกันจะคืนคาเปน “0” มีรูปแบบการประมวลผลดังนี้ ตัวแปร 1 1 1 0 0
ตัวดําเนินการ ^ ^ ^ ^
ตัวแปร 2 1 0 1 0
ผลลัพธ 0 1 1 0
รูปแบบ : expression1 ^ expression2 โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-49 unsigned int a = 60; unsigned int b = 13; unsigned int c = 0; c = a ^ b;
// a มีคาเปน 60 ซึงเท ่ ากับ 0011 1100 ฐานสอง // มีคาเปน 13 ซึงเท ่ ากับ 0000 1101 ฐานสอง // c มีคาเปน 49 ซึงเท ่ ากับ 0011 0001 ฐานสอง
2.11.6 ~ การกลับบิต (bitwise one’s complement) เปนคําสังที ่ ่ใชในการกลับคาลอจิกของบิตจาก “0” เปน “1” หรือจากบิต “1” เปน “0” โดยจะ กลับทีละบิตของขอมูล (expression) มีรูปแบบการประมวลผลดังนี้ ตัวดําเนินการ ~ ~
ตัวแปร 1 0
ผลลัพธ 0 1
รูปแบบ : ~ expression โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-50 unsigned int value=4; value = ~ value;
// value มีคาเปน 4 ซึงเท ่ ากับ 0000 0100 ฐานสอง // value มีคาเปน 251ซึงเท ่ ากับ 1111 1011 ฐานสอง
60
2.11.7 << และ <<= การเลื่อนบิตไปทางซาย เปนคําสั่งทีใช ่ ในการเลือนบิ ่ ตของขอมูลของตัวแปรหรือ expression1 ไปทางซายทีละบิตตาม จํานวนครั้ง ซึ่งกําหนดโดยคาตัวแปรหรือ expression 2 ที่อยูทางขวามือ และเพิ่มคา 0 ใหกับบิตทาง ขวาสุดหรือบิต LSB (Least Significat Bit) ในทุกครั้งที่เลื่อนบิตไปทางซาย รูปแบบ : expression1 << expression2 เลือนบิ ่ ตไปทางซายตามจํานวนที่กําหนดดวยคาของ expression2
หรือ expression1 <<= expression2; เลือนบิ ่ ตไปทางซายตามจํานวนที่กําหนดดวยคาของ expression2 แลวเก็บผลลัพธลงในตัวตังหรื ้ อตัวแปร ดานซายมือ นันคื ่ อ value <<= shift; มีการทํางานเหมือนกับ value = value << shift; โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-51 unsigned int value=4; unsigned int shift=2; value = value << shift; value <<= shift;
// value มีคาเปน 4 ซึงเท ่ ากับ 0000 0100 ฐานสอง // value มีคาเปน 16 ซึงเท ่ ากับ 0001 0000 ฐานสอง // value มีคาเปน 64 ซึงเท ่ ากับ 0100 0000 ฐานสอง
61
2.11.8 >> และ >>= การเลือนบิ ่ ตไปทางขวา (bitwise bit shift right) เปนคําสั่งที่ใชในการเลื่อนบิตของขอมูลของตัวแปรหรือ expression1 ไปทางขวาทีละบิตตาม จํานวนครั้ง ซึ่งกําหนดโดยคาตัวแปรหรือ expression 2 ที่อยูทางขวามือ และเพิ่มคา 0 ใหกับบิตทาง ซายสุดหรือบิต MSB (Most Significat Bit) ในทุกครั้งที่เลื่อนบิตไปทางขวา รูปแบบ : expression1 >> expression2 เลือนบิ ่ ตไปทางขาวตามจํานวนที่กําหนดดวยคาของ expression2
หรือ expression1 >>= expression2; เลือนบิ ่ ตไปทางขวาตามจํานวนที่กําหนดดวยคาของ expression2 แลวเก็บผลลัพธลงในตัวตังหรื ้ อตัวแปร ดานซายมือ นันคื ่ อ value >>= shift; มีการทํางานเหมือนกับ value = value >> shift; โดยที่ expression คือ การกระทําระหวางตัวดําเนินการ (operators) และตัวถูกดําเนินการ (operands) หรืออาจเปนขอมูล
ตัวอยางที่ 2-52 unsigned int value=4; unsigned int shift=1; value = value >> shift; value >>= shift;
// value มีคาเปน 4 ซึงเท ่ ากับ 0000 0100 ฐานสอง // value มีคาเปน 2 ซึ่งเทากับ 0000 0010 ฐานสอง // value มีคาเปน 1 ซึงเท ่ ากับ 0000 0001 ฐานสอง
62
2.12 คาคงทีใน ่ Wiring ใน wiring มีคาคงที่ตางๆ เพื่อชวยอํานวยความสะดวกในการคํานวณทางคณิตศาสตร ซึ่งคุณ ควรทําความรูจักกอน จะเริ่มเขียนโปรแกรมดังตอไปนี้ คาคงที่
คําอธิบาย
PI
คาคงทีทางคณิ ่ ตศาสตร มีคาประมาณ 3.14159 ใชรวมกับฟงกชันใน ่ การคํานวณตรีโกณมิติ
HALF_PI
คาคงที่ทางคณิตศาสตร มีคาประมาณ 1.57079 ซึงก็ ่ คือ ครึ่งหนึงของ ่ คา PI ใชรวมกับฟงกชั่นในการคํานวณตรีโกณมิติ
TWO_PI
คาคงทีทางคณิ ่ ตศาสตร มีคาประมาณ 6.28318 ซึ่งก็คือสองเทาของ คา PI ใชรวมกับฟงกชั่นคํานวณตรีโกณมิติ
หมายเหตุ : ชือของค ่ าคงที่เหลานี้เปนคําสงวน (reserved word) นําไปตั้งเปนชื่อตัวแปรไมได
2.13 คําสังเพิ ่ มเติ ่ มใน Wiring ที่ #define ไว นอกเหนือไปจากคําสังโครงสร ่ าง (structure) หลักทีเป ่ นไปตามมาตรฐานของโปรแกรมภาษา C/C++ ใน Wiring ยังมีคําสังพิ ่ เศษเพิ่มเติมอีกหลายคําสัง่ ดังนี้
2.13.1 null ใชกําหนดเปนคาวาง หรือหมายถึง ตัวอักษร “วาง” ก็ได เขียนไดทั้ง null และ NULL ตัวอยางที่ 2-53 char str[] = “some characters”; if( str != null) { Serial.print(c); // พิมพขอความ some characters }
63
2.13.2 false ใชกําหนดคาลอจิกเมื่อเปนเท็จ หรือเทากับ “0” ใชกับตัวแปรชนิด boolean เทานั้น ตัวอยางที่ 2-54 boolean b = false; if(b == false) { digitalWrite(17, HIGH); } else { digitalWrite(17, LOW); }
// ถาคาของ b เปนเท็จ // ทําใหขาพอรต 17 เปนลอจิก “1” ถาคาลอจิกของ b เปนเท็จ
2.13.3 true ใชกําหนดคาลอจิกเมื่อเปนจริง หรือมีคาเทากับ “1” ใชกับตัวแปรชนิด boolean เทานั้น ตัวอยางที่ 2-55 boolean b = true; if(b == true) // ถาคาของ b เปนจริง { digitalWrite(PB1, HIGH); // ทําใหจุดตอพอรต PB1 เปนลอจิก “1” ถาคาลอจิกของ b เปนจริง } else { digitalWrite(PB1, LOW); }
2.13.4 INPUT เปนคําสังกํ ่ าหนดใหขาพอรตเปนอินพุตดิจิตอล โดยเขียนคา “0” ไปยังรีจิสเตอรกําหนดทิศทาง ตัวอยางที่ 2-56 pinMode(PB2, INPUT);
// กําหนดใหจุดตอพอรต PB2 เปนอินพุตดิจิตอล
2.13.5 OUTPUT เปนคําสังกํ ่ าหนดใหขาพอรตเปนเอาตพุตดิจิตอล โดยเขียนคา “1” ไปยังรีจิสเตอรกําหนดทิศทาง ตัวอยางที่ 2-57 pinMode(17, OUTPUT);
// กําหนดใหขาพอรตหมายเลข 17 เปนเอาตพุตดิจิตอล
64
2.13.6 LOW เปนคําสังกํ ่ าหนดคาตัวแปรเปนลอจิกตํา่ หรือเทากับ “0” ซึงมี ่ ระดับแรงดันเทากับ 0V และอาจ หมายถึงสถานะปดหรือ OFF ก็ได ตัวอยางที่ 2-58 digitalWrite(17, LOW);
// เขียนคาลอจิกตํ่าไปยังขาพอรต 17
2.13.7 HIGH เปนคําสังกํ ่ าหนดคาตัวแปรเปนลอจิกสูง หรือเทากับ “1” ซึงมี ่ ระดับแรงดัน +5V อาจหมายถึง สถานะ ON ก็ได ตัวอยางที่ 2-59 digitalWrite(17, HIGH);
// เขียนคาลอจิกสูงไปยังขาพอรต 17
2.13.8 CHANGE เปนคําสังกํ ่ าหนดใหเกิดการอินเตอรรัปตจากสัญญาณภายนอก ตัวอยางที่ 2-60 attachInterrupt(0, myFunction, CHANGE); // กําหนดใหไปทํางานที่ myfunction เมือเกิ ่ ดอินเตอรรัปตที่ขาอินพุตอินเตอรรัปตภายนอกชอง 0
2.13.9 FALLING เปนคําสังกํ ่ าหนดใหเกิดอินเตอรรัปตขึ้น เมื่อเกิดการเปลี่ยนแปลงลอจิกสูงเปนตําที ่ ขาอิ ่ นพุต อินเตอรรัปตภายนอก ตัวอยางที่ 2-61 attachInterrupt(0, myFunction, FALLING); // ไปทํางานที่ myfunction เมือเกิ ่ ดอินเตอรรัปตเนื่องจากการเปลี่ยนลอจิกจากสูงเปนตําขึ ่ น้ // ที่ขาอินพุตอินเตอรรัปตภายนอกชอง 0
2.13.10 RISING เปนคําสังกํ ่ าหนดใหเกิดการอินเตอรรัปตขึน้ เมือเกิ ่ ดการเปลียนแปลงลอจิ ่ กตํามาเป ่ นลอจิกสูง ที่ขาอินพุตอินเตอรรัปตภายนอก ตัวอยางที่ 1-62 attachInterrupt(0, myFunction, RISING); // ไปทํางานที่ myfunction เมือเกิ ่ ดอินเตอรรัปตจากการเปลียนลอจิ ่ กตํ่าเปนสูง
65
2.13.11 LSBFIRST เปนคําสังกํ ่ าหนดลําดับของการสงหรือเลื่อนบิตขอมูล โดยกําหนดใหสงบิตนัยสําคัญตําสุ ่ ด หรือ LSB กอน มักใชรวมกับคําสัง่ shiftOut
2.13.12 MSBFIRST เปนคําสั่งกําหนดลําดับของการสงหรือเลื่อนบิตขอมูล โดยกําหนดใหสงบิตนัยสูงสุดหรือ MSB กอน มักใชรวมกับคําสัง่ shiftOut
2.14 พอยนเตอร (Pointer) หรือตัวชีข้ อมูล พอยนเตอร (pointer) คือ ขอมูลหรือตัวแปรชนิดหนึงที ่ ่เก็บคาเพือชี ่ ตํ้ าแหนงของหนวยความ จํา จะตองกําหนดชนิดของพอยนเตอรทุกครังที ้ ทํ่ าการประกาศเชนเดียวกับขอมูลทัวไป ่ ซึงชนิ ่ ดขอมูล ของพอยนเตอรตองเปนชนิดเดียวกับขอมูลที่ใชเก็บคาซึ่งใชในการชีตํ้ าแหนงของหนวยความจํา
2.14.1 การประกาศตัวแปร pointer คลายกับการประกาศตัวแปรทั่วไป ตางกันที่ชนิดของ pointer จะตองมีเครื่องหมาย * ตอทาย ทุกครั้ง เรามักจะประกาศตัวแปร pointer ไวดานบนสุดของฟงกชันหรื ่ อตอนตนของโปรแกรมเชน เดียวกับตัวแปรทัวไป ่ และตัวแปร pointer ทีถู่ กประกาศในฟงกชันหนึ ่ งจะไม ่ สามารถเรียกใชไดในอีก ฟงกชันหนึ ่ ่งเชนกัน รูปแบบ : datatype* var; โดยที่ datatype คือ ชนิดขอมูลที่เก็บคาตําแหนงของหนวยความจํา var คือ ชือของตั ่ วแปร pointer
2.14. 2 การอานคาจากตัวแปร pointer การอานคาจากตัวแปร pointer ตองทําทีละตําแหนง ยกเวนการอานคาขอมูล pointer บางชนิด เชน char สามารถใชไดหลายตําแหนงพรอมกัน รูปแบบ : var[index] โดยที่ var คือ ชื่อของตัวแปรpointer index คือ ตําแหนงของตัวแปรในชุดตัวแปร pointer ที่ตองการอานขอมูล
66
2.14.3 การกําหนดคาให pointer การกําหนดคาใหตัวแปร pointer ทําได 2 แบบคือ การกําหนดคาแอดเดรสใหตัวแปร pointer และการกําหนดคาใหกับหนวยความจําในตําแหนงที่ pointer ชี้ (1) การกําหนดคาแอดเดรสใหตัวแปร pointer รูปแบบ : var = value; หรือ
var = &variable; โดยที่ var คือ ชือของตั ่ วแปร pointer value คือ คาแอดเดรสหรือตําแหนงของหนวยความจําที่ตองการใหตัวแปร pointer ชี้ variable คือ คาแอดเดรสของหนวยความจําของตัวแปร variable ที่ตองการใหตัวแปร pointer ชี้ เมื่อนําเครืองหมาย ่ & มาไวหนาตัวแปร จะเปนการกําหนดหรือเลือกกําหนดคาแอดเดรสของตัวแปรนัน้
(2) กําหนดคาใหกับหนวยความจําในตําแหนงที่ pointer ชี้ ทําไดโดยนําเครื่องหมาย * ไวหนาชื่อของตัวแปร pointer กอน เพื่อบอกวา คาทีจะ ่ กําหนดเปนขอมูลทีต่ องนําไปเก็บไวทีตํ่ าแหนงดังกลาว โดยใชเครื่องหมาย = เพื่อกําหนดคาเชนเดียว กับตัวแปรทัวไป ่ และจะกําหนดคาใหตัวแปรไดก็ตอเมือชนิ ่ ดขอมูลและชนิดของตัวแปร pointer เปน ชนิดเดียวกัน เชน ถาขอมูลเปน interger ตัวแปร pointer ก็ตองเปนชนิด interger ดวย รูปแบบ : *var = value; โดยที่ var คือ ชือของตั ่ วแปร pointer value คือ ขอมูลทีจะเก็ ่ บลงในแอดเดรสของหนวยความจําที่ pointer ชี้
2.15 โอเวอรโหลด (Overload) เปนความสามารถที่มีอยูใน C++ โดยการโอเวอรโหลดคือ การประกาศชื่อฟงกชั่นหลายๆ ฟงกชันเป ่ นชื่อเดียวกันได โดยมีพารามิเตอรที่แตกตางกันอาจเปนขนาดหรือชนิดของขอมูล แตทุก ฟงกชันต ่ องคืนคาเปนขอมูลชนิดเดียวกัน โดยโปรแกรมจะทราบวาเรากําลังเรียกใชฟงกชันใดได ่ จาก พารามิเตอรขณะเรียกใชงาน บางครังฟ ้ งกชันที ่ มี่ การโอเวอรโหลด อาจทําใหเกิดความผิดพลาดเนืองจากความไม ่ ชัดเจนของ ชนิดขอมูลทีเป ่ นพารามิเตอรทําใหโปรแกรมไมสามารถตัดสินใจไดวาควรเรียกใชฟงกชันใด ่
67
2.16 โปรแกรมเชิงวัตถุ (Object-Oriented Programming : OOP) สิ่งที่ทําใหที่ภาษา C++ แตกตางจากภาษา C ก็คือ ภาษา C++ สามารถเขียนโปรแกรมเชิงวัตถุ หรือ Object-Oriented Programming (OOP) ได ดังนั้นภาษา C++ จึงมีคลาส (Class) และความสามารถ ตางๆ ของคลาส เชน การสืบทอด (Inheritance) และการแกไข (override) ซึงเป ่ นสิงสํ ่ าคัญทีทํ่ าใหภาษา C++ สามารถเขียนโปรแกรมแบบ OOP ได ดังนั้น การเขียนโปรแกรมใน Wiring จึงสามารถรองรับ การเขียนโปรแกรมในลักษณะ OOP ได ในที่นี้ขออธิบายขอมูลเบื้องตนที่ควรทราบเกี่ยวกับโปรแกรมเชิงวัตถุหรือ OOP เพื่อใชเปน ขอมูลอางอิงในขั้นตนสําหรับการเขียนโปรแกรม OOP ใน Wiring
2.16.1 คลาส (Class) คลาสในภาษา C++ คือขอบเขต (encapsulation) ที่ครอบคลุมขอมูลและฟงกชันที ่ ่ใชในการ จัดการขอมูลนัน้
2.16.1.1 ขอมูลและตัวแปรในคลาส ขอมูลทีเป ่ นสมาชิกของคลาสสามารถเปนชนิดใดก็ได และสามารถประกาศเปนพอยนเตอรได อีกดวย คลาสจะเปนเหมือนตัวแปรตัวหนึ่งหรือที่เราเรียกวา ออบเจ็กต (object)
2.16.1.2 ฟงกชันในคลาส ่ ฟงกชันที ่ ่สามารถประกาศภายในคลาสไดมี 3 ชนิดคือ 1. ฟงกชันทั ่ ่วไป 2. Constructor เปนฟงกชันที ่ ่ใชกําหนดคาเริ่มตนใหกับออบเจ็กต เปนฟงกชันพิ ่ เศษที่ จะมีชือเดี ่ ยวกับชือคลาสสามารถโอเวอร ่ โหลดไดไมจํากัดภายในคลาส ซึ่งแบงตามพารามิเตอรที่ตาง กัน Constructor จะไมมีการคืนคาใดๆ การสรางฟงกชันแบบ ่ Constructor มีขอกําหนดดังนี้ 2.1 ตองมีชือเดี ่ ยวกับคลาส 2.2 ตองไมมีการคืนคาใดๆ 2.3 constructor จะถูกเรียกขึ้นมาเปนอันดับแรกเมื่อมีการสรางออบเจ็กตของ คลาส การกําหนดคาเริ่มตนตางๆ เชน การประกาศสมาชิกในคลาสและการจองพื้นที่หนวยความจํา
68
3. Destructor คือฟงกชันที ่ ่ใชในการทําลายออบเจ็กต เปนฟงกชันพิ ่ เศษเชนเดียวกับ Constructor ซึ่งมีชือเดี ่ ยวกับชือคลาส ่ แตจะขึ้นตนดวยเครื่องหมาย ~ โดย Destructor จะไมมีการคืน คาใดๆ และจะถูกเรียกเมื่อออบเจ็กตของคลาสนั้นๆ สิ้นสุดการทํางาน
2.16.2 ระดับการเขาถึงขอมูลและฟงกชัน่ คลาสใน C++ มีการกําหนดระดับการเขาถึงที่สําคัญอยู 3 ระดับคือ Private, Public และ Protected ดังนี้ 1. private คือ การกําหนดใหเขาถึงขอมูลไดโดยฟงกชันที ่ ่เปนสมาชิกของคลาสนั้นๆ 2. protected คือ การกําหนดใหเขาถึงขอมูลไดโดยฟงกชันที ่ เป ่ นสมาชิกของคลาสและ คลาสทีสื่ บทอดจากคลาสนั้นๆ เทานั้น 3. public คือ การกําหนดใหเขาถึงไดโดยสมาชิกอื่นๆ จากภายนอก โดยทั่วไปไมนิยม ประกาศขอมูลไวในสวนนี้
2.16.3 การประกาศคลาส เราจะเรียกใชงานขอมูลไดก็ตอเมื่อมีตัวแปรมาเก็บขอมูลและตองมีการประกาศตัวแปรเสีย กอน เรามักจะประกาศตัวแปรไวดานบนสุดของฟงกชันหรื ่ อตอนตนโปรแกรม ตัวแปรทีถู่ กประกาศ ในฟงกชันหนึ ่ งจะไม ่ สามารถเรียกใชไดในฟงกชันอื ่ น่ ตัวแปรชนิดเดียวกันสามารถประกาศพรอมกัน หลายตัวได โดยใชเครื่องหมาย , เปนตัวแยก รูปแบบ : class name{ private: statement; protected: statement; public: statement; };
// การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น private // การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น protected // การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น public
โดยที่ name คือ ชือของคลาส ่ ซึงมี ่ กฏในการตั้งชือเช ่ นเดียวกับชือตั ่ วแปร statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
69
ตัวอยางที่ 2-63 class Example_class { private: int x; int y; public: Example_Class() { x = 0; y = 0; } ~Example_Class() {} int Add() { return x+y; } };
// Sample Class for the C++ Tutorial // Data member // Data member // Constructor for the C++ tutorial
// Destructor for the C++ Tutorial
2.16.4 friend ขอมูลตางๆ ทีประกาศเป ่ น private ภายในคลาสจะไมสามารถเขาถึงไดจากฟงกชันที ่ ไม ่ ใชสมาชิก ของคลาสหรือคลาสภายนอก แตใน C++ มีขอยกเวนทีจะยอมให ่ ฟงกชันและคลาสภายนอกเข ่ าถึงขอมูล ทีประกาศเป ่ น private ได โดยประกาศใหฟงกชันและคลาสภายนอกนั ่ นเป ้ น friend ภายในคลาส รูปแบบ : friend class name; หรือ friend type function(parameters);
70
2.16.5 การสืบทอด (inheritance) การสืบทอดคือการสรางคลาสใหมหรือคลาสลูก (derived class) ทีสื่ บทอดจากคลาสทีมี่ อยูแล ว หรือจากคลาสแม (base class) โดยคลาสลูกทีสร ่ างใหมจะไดรับสืบทอดตัวแปรและฟงกชันของคลาสแม ่ มาดวย ยกเวน constructor, destructor, friend ฟงกชันและ ่ friend คลาส นอกจากนัน้ คลาสลูกยังเพิมตั ่ ว แปรและฟงกชันของตั ่ วเองได และแกไขหรือโอเวอรไรด (override) บางฟงกชันของคลาสแม ่ ไดดวย (การแกไขหรือ override เปนการแกไขฟงกชันต ่ างๆ ทีได ่ รับการสืบทอดมาจากคลาสแม โดยฟงกชันดั ่ ง กลาวจะตองมีชือและpพารามิ ่ เตอรเหมือนเดิม) การสืบทอดจะชวยลดเวลาในการเขียนโคดทีซํ่ าซ ้ อนกัน รูปแบบ : class derivedClass : public baseClass { private: statement; // การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น private protected: statement; // การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น protected public: statement; // การประกาศตัวแปรและฟงกชั่นตางๆ ทีเป ่ น public }; โดยที่ derivedClass คือ ชือของคลาสลู ่ กทีต่ องการสรางใหม ซึงมี ่ กฏในการตังชื ้ อเช ่ นเดียวกับชือตั ่ วแปร baseClass คือ ชือของคลาสแม ่ ที่ตองการสืบทอด statement คือ คําสังหรื ่ อฟงกชันต ่ างๆ อาจมีไดหลายคําสัง่
คลาสลูกไมสามารถเขาถึงสมาชิกของคลาสแมที่กําหนดเปน private ได แตเขาถึงสมาชิกของ คลาสแมที่กําหนดเปน protected ได
71
นอกจากคําสังพื ่ ้นฐานที่มีใหใชในภาษา C/C++ แลว ใน Wiring ยังมีฟงกชันและคํ ่ าสังพิ ่ เศษ เพิ่มเติมใหใชที่จะชวยใหเขียนโปรแกรมไดงายขึ้น เชน ฟงกชันในการแปลงข ่ อมูล, ฟงกชันเกี ่ ่ยวกับ ตรีโกณมิติ เปนตน
3.1 ฟงกชันในการแปลงข ่ อมูล (Conversion) ใน Wiring มีฟงกชันที ่ ใช ่ ในการแปลงขอมูลอยู ซึงสามารถเรี ่ ยกใชไดเลยโดยไมตองผนวกหรือ นําเขามาจากภายนอก โดยมีรายละเอียดดังนี้
3.1.1 boolean() ใชในการแปลงขอมูล (value) ใหเปนชนิด boolean รูปแบบ : boolean(value); โดยที่ value คือ ขอมูลชนิด int, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-1 boolean b = boolean(60); boolean a = boolean(0);
// กําหนดให b มีคาเปนจริง (true) // กําหนดให a มีคาเปนเท็จ (false)
3.1.2 byte() ใชในการแปลงขอมูล (value) ใหเปนชนิด byte รูปแบบ : byte(value); โดยที่ value คือ ขอมูลชนิด int, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-2 byte b = byte(260);
72
3.1.3 char() ใชในการแปลงขอมูลใหเปนชนิด char รูปแบบ : char(value); โดยที่ value คือ ขอมูลชนิด int, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-3 char c = char(126);
3.1.4 int() ใชในการแปลงขอมูลใหเปนชนิด integer หรือตัวเลขทีไม ่ มีจุดทศนิยม รูปแบบ : int(value); โดยที่ value คือ ขอมูลชนิด int, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-4 int i = int(245.456);
3.1.5 long() ใชในการแปลงขอมูลใหเปนชนิด long (ไมมีจุดทศนิยม) รูปแบบ : long(value); โดยที่ value คือ ขอมูลชนิด integer, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-5 long i = long(245.456);
3.1.6 float() ใชในการแปลงขอมูลใหเปนชนิด float รูปแบบ : float(value); โดยที่ value คือ ขอมูลชนิด integer, long, float, char, byte หรือ boolean
ตัวอยางที่ 3-6 float f = float(true);
73
3.2 ฟงกชันในการคํ ่ านวณ (Calculation) ใน Wiring มีฟงกชันที ่ ่ใชในการคํานวณ เชน การหาคามากที่สุด, การหาคานอยที่สุด เปนตน ซึงช ่ วยใหเขียนโปรแกรมไดงายขึน้ คําสังเหล ่ านีสามารถเรี ้ ยกใชไดโดยไมตองผนวกไฟลไลบรารีจาก ภายนอก โดยมีรายละเอียดดังนี้
3.2.1 min() เปนคําสังหาค ่ านอยที่สุดในชุดขอมูล ฟงกชันนี ่ จะคื ้ นคาเปนคาทีน่ อยที่สุดของชุดขอมูลที่นํา มาตรวจสอบ สามารถใชกับขอมูลชนิด int หรือ float ขึ้นอยูกับชนิดของขอมูลอินพุต รูปแบบ : min(value1, value2); หรือ
min(value1, value2, value3); โดยที่ value คือ ขอมูลหรือตัวแปรที่ตองการหาคาที่นอยที่สุดซึ่งเปนตัวเลขชนิด int หรือ float
ตัวอยางที่ 3-7 int d = min(5, 9); int e = min(-4, -12); float f = min(12.3, 230.24);
// ผลลัพธที่ไดคือ d = 5 // ผลลัพธที่ไดคือ e = -12 // ผลลัพธที่ไดคือ f = 12.3
3.2.2 max() เปนคําสังหาค ่ าที่มากทีสุ่ ดในชุดขอมูล ฟงกชันนี ่ ้จะคืนคาเปนคาทีมากที ่ สุ่ ดของชุดขอมูลทีนํ่ า มาตรวจสอบ สามารถใชกับขอมูลชนิด int หรือ float ขึ้นอยูกับชนิดของขอมูลอินพุต รูปแบบ : max(value1, value2); หรือ
max(value1, value2, value3); โดยที่ value คือ ขอมูลหรือตัวแปรที่ตองการหาคาที่มากที่สุด ซึงเป ่ นตัวเลขชนิด int หรือ float
ตัวอยางที่ 3-8 int a = max(5, 9); int b = max(-4, -12); float c = max(12.3, 230.24);
// ผลลัพธที่ไดคือ a = 9 // ผลลัพธที่ไดคือ b = -4 // ผลลัพธที่ไดคือ c = 230.24
74
3.2.3 abs() เปนคําสั่งคํานวณหาคาสัมบูรณ (absolute) หรือปริมาณ (magnitude) ของขอมูลตัวเลข ซึ่ง ผลลัพธที่ไดมีคาเปนคาบวกเสมอ ฟงกชันนี ่ ้คืนคาเปนคาสัมบูรณ ซึ่งจะเปนขอมูลชนิด int หรือ float ขึนอยู ้ กับชนิดของขอมูลอินพุต รูปแบบ : abs(value); โดยที่ value คือ ขอมูลหรือตัวแปรที่ตองการหาคาสมบูรณซึงเป ่ นตัวเลขชนิด int หรือ float
ตัวอยางที่ 3-9 int a = abs(153); int b = abs(-15); float c = abs(12.234); float d = abs(-9.23);
// กําหนดให a มีคาเปน 153 // กําหนดให b มีคาเปน 15 // กําหนดให c มีคาเปน 12.234 // กําหนดให d มีคาเปน 9.23
3.2.4 constrain() เปนคําสังจํ ่ ากัดคาของขอมูลใหอยูในขอบเขตของคาสูงสุด (max) และคาตําสุ ่ ด (min) (1) ถาคาของขอมูล (value) มากกวาคาสูงสุด ฟงกชัน่ constrain() จะคืนคาเปนคาทีมากที ่ ่สุด (2) ถาหากคาของขอมูล (value) นอยกวาคาตําสุ ่ ด ฟงกชัน่ constrain() จะคืนคาเปนคาทีน่ อย ที่สุด (min) (3) ถาคาของขอมูล (value) อยูในชวงที่กําหนด ฟงกชัน่ constrain() จะคืนคาเปนคาเดิม ชนิดของขอมูลที่คืนอาจเปนชนิด int หรือ float ขึ้นอยูกับขอมูลอินพุต รูปแบบ : constrain (value, min, max); โดยที่ value คือ ขอมูลหรือตัวแปรที่ตองการจํากัดขอบเขต ซึงเป ่ นตัวเลขชนิด int หรือ float min คือ คาตําสุ ่ ดของขอบเขตขอมูล ซึงเป ่ นตัวเลขชนิด int หรือ float max คือ คาสูงสุดของขอบเขตขอมูล ซึงเป ่ นตัวเลขชนิด int หรือ float
ตัวอยางที่ 3-10 int data = 100; int t = constrain(data, 30, 70);
// คาของ t จะถูกเปลี่ยนเปน 70 ซึงอยู ่ ในชวง 30 ถึง 70
75
3.2.5 round() เปนคําสังที ่ ่ใชคํานวณหาคาเลขจํานวนเต็มที่ใกลเคียงกับคาของขอมูล (value) มากที่สุด เชน round(9.1); จะไดผลลัพธเปน 9 คืนคาเปนขอมูลชนิด int เสมอ รูปแบบ : round (value); โดยที่ value คือ ขอมูลหรือตัวแปรชนิด float
ตัวอยางที่ 3-11 float x = 8.22; int rx = round(x); float y = 9.9; int ry = round(y); float z = -10.6; int rz = round(z);
// ผลลัพธที่ไดคือ rx = 8 // ผลลัพธที่ไดคือ ry = 10 // ผลลัพธที่ไดคือ rz = -11
3.2.6 floor() เปนคําสังคํ ่ านวณหาคาทีใกล ่ เคียงกับคาของขอมูล (value) มากที่สุด โดยคาทีได ่ จะตองนอย กวาหรือเทากับคาทีเป ่ นพารามิเตอร คืนคาเปนขอมูลชนิด float รูปแบบ : floor (value); โดยที่ value คือ ขอมูลหรือตัวแปรชนิด float
ตัวอยางที่ 3-12 float x = 2.88; float a = floor(x);
// ผลลัพธที่ไดคือ a = 2.0
3.2.7 ceil() เปนคําสังคํ ่ านวณหาคาทีใกล ่ เคียงกับคาของขอมูล (value) มากทีสุ่ ด โดยคาทีได ่ จะตองมากกวา หรือเทากับคาทีเป ่ นพารามิเตอร คืนคาเปนขอมูลชนิด float รูปแบบ : ceil (value); โดยที่ value คือ ขอมูลหรือตัวแปรชนิด float
ตัวอยางที่ 3-13 float x = 8.22; float a = ceil(x);
// ผลลัพธที่ไดคือ a = 9.0
76
3.2.8 pow() เปนคําสังคํ ่ านวณหาคาเลขยกกําลัง คืนคาเปนผลลัพธของเลขยกกําลังซึงเป ่ นขอมูลชนิด float รูปแบบ : pow(base, exponent); โดยที่ base คือ เลขฐาน เปนตัวเลขชนิด int หรือ float exponent คือ เลขชีกํ้ าลัง เปนตัวเลขชนิด int หรือ float
ตัวอยางที่ 3-14 float a = pow( 1, 3); float b = pow( 3, 5); float c = pow( 3,-5); float d = pow(-3, 5);
// a มีคาเปน 13 หรือ 1*1*1 = 1 // b มีคาเปน 35หรือ 3*3*3*3*3 = 243 // c มีคาเปน 1 / 3*3*3*3*3 = 1 / 243 = .0041 // d มีคาเปน -3*-3*-3*-3*-3 = -243
3.2.9 sq() เปนคําสังคํ ่ านวณหาคาของเลขยกกําลัง 2 คืนคาผลลัพธเปนบวก และคาทีได ่ เปนขอมูลชนิด float รูปแบบ : sq(value); โดยที่ value คือ ขอมูลหรือตัวแปรชนิด int หรือ float
ตัวอยางที่ 3-15 float a = sq(1); float b = sq(-5); float c = sq(9);
// a มีคาเปน 1 มาจาก 1 x 1=1 // b มีคาเปน 25 มาจาก 5 x 5 = 25 // c มีคาเปน 81 มาจาก 9 x 9=81
3.2.10 sqrt() เปนคําสังที ่ ใช ่ ในการคํานวณหาคาของรากทีสอง ่ (square root) ของตัวเลข คืนคาเปนผลลัพธของ การถอดรากทีสองของค ่ านัน้ ฟงกชัน่ sqrt() คืนคาเปนบวกเสมอ และคาทีคื่ นจะเปนขอมูลชนิด float รูปแบบ : sqrt(value); โดยที่ value คือ ขอมูลหรือตัวแปรชนิด int หรือ float ซึงเป ่ นเลขบวกเสมอ
ตัวอยางที่ 3-16 float a = sqrt(6561); float b = sqrt(625); float c = sqrt(1);
// a มีคาเปน 81 มาจาก 81 x 81 = 6561 // b มีคาเปน 25 มาจาก 25 x 25 =625 // c มีคาเปน 1 มาจาก 1 x 1 = 1
77
3.2.11 map() เปนคําสังแปลงค ่ าของขอมูลใหอยูในชวงที่ตองการ คาที่คืนจากฟงกชันเป ่ นขอมูลชนิด float รูปแบบ : map(value, low1, high1, low2, high2); โดยที่ value low1 high1 low2 high2
คือ ขอมูลหรือตัวแปรที่ตองการแปลงคา เปนขอมูลชนิด float คือ ขอบเขตลางเดิมของขอมูลหรือตัวแปรที่ตองการแปลงคาเปนขอมูลชนิด float คือ ขอบเขตบนเดิมของขอมูลหรือตัวแปรที่ตองการแปลงคา เปนขอมูลชนิด float คือ ขอบเขตลางใหมของขอมูลหรือตัวแปรที่ตองการแปลงคาเปนขอมูลชนิด float คือ ขอบเขตบนใหมของขอมูลหรือตัวแปรที่ตองการแปลงคา เปนขอมูลชนิดfloat
ตัวอยางที่ 3-17 int value; int m; void setup() { Serial.begin(9600); } void loop() { value = analogRead(0); m = (int)map(value, 0, 1023, 0, 255); Serial.println(m); delay(100); }
// จากเดิมคา m อยูในชวง 0 ถึง 1023 // ใชmap() เพื่อแปลงใหอยูในชวง 0 ถึง 255 // แสดงผลคาของตัวแปร m
78
3.3 ฟงกชันตรี ่ โกณมิติ (Trigonometry) ใน Wiring มีฟงกชันที ่ ่ใชในการคํานวณคามุมและตรีโกณมิติ ดังตอไปนี้
3.3.1 sin() เปนคําสังคํ ่ านวณหาคาของไซน (sine) ของมุม โดยคาของมุมตองอยูในหนวยเรเดียน ซึ่งมีคา ระหวาง 0 ถึง 6.28 และจะคืนคาอยูในชวง -1 ถึง 1 เปนขอมูลชนิด float รูปแบบ : sin(angle); โดยที่ angle คือ มุมที่ตองการคํานวณอยูในหน วยเรเดียน (PI ถึง -PI) และตองเปนขอมูลชนิด float
3.3.2 cos() เปนคําสังคํ ่ านวณหาคาของโคไซน (cosine) ของมุม โดยคาของมุมตองอยูในหน วยเรเดียน ซึง่ มีคาระหวาง 0 ถึง 6.28 และจะคืนคาอยูในชวง -1 ถึง 1 เปนขอมูลชนิด float รูปแบบ : cos(angle); โดยที่ angle คือ มุมที่ตองการคํานวณอยูในหน วยเรเดียน (PI ถึง -PI) และตองเปนขอมูลชนิด float
3.3.3 tan() เปนคําสังหาค ่ าของแทนเจนต (tangent : tan) ของมุม ซึงเป ่ นอัตราสวนของ sine และ cosine คาของ มุมอยูในหน วยเรเดียน มีคา 0 ถึง 6.28 และจะคืนคาอยูในช วง - infinity ถึง infinity เปนขอมูลชนิด float รูปแบบ : tan(angle); โดยที่ angle คือ มุมที่ตองการคํานวณอยูในหน วยเรเดียน (PI ถึง -PI) และตองเปนขอมูลชนิด float
3.3.4 atan2() เปนคําสั่งคํานวณหาคามุมในหนวยเรเดียน ซึ่งวัดจากจุดพารามิเตอรเทียบกับจุดตังต ้ นหรือ origin โดยวัดจากแกน x ทางบวก ฟงกชันจะคื ่ นคาในชวง PI ถึง -PI เปนชนิด float ฟงกชัน่ atan2() นิยมใชในการหาตําแหนงของเคอรเซอร รูปแบบ : atan2(y, x); โดยที่ y คือ จุดในแกน y เปนขอมูลชนิด int หรือ float x คือ จุดในแกน x เปนขอมูลชนิด int หรือ float การกําหนดคาพารามิเตอรของคําสัง่ atan2() คาของจุดในแกน y ตองมากอนจุดในแกน x เสมอ
79
3.3.5 degrees() เปนคําสังที ่ ่ใชในการแปลงมุมในหนวยเรเดียนใหเปนมุมในหนวยองศา (degree) โดย 2Pi เร เดียน = 360 องศา คาทีคื่ นมาเปนตัวเลชนิด float รูปแบบ : degrees(angle); โดยที่ angle คือมุมทีต่ องการคํานวณในหนวยเรเดียน (PI ถึง -PI) และตองเปนขอมูลชนิด int หรือ float
ตัวอยางที่ 3-18 void setup() { Serial.begin(9600); } void loop() { float rad = PI/4; float deg = degrees(rad); Serial.print(rad); Serial.print(“ radians is “); Serial.print(deg); Serial.println(“ degrees”); }
// ตังค ้ าอัตราบอดใหกับพอรตอนุกรมเปน 9600 บิตตอวินาที
// กําหนดคาใหตัวแปร rad เปนมุมแบบ radian มีคา PI/4 // แปลงมุมในหนวยเรเดียนใหเปนองศา Pi/4 เทากับ 45.0 องศา // แสดงคาของตัวแปร rad // แสดงคาของตัวแปร deg
3.3.6 radians() เปนคําสังแปลงมุ ่ มในหนวยองศา (degree) ใหเปนมุมในหนวยเรเดียน โดย 360 องศา = 2PI = 3.1428 เรเดียน เชน 90 องศา = PI/2 = 1.5707964 คาทีคื่ นมาเปนตัวเลขชนิด float รูปแบบ : radians(angle); โดยที่ angle คือมุมทีต่ องการคํานวณในหนวยเรเดียน (PI ถึง -PI) และตองเปนขอมูลชนิดinteger หรือ float
ตัวอยางที่ 3-19 float deg = 45.0; float rad = radians(deg);
80
3.4 ฟงกชันสุ ่ มคา ใน Wiring มีฟงกชันที ่ ่ใชในการสุมตัวเลขหรือ Random มีรายละเอียดดังนี้
3.4.1 random() เปนคําสังสุ ่ มตัวเลข ในแตละครั้งที่เรียกใชฟงกชัน่ random() จะมีการคืนคาเปนตัวเลขชนิด float หรือตัวเลขที่มีจุดทศนิยมที่อยูในชวงที่กําหนดไว (value) หากในการเรียกใชฟงกชันกํ ่ าหนดคา ใหเพียง 1 คา โปรแกรมทําการสุมตั วเลขในชวงตังแต ้ 0 ถึงคาทีกํ่ าหนดไว ฟงกชัน่ random() สามารถ เรียกใชได 2 รูปแบบดังนี้ รูปแบบ : random(value1); หรือ
random(value1, value2); โดยที่ value คือขอมูลชนิด int หรือ float
ตัวอยางที่ 3-20 void setup() { Serial.begin(9600); } void loop() { int val = random(-40, 40); // กําหนดให val เปนตัวแปรเก็บคาที่ไดจากการสุมในชวง -40 ถึง 40 Serial.print(“val = “); Serial.println(val); int x = random(5); // กําหนดให x เปนตัวแปรเก็บคาที่ไดจากการสุมในช วง 0 ถึง 5 Serial.print(“x = “); Serial.println(x); }
81
3.4.2 randomSeed() เปนคําสังกํ ่ าหนดคาเริ่มตนใหกับคําสัง่ random() เพื่อกําหนดผลที่ไดจากการสุมค า รูปแบบ : randomSeed(value); โดยที่ value คือ ขอมูลชนิด int
ตัวอยางที่ 3-21 void setup() { Serial.begin(9600); randomSeed(20); } void loop() { int randNum = random(0, 500); Serial.println(randNum, 2); delay(500); }
// กําหนดคาเริมต ่ นใหการสุม
คําสัง่ random() จะทําการสุมคาใหผลเปนเลขชุดหนึง่ แมเมือเริ ่ มการทํ ่ างานใหมก็จะสุมได ตัว เลขชุดเดิม ในกรณีที่คาพารามิเตอรตางๆเหมือนกัน คําสัง่ randomSeed() จะทําใหผลของการสุมเปลี ่ยนไปแมวาคาของพารามิเตอรตางๆ ของคํา สั่ง random() จะเหมือนกัน ดังนั้นหากมีความตองการสุมค าแบบมีความกระจายของขอมูลสูงควรใช คําสั่ง randomSeed(); เพื่อกําหนดคาเริ่มตน โดยคา value ควรนํามาจากแหลงกําเนิดขอมูลที่มีการ เปลี่ ยนแปลงตลอดเวลา เชน คาจากฐานเวลา หรือคาจากการแปลงสัญญาณอะนาลอกเปนดิจิตอล จากนั้นจึงใชคําสัง่ random() เพื่อสุมคาตอไป
82
3.5 ฟงกชันเกี ่ ่ยวกับเวลา ใน Wiring มีฟงกชันที ่ ่ใชในกําหนดคาหนวงเวลา (delay) และคํานวณเวลา ซึ่งสามารถเรียก ใชไดโดยไมตองผนวกไฟลไลบรารีเพิ่มเติม มีรายละเอียดดังนี้
3.5.1 delay() เปนคําสังที ่ ่ทําใหเกิดการหนวงเวลาในหนวยมิลลิวินาที รูปแบบ : delay(milliseconds); โดยที่ milliseconds คือ ขอมูลหรือตัวแปรชนิด int เปนตัวกําหนดคาเวลาในหนวยมิลลิวินาที โดยที่ 1 วินาที = 1000 มิลลิวินาที
3.5.2 delayMicroseconds() เปนคําสังที ่ ่ทําใหเกิดการหนวงเวลาในหนวยไมโครวินาที รูปแบบ : delayMicroseconds(microseconds); โดยที่ microseconds คือ ขอมูลหรือตัวแปรชนิด long เปนตัวกําหนดคาเวลาในหนวย ไมโครวินาที โดยที่ 1 วินาที = 1,000,000 ไมโครวินาที
3.5.3 millis() เปนคําสังคื ่ นคาเวลาทีนั่ บไดตังแต ้ โปรแกรมเริมทํ ่ างานในหนวยมิลลิวินาที คาทีคื่ นเปนขอมูล ชนิด long รูปแบบ : millis(); ตัวอยางที่ 3-22 ตัวอยางนีแสดงการใช ้ คําสัง่ millis ในการสรางวงจรตังเวลาเพื ้ ่อควบคุมการทํางานของ LED ใหติดสวาง หลัง จากที่เวลาผานไป 7 วินาที โดยจะเริมนั ่ บเวลาเมือมี ่ การกดสวิตช int ledPin = PB1; // ตอ ZX-LED กับขาพอรต PB1 ของแผงวงจร IPST++ int switchPin = PB5; // เลือกใชสวิตช SW1 ทีต่ อกับพอรต PB5 ของแผงวงจร IPST++ long previousTime = 0; // กําหนดตัวแปรเก็บคาเวลาขณะที่กดสวิตช boolean press = false; // ตัวแปรบอกสถานะการกดสวิตช
83
void setup() { pinMode(ledPin, OUTPUT); // กําหนดใหขาพอรต PB1 ทํางานเปนเอาตพุต pinMode(switchPin, INPUT); // กําหนดใหขาพอรต PB5 ทํางานเปนอินพุต } void loop() { if(digitalRead(switchPin) == LOW) // ตรวจสอบสวิตชวามีการกดหรือไม { previousTime = millis(); // เก็บคาเวลาจริง ณ ปจจุบันเปนจุดเริมต ่ นนับเวลา press = true; // มีการกดสวิตช } // ตรวจสอบวา หลังจากกดสวิตชเวลาผานไป 7 วินาทีแลวหรือไม if(((millis() - previousTime) >= 7000 )&&(press == true)) { previousTime = 0; // รีเซตหรือเคลียรเวลาที่ถูกเก็บไว digitalWrite(ledPin, HIGH); // ขับ LED ใหสวาง delay(1000); // หนวงเวลาให LED สวางนานประมาณ 1 วินาที digitalWrite(ledPin, LOW); // ดับ LED press = false; // รีเซตหรือเคลียรสถานะการกดสวิตช } } เมื่อทําการรันโปรแกรม LED ที่ขาพอรต PB1 จะดับ เมื่อมีการกดสวิตช SW1 และเวลาผานไป 7 วินาที LED จะติดสวาง 1 วินาที แลวดับลงอีกครัง้ โปรแกรมจะทําการตรวจสอบคาที่ขาพอรต PB5 ที่ตอกับ SW1 วาเปนลอจิกตํ่า หรือไม หากมีการกดสวิตช คาลอจิกจะเปนลอจิกตํ่า ตัวแปร press ซึงเป ่ นตัวแปรบอกสถานะการกดสวิตช มีคาเปน true จากนันตรวจสอบในขั ้ นต ้ อไปวา หลังจากกดสวิตชเวลาผานไป 7 วินาทีแลวหรือไม ถาเงือนไขนี ่ เป ้ นจริง LED ถูกขับใหสวางประมาณ 1 วินาที แตถาหากคาที่ไดจากคําสัง่ digitalRead() มีคาเปน HIGH แสดงวาไมมีการกดสวิตช ก็จะไมมีการนับเวลาเพื่อทําให LED ติดสวาง และจะวนตรวจสอบเชนนีไปตลอด ้ เนืองจากคํ ่ าสังทั ่ งหมดนั ้ นอยู ้ ในฟ งกชัน่ loop()
84
3.6 String ใน Wiring มี String class ที่ใชสําหรับตัวอักษรหรือ string โดยเฉพาะ ซึ่งความแตกตางระ หวาง string class และอะเรยของ char ก็คือ String class มีกระบวนการชวยในการจัดการกับขอมูล ตัวอักษรเพื่อลดความยุงยากในการเขียนโปรแกรม เชน ความสามารถในการพิจารณาแยกแตละตัว อักษร, การเปรียบเทียบ string, การคนหา string, การแยกสวนของ string, และการแปลง string ให เปนตัวพิมพเล็ก (lower case) และตัวพิมพใหญ(upper case) Wiring String class มีความแตกตางกับ String class ของ Java ตรงที่บางกกระบวนการหรือ เมธอดจะแกไขคาของ string นั้นจริงๆ ไมใชเพียงคืนคาทีเป ่ นผลจากการทําเมธอดนั้นๆ ขอมูลชนิด String จะอยูในเครื่องหมายอัญประกาศหรือเครื่องหมายคําพูด “ หรือ double quotes เสมอ เชน “Abc” และขอมูลชนิด cha จะอยูในเครื่องหมายอัญประกาศเดี่ยวหรือ ‘ (single quotes) เสมอ เชน ‘A’
3.6.1 การประกาศตัวแปร String class การประกาศตัวแปร String class คลายกับการประกาศตัวแปรทัวไป ่ มักจะประกาศตัวแปรนี้ ไวบนสุดของฟงกชันหรื ่ อตอนตนของโปรแกรม ตัวแปร String class ทีถู่ กประกาศในฟงกชันหนึ ่ งจะไม ่ สามารถเรียกใชไดในอีกฟงกชันหนึ ่ ง่ การกําหนดคาใหตัวแปรอาจทําพรอมกับการประกาศตัวแปรก็ได รูปแบบ : String var; โดยที่ var คือ ชือของตั ่ วแปร String class มีขอกําหนดเชนเดียวกันกับการประกาศตัวแปรทั่วๆไป
ตัวอยางที่ 3-23 String a = “IPST”; char data[] = {‘I’, ‘P’, ‘S’, ‘T’}; String b = String(data); void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 Serial.println(a); // สงคาของตัวอักษร IPST ออกไปยังพอรตอนุกรม Serial.println(b); // สงคาของอะเรยตัวอักษร IPST ออกไปยังพอรตอนุกรม } void loop() {}
85
3.6.2 การกําหนดคาให String class การกําหนดคาใหตัวแปร String class ทําไดโดยใชเครืองหมาย ่ = เชนเดียวกับตัวแปรชนิด char จะกําหนดคาใหตัวแปรแบบนีได ้ ก็ตอเมือชนิ ่ ดขอมูลเปน String class เหมือนกัน หรือใชคําสัง่ String() แปลงขอมูลใหเปน string รูปแบบ : String(data) โดยที่ data คือ ขอมูลชนิด byte[], char[], int หรือ String
เนื่องจากอะเรยของตัวอักษร (char) รวมกันเปน string ได และขอมูลชนิด byte ถอดรหัสเปน ตัวอักษรได ดังนั้นอะเรยของ byte จึงรวมกันเปน string ไดเชนกัน และนําขอมูลชนิด int มาใชแทน ตัวอักษรพิเศษบางตัว ตัวอยางที่ 3-24 char t[] = “A character string”; String a = String(“hello”); String b = String(“ there”); String c = String(t); void setup() { Serial.begin(9600); a += b; Serial.println(c); Serial.println(a); } void loop() {}
// ตังค ้ าอัตราบอดเปน 9600 // ตัวแปร a ตอนนีจะเก็ ้ บขอความ ‘hello there’ // สงขอความ A character string ออกไปยังพอรตอนุกรม // สงขอความที่เก็บไวในตัวแปร a ออกไปยังพอรตอนุกรม
86
3.6.3 เมธอดตางๆใน String class ในการเขาถึงเมธอดตางๆ ใน String class ทําไดโดยนําตัวแปร String class มา . (dot) แลวตาม ดวยฟงกชันหรื ่ อคําสังที ่ ต่ องการ สําหรับเมธอดทีตั่ วแปร String class ใน Wiring ใชไดมีดังนี้
3.6.3.1 length() เปนคําสังคื ่ นคาเปนความยาวหรือจํานวนตัวอักษรของ String รูปแบบ : string. length(); โดยที่ string คือตัวแปร String class
ตัวอยางที่ 3-25 String str1 = “IPST”; void setup() { str1 = “IP”; int l1 = str1.length(); Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 Serial.println(l1, DEC); // ทีหน ่ าตาง Serial monitor แสดง 2 เทากับจํานวนอักษรของตัวแปร str1 } void loop() {}
87
3.6.3.2 replace() เปนคําสังแทนที ่ ่ตัวอักษรใน string (char1) ดวยตัวอักษรที่กําหนดไว (char1) รูปแบบ : string.replace(char1, char2) โดยที่ char1 คือ ตัวอักษรที่ตองการคนหาเพื่อแทนที่ ตองเปนขอมูลชนิด char char2 คือ ตัวอักษรที่ตองการนําไปแทนที่ ตองเปนขอมูลชนิด char string คือตัวแปร String class
ตัวอยางที่ 3-26 String str = “WWWX”; void setup() { Serial.begin(9600); str.replace(‘W’,’1'); Serial.println(str); } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 // แทนที่อักษร W ทุกตัวดวยเลข 1 // ที่หนาตาง Serial monitor ของ Wiring IDE จะแสดงขอความ 111X
88
3.6.3.3 setCharAt() เปนคําสังแทนที ่ ตั่ วอักษรใน string ทีอยู ่ ในตํ าแหนงทีกํ่ าหนดไว (index) ดวยตัวอักษรทีกํ่ าหนด ไว (ch) ซึ่งตําแหนงของ index จะไดรับการคํานวณแบบเดียวกับอะเรย กลาวคือ ถา string มีความยาว n ตัวอักษร index จะอยูในชวง 0 ถึง n-1 โดยตัวอักษรแรกสุดคือ 0 ตัวอักษรถัดไปคือ 1 รูปแบบ : string.setCharAt(index, ch); โดยที่ index คือ ตําแหนงของตัวอักษรที่ตองการแทนที่ เปนตัวเลขชนิด int ch คือ ตัวอักษรที่ตองการนําไปแทนที่ ตองเปนขอมูลชนิด char string คือตัวแปร String class
ตัวอยางที่ 3-27 String str = “IPST”; void setup() { Serial.begin(9600); str.setCharAt(0,’1'); Serial.println(str); } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 // แทนที่ตัวอักษรตําแหนง 0 ดวย 1 // ที่หนาตาง Serial monitor ของ Wiring IDE จะแสดงขอความ 1PST
89
3.6.3.4 charAt() เปนคําสังคื ่ นคาเปนตัวอักษรใน string ที่อยูในตําแหนงที่กําหนดไว (index) รูปแบบ : string.charAt(index); โดยที่ index คือตําแหนงของตัวอักษร เปนตัวเลขชนิด int string คือตัวแปร String class
ตัวอยางที่ 3-28 String str = “IPST”; char c1 = str.charAt(0); // ตัวแปร c1 เก็บตัวอักษรตัวแรก char c2 = str.charAt(1); // ตัวแปร c2 เก็บตัวอักษรตัวที่สอง char c3 = str.charAt(str.length()-1); // ตัวแปร c3 เก็บตัวอักษรสุดทาย void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 Serial.println(c1); // สงขอมูลของอักษร I ไปยังหนาตาง Serial Terminal Serial.println(c2); // สงขอมูลของอักษร P ไปยังหนาตาง Serial Terminal Serial.println(c3); // สงขอมูลของอักษร T ไปยังหนาตาง Serial Terminal } void loop() {}
90
3.6.3.5 indexOf() เปนคําสังค ่ นหาตําแหนง (index) ของตัวอักษรหรือขอความที่คนหา (str) ที่พบเปนที่แรกใน string ถาหาไมพบ คําสั่ง indexOf() จะคืนคาเปน -1 รูปแบบ : string.indexOf(str); หรือ
โดยที่ str คือ ตัวอักษรหรือขอความที่ตองการคนหา fromIndex คือตําแหนงเริมต ่ นที่ใชในการคนหา เปนตัวเลขชนิด int string คือตัวแปร String class
ตัวอยางที่ 3-29 String str = “IPST”; int p1 = str.indexOf(“I”); int p2 = str.indexOf(“P”); int p3 = str.indexOf(“ST”); void setup() { Serial.begin(9600); Serial.println(p1, DEC); Serial.println(p2, DEC); Serial.println(p3, DEC); } void loop() {}
// ตัวแปร p1 เก็บตําแหนงของ I // ตัวแปร p2 เก็บตําแหนงของ P // ตัวแปร p3 เก็บตําแหนงของ ST // ตังค ้ าอัตราบอดเปน 9600 // สงขอมูลของเลข 0 ไปยังหนาตาง Serial Terminal // สงขอมูลของเลข 1 ไปยังหนาตาง Serial Terminal // สงขอมูลของเลข 2 ไปยังหนาตาง Serial Terminal
91
3.6.3.6 equals() เปนคําสังเปรี ่ ยบเทียบ String กับขอความที่กําหนดไว (str) เนื่องจาก string ไมสามารถเปรียบ เทียบดวยการใชเครื่องหมาย == ได จึงตองใชคําสังนี ่ ้แทน equals() คืนคาเปนจริงเมือทั ่ ง้ 2 string เหมือนกัน และคืนคาเปนเท็จเมือทั ่ ง้ 2 string ไมเหมือนกัน ควรระวังเรื่องตัวพิมพเล็ก-ใหญในขอความทีนํ่ ามาเปรียบเทียบดวย รูปแบบ : string.equals(str); โดยที่ str คือ String ที่ตองการใชเปรียบเทียบ string คือตัวแปร String class
ตัวอยางที่ 3-30 String str1 = “IPST”; char str3[] = “IPST”; void setup() { Serial.begin(9600); if(str1.equals(str3) == true) { Serial.println(“Equal”); } else { Serial.println(“Not equal”); } if(str1.equals(“INEX”) == true) { Serial.println(“Equal”); } else { Serial.println(“Not equal”); } } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลเปน 9600 // ตรวจสอบวา str1 เหมือนกับ str3 หรือไม // ถาจริง แสดงขอความ Equal ที่หนาตาง Serial monitor
// ถาไมจริง แสดงขอความ Not equal // ตรวจสอบวา str1 เหมือนกับ IPST หรือไม // ถาจริง ใหแสดงขอความ Equal ที่หนาตาง Serial monitor
// ถาไมจริง แสดงขอความ Not equal ทีหน ่ าตาง Serial monitor
92
3.6.3.7 startsWith() เปนคําสังตรวจสอบว ่ า String ขึนต ้ นดวยขอความทีกํ่ าหนดไว (str) หรือไม คําสัง่ startsWith() จะคืนคาเปนจริ งหาก string ขึ้นตนดวยขอความที่กําหนดไว และคืนคาเปนเท็จถาไมใช คําสั่ง startsWith() ตางกับ equals() ตรงที่ equals() ตองเปรียบเทียบใหเหมือนทุกตัวอักษรจึงจะคืนคาเปน จริง แต startsWith() ตรวจสอบเพียงตัวอักษรที่กําหนดไว รูปแบบ : string.startsWith(str); หรือ
string.startsWith(str, offset); โดยที่ str คือ String ที่ตองการเปรียบเทียบ fromIndex คือตําแหนงเริมต ่ นที่ใชในการเปรียบเทียบ เปนตัวเลขชนิด int string คือตัวแปร String class
ตัวอยางที่ 3-31 void setup() { Serial.begin(9600); String str1 = “IPST”; String str2 = “IP”; if(str1.startsWith(str2) == true) { Serial.println(“Starts with”); } else { Serial.println(“Not”); } } void loop() {}
// ตังค ้ าอัตราบอดเปน 9600 // ตรวจสอบวา str1 ขึนต ้ นดวย IN หรือไม // ถาจริง แสดงขอความ Starts with ทีหน ่ าตาง Serial monitor
// ถาไมเปนจริง แสดงขอความ Not ที่หนาตาง Serial monitor
93
3.6.3.8 endsWith() เปนคําสังตรวจสอบว ่ า String ลงทายดวยขอความที่กําหนดไว (str) หรือไม คําสั่ง endsWith() คืนคาเปนจริงหาก string ลงทายดวยขอความทีกํ่ าหนดไว และคืนคาเปนเท็จถาไมใช คําสัง่ endsWith() จะตรวจสอบเพียงตัวอักษรที่กําหนดไวเทานั้นเหมือนกับคําสัง่ startsWith() รูปแบบ : string.endsWith(str); โดยที่ str คือ String ที่ตองการจะใชเปรียบเทียบ string คือตัวแปร String class
ตัวอยางที่ 3-32 void setup() { Serial.begin(9600); String str1 = “IPST”; String str2 = “ST”; if(str1.endsWith(str2) == true) { Serial.println(“Ends with”); } else { Serial.println(“Not”); } } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลอนุกรมเปน 9600 // ตรวจสอบวา str1 ลงทายดวย ST หรือไม // ถาเงือนไขเป ่ นจริง แสดงขอความนีที้ หน ่ าตาง Serial monitor
// ถาไมเปนจริง จะแสดงขอความนีที้ ่หนาตาง Serial monitor
94
3.6.3.9 substring() เปนคําสังสร ่ างตัวอักษรใหมจากตัวอักษรในตัวแปรเดิม โดยคัดลอกตัวแปร string ตนฉบับจาก ตําแหนงเริมต ่ น (beginIndex) ทีกํ่ าหนดไวจนถึงตําแหนงสุดทายของตัวแปร string หากไมไดกําหนด พารามิเตอร endIndex ในกรณีที่มีการกําหนดพารามิเตอร endIndex คําสัง่ substring() จะคัดลอกจน ถึงตําแหนงสิ้นสุด (endIndex -1) ที่กําหนดไว ซึ่งจะนอยกวาตําแหนงที่สิ้นสุดที่กําหนดไว 1 ตําแหนง คําสัง่ substring() คืนคาเปน string ใหม รูปแบบ : string.substring(beginIndex); หรือ
string.substring(beginIndex, endIndex); โดยที่ beginIndex คือตําแหนงเริมต ่ นในการสรางตัวแปร string ใหม เปนตัวเลขชนิด int endIndex คือตําแหนงสินสุ ้ ดในการสรางตัวแปร string ใหม เปนตัวเลขชนิด int string คือตัวแปร String class
ตัวอยางที่ 3-33 void setup() { Serial.begin(9600); String str1 = “IPST”; String str2 = “Rabbit”; String ss1 = str1.substring(2); String ss2 = str2.substring(3); String ss3 = str1.substring(0,1); String result = ss1; result += ':'; result += ss2; result += ':'; result += ss3; Serial.println(result); } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลอนุกรมเปน 9600 // ตัวแปร ss1 เก็บคา ST // ตัวแปร ss2 เก็บคา bit // ตัวแปร ss3 เก็บคา IP
// แสดงขอความ ST:bit:IP ที่หนาตาง Serial monitor
95
3.6.3.10 toCharArray() เปนคําสังคื ่ นคาเปนอะเรยของตัวแปรชนิด char ซึ่งประกอบดวย ตัวอักษรของ String ซึ่งก็คือ การแปลง String class เปนอะเรยของตัวแปรชนิด char คําสั่ง toCharArray() แตกตางกับคําสั่ง getBytes() ตรงที่คําสั่ง getBytes() จะไดผลลัพธเปนขอมูลชนิด byte แตคําสั่ง toCharArray() จะไดผลลัพธเปนขอมูลชนิด char รูปแบบ : string.toCharArray(); โดยที่ string คือตัวแปร String class
ตัวอยางที่ 3-34 void setup() { Serial.begin(9600); String str = “IPST”; char array [5]; str.toCharArray(array,5); Serial.println(array[1],BYTE); Serial.println(array); } void loop() {}
// ตังค ้ าอัตราบอดเปน 9600
// แสดงตัวอักษร P // แสดงขอความ IPST ที่หนาตาง Serial monitor
96
3.6.3.11 toLowerCase() เปนคําสั่งแปลงตัวอักษรในตัวแปรชนิด string ใหเปนตัวพิมพเล็กทั้งหมด (lower case)
รูปแบบ : string.toLowerCase(); โดยที่ string คือตัวแปร String class
ตัวอยางที่ 3-35 void setup() { Serial.begin(9600); String str1 = “IPST”; str1.toLowerCase(); Serial.println(str1); } void loop() {}
// ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 // แปลงตัวอักษรเปนตัวพิมพเล็ก // แสดงขอความ ipst ที่หนาตาง Serial Terminal ของ Wiring IDE
97
3.6.3.12 toUpperCase() เปนคําสั่งแปลงตัวอักษณในตัวแปรชนิด string ใหเปนตัวพิมพใหญทังหมด ้ (upper case)
รูปแบบ : string.toUpperCase() ; โดยที่ string คือตัวแปร String class
ตัวอยางที่ 3-36 void setup() { Serial.begin(9600); // ตังค ้ าอัตราบอดใหกับโมดูลสือสารข ่ อมูลผานพอรตอนุกรมเปน 9600 String str1= “Rabbit”; str1.toUpperCase(); // แปลงตัวอักษรเปนตัวพิมพใหญ Serial.println(str1); // แสดงขอความ RABBIT ที่หนาตาง Serial Terminal ของ Wiring IDE } void loop() {}
98
99
การพัฒนาโปรแกรมภาษา C/C++ ดวย Wiring สําหรับชุดกลองสมองกล IPST-MicroBOX ทีได ่ ทําการปรับปรุงมาเปนแผงวงจร IPST++ ดําเนินการภายใตการสนับสนุนของไฟลไลบรารี ipst.h ทังนี ้ เพื ้ อช ่ วยลดขันตอนและความซั ้ บซอนในการเขียนโปรแกรมเพือควบคุ ่ มสวนตางๆ ของฮารดแวร โครงสรางของไฟลไลบรารี ipst.h แสดงดังรูป รายละเอียดของไฟลไลบรารียอยทังหมดมี ้ ดั้ งนี้
100
4.1 ipst_lcd.h ไฟลไลบรารีของการแสดงผลที่โมดูล LCD เปนไฟลไลบรารีสนับสนุนชุดคําสังเกี ่ ่ยวกับการแสดงขอความทีโมดู ่ ล LCD กอนเรียกใชงาน ฟงกชันของ ่ ไลบรารีนีควรผนวกไฟล ้ ไลบรารีในตอนตนของโปรแกรมดวยคําสัง่ #include <ipst_lcd.h> หรือ #include <ipst.h> ฟงกชันที ่ สํ่ าคัญคือ lcd บรรจุฟงกชันสํ ่ าหรับการแสดงผลขอความทีโมดู ่ ล LCD แบบ 16 ตัวอักษร 2 บรรทัด รูปแบบ void lcd(char *p,...) พารามิเตอร p - รับรหัสสําหรับกําหนดกลุมขอความที่ตองการแสดงผลที่โมดูล LCD โดยสามารถกําหนดรูปแบบการ แทรกสัญลักษณพิเศษเพื่อรวมแสดงผลคาขอมูลตัวเลขรูปแบบอืนๆ ่ อันไดแก รหัสบังคับ การทํางาน %c หรือ %C รับคาการแสดงผลตัวอักษร 1 ตัว %d หรือ %D รับคาการแสดงผลตัวเลขฐานสิบในชวง -32,768 ถึง +32,767 %l หรือ %L รับคาการแสดงผลตัวเลขฐานสิบในชวง -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F รับคาเพื่อแสดงผลขอมูลแบบจํานวนจริง (แสดงทศนิยม 3 หลัก) #c คําสังพิ ่ เศษเพื่อสั่งเคลียรขอความกอนแสดงผลในครั้งถัดไป #n คําสังพิ ่ เศษเพื่อสั่งตัดขอความไปแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง)
ตัวอยางที่ 4-1 lcd(“Hello LCD”); ผลลัพธทีโมดู ่ ล LCD
// แสดงขอความ Hello LCD ที่โมดูล LCD
H e l l o o L C D rb o a r d r W i r i n g I / Ob R o b o t d
101
ตัวอยางที่ 4-2 lcd(“abcdefghijklmnopqrstuvwxyz”); // แสดงผลขอความเมือสายอั ่ กขระเกิน 16 ตัวอักษร อักขระตัวถัดไปจะขึนบรรทั ้ ดที่ 2 (บรรทัดลาง) ทันที ผลลัพธทีโมดู ่ ล LCD abcdefghijklmnop q r s t u v w x yz R o b o t d
ตัวอยางที่ 4-3 lcd(“Value: %d unit “,518); // แสดงขอความรวมกับขอมูลตัวเลข (518) ที่โมดูล LCD ผลลัพธทีโมดู ่ ล LCD Value:g518kunitp q r s t u v w x yz R o b o t d
ตัวอยางที่ 4-4 lcd(“Value: %d “,analog(4)); ผลลัพธทีโมดู ่ ล LCD
// แสดงผลคาอะนาลอกชอง ADC4 ที่โมดูล LCD
Value:gxxxkunitp q r s t u v w x yz R o b o t d
โดยที่ xxx คือคาที่อานได มีคาตังแต ้ 0 ถึง 1023
ตัวอยางที่ 4-5 char c_test=’j’; lcd(“abcd%cxyz”,c_test);// แสดงอักขระ j รวมกับขอความอืนๆ ่ ผลลัพธทีโมดู ่ ล LCD
abcdjxyzxxkunitp q r s t u v w x yz R o b o t d
102
ตัวอยางที่ 4-6 lcd(“Value: %f “,125.450); // แสดงขอความรวมกับตัวเลขที่โมดูล LCD (แสดงทศนิยม 3 หลัก) ผลลัพธทีโมดู ่ ล LCD Value:g125.450tp q r s t u v w x yz R o b o t d
ตัวอยางที่ 4-7 lcd(“count1: %d #ncount2: %d”,12,48); // แสดงขอความรวมกับ 2 รหัสควบคุม และคียพิเศษ #n // เพื่อกําหนดใหกลุมขอความที่ตอทาย #n จะถูกนํามาแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง) ผลลัพธทีโมดู ่ ล LCD count1:112.450tp c o u n t 2 : x 48 R o b o t d
4.2 ipst_sleep.h ไฟลไลบรารียอยการหนวงเวลา เปนไฟลไลบรารีสนับสนุนชุดคําสังเกี ่ ่ยวกับการหนวงเวลา กอนเรียกใชงานควรผนวกไฟล ไลบรารีไวในตอนตนของโปรแกรมดวยคําสั่ง #include <ipst_sleep.h> หรือเรียก #include <ipst.h> ฟงกชันที ่ สํ่ าคัญคือ sleep เปนฟงกชันหน ่ วงเวลาโดยประมาณในหนวยมิลลิวินาที มีรายละเอียดดังนี้ รูปแบบ void sleep(unsigned int ms) พารามิเตอร ms - กําหนดคาเวลาที่ตองการหนวงในหนวยมิลลิวินาที มีคา 0 ถึง 65,535
ตัวอยางที่ 4-8 sleep(20); sleep(1000);
// หนวงเวลาประมาณ 20 มิลลิวินาที // หนวงเวลาประมาณ 1 วินาที
103
4.3 in_out.h ไฟลไลบรารียอยสําหรับติดตอพอรต เปนไฟลไลบรารีสนับสนุนชุดคําสั่งอานและเขียนคากับพอรตอินพุตเอาตพุตของฮารดแวร Wiring I/O ซึงในที ่ ่นี้คือ แผงวงจร IPST++ กอนเรียกใชงานฟงกชันต ่ องผนวกไฟลไลบรารีนี้ไวใน ตอนตนของโปรแกรมดวยคําสั่ง #include <ipst_in_out.h> หรือเรียก #inclue <ipst.h> ฟงกชันที ่ สํ่ าคัญของไฟลไลบรารีนีประกอบด ้ วย
4.3.1 in เปนฟงกชันอ ่ านคาสถานะลอจิกของพอรตที่กําหนด รูปแบบ char in(x) พารามิเตอร x - กําหนดขาพอรตที่ตองการอานคา มีคาตังแต ้ 0 ถึง 50
การคืนคา เปน 0 หรือ 1
ตัวอยางที่ 4-9 char x; x = in(49);
// ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ // อานคาดิจิตอลจากพอรตหมายเลข 49 แลวเก็บคาไวที่ตัวแปร x
ตัวอยางที่ 4-10 char x; x = in(50);
// ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ // อานคาดิจิตอลจากพอรตหมายเลข 50 แลวเก็บคาไวที่ตัวแปร x
4.3.2 out เปนฟงกชันกํ ่ าหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังขาพอรตทีกํ่ าหนด รูปแบบ out(char _bit,char _dat)
พารามิเตอร _bit - กําหนดขาพอรตที่ตองการ มีคา 0 ถึง 50
ตัวอยางที่ 4-11 out(43,1); out(45,0);
// กําหนดใหขาพอรต 43 เปน “1” // กําหนดใหขาพอรต 45 เปน “0”
104
4.3.3 sw1_press เปนฟงกชั่นวนตรวจสอบการกดสวิตช SW1 บนแผงวงจร IPST++ (หรือ Display-io หรือ Display-Motor ที่ติดตังบนแผงวงจรหลั ้ กของ IPST-MicroBOX) ตองรอจนกระทั่ง SW1 ถูกปลอยหลัง จากมีการกดสวิตช จึงจะผานพนการทํางานของฟงกชันนี ่ ้ไป รูปแบบ void sw1_press() ตัวอยางที่ 4-12 ............ sw1_press(); ................
// รอจนกระทั่งสวิตช SW1 ถูกกดและปลอย
4.3.4 sw2_press
เปนฟงกชันวนตรวจสอบการกดสวิ ่ ตช SW2 บนแผงวงจร IPST++ รูปแบบ void sw2_press() ตัวอยางที่ 4-13
.................. Sw2_press(); // รอจนกระทั่งสวิตช SW2 ถูกกดและปลอย .................
4.3.5 sw3_press
เปนฟงกชันวนตรวจสอบการกดสวิ ่ ตช SW3 บนแผงวงจร IPST++ รูปแบบ void sw3_press() ตัวอยางที่ 4-14
............ Sw3_press(); // รอจนกระทั่งสวิตช SW3 ถูกกดและปลอย .................
105
4.3.6 sw1 เปนฟงกชันตรวจสอบการกดสวิ ่ ตช SW1 ในขณะใดๆ รูปแบบ char sw1()
การคืนคา เปน “0” เมื่อสวิตช SW1 ถูกกด และ เปน “1” เมือไม ่ มีการกดสวิตช SW1
ตัวอยางที่ 4-15 char x; x = sw1();
// ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจากการอานคาดิจิตอล // อานคาสถานะของสวิตช SW1 มาเก็บไวที่ตัวแปร x
4.3.7 sw2 เปนฟงกชันตรวจสอบการกดสวิ ่ ตช SW2 ในขณะใดๆ รูปแบบ char sw2() การคืนคา เปน “0” เมื่อสวิตช SW2 ถูกกด และ เปน “1” เมือไม ่ มีการกดสวิตช SW2
ตัวอยางที่ 4-16 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจากการอานคาดิจิตอล x = sw2(); // อานคาสถานะของสวิตช SW2 มาเก็บไวที่ตัวแปร x
4.3.8 sw3 เปนฟงกชันตรวจสอบการกดสวิ ่ ตช SW3 ในขณะใดๆ รูปแบบ char sw2() การคืนคา เปน “0” เมื่อสวิตช SW2 ถูกกด และ เปน “1” เมื่อไมมีการกดสวิตช SW3
ตัวอยางที่ 4-17 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจากการอานคาดิจิตอล x = sw3(); // อานคาสถานะของสวิตช SW2 มาเก็บไวที่ตัวแปร x
106
4.4 ipst_analog.h ไฟลไลบรารีจัดการสัญญาณอะนาลอก เปนไฟลไลบรารีสนับสนุนชุดคําสังที ่ ่เกี่ยวกับการอานคาอินพุตอะนาลอก ซึ่งใชในการอาน คาจากตัวตรวจจับทีให ่ ผลการทํางานในรูปแรงดันไฟฟาในยาน 0 ถึง +5V กอนเรียกใชงานตองผนวก ไฟลไลบรารีไวในตอนตนของโปรแกรมดวยคําสัง่ #include <ipst_analog.h> หรือ #inclue <ipst.h> ฟงกชันที ่ สํ่ าคัญของไฟลไลบรารีนีประกอบด ้ วย
4.4.1 analog เปนฟงก ชั่นอ านคาขอมูลดิจิตอลที่ไดจากการกระบวนการแปลงสัญญาณอะนาลอกของ ไมโครคอนโทรลเลอรทีขาพอร ่ ต ADC0 ถึง ADC7 รูปแบบ unsigned int analog(unsigned char channel) พารามิเตอร channel - กําหนดชองอินพุตอะนาลอกที่ตองการ มีคา 0 ถึง 7 ซึงตรงกั ่ บขาพอรต ADC0 ถึง ADC7
การคืนคา เป นขอมูลที่ ไดจากการแปลงสัญญาณของโมดูลแปลงสัญญาณอะนาลอกเปนดิจิตอลภายในไมโคร คอนโทรลเลอรจากชองอินพุตที่กําหนด โดยขอมูลมีความละเอียด 10 บิต ดังนันค ้ าที่เปนไปไดคือ 0 ถึง 1,023
ตัวอยางที่ 4-18 int val=0; // กําหนดตัวแปรสําหรับเก็บคาของอินพุตอะนาลอกทีได ่ จากการแปลงสัญญาณแลว val = analog(2); // อานคาของอินพุตอะนาลอกชอง 2 มาเก็บไวที่ตัวแปร val
4.4.2 knob เปนฟงกชั่นสําหรั บอานคาขอมูลดิจิตอลที่ไดจากการแปลงสัญญาณอะนาลอกของไมโคร คอนโทรลเลอรทีขาพอร ่ ต ADC7 ซึงต ่ อกับตัวตานทานปรับคาไดหรือเรียกวาชองอินพุตนีว้ า KNOB รูปแบบ unsigned int knob() การคืนคา เปนขอมูลที่ไดจากการแปลงสัญญาณอะนาลอกเปนดิจิตอลจากชอง KNOB (ADC7) มีคา 0 ถึง 1,023
ตัวอยางที่ 4-19 int val=0; val = knob();
// กําหนดตัวแปรสําหรับเก็บคาของอินพุตอะนาลอกทีได ่ จากการแปลงสัญญาณแลว // อานคาจากอินพุต knob ซึงผ ่ านการแปลงเปนขอมูลดิจิตอลแลวมาเก็บไวทีตั่ วแปร val
107
4.5 ipst_motor.h เปนไฟลไลบรารีชุดคําสังควบคุ ่ มมอเตอรไฟตรง ตองผนวกไฟลไลบรารีไวในตอนตนของ โปรแกรมดวยคําสัง่ #include <motor.h> หรือ #inclue <atx.h>
4.5.1 การเชือมต ่ อทางฮารดแวร ไฟลไลบรารีนี้รองรับการขับมอเตอรไฟตรงของแผงวงจร IPST++ จํานวน 2 ชองคือ ชอง 1 และ 2 ใน 2 วิธีการเชือมต ่ อ ดังนี้ 1. กรณีใชแผงวงจร IPST++ ทีมาจากแผงวงจรหลั ่ กกับแผงวงจร Display-io จะตองใชแผงวงจร ขับมอเตอร ZX-DCM2 รวมดวย มีการตอวงจรเพิ่มเติมดังรูปที่ 4-2 ซึ่งสรุปไดดังนี้ (ก) สําหรับมอเตอรชอง 1 ตอขาพอรต PD2 ของแผงวงจร MicroBOX กับอินพุต DIR1A ตอขาพอรต PD3 ของแผงวงจร MicroBOX กับอินพุต DIR1B ตอขาพอรต PD4 ของแผงวงจร MicroBOX กับอินพุต PWM1E
(ข) สําหรับมอเตอรชอง 2 ตอขาพอรต PD7 ของแผงวงจร MicroBOX กับอินพุต DIR2A ตอขาพอรต PD6 ของแผงวงจร MicroBOX กับอินพุต DIR2B ตอขาพอรต PD5 ของแผงวงจร MicroBOX กับอินพุต PWM2E
2. กรณีใชแผงวงจร IPST++ ที่มาจากแผงวงจรหลักกับแผงวงจร Display-MOTOR ซึ่งมีวงจร ขับมอเตอรในตัว จึงใชงานไดทันที ดังแสดงตําแหนงเชือมต ่ อมอเตอรในรูปที่ 4-3
108
DC MOTOR 6-12V
PB4
TxD
PB3
PWM2 DIR2A DIR2B 2E +VM
PA1 PA3 PA5
L293D/SN754410
PB1
PB0 PA0 PA2 PA4
+VM
2B 2A 2E G
IPST MicroBOX
ON
OFF
+5V
GND PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 +5V
+ Vin -
1B 1A 1E +5
+
ISP
PB2
OUT1
ZX-DCM2 DIR1B DIR1A PWM1 1E
ATMEGA16 PA7
OUT2
RESET
PD3
+
PD2
PD5
PORTC
+
PD4
PD7
PD1
PD6
DC input
DC MOTOR 6-12V
PA6
รูปที่ 4-2 การตอวงจรเพื่อใชงานแผงวงจร MicroBOX ขับมอเตอรไฟตรงผานแผงวงจร ZX-DCM2 ในชุดกลองสมองกล IPST-MicroBOX
Display-MOTOR
แผงวงจรแสดงผลและควบคุมมอเตอร PORTC
PA7
Vm OUT
GND GND PC0 PC0 PC1 PC1 PC2 PC2 PC3 PC3 PC4 PC4 PC5 PC5 PC6 PC6 PC7 PC7 +5V +5V
PA6
IPST MicroBOX PA4
PA5
KNOB PA7
DC input
OFF
ON
ON
SCL DC INPUT
PA2
PA1
PA0
Over 7.5V
++ Vin -
PA3
SDA RS-232 LOW BATT.
M2 M1
PD7
PD1
PD6
PD0
PD5
TxD
PD4
RxD
PD3
PB4
RESET
สวนของวงจร ขับมอเตอรไฟตรง
MOTOR OUTPUT
PD2
B0 B1 B2 B3 B4
DisplayMotor
PB2 SW3
+ -
PB0
PB3
SW2
S
PB1
SW1
SERVO
ATMEGA16
I P S T - B O T o ro b o t D i s p l a y - MO T E R a r d
จุดตอมอเตอร ไฟตรง 2 ตัว
LED แสดงสถานะการทํางาน สีเขียว : หมุนไปขางหนา สีแดง : หมุนกลับทาง
รูปที่ 4-3 แสดงสวนของวงจรขับมอเตอรบนแผงวงจร Display-MOTOR
109
4.5.2 motor เปนฟงกชันขั ่ บเคลือนมอเตอร ่ ไฟตรง รูปแบบ void motor(char _channel,int _power) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรงของแผงวงจร IPST++ มีคา 1 และ 2 _power - กําหนดกําลังขับมอเตอร มีคาในชวง -100 ถึง 100 ถากําหนดคา _power เปนบวก (1 ถึง 100) ทําใหมอเตอรหมุนไปในทิศทางหนึง่ ถากําหนดคา _power เปนลบ (-1 ถึง -100) มอเตอรจะถูกขับใหหมุนไปในทิศทางตรงขาม ถากําหนดคา _power เปน 0 มอเตอรหยุดหมุน ไมแนะนําใหกําหนดคาเปน 0 หากตองการใหมอเตอร หยุดหมุนควรเรียกใชฟงกชัน่ motor_stop
ตัวอยางที่ 4-20 motor(1,60); motor(1,-60);
// ขับมอเตอรชอง 1 ดวยกําลัง 60% ของกําลังสูงสุด // ขับมอเตอรชอง 1 ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสังก ่ อนหนา
ตัวอยางที่ 4-21 motor(2,100);
// ขับมอเตอรชอง 2 ดวยกําลัง 100% อันเปนคากําลังสูงสุด
4.5.3 motor_stop เปนฟงกชันหยุ ่ ดขับมอเตอร รูปแบบ void motor_stop(char _channel) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอร ทังหมดหยุ ้ ดทํางาน
ตัวอยางที่ 4-22 motor_stop(1); motor_stop(2);
// หยุดขับมอเตอรชอง 1 // หยุดขับมอเตอรชอง 2
ตัวอยางที่ 4-23 motor_stop(ALL);
// มอเตอรทั้ง 2 ชองหยุดทํางานพรอมกัน
110
4.6 ipst_SoftwareServo.h ไฟลไลบรารีขับเซอรโวมอเตอร เปนไฟลไลบรารีควบคุมเซอรโวมอเตอร มีฟงกชันสนั ่ บสนุนการควบคุมตําแหนงแกนหมุน ของเซอรโวมอเตอร ควบคุมได 5 ตัวในเวลาเดียวกัน กอนใชงานตองผนวกไลบรารีไวในตอนตนของ โปรแกรมดวยคําสัง่ #include <ipst_SoftwareServo.h> หรือ #include <ipst.h> ในไฟลไลบรารีนี้มี 2 ฟงกชันคื ่ อ servo และ servoRefresh
4.6.1 การเชือมต ่ อทางฮารดแวร
AA
AA
AA DC input
PORTC
OFF
PA7
PA6
ON
ON Vm OUT
SCL
IPST MicroBOX
KNOB PA7
สายไฟบวก (สีแดง)
สายไฟลบ (สีดํา)
GND GND PC0 PC0 PC1 PC1 PC2 PC2 PC3 PC3 PC4 PC4 PC5 PC5 PC6 PC6 PC7 PC7 +5V +5V
PA4
PA5
DC INPUT
SDA
PA0
Over 7.5V
I P S T - B O T o ro b o t ATMEGA16
PA2
PA1
RS-232 LOW BATT.
++ Vin -
PA3
Display-MOTOR
M2
PD7
จุดตอเซอรโวมอเตอร 5 ตัว (PB0 ถึง PB4)
M1
PD6
PD1
PD5
PD0
PD4
TxD
ไฟแจงระดับของแบตเตอรี่
MOTOR OUTPUT PD3
RxD
สวิตชเปด-ปด
แผงวงจรแสดงผลและ ควบคุมมอเตอร
PD2
B0 B1 B2 B3 B4
DisplayMotor
SW3
+ -
PB2
PB4
RESET
SW2
S
PB0
PB3
SW1
SERVO
D i s p l a y - MO T E R a r d PB1
แผงวงจรหลัก MicroBOX อยู ดานลาง เมื่อตอกับแผงวงจร Display-MOTOR แล ว การ จายไฟเลี้ยงใหกระทําผานจุด ต อ ไฟเลี้ ยง DC INPUT บน แผงวงจร Display-MOTOR แทน
AA
กะบะถานขนาด AA 5 กอน ถาใชแบตเตอรี่แบบอัลคาไลน จะไดแรงดัน +7.5V (1.5V x5) ถาใชแบตเตอรี่แบบประจุ ได จะไดแรงดัน +6V (1.2V x5)
AA
ไลบรารี จะใชงานไดกับแผงวงจร IPST++ ที่มาจากการประกอบกันของแผงวงจรหลัก MicroBOX กับแผงวงจร Display-MOTOR มีตัวอยางการตอใชงานแสดงในรูปที่ 4-4
เซอรโวมอเตอร
SERVO MOTOR Standard
รูปที่ 4-4 แสดงการตอใชงานแผงวงจรหลัก MicroBOX กับแผงวงจร Display-MOTOR และเซอรโวมอเตอร
111
4.6.2 servo เปนฟงกชันกํ ่ าหนดตําแหนงแกนหมุนของเซอรโวมอเตอร รูปแบบ void servo(unsigned char _ch, int _pos) พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 0 ถึง 4 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรที่ชองนันๆ ้
4.6.3 servoRefresh เปนฟงกชันเตรี ่ ยมความพรอมในการขับเซอรโวมอเตอรของแผงวงจร IPST++ จะตองเรียกใช ฟงกชันนี ่ ้กอนใชฟงกชัน่ servo เสมอ รูปแบบ void servoRefresh ตัวอยางที่ 4-24 #include <ipst.h> unsigned int pos = 20; void setup() { lcd_clear(); } void loop() { servoRefresh(); sleep(100); servo(0,pos); sleep(100); servo(0,0); sleep(100); }
// ผนวกไฟลไลบรารีหลัก "ipst.h" // กําหนดตัวแปรสําหรับควบคุมตําแหนงของเซอรโวมอเตอร // ลางขอมูลที่ถูกสงไปยังโมดูล LCD กอนหนานี้
// ลางขอมูลตําแหนงลาสุดที่สงไปยังเซอรโวมอเตอร // ใหพรอมที่จะรับคาตําแหนงใหม // กําหนดตําแหนงการขับเซอรโวมอเตอรชอง 0 จากตัวแปร pos // หนวงเวลา // กําหนดตําแหนงของเซอรโวมอเตอรชอง 0 กลับไปยังตําแหนง 0 // หนวงเวลา
112
4.7 ipst_sound.h ไฟลไลบรารีกําเนิดสัญญาณเสียง เปนไฟลไลบรารีสนับสนุนชุดคําสังเกี ่ ่ยวกับการกําเนิดเสียงของแผงวงจร ATX กอนใชงาน ตองผนวกไฟลไลบรารีไวในตอนตนของโปรแกรมดวยคําสั่ง #include <ipst_sound.h> หรือ #include <ipst.h>
4.7.1 beep เปนฟงกชันกํ ่ าเนิดเสียง “ติด” ๊ ซึ่งมีความถี่ 500Hz นาน 100 มิลลิวินาที ที่ขาพอรตใดๆ รูปแบบ void beep()
4.7.2 sound เปนฟงกชันกํ ่ าเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณได รูปแบบ void sound(int freq,int time) พารามิเตอร freq - กําหนดความถีสั่ ญญาณเสียง มีคา 0 ถึง 32,767 time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767
ตัวอยางที่ 4-25 beep(); // กําเนิดเสียงความถี่ 500Hz นาน 100 มิลลิวินาที sound(1200,500); // กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที
113
4.8 serial.h ไฟลไลบรารีสือสารข ่ อมูลผานโมดูลสือสารข ่ อมูลพอรตอนุกรม หรือ UART เปนไฟลไลบรารีสนับสนุนชุดคําสังเกี ่ ่ยวกับการรับสงขอมูลผานโมดูลสือสารข ่ อมูลอนุกรม (UART) กอนเรียกใชงานตองผนวกไฟลไลบรารีไวในตอนตนของโปรแกรมดวยคําสัง่ #include <ipst_serial.h> หรือ #include <ipst.h>
4.8.1 การเชือมต ่ อทางฮารดแวร มีใหใชงานเพียงชองเดียวคือ จุดตอพอรตอนุกรมบนแผงวงจร Display-io หรือ Display-MOTOR โดยใชสาย CX-4 ตอกับพอรตอนุกรมของคอมพิวเตอร หรือตอผานตัวแปลงสัญญาณ UCON-232S หากคอมพิวเตอรทีใช ่ งานมีเฉพาะพอรต USB เปนจุดตอเดียวกับทีใช ่ ในการอัปโหลดโปรแกรม ดังใน รูปที่ 4-5 ตอเขากับพอรตอนุกรม ของคอมพิวเตอรโดยตรง
สาย CX-4 ปรับความสวางจอแสดงผล ของโมดูล LCD
UCON-232S
ตอสาย CX-4 เขากับ UCON-232S ตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม ในกรณีที่คอมพิวเตอรไมมีพอรตอนุกรม
DC input
PORTC
OFF
PA7
PA6
ON
IPST MicroBOX PA4
PA5
GND PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 +5V
SCL
KNOB PA7 LCD
SDA
RS-232
PA0
ATMEGA16
PA2
PA1
+ Vin -
PA3
I P S T - M i c r oB O X
TxD
PD0
PD1
PD7
RxD
PD6
PB4
RESET
PD5
PB2 SW3
PD4
PB0
PB3
SW2
PD3
PB1
SW1
PD2
D i s p l a y - io B o a r d
ตอกับพอรต USB ของคอมพิวเตอร
แผงวงจร Display-io หรือ Display-MOTOR
แผงวงจรหลัก MicroBOX อยูดานลาง
รูปที่ 4-5 การตอวงจรเพือทดสอบและใช ่ งานไลบรารี uart สําหรับสือสารข ่ อมูลอนุกรมกับคอมพิวเตอร
114
4.8.2 uart เปนฟงกชันสํ ่ าหรับสงขอมูลสายอักขระออกจากโมดูล UART มีอัตราบอดเริ่มตนที่ 115,200 บิตตอวินาที รูปแบบ 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 กําหนดใหขอความขึนบรรทั ้ ดใหม
4.8.3 uart_set_baud เปนฟงกชันกํ ่ าหนดอัตราบอดในการสื่อสารของโมดูล UART กับคอมพิวเตอร รูปแบบ void uart_set_baud(unsigned int baud) พารามิเตอร baud - อัตราบอดในการสือสารของโมดู ่ ล UART0 กับคอมพิวเตอร มีคา 2400 ถึง 115,200
ตัวอยางที่ 4-26 uart_set_baud(4800);
// กําหนดอัตราบอดในการสือสารข ่ อมูลเปน 4,800 บิตตอวินาที
115
4.8.3 uart_available เปนฟงกชันตรวจสอบการรั ่ บขอมูลเขามาของโมดูล UART0 เมื่อติดตอกับคอมพิวเตอร รูปแบบ unsigned char uart_available(void) การคืนคา - เปน “0” เมือยั ่ งไมมีขอมูลเขามา - มากกวา 0 เมือมี ่ ขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระที่ไดรับ
ตัวอยางที่ 4-27 char x =uart_available(); // ตรวจสอบวา มีขอมูลเขามาทางภาครับของโมดูล UART0 หรือไม ถา x มีคามากกวา 0 แสดงวา // มีขอมูลเขามายังภาครับแลว ควรอานขอมูลออกดวยฟงกชัน่ uart_getkey ในลําดับถัดไปทันที
4.8.4 uart_getkey เปนฟงกชันอ ่ านขอมูลจากบัฟเฟอรตัวรับของโมดูล UART0 รูปแบบ char uart_getkey(void) การคืนคา - เปน “0” เมือไม ่ มีการรับอักขระใดๆ เขามายังวงจรภาครับของโมดูล UART - เปนคาของอักขระที่รับไดในรูปแบบของรหัสแอสกี้
ตัวอยางที่ 4-28
}
#include <atx.h> void setup() { } void loop() { if(uart_available()) { if(uart_getkey()==’a’) { lcd(“Key a Active!”); sleep(1000); } else { lcd(“#c”); } }
// เรียกใชฟงกชันพื ่ ้นฐาน // ลูปการทํางานหลัก // ตรวจสอบวามีขอมูลเขามาหรือไม // ตรวจจับการกดคีย a วา ถูกกดหรือไม // แสดงขอความเพื่อตอบสนองตอการตรวจพบวามีการคีย a // หนวงเวลาแสดงขอความประมาณ 1 วินาที // เคลียรขอความที่หนาจอโมดูล LCD
116