Page 1

   

POP-XT  1

    ArduinoPOP-XT กฤษดา ใจเย็น วรพจน กรแกววัฒนกุล ชัยวัฒน ลิ้มพรจิตรวิไล Innovative Experiment Co.,Ltd INEX Education Centre


2       POP-XT

    สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต

ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกตใชในการทดลอง เกียวกั ่ บการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโครคอนโทรลเลอร  ในแนวทางใหมทีใช ่ กิจกรรมโครงงานวิทยาศาสตรประยุกตเปนสือ่ 2. สถาบันการศึกษา โรงเรียนในระดับมัธยมศึกษาที่มีการเรียนการสอนในวิชาตามกลุมสาระวิ  ชาวิทยาศาสตร เทคโนโลยี วิศวกรรม และคณิตศาสตร (STEM) 3. วิทยาลัยและมหาวิทยาลัยทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกสหรือภาควิชาวิศวกรรมอิเล็กทรอนิกสและ คอมพิวเตอร 4. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาตามกลุมสาระวิ  ชาวิทยาศาสตร เทคโนโลยี วิศวกรรม และคณิตศาสตร (STEM), ไมโครคอนโทรลเลอร รวมถึงวิทยาศาสตรประยุกตทีต่ องการบูรณาการความ รูทางอิ  เล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรมคอมพิวเตอร--การทดลองทางวิทยาศาสตร ในระดับมัธยม ศึกษา อาชีวศึกษา และปริญญาตรี ดําเนินการจัดพิมพและจําหนายโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด 108 ซ.สุขุมวิท 101/2 ถ.สุขุมวิท แขวงบางนา เขตบางนา กรุงเทพฯ 10260 โทรศัพท 0-2747-7001-4 โทรสาร 0-2747-7005

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


   

POP-XT  3

     ในการเรียนรูวิ ทยาการสมัยใหมมีแนวคิดหนึงที ่ ได ่ รับการยอมรับอยางกวางขวาง นันคื ่ อ แนวคิดดาน STEM ศึกษา หรือ STEM Education ประกอบดวย วิทยาศาสตร (Science), เทคโนโลยี (Technology), วิศวกรรม (Engineering) และคณิตศาสตร (Mathematic) เพือให ่ ผูเรี ยนไดศึกษากระบวนการทางวิทยาศาสตรและเทคโนโลยีสมัยใหมทีจะต ่ อง อาศัยทักษะพืนฐานสํ ้ าคัญทัง้ 4 ดานมาบูรณาการกัน เพือก ่ อใหเกิดความรู ความเขาใจในเรืองนั ่ นๆ ้ อยางถูกตอง ไมโครคอนโทรลเลอร (microcontroller) และระบบสมองกลฝงตัว (embedded system) ถูกนํามาเปน สวนหนึงของกระบวนการ ่ STEM ศึกษาในระดับมัธยมศึกษา เนืองจากในสั ่ งคมสมัยใหมมีอุปกรณเครืองใช ่ จํานวนมาก ในชีวิตประจําวันทีมี่ วงจรและอุปกรณอิเล็กทรอนิกสเขาไปเกียวข ่ อง การเรียนรูของนั  กเรียนเพือทํ ่ าความเขาใจและตอยอด ไปสูการพั  ฒนาเปนโครงงานวิทยาศาสตรสมัยใหมทีมี่ ความเกียวข ่ องกับระบบควบคุมอัตโนมัติ อันมีไมโครคอนโทรลเลอร เปนสวนหนึงของหั ่ วใจหลักจึงเปนเปาหมายหนึงที ่ แสดงถึ ่ งความสัมฤทธิผลของการเรี ์ ยนรู STEM ศึกษา แผงวงจรไมโครคอนโทรลเลอร POP-XT (จาก INEX : www.inex.co.th) และซอฟตแวรระบบเปด (open source) ทีใช ่ ในการพัฒนาโปรแกรมควบคุมดวยภาษา C/C++ ทีชื่ อ่ Arduino (www.arduino.cc) เปนหนึงในทางเลื ่ อก เพือสนั ่ บสนุนการเรียนรูไมโครคอนโทรลเลอร  อยางงาย กอใหเกิดกระบวนการคิดเพือพั ่ ฒนาโครงงานวิทยาศาสตร สมัยใหมทีมี่ ความเกียวข ่ องกับระบบควบคุมอัตโนมัติขนาดเล็ก เพือให ่ ผูเรี ยนสามารถบรรลุจุดประสงคของการเรียนรู STEM ศึกษา ไดอยางมีประสิทธิภาพ การเรียนรูไมโครคอนโทรลเลอร  ดวยแผงวงจร POP-XT และซอฟตแวร Arduino ชวยใหผูเรี ยนและครู-อาจารย สามารถเขียนโปรแแกรมควบคุมอุปกรณฮารดแวรดวยภาษา C/C++ ไดไมยาก เขาใจถึงความสัมพนธและการทํางาน รวมกันระหวางการเชือมต ่ อทางฮารดแวรและกระบวนการคิดทางซอฟตแวร มีการอานคาเขามาในระบบ ทําการประมวล ผล คิด วิเคราะห แลวสงคําสังหรื ่ อสังการส ่ งคาออกไปยังอุปกรณภายนอก เพือควบคุ ่ มการทํางานหรือแสดงผล ซึงนั ่ น่ ก็คือ หลักการเบืองต ้ นของการพัฒนาโครงงานวิทยาศาสตรประยุกตสมัยใหมทีสอดคล ่ องกับแนวคิด STEM ศึกษา แนวคิด STEM ศึกษามิไดจํากัดขอบเขตของผูเรี ยนไวในระดับมัธยมศึกษาเทานัน้ ในระดับอาชีวศึกษาหรือ ระดับปริญญาตรีชวงตนก็สามารถเรียนรูและนํ  าแนวคิด STEM ศึกษาไปตอยอดได อาจกลาวใหเขาใจงายๆ วา STEM ศึกษาคือ สาระความรูด านพืนฐานทางวิ ้ ศวกรรมก็ได เพราะมิไดจํากัดเฉพาะดานไฟฟา อิเล็กทรอนิกส คอมพิวเตอร เทานัน้ STEM มีฐานความรูที กว ่ างไปถึงความรูทางกลศาสตร  ทักษะการใชเครืองมื ่ อ การคํานวณ สถิติ เคมี ชีววิทยา ดังนันการเรี ้ ยนรูไมโครคอนโทรลเลอร  และฝกหัดการเขียนโปรแกรมดวยภาษา C/C++ จึงนําไปประยุกตใชใหเขากับ องคความรูพืนฐานต ้ างๆ ไดอยางลงตัว และตอบโจทยการพัฒนากระบวนการคิดไดเปนทีประจั ่ กษ ชุดอุปกรณการเรียนรูทั้ง POP-BOT XT robot kit , POP-BOT XT Lite robot kit และ POP-XT Education kit เปนสือการเรี ่ ยนรูทางเลื  อกสําหรับครู-อาจารย, นักเรียนและนักพัฒนาระบบสมองกลฝงตัวอิสระทีมี่ ความประสงค ในการตอยอดหรือประยุกตใชไมโครคอนโทรลเลอร และซอฟตแวร Arduino ในกิจกรรมดานหุนยนต  และโครงงาน วิทยาสาสตรสมัยใหมทีเกี ่ ยวข ่ องกับระบบควบคุมอัตโนมัติควบคุมดวยโปรแกรมภาษา C/C++ ดําเนินการโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด การจัดหาสือการเรี ่ ยนรูนี เป ้ นไปในรูปแบบสมัครใจ การบริการเกียวกั ่ บการจัดหา และซอมแซมอุปกรณอยูภายใต  ความรับผิดชอบของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด


4       POP-XT

  การนําเสนอขอมูลเกียวกั ่ บขอมูลทางเทคนิคและเทคโนโลยีในหนังสือเลมนี้ เกิดจากความตอง การทีจะอธิ ่ บายกระบวนการและหลักการทํางานของอุปกรณในภาพรวมดวยถอยคําทีง่ ายเพื่อสราง ความเขาใจแกผูอ าน ดังนันการแปลคํ ้ าศัพททางเทคนิคหลายๆ คําอาจไมตรงตามขอบัญญัติของราช บัณฑิตยสถาน และมีหลายๆ คําทียั่ งไมมีการบัญญัติอยางเปนทางการ คณะผูเขี  ยนจึงขออนุญาต บัญญัติศัพทขึนมาใช ้ ในการอธิบาย โดยมีขอจํากัดเพืออ ่ างอิงในหนังสือเลมนีเท ้ านัน้ สาเหตุหลักของขอชี้แจงนี้มาจากการรวบรวมขอมูลของอุปกรณในระบบสมองกลฝงตัวและ เทคโนโลยีหุนยนต  สําหรับการศึกษาเพือนํ ่ ามาเรียบเรียงเปนภาษาไทยนันทํ ้ าไดไมงายนัก ทางคณะผู เขียนตองทําการรวบรวมและทดลองเพือให ่ แนใจวา ความเขาใจในกระบวนการทํางานตางๆ นันมี ้ ความ คลาดเคลือนน ่ อยทีสุ่ ด เมือต ่ องทําการเรียบเรียงออกมาเปนภาษาไทย ศัพททางเทคนิคหลายคํามีความหมายทีทั่ บซอน กันมาก การบัญญัติศัพทจึงเกิดจากการปฏิบัติจริงรวมกับความหมายทางภาษาศาสตร ดังนันหากมี ้ ความ คลาดเคลือนหรื ่ อผิดพลาดเกิดขึน้ ทางคณะผูเขี  ยนขอนอมรับและหากไดรับคําอธิบายหรือชีแนะจากท ้ าน ผูรู จะได  ทําการชีแจงและปรั ้ บปรุงขอผิดพลาดทีอาจมี ่ เหลานันโดยเร็ ้ วทีสุ่ ด ทังนี ้ ้เพื่อใหการพัฒนาสื่อทางวิชาการ โดยเฉพาะอยางยิงกั ่ บความรูของเทคโนโลยีสมัยใหม สามารถดําเนินไปไดอยางตอเนื่อง ภายใตการมีสวนรวมของผูรูในทุ  กภาคสวน


   

POP-XT  5

 บทที่ 1 แนะนําอุปกรณทางฮารดแวร....................................................................................7 บทที่ 2 แนะนําและติดตังซอฟต ้ แวร Arduino 1.0..................................................................17 บทที่ 3 โครงสรางโปรแกรมของ Arduino..................................................................................41 บทที่ 4 ฟงกชันพื ่ นฐานของ ้ Arduino......................................................................................75 บทที่ 5 การพัฒนาโปรแกรมสําหรับแผงวงจร POP-XT ดวย Arduino 1.0........................97 บทที่ 6 ทดสอบการควบคุมฮารดแวรของแผงวงจร POP-XT .......................................... 105 บทที่ 7 ไลบรารีสําหรับการพัฒนาโปรแกรมของแผงวงจร POP-XT................................123 บทที่ 8 ตัวอยางการทดลองใชงานแผงวงจร POP-XT ติดตอกับอุปกรณภายนอก........155


6       POP-XT


    POP-XT  7



 ในการเรียนรูไมโครคอนโทรลเลอร  เพือพั ่ ฒนาโครงงานสําหรับหนังสือเลมนี้ เลือกใชอุปกรณ ดังตอไปนี้ 1. แผงวงจรไมโครคอนโทรลเลอร POP-XT ที่ติดตังกะบะถ ้ าน AA แบบ 4 กอน 2. แผงวงจรไฟแสดงผล ZX-LED จํานวน 2 ชุด 3. แผงวงจรสวิตช ZX-SWITCH01 จํานวน 2 ชุด 4. แผงวงจรตรวจจับแสง ZX-LDR 5. แผงวงจรตรวจจับแสงสะทอน ZX-03R 6. แผงวงจรตัวตานทานปรับคาได ZX-POTH 7. ไอซีวัดอุณหภูมิ MCP9701 พรอมสายตอ 8. มอเตอรไฟตรงพรอมชุดเฟองขับรุน BO-1 อัตราทด 48:1 พรอมสายเชือมต ่ อ จํานวน 2 ตัว 9. เซอรโวมอเตอร 10. สายเชือมต ่ อ USB-miniB สําหรับดาวนโหลดโปรแกรมและสื่อสารขอมูล โดยมีการจัดอุปกรณดังกลาวในชือ่ ชุดเรียนรูไมโครคอนโทรลเลอร POP-XT Educatioin kit (www.inex.co.th) นอกจากนันเนื ้ อหาการเรี ้ ยนรูในหนั  งสือเลมนียั้ งใชไดกับชุดหุนยนต  POP-BOT XT ทุกรุนได  ดวย หากการทดลองตองใชอุปกรณเพิมเติ ่ มจากชุดหุนยนต  ผูสนใจสามารถสั  งซื ่ อได ้ กับบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด (www.inex.co.th)


8      POP-XT

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

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

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

 มีไฟแสดงสถานะไฟเลี้ยงและไฟทดสอบพอรต  มีสวิตช RESET  มีจุดตอพอรต USB

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

้  มีจุดตอไฟเลี้ยง (DC INPUT) ผานทางจุดตอสายแบบขันสกรู สามารถรับไฟเลี้ยงไดตังแต 4.8 ถึง 7.2V โดยมีสวิตชเปด-ปดเพื่อตัดตอไฟเลี้ยงแกแผงวงจร  มีวงจรควบคุมไฟเลี้ยง +5V แบบสวิตชิง่  จุดตอพอรตอินพุตเอาตพุตดิจิตอลหรืออะนาลอก 8 ชอง คือ A0 ถึง A7 (ตรงกับขา 18 ถึง

23 สําหรับขา A0 ถึง A5, 4 และ 6 สําหรับขา A6 และ A7)  จุดตอพอรตดิจิตอลรองรับระบบบัส I2C

1 ชุด คือ จุดตอ 2 (SDA) และ 3 (SCL)

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


    POP-XT  9

รูปที่ 1-1 แสดงสวนประกอบของแผงวงจรควบคุม POP-XT  มีวงจรขับมอเตอรไฟตรง 2 ชอง พรอมไฟแสดงผล  มีจุดตอขาพอรตของไมโครคอนโทรลเลอรสําหรับขับเซอรโวมอเตอร 3 ชองคือ จุดตอ 30,

12 และ 13 (เรียงตามลําดับ SV1, SV2 และ SV3)  มีลําโพงเปยโซสําหรับขับเสียง โดยตอกับขาพอรต 11  มีโมดูลแสดงผลแบบกราฟกสี ความละเอียด 128 x 160 จุด แสดงภาพกราฟกลายเสน และ

พื้นสี (ไมรองรับไฟลรูปภาพใดๆ) พรอมไฟสองหลัง แสดงผลเปนตัวอักษรขนาดปกติ (5x7 จุด) ได 21 ตัวอักษร 16 บรรทัด (21x16)  มีสวิตชกดติดปลอยดับพรอมใชงาน (สวิตช OK) 1 จุด โดยตอรวมกับตัวตานทานปรับคาได

(KNOB) ซึงเชื ่ อมต ่ อไปยังขาพอรต 8 ทําใหอานคาสัญญาณดิจิตอลและอะนาลอกไดในขาพอรตเดียวกัน วงจรสมบูรณของแผงวงจร POP-XT แสดงในรูปที่ 1-2


10      POP-XT

PF1 A4 22

PF5 A2 20

+Vm

PF7 A0 18

SWITCH ON

+5V K3 BATT 4.8-7.2V 3

PF0 A5 23

PF4 A3 21

+

PF6 A1 19

L1 10H 1

C6 100F 10V

C5 0.1 F

+USB

44 43 42 41 40 39 38 37 36 35 34 1 33 32 2 31 3 4

IC1 ATMega32U4 (TQFP44)

UGnd 5 UCap

VBus PB0

C1 1F

6 7

30 29 28 27 26

8 17 PB1 9 15 PB2 10 16 PB3 11 14

PE2 PC7 PC6 PB6 PB5 PB4 PD7 PD6 PD4 AVcc GND

Pxx

C12 0.1F

4

1,2,3

G

RST + 17

+5V

+5V Q1 KRC102

R5 4k7

19 18

+Vm

+Vm PWMA AIN2 AIN1 Vcc STB GND BIN1 BIN2 PWMB +Vm +Vm

CR1 16MHz

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

IC2 TB6612FNG

+5V 3

4 5

6 7

+Vm

8 9 10 11 12

A1 A1 PG PG A2 A2 B2 B2 PG PG B1 B1

1 2

C3 10 F 16V

PC6

SDA PD1

0 RXD

6

PD2

1

TXD PD3

4

A7 PD7

ADIR

R8 1k

R7 1k

5

7

APWM 9 PB5

BDIR

10 BPWM

SV3

GND +Vm 12

SV2

GND +Vm 30

SV1

PB6

-+ 2

SCL PD0

GND +Vm 13 PE6

-+

3

A

B

DC. MOTOR OUTPUT

A6 PD4

+5V

+3.3V IC5 LM1117-3.3V

GLCD 128x160 pixel

C14 10F 16V

21-character 16-line

C16 10F 16V

C15 0.1F

R11 4.7k PB0 R13 4.7k

31

21 20

12 6

PE2

RST

SP1 PIEZO Speaker

16

4 30

R12 4.7k

R15 4.7k

R14 4.7k

+5V R11 1k

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

PB2

R17 4.7k

N/C GND CS Vcc Vcc CLK MISO D/C /RST GND LEDA LEDK GND N/C

PB1

8

R16 4.7k

R9 4.7

+3.3V

VR1 KNOB

SW5 OK

PE2 +3.3V

R18 4.7k +3.3V

R10 4.7k RST C17 0.1F

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

D1 1N4148

C18 0.1F

PB4

SW3 RESET

R11 1k

31

+Vm

11

15

REF 23 22

A8

R3 4k7

17

7 GND

2 0 1

PB4

C9 0.1 F

ISP SW2 RESET

+

14 3

8

+5V

C2 0.01F

15 16

13 5 11

C8 0.1 F

R6 4k7

Q2 KRC102

  

GND GND

31

8

C13 220F 10V

10 9

PB7 RST Vcc GND XTAL2 XTAL1 PD0 PD1 PD2 PD3 PD5

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

R4 4k7 LED1 BLUE

5

SPI Ext.

PE6 UVcc DD+

R1 R2 27 27

VUSB DD+ ID GND

AVcc GND AREF PF0 PF1 PF4 PF5 PF6 PF7 GND Vcc

C4

+5V 0.1 F

4

2

IC4 NCP1450 - 5.0

 

xx C7 0.1F

1

5,6,7,8 C11 470F 16V Q3 FDS6680A

3

4

+5V

K1 mini B-USB USB port

IC3 2 KIA278R05

C10 470F 16V

+5V

+5V D1 MBRS340


    POP-XT  11

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

LED1 R1 (Default = 510)

S

+

Q1 KRC102 (DTC114)

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

1.2.2 มอเตอรไฟตรงพรอมชุดเฟองขับ เปนชุดมอเตอรพรอมเฟองขับรุน BO-1 อัตราทด 48:1 มีสายตอ 2 เสน คุณสมบัติทางเทคนิคที่ สําคัญมีดังนี้  ตองการไฟเลี้ยงในยาน +3 ถึง +12Vdc  กินกระแสไฟฟา 130mA (ที่ไฟเลี้ยง +6V และไมมีโหลด)  ความเร็วเฉลี่ย 170 ถึง 250 รอบตอนาที (ที่ไฟเลี้ยง +6V และไมมีโหลด)  นํ้าหนัก 30 กรัม ่ ด 0.5 กิโลกรัม-เซนติเมตร  แรงบิดตําสุ  ขนาด (กวาง x ยาว x สูง) 22 x 70 x 19 มิลลิเมตร (ไมรวมความยาวของแกน 10 มิลลิเมตร)


12      POP-XT

1.2.3 เซอรโวมอเตอรแบบมาตรฐาน มีสายตอใชงาน 3 เสนคือ สายสัญญาณ (S) สายไฟเลี้ยง (+V) และกราวด (G) ภายในเซอรโว มอเตอรมีวงจรควบคุมการหมุนติดตังอยู ้  คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้  ตองการไฟเลี้ยงในยาน +4.8 ถึง +6Vdc  ความเร็วเฉลี่ย 60 รอบตอนาที (ที่ไฟเลี้ยง +5V และไมมีโหลด)  นํ้าหนัก 45 กรัม  แรงบิด 3.40 กิโลกรัม-เซนติเมตร หรือ 47 ออนซ-นิ้ว  ขนาด (กวาง x ยาว x สูง) 40.5 x 20 x 38 มิลลิเมตร หรือ 1.60 x 0.79 x 1.50 นิ้ว       

STANDARD SERVO MOTOR

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

D

ZX-SWITCH01

มีวงจรแสดงในรูปที่ 1-4 ประกอบดวยสวิตชพรอมไฟแสดงผล ใหเอาตพุตคือ หากมีการกดสวิตช จะสงลอจิก “0” (ระดับแรงดัน 0V) และไฟสีแดงติด    

LED1

Indicator

+V

R2 10k R1 510

R3 220

DATA

Signal output S1 GND Switch

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


    POP-XT  13

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

1.3.2 แผงวงจรตรวจจับแสง : ZX-LDR ใชตรวจจับแสงสวาง เลือกเอาตพุตได 2 แบบคือ แรงดันเอาตพุตเพิม่ เมื่อแสงตกกระทบ

+ +

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

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

+

LDR Light

+

A

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

ZX-LDR +

10k

S

+

A

+

LDR

S

+

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

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


14      POP-XT

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

LED LED1

+V OUT

SFH310

GND

10k

220

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

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

1.3.3 แผงวงจรตัวตานทานปรับคาไดแบบแกนหมุน : ZX-POTH ใชกําหนดแรงดัน 0 ถึง +5V ตามการหมุนแกน นําไปใชวัดคามุมและระยะทางได มีทั้งแบบ ตัวตังและตั ้ วนอน มีเอาตพุต 2 แบบคือ แรงดันมากขึนเมื ้ ่อหมุนทวนเข็มนาฬิกาหรือ ตามเข็มนาฬิกา มีวงจรและหนาตาของแผงวงจรแสดงในรูปที่ 1-7 ใชงานกับแผงวงจรไมโครคอนโทรลเลอร POP-XT โดยตอสัญญาณเขากับชองอินพุตอะนาลอกที่ชอง A0 ถึง A7 เมื่อหมุนทวนเข็มนาฬิกา แรงดันที่ไดจะมากขึ้น

A

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

Potentiometer

A

ZX-POTH S + S +

10kB

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


    POP-XT  15

1.3.4 ไอซีวัดอุณหภูมิ MCP9701 เปนอุปกรณตรวจจับและวัดอุณหภูมิทีให ่ ผลการทํางานเปนแรงดันไฟฟาแบบเชิงเสน รับรูการ  เปลี่ยนแปลงของอุณหภูมิภายในเวลาไมถึง 2 วินาที เชื่อมตอกับอินพุตอะนาลอก A0 ถึง A6 ของแผง วงจรหลัก IPST-SE ไดทันที ในรูปที่ 1-8 แสดงการจัดขาและกราฟคุณสมบัติของไอซีวัดอุณหภูมิเบอร MCP9701 คุณสมบัติทางเทคนิคของ MCP9701 ที่ควรทราบ  เปนไอซีวัดอุณหภูมิในกลุมเทอรมิสเตอรแบบแอกตีฟที่ใหผลการทํางานแบบเชิงเสน  ยานวัด -40 ถึง +125 องศาเซลเซียส  ผลการวัดอางอิงกับหนวยขององศาเซลเซียสโดยตรง  ความผิดพลาดเฉลี่ย 2 องศาเซลเซียส  ยานไฟเลี้ยง +3.1 ถึง +5.5V กินกระแสไฟฟาเพียง 6uA ใชแบตเตอรี่เปนแหลงจายไฟได  คาแรงดันเอาตพุต

500mV (ที่ 0๐C) ถึง 2.9375V (ที่ 125๐)

 คาแรงดันเอาตพุตตอการเปลี่ยนแปลงอุณหภูมิ 19.5mV/๐C ใชงานกับวงจรแปลงสัญญาณ

อะนาลอกเปนดิจิตอลความละเอียดตั้งแต 8 บิตได โดยมีความคลาดเคลื่อนตํา่  ไมตองการอุปกรณภายนอกตอเพิ่มเติมเพื่อชดเชยการทํางาน

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


16      POP-XT

1.4 ขอมูลของสายสัญญาณที่ใชประกอบการเรียนรู 1.4.1 สาย JST3AA-8 : สายเชือมต ่ อระหวางแผงวงจร สาย JST3AA-8 ใชเชือมต ่ อระหวางแผงวงจรควบคุม POP-XT กับแผงวงจรตรวจจับและแผง วงจรอุปกรณตางๆ เปนสายแพ 3 เสน ยาว 8 นิ้ว ปลายสายทั้งสองดานติดตังคอนเน็ ้ กเตอรแบบ JST 3 ขา ตัวเมีย ระยะหางระหวางขา 2 มิลลิเมตร มีการจัดขาดังนี้ ระยะหางระหวางขา 2 มม.

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

GND S +5V

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


    POP-XT  17



 ในบทนี้จะอธิบายสวนประกอบและรายละเอียดของโปรแกรม Arduino1.0 ที่ใชในการเขียน โปรแกรม คอมไพลโปรแกรม และอัปโหลดโปรแกรมไปยังแผงวงจรไมโครคอนโทรลเลอร POP-XT โดยซอฟตแวร Arduino1.0 สามารถรันบนระบบปฏิบัติการไดทุกแบบ ไมวาจะเปนวินโดวสทีรองรั ่ บ ตังแต ้ วินโดวส XP ขึ้นไป, MAC OS และ Linux

2.1 การติดตังซอฟต ้ แวร Arduino และไดรเวอร USB สําหรับวินโดวส 7 และ 8 2.1.1 ติดตังซอฟต ้ แวร Arduino 1.0.x ในชุดซอฟตแวรทีมาพร ่ อมกับชุดหุนยนต  POP-BOT XT หรือ ชุดเรียนรูไมโครคอนโทรลเลอร  POP-XT Education kit ประกอบดวย ซอฟตแวร Arduino 1.0 ทีบรรจุ ่ ไดรเวอรและขอมูลสําหรับติดตอ กับแผงวงจร POP-XT ซึ่งเขากันไดกับฮารดแวร Arduino Leonardo, ไฟลไลบรารีที่ชือ่ popxt.h และ โปรแกรมตัวอยาง มีขั้นตอนการติดตังดั ้ งนี้ (ภาพประกอบที่เปนหนาตางตางๆ ของโปรแกรมอางอิง กับระบบปฏิบัติการวินโดวส 7) (1) นําแผนซีดีรอมทีมากั ่ บชุดอุปกรณใสเขาไปในซีดีรอมไดรฟ เขาไปทีโฟลเดอร ่ D:\Robotics\ POP-BOT_POP-BOT XT\Software\Windows ดับเบิลคลิ ้ กทีไฟล ่  arduino1.0.4release_setup130421.exe (ตัวเลขเวอรชันอาจเปลียนแปลงตามการปรั ่ บปรุง) จะปรากฎหนาตางตอนรับสูการติ  ดตังให ้ คลิก Next หนาตางติดตังจะสอบถามตํ ้ าแหนงการติดตังโปรแกรมให ้ กด Next


18      POP-XT

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

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

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


    POP-XT  19

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

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

(6) ปดสวิตชของแผงวงจร POP-XT บรรจุแบตเตอรี่ AA จํานวน 4 กอน ลงในแผงวงจร POP-XT (7) ตอสาย USB-miniB เขาทีจุ่ ดตอพอรต USB สวนปลายอีกดานของสาย USB ตอเขากับพอรต USB ของคอมพิวเตอร


20      POP-XT

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

100 F

ATMega32U4

220 F

100 TB6612

ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา

ใหการติดตั้งไดรเวอรอาจมีขอผิดพลาดได (9) หลังจากปลอยสวิตช OK ทีมุ่ มขวาลางของคอมพิวเตอรจะแจงวา ตรวจพบฮารดแวรตัวใหม สอบถามถึงตําแหนงของไฟลไดรเวอร Arduino Leonardo Bootloader ทีต่ องการติดตัง้ ใหคลิก เลือก ที่ชอง Install from a list or specific location (Advanced) จากนั้นคลิกที่ปุม Next (10) หนาตางคนหาไดรเวอรแบบอัตโนมัติหรือหาดวยตนเองภายในคอมพิวเตอรปรากฏขึนมา ้ ใหเลือก Browse my computer for driver software อันเปนการเลือกคนหาไดรเวอรดวยตนเอง


    POP-XT  21

(11) ระบุตําแหนงของไดรเวอรไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x64 ใน กรณีเปนวินโดวส 64 บิต หรือ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณีเปนวินโดวส 32 บิต จากนั้นกด Next (12) ระบบจะแจงเตือนเรื่องความปลอดภัยของไดรเวอรที่ตองการติดตังลงไป ้ ใหเลือกหัวขอ Install this driver software anyway เพื่อยืนยันการติดตัง้

(13) ระบบจะใชเวลาสักครูเพื่อติดตังไดรเวอร ้ ของ Arduino Leonardo Bootloader (14) จากนัน้ จะมีการรองขอใหติดตังไดรเวอร ้ Arduino Leonardo ตอเนืองกั ่ น ใหดําเนินการ ขั้นตอนที่ (9) ถึง (12) (15) ตรวจสอบตําแหนงของพอรตทีใช ่ ในการเชือมต ่ อ โดยคลิกเมาสปุมขวาที  ่ My Computer เลือก Properties > Control panel > Device Manager


22      POP-XT

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

2.1.2 ทดสอบอัปโหลดโปรแกรม (1) เปดซอฟตแวร Arduino 1.0.x (ตามเอกสารนี้เปนเวอรชัน 1.0.4) (2) เลือกไฟลตัวอยาง จาก File > Example > POP-BOT XT > HelloWorld (3) เลือกชือของแผงวงจร ่ โดยไปที่ Tools > Board > POP-XT (Caterina)


    POP-XT  23

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

(5) อัปโหลดโคด โดยคลิกที่ปุม

หรือเลือกเมนู File > Upload

(6) เมื่อการอัปโหลดเสร็จสิ้น จะมีขอความ Done uploading ปรากฏขึ้นที่แถบแสดงสถานะ ดานลางของหนาตางโปรแกรม ที่จอแสดงผลของ POP-XT แสดงขอความ Hello World เปนการแสดงวา แผงวงจร POP-XT พรอมใชงานแลว 100 F

ATMega32U4

HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


24      POP-XT

2.1.3 การแกไขปญหาในกรณีทีเกิ ่ ดไมสามารถอัปโหลดโปรแกรม หรือซอฟตแวร Arduino ไมพบการเชือมต ่ อกับแผงวงจร POP-XT โดยปกติควรเชือมต ่ อพอรต USB ของคอมพิวเตอรกับแผงวงจร POP-XT ที่ตําแหนงเดิม หาก ตองการเปลียนช ่ องตอของพอรต USB ก็สามารถทําไดทันที แตอาจเกิดเหตุการณทีซอฟต ่ แวร Arduino ไมพบฮารดแวร ทําใหติดตอกับแผงวงจร POP-XT ไมได มีแนวทางในการแกไขดังนี้ (1) ตอสาย USB-miniB เขาทีแผงวงจรกั ่ บพอรต USB ของคอมพิวเตอร ) เปดสวิตชจายไฟให แกแผงวงจร POP-XT (2) ที่มุมขวาลางของคอมพิวเตอรจะแจงวา ตรวจพบฮารดแวรตัวใหมและพยายามติดตั้งได รเวอรลงในเครื่องคอมพิวเตอร โดยในขั้นตนจะแจงวาการติดตังไดรเวอร ้ ไมสมบูรณดังรูป

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


    POP-XT  25

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

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


26      POP-XT

(6) ระบุตําแหนงของไดรเวอรไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x64 ในกรณี เปนวินโดวส 64 บิต หรือ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณีเปนวินโดวส 32 บิต จากนั้นกด Next (7) ระบบจะแจงเตือนเรื่องความปลอดภัยของไดรเวอรที่ตองการติดตังลงไป ้ ใหเลือกหัวขอ Install this driver software anyway เพื่อยืนยันการติดตัง้

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


    POP-XT  27

2.2 การติดตั้งซอฟตแวรและไดรเวอร USB สําหรับวินโดวส XP 2.2.1 ติดตังซอฟต ้ แวร Arduino ซอฟตแวรทีมาพร ่ อมกับแผงวงจร POP-XT ประกอบดวย ซอฟตแวร Arduino 1.0 ทีบรรจุ ่ ไดรเวอรและขอมูลสําหรับติดตอกับแผงวงจร POP-XT ซึงเข ่ ากันไดกับฮารดแวร Arduino Leonardo, ไฟล ไลบรารีของแผงวงจร POP-XT ทีชื่ อ่ popxt.h และโปรแกรมตัวอยาง มีขันตอนการติ ้ ดตังดั ้ งนี้ (1) นําแผนซีดีรอมที่มากับชุดอุปกรณใสเขาไปในซีดีรอมไดรฟ เขาไปที่ D:\Robotics\ POP-BOT_POP-BOT XT\Software\Windows ดับเบิลคลิ ้ กทีไฟล ่  arduino1.0.4release_setup130421.exe (ตัวเลขเวอรชันอาจเปลียนแปลงตามการปรั ่ บปรุง) จะปรากฎหนาตางตอนรับสูการติ  ดตังให ้ คลิก Next หนาตางติดตังจะสอบถามตํ ้ าแหนงการติดตังโปรแกรมให ้ กด Next

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


28      POP-XT

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

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


    POP-XT  29

2.2.2 ติดตังไดรเวอร ้ ใหกับแผงวงจร POP-XT สําหรับวินโดวส XP สําหรับวินโดวส XP จะมีขันตอนและหน ้ าตางของการติดตังไดรเวอร ้ ทีแตกต ่ างไปจากวินโดวส 7 และ 8 ดังนี้ (1) ปดสวิตชของแผงวงจร POP-XT จากนั้น บรรจุแบตเตอรี่ AA จํานวน 4 กอน ลงในแผง วงจร POP-XT (2) ตอสาย USB-miniB เขาทีจุ่ ดตอพอรต USB สวนปลายอีกดานของสาย USB ตอเขากับพอรต USB ของคอมพิวเตอร (.3) กดสวิตช OK คางไว จากนัน้ เปดสวิตชจายไฟใหแกแผงวงจร POP-XT แลวปลอยสวิตช OK

100 F

ATMega32U4

220 F

100 TB6612

ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา

ใหการติดตั้งไดรเวอรอาจมีขอผิดพลาดได


30      POP-XT

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

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


    POP-XT  31

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

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

(8) เลือกตําแหนงของไดรเวอรไปที่ C:\Arduino\drivers\Unicon POP-XT Driver\x86 กรณี เปนวินโดวส 32 บิต หรือ C:\Arduino\drivers\Unicon POP-XT Driver\x64 กรณีเปนวินโดวส XP รุน 64 บิต แลวคลิกปุม Next (9) กระบวนการติดตังไดรเวอร ้ Arduino Leonardo จะเริมขึ ่ น้ รอจนกระทังเสร็ ่ จ คลิกปุม Finish เพือจบการติ ่ ดตัง้


32      POP-XT

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

2.2.3 ทดสอบอัปโหลดโปรแกรม (1) เปดซอฟตแวร Arduino 1.0.x (ตามเอกสารนี้เปนเวอรชัน 1.0.4) (2) เลือกไฟลตัวอยาง จาก File > Example > POP-BOT XT > HellWorld (3) เลือกชือของแผงวงจร ่ โดยไปที่ Tools > Board > POP-XT (Caterina)


    POP-XT  33

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

(5) อัปโหลดโคด โดยคลิกที่ปุม

หรือเลือกเมนู File > Upload

(6) รอจนกระทั่งการอัปโหลดเสร็จสิ้น จะมีขอความ Done uploading ปรากฏขึ้นที่แถบแสดง สถานะดานลางของหนาตางโปรแกรม (7) ที่จอแสดงผลของ POP-XT แสดงขอความ Hello World เปนการแสดงวา นับจากนี้แผง วงจร POP-XT พรอมใชงาน

100 F

ATMega32U4

HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRR Row09 RRRRRRRRRR Row010 RRRRRRRRRRR Row011 RRRRRRRRRRRR Row012 RRRRRRRRRRRRR Row013 RRRRRRRRRRRRRR Row014 RRRRRRRRRRRRRRR Row015

100

220 F

TB6612


34      POP-XT

2.2.4 ติดตังไดรเวอร ้ ใหกับแผงวงจร POP-XT สําหรับวินโดวส XP กรณีทีเปลี ่ ยน ่ พอรต USB โดยปกติควรเชือมต ่ อพอรต USB ของคอมพิวเตอรกับแผงวงจร POP-XT ที่ตําแหนงเดิม หาก ตองการเปลียนช ่ องตอของพอรต USB ในกรณีของวินโดวส XP จะตองทําการติดตังไดรเวอร ้ ใหม โดย ใชวิธีการเดียวกับหัวขอ 2.2 ดังนี้ (1) ปดสวิตชของแผงวงจร POP-XT บรรจุแบตเตอรี่ AA 4 กอน ลงในแผงวงจร POP-XT (2) ตอสาย USB-miniB เขาทีจุ่ ดตอพอรต USB สวนปลายอีกดานของสาย USB ตอเขากับพอรต USB ของคอมพิวเตอร (3) กดสวิตช OK คางไว จากนัน้ เปดสวิตชจายไฟใหแกแผงวงจร POP-XT แลวปลอยสวิตช OK

100 F

ATMega32U4

220 F

100 TB6612

ขันตอนนี ้ สํ้ าคัญมาก จะตองกดสวิตช OK คางไว กอนเปดสวิตชจายไฟ มิเชนนัน้ จะทํา

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


    POP-XT  35

2.3 ติดตั้งซอฟตแวร Arduino บนคอมพิวเตอร Macintosh ที่ใชระบบปฏิบัติการ OSX 10.6 ขึ้นไป การติดตังและเริ ้ ่มตนใชงานซอฟตแวร Arduino1.0 บนคอมพิวเตอร Macintosh มีขั้นตอนที่ ไมซับซอน ดังนี้ (1) คัดลอกไฟล Arduino 0102 MacOSX 20121113.dmg จากแผนซีดีรอมไปไวทีหน ่ า Desktop (2) จากนั้นดับเบิลคลิกไฟล Arduino 0102 MacOSX 20121113.dmg แลวดําเนินการตามคํา แนะนําทีปรากฏขึ ่ ้นมา (3) เมือติ ่ ดตังแล ้ ว เปดซอฟตแวร Arduino ขึนมา ้ ไปทีเมนู ่ Tools เลือก Board เปนรุน POP-XT

(4 ) เปดสวิตชจายไฟแกแผงวงจร POP-XT รอสักครูเพื  อให ่ แผงวงจรเตรียมความพรอม ใชเวลา ประมาณ 10 วินาที จากนันจึ ้ งเสียบสาย USB จากแผงวงจร POP-XT เขาทีพอร ่ ต USB ของคอมพิวเตอร Macintosh (5) ไปที่เมนู Tools เลือก Serial Port จะพบอุปกรณที่ชือ่ /dev/tty.usbmodemxxxx โดย xxxx ที่ตามมาขางหลังอาจจะมีชือใด ่ ๆ อยูก็ได ใหเลือกใชการสื่อสารอนุกรมจากอุปรณตัวนี้


36      POP-XT

2.4 สวนประกอบของหนาจอโปรแกรม Arduino1.0.x เมือเรี ่ ยกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 2-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้ ่ างๆ ในการใชงานโปรแกรม  เมนู (Menu) ใชเลือกคําสังต แถบเครืองมื ่ อ (Toolbar) เปนการนําคําสังที ่ ่ใชงานบอยๆ มาสรางเปนปุม เพื่อใหเรียกใช คําสังได ่ รวดเร็วขึ้น 

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

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

เมนู (Menu) แถบเครืองมื ่ อ (Tools bar) แถบเลือกโปรแกรม (Tab)

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

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

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

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


    POP-XT  37

้ แสดงสถานะการทํ ่ างาน (Message area) เปนพืนที ้ โปรแกรมใช ่ แจงสถานะการทํางาน  พืนที ของโปรแกรม เชน ผลการคอมไพลโปรแกรม ้ ่แสดงขอมูล (Text area) ใชแจงวาโปรแกรมที่ผานการคอมไพลแลวมีขนาดกีไบต ่  พืนที  าหรับเปดหนาตาง Serial Monitor ปุมนี  จะอยู ้ ทางมุ  มบนดานขวามือ คลิกปุมนี  เมื ้ อต ่ อง  ปุมสํ การเปดหนาตางสื่อสารและแสดงขอมูลอนุกรม โดยตองมีการตอฮารดแวร Arduino และเลือกพอร ตการเชื่อมตอใหถูกตองกอน

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


38      POP-XT

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

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

เพื่อเริ่มเขียนโปรแกรมใหม

 Open ใชเปดสเก็ตชที่บันทึกไวกอนหนานี้  Sketchbook : ใชเปดไฟลสเก็ตชลาสุดที่เปดใชงานเสมอ  Example : ใชในการเลือกเปดไฟลสเก็ตชตัวอยางทีบรรจุ ่ และรวบรวมไวในโฟลเดอรของ

โปรแกรม Arduino1.0  Save : ใชในการบันทึกไฟลสเก็ตชปจจุบัน

่  Save as : ใชบันทึกไฟลสเก็ตชโดยเปลี่ยนชือไฟล  Upload : ใชอัปโหลดโปรแกรมไปยังแผงวงจรไมโครคอนโทรลเลอร POP-XT หรือฮารดแวร

ของ Arduino Leonardo  Page setup : ตังค ้ าหนากระดาษของไฟลสเก็ตชปจจุบัน  Print :

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

 Preference : ใชกําหนดคาการทํางานของโปรแกรม  Quit : ใชจบการทํางานและออกจากโปรแกรม

2.4.1.2 เมนู Edit ในขณะที่พิมพโปรแกรมใหใชคําสังในเมนู ่ นี้ในการสังยกเลิ ่ กคําสังที ่ ่แลว ทําซํา้ ฯลฯ มีเมนู ตางๆ ดังนี้ Undo : ยกเลิกคําสังหรื ่ อการพิมพครั้งสุดทาย

้ าสังหรื ่ อการพิมพครั้งสุดทาย  Redo : ทําซําคํ  Cut : ตัดขอความที่เลือกไวไปเก็บในคลิปบอรดของโปรแกรม


    POP-XT  39  Copy : คัดลอกขอความที่เลือกไวมาเก็บในคลิปบอรด

้   Paste : นําขอความที่อยูในคลิปบอรดมาแปะลงในตําแหนงที่เคอรเซอรชีอยู  Select All : เลือกขอความทั้งหมด

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

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

2.4.1.3 เมนู Sketch เปนเมนูทีบรรจุ ่ คําสังที ่ ่ใชในการคอมไพลโปรแกรม เพิ่มไฟลไลบรารี ฯลฯ มีเมนูยอยดังนี้  Verify/Compile : ใชคอมไพลแปลโปรแกรมภาษาซีใหเปนภาษาเครื่อง

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

่ ยกใชไลบรารีเพิ่มเติม เมื่อคลิกเลือกคําสังนี ่ ้แลว โปรแกรม  Import Library : เปนคําสังเรี Arduino IDE จะแสดงไลบรารีใหเลือก เมื่อเลือกแลว โปรแกรมจะแทรกบรรทัดคําสัง่ #include ลง ในสวนตนของไฟล  Show Sketch folder : สั่งเปดโฟลเดอรที่เก็บโปรแกรมของผูใช

2.4.1.4 เมนู Tools ใชจั ดรูปแบบของโคดโปรแกรม, เลือกรุนของฮารดแวรไมโครคอนโทรลเลอร Arduino หรือเลือกพอรตอนุกรม มีเมนูพื้นฐาดังดังนี้ ้ าเยืองขวา ้ จัดตําแหนง  Auto Format : จัดรูปแบบของโคดโปรแกรมใหสวยงาม เชน กันหน วงเล็บปกกาปดใหตรงกับปกกาเปด ถาเปนคําสังที ่ อยู ่ ภายในวงเล็  บปกกาเปดและปดจะถูกกันหน ้ าเยืองไป ้ ทางขวามากขึน้ ่ บอัดไฟลโปรแกรมทังโฟลเดอร ้ หลักและโฟลเดอรยอยของไฟล  Archive Sketch : สังบี สเก็ตชปจจุบัน ไฟลทีสร ่ างใหมจะมีชือเดี ่ ยวกับไฟลสเก็ตชปจจุบันตอทายดวย -510123.zip  Export Folder : สั่งเปดโฟลเดอรที่เก็บสเก็ตชบุกปจจุบัน


40      POP-XT

 Board : เลือกฮารดแวรของบอรไมโครคอนโทรลเลอร Arduino สําหรับ POP-XT หรือ

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

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

2.4.3 แถบเครื่องมือ (ทูลบาร : Tools bar) สําหรับคําสังที ่ ่มีการใชบอยๆ ตัวโปรแกรม Arduino1.0 จะนํามาสรางเปนปุมบนแถบเครือง ่ มือ เพื่อใหสามารถคลิกเลือกไดทันที ปุมตางๆ บนแถบเครื่องมือมีดังนี้ Verfy/Compile ใชตรวจสอบการเขียนคําสังในโปรแกรมว ่ า มีถูกตองตามหลักไวยกรณ หรือไม และคอมไพลโปรแกรม Upload to I/O Board ใชอัปโหลดโปรแกรมที่เขียนขึ้นไปยังบอรดหรือฮารดแวร Arduino กอนจะอัปโหลดไฟล ตองแนใจวาไดบันทึกไฟลและคอมไพลไฟลสเก็ตชเรียบรอยแลว New ใชสรางสเก็ตไฟล (ไฟลโปรแกรม) ตัวใหม Open ใชแทนเมนู File > Sketchbook เพื่อเปดสเก็ตช (ไฟลโปรแกรม) ที่มีในเครื่อง Save ใชบันทึกไฟลสเก็ตชบุกที  ่เขียนขึ้น


    POP-XT  41



 ในการเขียนโปรแกรมสําหรับแผงวงจร POP-XT จะตองเขียนโปรแกรมโดยใชภาษา C/C++ ของ Arduino (Arduino programming language) เวอรชัน 1.0 ขึ้นไป ซึงตั ่ วภาษาของ Arduino เองก็ นําเอาโอเพนซอรสโปรเจ็กตชือ่ wiring มาพัฒนาตอ ภาษาของ Arduino แบงไดเปน 2 สวนหลักคือ 1. โครงสรางภาษา (structure) ตัวแปรและคาคงที่ 2. ฟงกชัน่ (function) ภาษาของ Arduino จะอางอิงตามภาษา C/C++ จึงอาจกลาวไดวาการเขียนโปรแกรมสําหรับ Arduino (ซึ่งรวมถึง POP-XT) ก็คือการเขียนโปรแกรมภาษา C โดยเรียกใชฟงกชันและไลบรารี ่ ที่ทาง Arduino ไดเตรียมไวใหแลว ซึงสะดวก ่ และทําใหผูที ่ไมมีความรูด านไมโครคอนโทรลเลอรอยางลึก ซึ้งสามารถเขียนโปรแกรมสังงานได ่

3.1 โครงสรางโปรแกรมของ Arduino โปรแกรมของ Arduino แบงไดเปนสองสวนคือ void setup()

และ void loop()

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


42      POP-XT

3.1.1 สวนของฟงกชัน่ setup() ฟงกชันนี ่ ้จะเขียนที่สวนตนของโปรแกรม ทํางานเมื่อโปรแกรมเริ่มตนเพียงครังเดี ้ ยว ใชเพื่อ กําหนดคาของตัวแปร, โหมดการทํางานของขาตางๆ หรือเริ่มตนเรียกใชไลบรารี ฯลฯฯ ตัวอยางที่ 3-1 int buttonPin = 3; void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }

ในขณะที่โปรแกรมภาษา C มาตรฐานทีเขี ่ ยนบน AVR GCC (เปนโปรแกรมภาษา C ทีใช ่ คอมไพเลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้ int main(void) { init(); setup(); for (;;) loop(); return ; }

ตรงกับ void

setup()

ตรงกับ void

loop()


    POP-XT  43

3.1.2 สวนของฟงกชัน่ loop() หลังจากทีเขี ่ ยนฟงกชัน่ setup()ทีกํ่ าหนดคาเริมต ่ นของโปรแกรมแลว สวนถัดมาคือฟงกชัน่ ่ อ จะทํางานตามฟงกชันนี ่ ้วนตอเนื่องตลอดเวลา ภายในฟงกชัน่ loop() ซึ่งมีการทํางานตรงตามชือคื นี้จะมีโปรแกรมของผูใช  เพื่อรับคาจากพอรต ประมวล แลวสั่งเอาตพุตออกขาตางๆ เพื่อควบคุมการ ทํางานของบอรด ตัวอยางที่ 3-2 int buttonPin = 3; // กําหนดชือตั ่ วแปรใหขาพอรต 3 และชนิดของตัวแปร void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } // ลูปตรวจสอบการกดสวิตชที่ขาพอรตซึ่งถูกประกาศดวยตัวแปร buttonPin void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite('H'); else serialWrite('L'); delay(1000); }


44      POP-XT

3.2 คําสังควบคุ ่ มการทํางาน 3.2.1 คําสั่ง if ใชทดสอบเพือกํ ่ าหนดเงือนไขการทํ ่ างานของโปรแกรม เชน ถาอินพุตมีคามากกวาคาทีกํ่ าหนด ไวจะใหทําอะไร โดยมีรูปแบบการเขียนดังนี้ if (someVariable > 50) { // do something here }

ตัวโปรแกรม จะทดสอบวาถาตัวแปร someVariable มีคามากกวา 50 หรือไม ถาใชใหทําอะไร ถาไมใชใหขามการทํางานสวนนี้ การทํางานของคําสั่งนี้จะทดสอบเงื่อนไข ที่เขียนในเครื่องหมายวงเล็บ ถาเงือนไขเป ่ นจริง ทําตามคําสังที ่ ่เขียนในวงเล็บปกกา ถาเงื่อนไขเปนเท็จ ขามการทํางานสวนนี้ไป สวนของการทดสอบเงื่อนไขที่เขียนอยูภายในวงเล็บ จะตองใชตัวกระทําเปรียบเทียบตางๆ ดังนี้ x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y) เทคนิคสําหรับการเขียนโปรแกรม ในการเปรียบเทียบตัวแปรใหใชตัวกระทํา == เชน if (x==10) หามเขียนผิดเปน = เชน ่ แล ้ ว x จะมีคาเทา if(x=10) คําสั่งที่เขียนผิดในแบบนี้ ผลการทดสอบจะเปนจริงเสมอ เมื่อผานคําสังนี กับ 10 ทําใหการทํางานของโปรแกรมผิดเพี้ยนไป ไมเปนตามที่กําหนดไว นอกจากนั้นยังใชคําสัง่ if ควบคุมการแยกเสนทางของโปรแกรม โดยใชคําสัง่ if...else ไดดวย


    POP-XT  45

3.2.2 คําสั่ง

if...else

ใชทดสอบเพื่อกําหนดเงื่อนไขการทํางานของโปรแกรมไดมากกวาคําสั่ง if ธรรมดา โดย สามารถกําหนดไดวา ถาเงือนไขเป ่ นจริงใหทําอะไร ถาเปนเท็จใหทําอะไร เชน ถาคาอินพุตอะนาลอก ที่อานไดนอยกวา 500 ใหทําอะไร ถาคามากกวาหรือเทากับ 500 ใหทําอีกอยาง เขียนคําสังได ่ ดังนี้ ตัวอยางที่ 3-3 if (pinFiveInput < 500) { // คําสังเพื ่ ่อทํางานอยางหนึง่ เนื่องมาจาก pinFiveInput มีคานอยกวา 500 } else { // คําสังเพื ่ ่อทํางานอีกอยางหนึง่ เนื่องมาจาก pinFiveInput มีคามากวาหรือเทากับ 500 }

หลังคําสัง่ else สามารถตามดวยคําสัง่ if ทําใหรูปแบบคําสังกลายเป ่ น if...else...if เปน การทดสอบเงือนไขต ่ างๆ เมื่อเปนจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ ตัวอยางที่ 3-4 if (pinFiveInput < 500) { // คําสังเพื ่ ่อทํางานอยางหนึง่ เนื่องมาจาก pinFiveInput มีคานอยกวา 500 } else if (pinFiveInput >= 1000) { // คําสังเพื ่ ่อทํางานอีกอยางหนึง่ เนื่องมาจาก pinFiveInput มีคามากกวาหรือเทากับ 1000 } else { // คําสังเพื ่ ่อกําหนดใหทํางานตอไปในกรณีที่ pinFiveInput ไมไดมีคานอยกวา 500 // และมากกวาหรือเทากับ 1000 (นันคื ่ อ จะมีการกระทําคําสังในโปรแกรมย ่ อยนีเมื ้ ่อตัวแปรมีคาอยู // ระหวาง 501 ถึง 999 (ฐานสิบ) }

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


46      POP-XT

3.2.3 คําสั่ง

for()

คําสังนี ่ ใช ้ เพือสั ่ งให ่ คําสังที ่ อยู ่ ภายในวงเล็  บปกกาหลัง for มีการทํางานซํากั ้ นตามจํานวนรอบ ที่ตองการ คําสังนี ่ ้มีประโยชนมากสําหรับการทํางานใดๆ ที่ตองทําซํากั ้ นและทราบจํานวนรอบของ การทําซํ้าที่แนนอน มักใชคูกับตัวแปรอะเรยในการเก็บสะสมคาที่อานไดจากขาอินพุตอะนาลอก หลายๆ ขาที่มีหมายเลขขาตอเนื่องกัน รูปแบบของคําสัง่ for() แบงได 3 สวนดังนี้ for (initialization; condition; increment) { //statement(s); } เริ่มตนดวย initialization ใชกําหนดคาเริ่มตนของตัวแปรควบคุมการวนรอบ ในการทํางาน แตละรอบจะทดสอบ condition ถาเงือนไขเป ่ นจริงจะกระทําคําสังในวงเล็ ่ บปกกา แลวมาเพิมหรื ่ อลดคา ตัวแปรตามทีสั่ ่งใน increment แลวทดสอบเงื่อนไขอีก ทําซําจนกว ้ าเงื่อนไขเปนเท็จ ตัวอยางที่ 3-5 for (int i=1; i <= 8; i++) { // คําสังเพื ่ ่อทํางานโดยใชคาของตัวแปร i และวนทํางานจนกระทั่งคาของตัวแปร i มากกวา 8; }

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


    POP-XT  47

3.2.4 คําสั่ง

switch-case

ใชทดสอบเงือนไขเพื ่ อกํ ่ าหนดการทํางานของโปรแกรม ถาตัวแปรที่ทดสอบตรงกับเงื่อนไข ใดก็ใหทํางานตามที่กําหนดไว พารามิเตอร var ตัวแปรที่ตองการทดสอบวาตรงกับเงื่อนไขใด default ถาไมตรงกับเงื่อนไขใดๆ เลยใหทําคําสังต ่ อทายนี้ ่ อไปเรื่อยๆ break คําสั่งหยุดการทํางาน ใชเขียนตอทาย case ตางๆ ถาไมไดเขียน โปรแกรมจะวนทํางานตามเงือนไขต

ตัวอยางที่ 3-6 switch (var) { case 1: // คําสังเพื ่ ่อทํางาน เมื่อคาของตัวแปรเทากับ 1 break; case 2: // คําสังเพื ่ ่อทํางาน เมื่อคาของตัวแปรเทากับ 2 break; default: // ถาหากคาของตัวแปรไมใช 1 และ 2 ใหกระทําคําสังในส ่ วนนี้ }


48      POP-XT

3.2.5 คําสั่ง while เปนคําสังวนรอบ ่ โดยจะทําคําสังที ่ เขี่ ยนในวงเล็บปกกาอยางตอเนือง ่ จนกวาเงือนไขในวงเล็ ่ บของ คําสัง่ while() จะเปนเท็จ คําสังที ่ ให ่ ทําซําจะต ้ องมีการเปลียนแปลงค ่ าตัวแปรทีใช ่ ทดสอบ เชน มีการ เพิมต ่ าตัวแปร หรือมีเงือนไขภายนอกเช ่ นอานคาจากเซ็นเซอรไดเรียบรอยแลวใหหยุดการอานคา มิฉะนัน้  เงือนไขในวงเล็ ่ บของ while() เปนจริงตลอดเวลา ทําใหคําสัง่ while ทํางานวนไมรูจบ รูปแบบคําสั่ง while(expression) { // statement(s); } พารามิเตอร expression เปนคําสังทดสอบเงื ่ ่อนไข (ถูกหรือผิด)

ตัวอยางที่ 3-7 var = 0; while(var < 200) { // คําสังเพื ่ ่อทํางาน โดยวนทํางานทั้งสิน้ 200 รอบ var++; }


    POP-XT  49

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

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

รูปแบบคําสั่ง result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2; พารามิเตอร value1 : เปนคาของตัวแปรหรือคาคงที่ใดๆ value2: เปนคาของตัวแปรหรือคาคงที่ใดๆ

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

เทคนิคสําหรับการเขียนโปรแกรม  เลือกขนาดของตัวแปรใหใหญพอสําหรับเก็บคาผลลัพธที่มากที่สุดของการคํานวณ ่ าใดตัวแปรทีเก็ ่ บจะมีการวนซําค ้ ากลับ และวนกลับอยางไร ตัวอยางเชน  ตองทราบวาทีค (0 ไป 1) หรือ (0 ไป -32768) ่ องการเศษสวนใหใชตัวแปรประเภท float แตใหระวังผลลบ เชน  สําหรับการคําณวณทีต ตัวแปรมีขนาดใหญ คํานวณไดชา  ใชตัวกระทํา cast เชน (int)myfloat ในการเปลี่ยนประเภทของตัวแปรชัวคราวขณะที ่ ่ โปรแกรมทํางาน


50      POP-XT

3.3.2 ตัวกระทํา % หารเอาเศษ ใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษไมสามารถใชงานกับ ตัวแปรเลขทศนิยม (float) รูปแบบคําสั่ง result = value1 % value2; พารามิเตอร value1 - เปนตัวแปรประเภท byte,char,int หรือ long value2 - เปนตัวแปรประเภท byte,char,int หรือ long

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

ตัวอยางที่ 3-9 x = 7 % 5; x = 9 % 5; x = 5 % 5; x = 4 % 5;

// x now contains 2 // x now contains 4 // x now contains 0 // x now contains 4

ตัวกระทําหารเอาเศษนี้มักนําไปใชในงานที่ตองการใหเหตุการณเกิดขึ้นดวยชวงเวลาที่สมํ่า เสมอ หรือใชทําใหหนวยความที่เก็บตัวแปรอะเรยเกิดการลนคากลับ (roll over) ตัวอยางที่ 3-10 // ตรวจสอบคาของตัวตรวจจับ 10 ครังต ้ อการทํางาน 1 รอบ void loop() { i++; if ((i % 10) == 0) // หารคาของ i ดวย 10 แลวตรวจสอบเศษการหารเปน 0 หรือไม { x = analogRead(sensPin); // อานคาจากตัวตรวจจับ 10 ครั้ง } } ในตัวอยางนีเป ้ นการนําคําสัง่ % มาใชกําหนดรอบของการทํางาน โดยโปรแกรมวนทํางานเพื่ออานคาจนกวา ผลการหารเอาเศษของคําสัง่ i % 10 จะเทากับ 0 ซึงจะเกิ ่ ดขึนเมื ้ อ่ i = 10 เทานัน้


    POP-XT  51

3.4 ตัวกระทําเปรียบเทียบ ใชประกอบกับคําสัง่ if() เพื่อทดสอบเงื่อนไขหรือเปรียบเทียบคาตัวแปรตาง โดยจะเขียน เปนนิพจนอยูภายในเครื่องหมาย () x == y (x เทากับ y) x != y (x ไมเทากับ y) x < y (x นอยกวา y) x > y (x มากกวา y) x <= y (x นอยกวาหรือเทากับ y) x >= y (x มากกวาหรือเทากับ y)

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

3.5.1 && (ตรรกะ และ) ใหคาเปนจริงเมื่อผลการเปรียบเทียบทังสองข ้ างเปนจริงทั้งคู ตัวอยางที่ 3-11 if (x > 0 && x < 5) { // ... } ใหคาเปนจริงเมือ่ x มากกวา 0 และนอยกวา 5 (มีคา 1 ถึง 4)

3.5.2 && (ตรรกะ หรือ) ใหคาเปนจริง เมือผลการเปรี ่ ยบเทียบพบวา มีตัวแปรตัวใดตัวหนึงเป ่ นจริงหรือเปนจริงทังคู ้  ตัวอยางที่ 3-12 if (x > 0 || y > 0) { // ... } ใหผลเปนจริงเมือ่ x หรือ y มีคามากกวา 0


52      POP-XT

3.5.3 ! (ใชกลับผลเปนตรงกันขาม) ใหคาเปนจริง เมื่อผลการเปรียบเทียบเปนเท็จ ตัวอยางที่ 3-13 if (!x) { // ... } ใหผลเปนจริงถา x เปนเท็จ (เชน ถา x = 0 ใหผลเปนจริง)

3.5.4 ขอควรระวัง ระวังเรื่องการเขียนโปรแกรม ถาตองการใชตัวกระทําตรรกะและ ตองเขียนเครื่องหมาย && ถาลืมเขียนเปน & จะเปนตัวกระทําและระดับบิตกับตัวแปร ซึ่งใหผลที่แตกตาง เชนกันในการใชตรรกะหรือใหเขียนเปน || (ขีดตังสองตั ้ วติดกัน) ถาเขียนเปน | (ขีดตังตั ้ วเดียว) จะหมายถึงตัวกระทําหรือระดับบิตกับตัวแปร ตัวกระทํา NOT ระดับบิต (~) จะแตกตางจากตัวกลับผลใหเปนตรงขาม (!) เลือกใชใหถูกตอง ตัวอยางที่ 3-14 if (a >= 10 && a <= 20){} // ใหผลการทํางานเปนจริงเมือ่ a มีคาอยูระหวาง 10 ถึง 20


    POP-XT  53

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

3.6.1 ตัวกระทําระดับบิต AND (&) คําสัง่ AND ในระดับบิตของภาษาซีเขียนไดโดยใช & หนึ่งตัว โดยตองเขียนระหวางนิพจน หรือตัวแปรทีเป ่ นเลขจํานวนเต็ม การทํางานจะนําขอมูลแตละบิตของตัวแปรทังสองตั ้ วมากระทําทาง ตรรกะ AND โดยมีกฎดังนี้ ถาอินพุตทั้งสองตัวเปน “1” ทั้งคูเอาตพุตเปน “1” กรณีอื่นๆ เอาตพุตเปน “0” ดังตัวอยางตอ ไปนี้ ในการดูใหคูของตัวกระทําตามแนวตั้ง 0 0 1 1 0 1 0 1 —————————— 0 0 0 1

Operand1 Operand2 Returned result

ใน Arduino ตัวแปรประเภท int จะมีขนาด 16 บิต ดังนั้นเมือใช ่ ตัวกระทําระดับบิต AND จะมี การกระทําตรรกะและพรอมกันกับขอมูลทั้ง 16 บิต ดังตัวอยางในสวนของโปรแกรมตอไปนี้ ตัวอยางที่ 3-15 int a = 92; // เทากับ 0000000001011100 ฐานสอง int b = 101; // เทากับ 0000000001100101 ฐานสอง int c = a & b; // ผลลัพธคือ 0000000001000100 ฐานสองหรือ 68 ฐานสิบ ในตัวอยางนีจะนํ ้ าขอมูลทั้ง 16 บิตของตัวแปร a และ b มากระทําทางตรรกะ AND แลวนําผลลัพธที่ไดทั้ง 16 บิตไปเก็บที่ตัวแปร c ซึงได ่ คาเปน 01000100 ในเลขฐานสองหรือเทากับ 68 ฐานสิบ

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


54      POP-XT

3.6.2 ตัวกระทําระดับบิต OR (|) คําสั่งระดับบิต OR ของภาษาซีเขียนไดโดยใชเครื่องหมาย |หนึ่งตัว โดยตองเขียนระหวาง นิพจนหรือตัวแปรทีเป ่ นเลขจํานวนเต็ม สําหรับการทํางานใหนําขอมูลแตละบิตของตัวแปรทังสองตั ้ ว มากระทําทางตรรกะ OR โดยมีกฎดังนี้ ถาอินพุตตัวใดตัวหนึงหรื ่ อทังสองตั ้ วเปน “1” เอาตพุตเปน “1” กรณีทีอิ่ นพุตเปน “0” ทังคู ้ เอาต  พุตจึงจะเปน “0” ดังตัวอยางตอไปนี้ 0 0 1 1 0 1 0 1 —————————— 0 1 1 1

Operand1 Operand2 Returned result

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

ตัวอยางที่ 3-17 โปรแกรมแสดงการใชตัวกระทําระดับบิต AND และ OR ตัวอยางงานที่ใชตัวกระทําระดับบิต AND และ OR เปนงานที่โปรแกรมเมอรเรียกวา Read-Modify-Write on a port สําหรับไมโครคอนโทรลเลอร 8 บิต คาทีอ่ านหรือเขียนไปยังพอรตมีขนาด 8 บิต ซึงแสดงค ่ าอินพุตที่ขาทั้ง 8 ขา การเขียนคาไปยังพอรตจะเขียนคาครังเดี ้ ยวไดทั้ง 8 บิต ตัวแปรชือ่ PORTD เปนคาที่ใชแทนสถานะของขาดิจิตอลหมายเลข 0,1,2,3,4,5,6,7 ถาบิตใดมีคาเปน 1 ทําใหขานันมี ้ คาลอจิกเปน HIGH (อยาลืมกําหนดใหขาพอรตนันๆ ้ ทํางานเปนเอาตพุตดวยคําสัง่ pinMode() กอน) ดังนัน้ ถากําหนดคาให PORTD = B00110001; ก็คือตองการใหขา 2,3 และ 7 เปน HIGH ในกรณีนีไม ้ ตองเปลี่ยนคา สถานะของขา 0 และ 1 ซึงปกติ ่ แลวฮารดแวรของ Arduino ใชในการสือสารแบบอนุ ่ กรม ถาไปเปลียนค ่ าแลวจะกระทบ ตอการสือสารแบบอนุ ่ กรม อัลกอริธึมสําหรับโปรแกรมเปนดังนี้  อานคาจาก PORTD แลวลางคาเฉพาะบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต AND)  นําคา PORTD ที่แกไขจากขางตนมารวมกับคาบิตที่ตองการควบคุม (ใชตัวกระทําแบบบิต OR) เขียนเปนโปรแกรมไดดังนี้ int i; // counter variable int j;


    POP-XT  55

void setup() { DDRD = DDRD | B11111100; // กําหนดทิศทางของขาพอรต 2 ถึง 7 ดวยคา 11111100 Serial.begin(9600); } void loop() { for (i=0; i<64; i++) { PORTD = PORTD & B00000011; // กําหนดขอมูลไปยังขาพอรต 2 ถึง 7 j = (i << 2); PORTD = PORTD | j; Serial.println(PORTD, BIN); // แสดงคาของ PORTD ที่หนาตาง Serial montior delay(100); } }

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

Operand1 Operand2 Returned result

หรือกลาวไดอีกอยางวา ตัวกระทําระดับบิต XOR จะใหเอาตพุตเปน “0” เมื่ออินพุตทั้งสอง ตัวมีคาเหมือนกัน และใหเอาตพุตเปน “1” เมื่ออินพุตทั้งสองมีคาตางกัน ตัวอยางที่ 3-18 int x = 12; int y = 10; int z = x ^ y;

// คาเลขฐานสองเทากับ 1100 // คาเลขฐานสองเทากับ 1010 // ผลลัพธเทากับ 0110 ฐานสองหรือ 6 ฐานสิบ

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


56      POP-XT

ตัวอยางที่ 3-19 void setup() { DDRD = DDRD | B00100000; } void loop() { PORTD = PORTD ^ B00100000; delay(100); }

// กําหนดขา 5 เปนเอาตพุต // กลับลอจิกที่ขา 5

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

Operand1 ~ Operand1

int a = 103; int b = ~a;

// binary: 0000000001100111 // binary: 1111111110011000

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


    POP-XT  57

3.6.5 คําสั่งเลือนบิ ่ ตไปทางซาย (<<) และเลือนบิ ่ ตไปทางขวา (>>) ในภาษา C/C++ มีตัวกระทําเลื่อนบิตไปทางซาย << และเลื่อนบิตไปทางขวา >> ตัวกระทํา นี้จะสั่งเลื่อนบิตของตัวถูกกระทําทีเขี ่ ยนดานซายมือไปทางซายหรือไปทางขวาตามจํานวนบิตที่ระบุ ไวในดานขวามือของตัวกระทํา รูปแบบคําสั่ง variable << number_of_bits variable >> number_of_bits พารามิเตอร variable เปนตัวแปรเลขจํานวนเต็มที่มีจํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประเภท byte, int หรือ long)

ตัวอยางที่ 3-20 int a = 5; int b = a << 3; int c = b >> 3;

// เทากับ 0000000000000101 ฐานสอง // ไดผลลัพธเปน 0000000000101000 ฐานสองหรือ 40 // ไดผลลัพธเปน 0000000000000101 ฐานสองหรือ 5 ฐานสิบ

ตัวอยางที่ 3-21 เมื่อสั่งเลือนค ่ าตัวแปร x ไปทางซายจํานวน y บิต (x << y) บิตขอมูลที่อยูดานซายสุดของ x จํานวน y ตัวจะ หายไปเนืองจากถู ่ กเลือนหายไปทางซ ่ ายมือ int a = 5; // เทากับ 0000000000000101ฐานสอง int b = a << 14; // ไดผลลัพธเปน 0100000000000000 ฐานสอง

การเลือนบิ ่ ตไปทางซาย จะทําใหคาของตัวแปรดานซายมือของตัวกระทําจะถูกคูณดวยคาสอง ยกกําลังบิตที่เลื่อนไปทางซายมือ ดังนี้ 1 << 0 1 << 1 1 << 2 1 << 3 ... 1 << 8 1 << 9 1 << 10 ...

== == == ==

1 2 4 8

== 256 == 512 == 1024

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


58      POP-XT

แลว โปรแกรมจะนําคาของบิตเครืองหมายมาเติ ่ มใหกับบิตทางซายมือสุด ปรากฏการณนีเรี้ ยกวา sign extension มีตัวอยางดังนี้ ตัวอยางที่ 3-22 int x = -16; int y = x >> 3;

// เทากับ 1111111111110000 ฐานสอง // เลือนบิ ่ ตของตัวแปร x ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 1111111111111110 ฐานสอง

ถาตองการเลือนบิ ่ ตไปทางขวามือแลวใหคา 0 มาเติมยังบิตซายมือสุด (ซึงเกิ ่ ดกับกรณีทีตั่ วแปร เปนประเภท unsigned int) ทําไดโดยใชการเปลี่ยนประเภทตัวแปรชัวคราว ่ (typecast) เพื่อเปลี่ยนให ตัวแปร x เปน unsigned int ชัวคราวดั ่ งตัวอยางตอไปนี้ ตัวอยางที่ 3-23 int x = -16; // เทากับ 1111111111110000 ฐานสอง int y = unsigned(x) >> 3; // เลือนบิ ่ ตของตัวแปร x (แบบไมคิดเครื่องหมาย) ไปทางขวา 3 ครั้ง // ไดผลลัพธเปน 0001111111111110 ฐานสอง

ถาหากระมัดระวังเรื่อง sign extension แลว ก็จะใชตัวกระทําเลื่อนบิตไปทางขวามือสําหรับ หารคาตัวแปรดวย 2 ยกกําลังตางๆ ไดดังตัวอยาง ตัวอยางที่ 3-24 int x = 1000; int y = x >> 3;

// หารคาของ 1000 ดวย 8 (มาจาก 23) ทําให y = 125


    POP-XT  59

3.7 ไวยากรณภาษาของ Arduino 3.7.1 ; (เซมิโคลอน - semicolon) ใชเขียนแจงวา จบคําสัง่ ตัวอยางที่ 3-25 int a = 13;

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

3.7.2 { } (วงเล็บปกกา - curly brace) เครื่องหมายวงเล็บปกกา เปนสวนสําคัญของภาษาซี ใชในการกําหนดขอบเขตการทํางานใน แตละชวง วงเล็บปกกาเปด { จะตองเขียนตามดวยวงเล็บปกกาปด } ดวยเสมอ หรือเรียกวา วงเล็บตอง ครบคู ในซอฟตแวร Arduino IDE ที่ใชเขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบ คูของเครื่องหมายวงเล็บ ผูใช  งานเพียงแคคลิกทีวงเล็ ่ บ มันจะแสดงวงเล็บที่เหลือซึ่งเปนคูของมั  น สําหรับโปรแกรมเมอรมือใหมและโปรแกรมเมอรที่ยายจากภาษา BASIC มาเปนภาษา C มัก จะสับสนกับการใชเครืองหมายวงเล็ ่ บ แททีจริ ่ งแลวเครืองหมายป ่ กกาปดนีเที ้ ยบไดกับคําสัง่ RETURN ของ subroutine (function) หรือแทนคําสัง่ ENDIF ในการเปรียบเทียบ และแทนคําสัง่ NEXT ของคํา สั่งวนรอบ FOR เนืองจากมี ่ การใชวงเล็บปกกาไดหลากหลาย ดังนันเมื ้ อต ่ องการเขียนคําสังที ่ ต่ องใชเครืองหมาย ่ วงเล็บ เมื่อเขียนวงเล็บเปดแลวใหเขียนเครื่องหมายวงเล็บปดทันที ถัดมาจึงคอยเคาะปุม Enter ใน ระหวางเครืองหมายวงเล็ ่ บเพือขึ ่ นบรรทั ้ ดใหม แลวเขียนคําสังที ่ ต่ องการ ถาทําไดตามนีวงเล็ ้ บจะครบ คูแนนอน สําหรับวงเล็บทีไม ่ ครบคู ทําใหเกิดความผิดพลาดในขณะคอมไพลโปรแกรม ถาเปนโปรแกรม ขนาดใหญจะหาที่ผิดไดยาก ตําแหนงที่อยูของเครื่องหมายวงเล็บแตละตัวจะมีผลอยางมากตอ ไวยากรณของภาษาคอมพิวเตอร การยายตําแหนงวงเล็บไปเพียงหนึ่งหรือสองบรรทัด ทําใหตัว โปรแกรมทํางานผิดไป


60      POP-XT

ตําแหนงทีใช ่ วงเล็บปกกา ฟงกชัน่ (Function) void myfunction(datatype argument) { statements(s) } คําสังวนรอบ ่ (Loops) while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialisation; termination condition; incrementing expr) { statement(s) } คําสังทดสอบเงื ่ ่อนไข (condition) if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) }

3.7.3 // และ /*...* หมายเหตุบรรทัดเดียวและหลายบรรทัด เปนสวนของโปรแกรมทีผู่ ใช  เขียนเพิมเติ ่ มวาโปรแกรมทํางานอยางไร โดยสวนทีเป ่ นหมายเหตุ จะไมถูกคอมไพล ไมนําไปประมวลผล มีประโยชนมากสําหรับการตรวจสอบโปรแกรมภายหลังหรือ ใชแจงใหเพือนร ่ วมงานหรือบุคคลอืนทราบว ่ าบรรทัดนีใช ้ ทําอะไร ตัวหมายเหตุภาษาซีมี 2 ประเภทคือ (1) หมายเหตุบรรรทัดเดียว เขียนเครื่องสแลช // 2 ตัวหนาบรรทัด (2) หมายเหตุหลายบรรทัด เขียนเครื่องหมายสแลช / คูกับดอกจัน * ครอมขอความที่เปน หมายเหตุ เชน /* blabla */


    POP-XT  61

3.7.4 #define เปนคําสังที ่ ใช ่ งานมากในการกําหนดคาคงทีให ่ กับโปรแกรม เนืองจากเป ่ นการกําหนดคาทีไม ่ ใชพื้นที่หนวยความจําของไมโครคอนโทรลเลอรแตอยางใด เมื่อถึงขั้นตอนแปลภาษา คอมไพเลอร จะแทนที่ตัวอักษรดวยคาทีกํ่ าหนดไว ใน Arduino จะใช คําสัง่ #define ตรงกับภาษา C รูปแบบ #define constantName value อยาลืมเครื่องหมาย # ตัวอยางที่ 3-26 #define ledPin 3 // เปนการกําหนดใหตัวแปร ledPin เทากับคาคงที่ 3 ทายคําสัง่ #define ไมตองมีเครืองหมายเซมิ ่ โคลอน

3.7.5 #include ใชสั่งใหรวมไฟลอืนๆ ่ เขากับไฟลโปรแกรมของเรากอน แลวจึงทําการคอมไพลโปรแกรม รูปแบบคําสั่ง #include <file> #include “file” ตัวอยางที่ 3-27 #include <stdio.h> #include “popxt.h” บรรทัดแรกจะสังให ่ เรียกไฟล stdio.h มารวมกับไฟลโปรแกรมที่กําลังพัฒนา โดยคนหาไฟลจากตําแหนง ที่เก็บไฟลระบบของ Arduino โดยปกติเปนไฟลมาตรฐานที่มาพรอมกับ Arduino บรรทัดที่ 2 สังให ่ รวมไฟล popxt.h มารวมกับไฟลโปรแกรมที่กําลังพัฒนา โดยหาไฟลจากโฟลเดอรที่อยู ของไฟลภาษา C กอน ปกติเปนไฟลที่ผูใชสรางขึ้นเอง


62      POP-XT

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

3.8.1 char : ตัวแปรประเภทตัวอักขระ เปนตัวแปรที่มีขนาด 1 ไบต (8 บิต) มีไวเพื่อเก็บคาตัวอักษร ตัวอักษรในภาษา C จะเขียนอยู ในเครื่องหมายคําพูดขีดเดียว เชน ‘A’ (สําหรับขอความ ที่ประกอบจากตัวอักษรหลายตัวเขียนตอกัน จะเขียนอยูในเครื  องหมายคํ ่ าพูดปกติ เชน “ABC”) คุณสามารถสังกระทํ ่ าทางคณิตศาสตรกับตัวอักษร ได ในกรณีจะนําคารหัส ASCII ของตัวอักษรมาใช เชน ‘A’ +1 มีคาเทากับ 66 เนืองจากค ่ ารหัส ASCII ของตัวอักษร A เทากับ 65 รูปแบบคําสั่ง char sign = ' '; ตัวอยางที่ 3-28 char var = 'x'; var คือชื่อของตัวแปรประเภท char ที่ตองการ x คือคาที่ตองการกําหนดใหกับตัวแปร ในที่นีเป ้ นตัวอักษรหนึ่งตัว

3.8.2 byte : ตัวแปรประเภทตัวเลข 8 บิตหรือ 1 ไบต ตัวแปร byte ใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255 ตัวอยางที่ 3-29 byte b = B10010; // แสดงคาของ b ในรูปของเลขฐานสอง (เทากับ 18 เลขฐานสิบ)

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


    POP-XT  63

ตัวอยางที่ 3-30 int ledPin = 13; // กําหนดใหตัวแปร ledPIn มีคาเทากับ 13 เมือตั ่ วแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตํ่าสุดที่เก็บได และ เมือมี ่ คานอยกวาคาตํ่าสุดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้

ตัวอยางที่ 3-31 int x x = -32,768; x = x - 1; x = 32,767; x = x + 1;

// เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลียนจาก ่ -32,768 เปน 32,767 // เมือกระทํ ่ าคําสังแล ่ ว คาของ x จะเปลียนจาก ่ 32,767 เปน -32,768

3.8.4 unsigned int : ตัวแปรประเภทเลขจํานวนเต็มไมคิดเครืองหมาย ่ ตัวแปรประเภทนี้คลายกับตัวแปร int แตจะเก็บเลขจํานวนเต็มบวกเทานั้น โดยเก็บคา 0 ถึง 65,535 (216 -1) รูปแบบคําสั่ง unsigned int var = val; พารามิเตอร var คือชื่อของตัวแปร int ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร

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

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


64      POP-XT

3.8.5 long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต เปนตัวแปรเก็บคาเลขจํานวนเต็มที่ขยายความจุเพิ่มจากตัวแปร int โดยตัวแปร long หนึ่งตัว กินพื้นทีหน ่ วยความจํา 32 บิต (4 ไบต) เก็บคาไดจาก -2,147,483,648 ถึง 2,147,483,647 รูปแบบคําสั่ง long var = val; พารามิเตอร var คือชื่อของตัวแปร long ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร

ตัวอยางที่ 3-34 long time;

// กําหนดใหตัวแปร time เปนแบบ long

3.8.6 unsigned long : ตัวแปรประเภทเลขจํานวนเต็ม 32 บิต แบบไมคิดเครืองหมาย ่ เปนตัวแปรเก็บคาเลขจํานวนเต็มบวก ตัวแปรหนึ่งตัวกินพื้นที่หนวยความจํา 32 บิต (4 ไบต) เก็บคาไดจาก 0 ถึง 4,294,967,295 หรือ 232 -1 รูปแบบคําสั่ง unsigned long var = val; พารามิเตอร var คือชื่อของตัวแปร unsigned long ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร

ตัวอยางที่ 3-35 unsigned long time;

// กําหนดใหตัวแปร time เปนแบบ undigned long (ไมคิดเครื่องหมาย)


    POP-XT  65

3.8.7 float : ตัวแปรประเภทเลขทศนิยม เปนตัวแปรสําหรับเก็บคาเลขเลขทศนิยม ซึ่งนิยมใชในการเก็บคาสัญญาณอะนาล็อกหรือคา ที่ตอเนื่อง เนื่องจากสามารถเก็บคาไดละเอียดกวาตัวแปร int ตัวแปร float เก็บคาไดจาก -4.4028235 x 1038 ถึง 4.4028235 x 1038 โดยหนึ่งตัวจะกินพื้นที่หนวยความจํา 32 บิต (4 ไบต) ในการคํานวณคณิตศาสตรกับตัวแปร float จะชากวาการคํานวณของตัวแปร int ดังนั้นจึง พยายามหลีกเลี่ยงการคํานวณกับตัวแปร float ในกรณีกระทําคําสังวนรอบที ่ ต่ องทํางานดวยความเร็ว สูงสุดของฟงก ชั่ นทางเวลาที่ตองแมนยําอยางมาก โปรแกรมเมอรบางคนจะทําการแปลงตัวเลข ทศนิยมใหเปนเลขจํานวนเต็มกอนแลวจึงคํานวณเพือให ่ ทํางานไดเร็วขึน้ รูปแบบคําสั่ง float var = val; พารามิเตอร var คือชื่อของตัวแปร float ที่ตองการ val คือคาที่ตองการกําหนดใหกับตัวแปร

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

ตัวอยางที่ 3-37 int x; int y; float z; x = 1; y = x / 2; // y เทากับ 0 ไมมีการเก็บคาของเศษที่ไดจากการหาร z = (float)x / 2.0; // z เทากับ 0.5 เมื่อมีการใชตัวแปรแบบ float ตัวเลขที่นํามากระทํากับตัวแปรแบบ float นีจะต ้ องเปนเลขทศนิยมดวย จากตัวอยางคือ เลข 2 เมื่อนํามาทํางานกับตัวแปร x ที่เปนแบบ float เลข 2 จึงตองเขียนเปน 2.0

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


66      POP-XT

3.8.9 string : ตัวแปรประเภทขอความ เปนตัวแปรเก็บขอความ ซึ่งในภาษาซีจะนิยามเปนอะเรยของตัวแปรประเภท char ตัวอยางที่ 3-38 ตัวอยางการประกาศตัวแปรสตริง char Str1[15]; char Str2[8] = {'a','r','d','u','i','n','o'}; char Str3[8] = {'a','r','d','u','i','n','o','\0'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino";  Str1 เปนการประกาศตัวแปรสตริงโดยไมไดกําหนดคาเริมต ่ น  Str2 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร หากไมครบตามจํานวนที่ประกาศ คอมไพเลอรจะเพิม่ null string ใหเองจนครบ (จากตัวอยางประกาศไว 8 ตัว แตขอความมี 7 ตัวอักษร จึงมีการเติม null string ใหอีก 1 ตัว ่ อ \0  Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความ แลวปดทายดวยตัวอักษรปด นันคื  Str4 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ่ าพูด จากตัวอยาง ไมไดกําหนดขนาดตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร ่ าพูด และขนาดของตัวแปร จากตัวอยาง  Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครืองหมายคํ ประกาศไว 8 ตัว ่ ่ยาวมากกวานี้  Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผื่อไวสําหรับขอความอืนที

3.8.9.1 การเพิมตั ่ วอักษรแจงวาจบขอความ (null termination) ในตัวแปรสตริงของภาษา C กําหนดใหตัวอักษรสุดทายเปนตัวแจงการจบขอความ (null string) ซึ่งก็คือตัวอักษร \0 ในการกําหนดขนาดของตัวแปร (คาในวงเล็บเหลี่ยม) จะตองกําหนดให เทากับจํานวนตัวอักษร + 1 ดังในตัวแปร Str2 และ Str3 ในตัวอยางที่ 3-38 ที่ขอความ Arduino มีตัว อักษร 7 ตัว ในการประกาศตัวแปรตองระบุเปน [8] ในการประกาศตัวแปรสตริง ตองเผื่อพื้นที่สําหรับเก็บตัวอักษรแจงวาจบขอความ มิฉะนั้น คอมไพเลอรจะแจงเตือนวาเกิดการผิดพลาด ในตัวอยางที่ 3-38 ตัวแปร Str1 และ Str6 เก็บขอความ ไดสูงสุด 14 ตัวอักษร

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


    POP-XT  67

3.8.10 ตัวแปรอะเรย (array) ตัวแปรอะเรยเปนตัวแปรหลายตัว ทีถู่ กเก็บรวมอยูในตั  วแปรชือเดี ่ ยวกัน โดยอางถึงตัวแปรแตละ ตัวดวยหมายเลขดัชนีทีเขี ่ ยนอยูในวงเล็  บสีเหลี ่ ยม ่ ตัวแปรอะเรยของ Arduino จะอางอิงตามภาษา C ตัวแปรอะเรยอาจจะดูซับซอน แตถาใชเพียงตัวแปรอะเรยอยางตรงไปตรงมาจะงายตอการทําความเขาใจ ตัวอยางที่ 3-39 ตัวอยางการประกาศตัวแปรอะเรย int myInts[6]; int myPins[] = {2, 4, 8, 3, 6}; int mySensVals[6] = {2, 4, -8, 3, 2}; char message[6] = “hello”;  ผูพัฒนาโปรแกรมสามารถประกาศตัวแปรอะเรยไดโดยยังไมกําหนดคาของตัวแปร myInts  การประกาศตัวแปร myPins เปนการประกาศตัวแปรอะเรยโดยไมระบุขนาด เมื่อประกาศตัวแปรแลวตอง กําหนดคาทันที เพื่อใหคอมไพเลอรนับวา ตัวแปรมีสมาชิกกี่ตัวและกําหนดคาไดถูกตอง จากตัวอยางมีทั้งสิน้ 5 ตัว  ในการประกาศตัวแปรอะเรย ผูพัฒนาโปรแกรมสามารถประกาศและกําหนดขนาดของตัวแปรอะเรยไดใน พรอมกันดังตัวอยางการประกาศตัวแปร mySensVals ที่ประกาศทั้งขนาดและกําหนดคา  ตัวอยางสุดทายเปนการประกาศอะเรยของตัวแปร message ที่เปนแบบ char มีตัวอักษร 5 ตัวคือ hello แตการกําหนดขนาดของตัวแปรจะตองเผือที ่ ่สําหรับเก็บตัวอักษรแจงจบขอความดวย จึงทําใหคาดัชนีตองกําหนดเปน 6

3.8.10.1 การใชงานตัวแปรอะเรย พิมพชือตั ่ วแปรพรอมกับระบุคาดัชนีภายในเครืองหมายวงเล็ ่ บสีเหลี ่ ยม ่ คาดัชนีของตัวแปรอะเรย เริมต ่ นดวย 0 ดังนันค ้ าของตัวแปร mySensVals มีคาดังนี้ mySensVals[0] == 2, mySensVals[1] == 4 , ฯลฯ

การกําหนดคาใหกับตัวแปรอะเรย ทําไดดังนี้ mySensVals[0] = 10;

การเรียกคาสมาชิกของตัวแปรอะเรย ทําไดดังนี้ x = mySensVals[4];


68      POP-XT

3.8.10.2 อะเรยและคําสั่งวนรอบ for โดยทัวไปจะพบการใช ่ งานตัวแปรอะเรยภายในคําสัง่ for โดยใชคาตัวแปรนับรอบของคําสั่ง for เปนคาดัชนีของตัวแปรอะเรย ดังตัวอยางตอไปนี้ ตัวอยางที่ 3-40 int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); // แสดงคาสมาชิกของตัวแปรอะเรยที่หนาตาง Serial monitor } ตัวอยางโปรแกรมการใชงานตัวแปรอะเรยที่สมบูรณดูไดในตัวอยาง KnightRider ในหัวขอ Tutorials ในเว็บไซต www.arduino.cc POP-Note การกําหนดคาคงที่เลขจํานวนเต็มเปนเลขฐานตางๆ ของ Arduino คาคงทีเลขจํ ่ านวนเต็มก็คือตัวเลขทีคุ่ ณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัวเลขเหลานี้ จะเปนเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอื่นจะตองใชเครื่องหมายพิเศษระบ เชุ น ฐาน ตัวอยาง 10 (decimal) 123 2 (binary) B1111011 8 (octal) 0173 16 (hexadecimal) 0x7B Decimal ก็คือเลขฐานสิบ ซึงใช ่ ในชีวิตประจําวัน ตัวอยาง 101 = 101 มาจาก (1* 102) + (0 * 101) + (1 * 100) = 100 + 0 + 1 = 101 Binary เปนเลขฐานสอง ตัวเลขแตละหลักเปนไดแค 0 หรือ 1 ตัวอยาง B101 = 5 ฐานสิบ มาจาก (1 * 22) + (0 * 21) + (1 * 20) = 4 + 0 + 1 = 5 เลขฐานสองจะใชงานไดไมเกิน 8 บิต (ไมเกิน 1 ไบต) มีคาจาก 0 (B0) ถึง 255 (B11111111) Octal เปนเลขฐานแปด ตัวเลขแตละหลักมีคาจาก 0 ถึง 7 เทานั้น ตัวอยาง 0101 = 65 ฐานสิบ มาจาก (1 * 82) + (0 * 81) + (1 * 80) = 64 + 0 +1 = 65 ขอควรระวังในการกําหนดคาคงที่ อยาเผลอใสเลข 0 นําหนา มิฉะนันตั ้ วคอมไพเลอรจะแปลความหมายผิดไปวา คาตัวเลขเปนเลขฐาน 8 Hexadecimal (hex) เปนเลขฐานสิบหก ตัวเลขแตละหลักมีคาจาก 0 ถึง 9 และตัวอักษร A คือ 10, B คือ 11 ไปจนถึง F ซึงเท ่ ากับ 15 ตัวอยาง 0x101 = 257 ฐานสิบ มาจาก (1 * 162) + (0 * 161) + (1 * 160) = 256 + 0 + 1 = 257


    POP-XT  69

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

3.9.1 ตัวแปรโลคอลและโกลบอล ตัวแปรแบบโกลบอล (global variable) เปนตัวแปรที่ทุกฟงกชันในโปรแกรมรู ่ จัก โดยตอง ประกาศตัวแปร นอกฟงกชัน่ สําหรับตัวแปรแบบโลคอลหรือตัวแปรทองถิ่นเปนตัวแปรที่ประกาศ ตัวแปรอยูภายในเครื่องหมายวงเล็บปกกาของฟงกชัน่ และรูจั กเฉพาะภายในฟงกชันนั ่ ้น เมื่อโปรแกรมเริ่มมีขนาดใหญและซับซอนมากขึ้น การใชตัวแปรโลคอลจะมีประโยชนมาก เนืองจากแน ่ ใจไดวามีแคฟงกชันนั ่ นเท ้ านันที ้ สามารถใช ่ งานตัวแปร ชวยปองกันการเกิดการผิดพลาด เมื่อฟงกชันทํ ่ าการแกไขคาตัวแปรที่ใชงานโดยฟงกชันอื ่ ่น ตัวอยางที่ 3-41 int gPWMval; void setup() {} void loop() { int i; float f; }

// ทุกฟงกชันมองเห็ ่ นตัวแปรนี้

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

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


70      POP-XT

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

3.10.1 HIGH, LOW : ใชกําหนดคาทางตรรกะ ในการอานหรือเขียนคาใหกับขาพอรตดิจิตอล คาทีเป ่ นไดมี 2 คาคือ HIGH หรือ LOW HIGH เปนการกําหนดคาใหขาดิจิตอลนั้นมีแรงดันเทากับ +5V สวนการอานคา ถาอานได +3V หรือมากกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน HIGH คาคงที่ของ HIGH คือ “1” หรือ เทียบเปนตรรกะคือ จริง (true) LOW เปนการกําหนดคาใหขาดิจิตอลนันมี ้ แรงดันเทากับ 0V สวนการอานคา ถาอานได +2V หรือนอยกวา ไมโครคอนโทรลเลอรจะอานคาไดเปน LOW คาคงที่ของ LOW คือ “0” หรือเทียบ เปนตรรกะคือ เท็จ (false)

3.10.2 INPUT, OUTPUT : กําหนดทิศทางของขาพอรตดิจิตอล ขาพอรตดิจิตอลทําหนาทีได ่ 2 อยางคือ เปนอินพุตและเอาตพุต เมื่อกําหนดเปน INPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาอินพุต เมื่อกําหนดเปน OUTPUT หมายถึง กําหนดใหขาพอรตนั้นๆ เปนขาเอาตพุต

3.11 ตัวกระทําอื่นๆ ที่เกี่ยวของกับตัวแปร 3.11.1 cast : การเปลี่ยนประเภทตัวแปรชั่วคราว cast เปนตัวกระทําทีใช ่ สั่งใหเปลี่ยนประเภทของตัวแปรไปเปนประเภทอื่น และบังคับให คํานวณคาตัวแปรเปนประเภทใหม รูปแบบคําสั่ง (type)variable เมื่อ

Type เปนประเภทของตัวแปรใดๆ (เชน int, float, long) Variable เปนตัวแปรหรือคาคงที่ใดๆ

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


    POP-XT  71

3.11.2 sizeof : แจงขนาดของตัวแปร ใชแจงบอกจํานวนไบตของตัวแปรทีต่ องการทราบคา ซึงเป ่ นทังตั ้ วแปรปกติและตัวแปรอาเรย รูปแบบคําสั่ง เขียนไดสองแบบดังนี้

sizeof(variable) sizeof variable เมื่อ

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

ตัวอยางที่ 3-43 ตัวกระทํา sizeof มีประโยชนอยางมากในการจัดการกับตัวแปรอะเรย (รวมถึงตัวแปรสตริง) ตัวอยางตอไปนี้จะพิมพขอความออกทางพอรตอนุกรมครั้งละหนึ่งตัวอักษร char myStr[] = “this is a test”; int i; void setup() { Serial.begin(9600); } void loop() { for (i = 0; i < sizeof(myStr) - 1; i++) { Serial.print(i, DEC); Serial.print(“ = “); Serial.println(myStr[i], BYTE); } }


72      POP-XT

3.12 คําสงวนของ Arduino คําสงวนคือ คาคงที่ ตัวแปร และฟงกชันที ่ ่ไดกําหนดไวเปนสวนหนึ่งของภาษา C ของ Arduino หามนํา คําเหลานี้ไปตังชื ้ อตั ่ วแปร สามารถแสดงไดดังนี้ # Constants

# Datatypes

HIGH LOW INPUT OUTPUT SERIAL DISPLAY PI HALF_PI TWO_PI LSBFIRST MSBFIRST CHANGE FALLING RISING false true null

boolean byte char class default do double int long private protected public return short signed static switch throw try unsigned void

# Literal Constants GLCD_RED GLCD_GREEN GLCD_BLUE GLCD_YELLOW GLCD_BLACK GLCD_WHITE GLCD_SKY GLCD_MAGENTA # Port Constants DDRB PINB PORTB DDRC PINC PORTC DDRD PIND PORTD # Names

popxt

# Methods/Fucntions sw_ok sw_ok_press analog knob glcd glcdChar glcdString glcdMode glcdGetMode glcdFlip glcdGetFlip colorRGB setTextColor setTextBackgroundColor setTextSize getTextColor getTextBackgroundColor getTextSize

glcdFillScreen glcdClear glcdPixel glcdRect glcdFillRect glcdLine glcdCircle glcdFillCircle glcdArc getdist in out motor motor_stop fd bk fd2 bk2 tl tr sl sr servo sound beep uart_set_baud uart_get_baud uart_putc uart_puts uart uart_available uart_getkey uart1_set_baud uart1_get_baud uart1_putc uart1_puts uart1 uart1_available uart1_getkey uart1_flush

# Other abs acos += + [] asin = atan atan2 & &= | |= boolean byte case ceil char char class , // ?: constrain cos {} — default delay delayMicroseconds / /** . else == exp false float float floor for < <= HALF_PI if ++


    POP-XT  73 != int << < <= log && ! || ^ ^= loop max millis min % /*

* new null () PII return >> ; Serial Setup sin sq sqrt = switch tan this true

TWO_PI void while Serial begin read print write println available digitalWrite digitalRead pinMode analogRead analogWrite attachInterrupts detachInterrupts beginSerial

serialWrite serialRead serialAvailable printString printInteger printByte printHex printOctal printBinary printNewline pulseIn shiftOut


74      POP-XT


    POP-XT  75



       ทางผูจัดทําซอฟตแวร Arduino IDE (www.arduino.cc) ไดจัดเตรียมฟงกชั่นพื้นฐาน เชน ฟงกชันเกี ่ ยวกั ่ บขาพอรตอินพุตเอาตพุตดิจิตอล, อินพุตเอาตพุตอะนาลอก เปนตน ดังนั้นในการเขียน โปรแกรมจึงเรียกใชฟงกชันเหล ่ านีได ้ ทันที นอกจากฟงกชันพื ่ นฐานเหล ้ านีแล ้ ว นักพัฒนาทานอืนๆ ่ ทีร่ วมในโครงการ Arduino นีก็้ ไดเพิม่ ไลบรารีอืนๆ ่ เชน ไลบรารีควบคุมมอเตอร, การติดตอกับอุปกรณบัส I2C ฯลฯ ในการเรียกใชงานตอง เพิ่มบรรทัด #include เพือผนวกไฟล ่ ที่เหมาะสมกอน จึงจะเรียกใชฟงกชันได ่ สําหรับชุดบอรดสมอง กล OBEC kit ก็มีไฟลไลบรารีพิเศษของตัวเองเชนกัน จะไดกลาวถึงในบทตอๆ ไป ในบทนีจะอธิ ้ บายถึงการเรียกใชฟงกชันและตั ่ วอยางโปรแกรมสําหรับทําการทดลอง โดยใช ชุดบอรดสมองกลและอุปกรณเชื่อมตอ OBEC kit เปนอุปกรณหลักในการทดลอง

4.1 ฟงกชันอิ ่ นพุตเอาตพุตดิจิตอล (Digital I/O) 4.1.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.1.1.1 pinMode(pin,mode) ใชกําหนดขาพอรตใดๆ ใหเปนพอรตดิจิตอล พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร POP-XT (คาเปน int) mode - โหมดการทํางานเปน INPUT (อินพุต) หรือ OUTPUT (เอาตพุต) (คาเปน int) ตองใชตัวพิมพใหญเทานัน้ ตัวอยางที่ 4-1 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 void setup() { pinMode(ledPin, OUTPUT); // กําหนดเปนเอาตพุต } void loop() { digitalWrite(ledPin, HIGH); // LED ติดสวาง delay(1000); // หนวงเวลา 1 วินาที digitalWrite(ledPin, LOW); // LED ดับ delay(1000); // หนวงเวลา 1 วินาที }


76      POP-XT

4.1.1.2 digitalWrite(pin,value) สั่งงานใหขาพอรตมีคาสถานะเปนลอจิกสูง (HIGH หรือ “1”) หรือลอจิกตํ่า (LOW หรือ “0”) พารามิเตอร pin - หมายเลขขาพอรตของแผงวงจร POP-XT (คาเปน int) value - มีคา HIGH หรือ LOW ตัวอยางที่ 4-2 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 void setup() { pinMode(ledPin, OUTPUT); // กําหนดเปนเอาตพุต } void loop() { digitalWrite(ledPin, HIGH); // LED ติดสวาง delay(500); // หนวงเวลา 1 วินาที digitalWrite(ledPin, LOW); // LED ดับ delay(500); // หนวงเวลา 1 วินาที } กําหนดใหพอรตหมายเลข 4 เปน HIGH (มีลอจิกเปน “1”) หนวงเวลา 0.5 วินาที แลวจึงสังให ่ กลับเปน LOW (มีลอจิกเปน “0”) อีกครัง้ วนเชนนีไปตลอด ้

4.1.1.3 int

digitalRead(pin)

อานคาสถานะของขาทีระบุ ่ ไววามีคาเปน HIGH หรือ LOW พารามิเตอร pin - ขาพอรตที่ตองการอานคา ซึงต ่ องเปนขาพอรตดิจิตอล มีคาไดจาก 0 ถึง 31 หรือเปนตัวแปรที่มีคา อยูในชวง 0 ถึง 31 ก็ได คาทีส่ งกลับ เปน HIGH หรือ LOW ตัวอยางที่ 4-3 int ledPin = 4; // ตอ ZX-LED ที่พอรตหมายเลข 4 int inPin = 23; // ตอ ZX-SWITCH01 ที่พอรตหมายเลข 23 int val = 0; // กําหนดเตัวแปรสําหรับเก็บคาที่อานไดจากอินพุต void setup() { pinMode(ledPin, OUTPUT); // กําหนดใหพอรต 4 เปนเอาตพุต pinMode(inPin, INPUT); // กําหนดใหพอรต 23 เปนอินพุต }


    POP-XT  77

void loop() { val = digitalRead(inPin); // อานคาจากพอรตอินพุต digitalWrite(ledPin, val); // แสดงคาที่อานไดที่พอรตเอาตพุต ในที่นีคื่ อ พอรต 4 } เมื่อไมกดสวิตช สถานะที่พอรต 23 เปน “1” ทําใหพอรต 4 มีสถานะเปน”1” เชนกัน LED ที่ตอกับพอรต 4 จึงติดสวาง เมื่อกดสวิตช สถานะลอจิกที่พอรต 23 จะเปน “0” พอรต 4 จึงมีสถานะเปน “0” เชนกัน LED ที่ตออยูจึ งดับ

4.1.2 การใชงานพอรตเอาตพุตดิจิตอลของแผงวงจรหลัก POP-XT 4.1.2.1 คุณสมบัติของขาพอรตเอาตพุต สําหรับขาพอรตที่กําหนดใหเปนเอาตพุตผานทางฟงกชัน่ pinMode() จะมีสถานะเปนอิมพี แดนซตํา่ ทําใหสามารถจายกระแสใหกับวงจรภายนอกไดสูงถึง 40mA ซึงเพี ่ ยงพอสําหรับขับกระแส ให LED สวาง (อยาลืมตอตัวตานทานอนุกรมดวย) หรือใชกับตัวตรวจจับตางๆ ได แตไมเพียงพอ สําหรับขับรีเลย โซลีนอยด หรือมอเตอร กอนทีจะใช ่ งานขาดิจิตอลของแผงวงจร POP-XT จะตองสังก ่ อนวาใหขาพอรตนี้ทําหนาทีเป ่ น อินพุตหรือเอาตพุต ในหัวขอนี้จะทดลองตอเปนเอาตพุต ถากําหนดใหเปนเอาตพุตสามารถรับหรือ จายกระแสไดสูงสุดถึง 20 mA ซึ่งเพียงพอสําหรับขับ LED

4.1.2.2 การกําหนดโหมดของขาพอรต กอนใชงานตองกําหนดโหมดการทํางานของขาพอรตดิจิตอล ใหเปนอินพุตหรือเอาตพุต กําหนด ไดจากฟงกชัน่ pinMode()มีรูปแบบดังนี้ pinmode(pin,mode); เมื่อ

pin คือ หมายเลขขาที่ตองการ Mode คือ โหมดการทํางาน (INPUT หรือ OUTPUT)

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

pin คือหมายเลขขาที่ตองการ value สถานะลอจิกที่ตองการ (HIGH หรือ LOW)


78      POP-XT

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

4.2.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.2.1.1 Serial.begin(int

datarate)

กําหนดคาอัตราบอดของการรับสงขอมูลอนุกรม ในหนวยบิตตอวินาที (bits per second : bps หรือ baud) ในกรณีที่ติดตอกับคอมพิวเตอรใหใชคาตอไปนี้ 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 หรือ 115200 พารามิเตอร Int datarate ในหนวยบิตตอวินาที (baud หรือ bps) ตัวอยางที่ 4-4 void setup() { Serial.begin(9600); // เปดพอรตอนุกรม กําหนดอัตราบอดเปน 9600 บิตตอวินาที }

4.2.1.2 int

Serial.available()

ใชแจงวาไดรับขอมูลตัวอักษร (characters) แลว และพรอมสําหรับการอานไปใชงาน คาทีส่ งกลับจากฟงกชัน่ จํานวนไบตที่พรอมสําหรับการอานคา โดยเก็บขอมูลในบัฟเฟอรตัวรับ ถาไมมีขอมูล จะมีคาเปน 0 ถามีขอมูล ฟงกชันจะคื ่ นคาที่มากกวา 0 โดยบัฟเฟอรเก็บขอมูลไดสูงสุด 128 ไบต


    POP-XT  79

4.2.1.3

int Serial.read()

ใชอานคาขอมูลทีได ่ รับจากพอรตอนุกรม คาทีส่ งกลับจากฟงกชัน่ เปนเลข int ที่เปนไบตแรกของขอมูลที่ไดรับ (หรือเปน -1 ถาไมมีขอมูล) ตัวอยางที่ 4-5 int incomingByte = 0; void setup() { Serial.begin(9600); // เปดพอรตสื่อสาร กําหนดอัตราบอดเปน 9600 บิตตอวินาที } void loop() // วนสงขอมูลเมื่อไดรับขอมูลเขามา { if (Serial.available() > 0) // อานขอมูลอนุกรม { incomingByte = Serial.read(); // เก็บขอมูลที่อานไดไวในตัวแปร Serial.print("I received: "); // พิมพขอความออกไปยังหนาตาง Serial Monitor Serial.println(incomingByte, DEC); // พิมพขอมูลที่รับไดออกไปยังหนาตาง Serial Monitor } } ในตัวอยางนี้ เลือกใชอัตราบอด 9600 บิตตอวินาที ถามีขอมูลเขามาจะเก็บไวในตัวแปร incomingByte แลวนําไปแสดงผลที่หนาตาง Serial Monitor โดยตอทายขอความ I received :..... เมื่อรันโปรแกรม ใหเปดหนาตาง Serial Monitor โดยคลิกที่ปุม

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

ซึงอยู ่ ที่มุมขวาของหนาตางหลัก

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

4.2.1.4 Serial.flush() ใชลางบัฟเฟอรตัวรับขอมูลของพอรตอนุกรมใหวาง


80      POP-XT

4.2.1.5 Serial.print(data) ใชสงขอมูลออกทางพอรตอนุกรม พารามิเตอร Data - เปนขอมูลเลขจํานวนเต็ม ไดแก char, int หรือเลขทศนิยมที่ตัดเศษออกเปนเลขจํานวนเต็ม รูปแบบฟงกชัน่ คําสังนี ่ สามารถเขี ้ ยนไดหลายรูปแบบ

Serial.print(b) เปนการเขียนคําสังแบบไม ่ ไดระบุรูปแบบ จะพิมพคาตัวแปร b เปนเลขฐานสิบ โดยพิมพตัวอักษรรหัส ASCII ดังตัวอยาง int b = 79; Serial.print(b); พิมพขอความ 79

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

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

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

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


    POP-XT  81

Serial.write(b) เปนคําสังพิ ่ มพคาตัวแปร b ขนาด 1 ไบต เดิมทีคําสังนี ่ ้ จะเปน Serial.print(b,BYTE) ตังแต ้ Arduino 1.0 ขึ้นมา ไดยกเลิกคําสัง่ Serial.print(b,BYTE) และใหใชคําสัง่ Serial.write(b) แทน ดังตัวอยาง int b = 79; Serial.write(b); พิมพตัวอักษร O ซึ่งมีคาตามตาราง ASCII เทากับ 79 ใหดูขอมูลจากตารางรหัสแอสกี้เพิ่มเติม

Serial.print(str) เปนคําสังพิ ่ มพคาขอความในวงเล็บ หรือขอความที่เก็บในตัวแปร str ดังตัวอยาง Serial.print(“Hello World!”); พิมพขอความ Hello World พารามิเตอร b - ไบตขอมูลที่ตองการพิมพออกทางพอรตอนุกรม str - ตัวแปรสตริงที่เก็บขอความสําหรับสงออกพอรตอนุกรม ตัวอยางที่ 4-6 int analogValue = 0; // กําหนดตัวแปรเก็บคาสัญญาณอะนาลอก void setup() { Serial.begin(9600); // เปดพอรตอนุกรม กําหนดอัตราบอดเปน 9600 บิตตอวินาที } void loop() { analogValue = analogRead(0); // อานคาสัญญาณอะนาลอกชอง 0 // โดยตอแผงวงจร ZX-POTH เขาที่จุดตอ A0 // แสดงผลที่หนาตาง Serial Monitor ในหลายรูปแบบ Serial.print(analogValue); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.print(analogValue, DEC); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.print(analogValue, HEX); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบหก Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.print(analogValue, OCT); // แสดงเปนรหัสแอสกี้ของเลขฐานแปด Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.print(analogValue, BIN); // แสดงเปนรหัสแอสกี้ของเลขฐานสอง Serial.print("\t"); // คั่นดวยแท็บ (tab) Serial.write(analogValue/4);


82      POP-XT

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

ตองเลือกอัตราบอดของหนาตาง Serial Monitor เปน 9600baud, เลือก No line Ending และคลิกทํา เครืองหมายที ่ ่ชอง Autoscroll ดวย จึงจะไดผลการทํางานที่ถูกตอง เทคนิคสําหรับการเขียนโปรแกรม Serial.print() จะตัดเศษเลขทศนิยมเหลือเปนเลขจํานวนเต็ม ทําใหสวนทศนิยมหายไป ทางแกไข ทางหนึงคื ่ อ คูณเลขทศนิยมดวย 10, 100, 1000 ฯลฯ ขึนอยู ้ กั บจํานวนหลักของเลขทศนิยม เพือแปลงเลขทศนิ ่ ยม เปนจํานวนเต็มกอนแลวจึงสงออกพอรตอนุกรม จากนันที ้ ฝ่ งภาครั  บใหทําการหารคาทีรั่ บไดเพือแปลงกลั ่ บเปนเลข ทศนิยม


    POP-XT  83

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

Serial.println(b) เปนคําสังพิ ่ มพขอมูลแบบไมไดระบุรูปแบบ จะพิมพคาตัวแปร b เปนเลขฐานสิบ ตามดวยรหัสอักษร carriage return และ linefeed ดังตัวอยางตอไปนี้

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

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

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

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

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

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

Serial.println() เปนคําสังพิ ่ มพรหัส carriage return และ linefeed พารามิเตอร b - ไบตขอมูลที่ตองการพิมพออกทางพอรตอนุกรม str - ตัวแปรสตริงที่เก็บขอความสําหรับสงออกพอรตอนุกรม


84      POP-XT

ตัวอยางที่ 4-7 int analogValue = 0; // ประกาศตัวแปรสําหรับเก็บคาอะนาลอก void setup() { Serial.begin(9600); // เปพอรตอนุกรมและเลือกอัตราบอดเปน 9600 บิตตอวินาที } void loop() { analogValue = analogRead(0); // อานคาอินพุตอะนาลอกชอง 0 // ตอแผงวงจร ZX-POTH กับพอรตอินพุตอะนาลอก A0 // แสดงผลในรูปแบบตางๆ Serial.println(analogValue); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.println(analogValue, DEC); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบ Serial.println(analogValue, HEX); // แสดงเปนรหัสแอสกี้ของเลขฐานสิบหก Serial.println(analogValue, OCT); // แสดงเปนรหัสแอสกี้ของเลขฐานแปด Serial.println(analogValue, BIN); // แสดงเปนรหัสแอสกี้ของเลขฐานสอง Serial.write(analogValue); // แสดงคาในรูปแบบขอมูลระดับไบต Serial.println(); Serial.flush(); delay(10); // หนวงเวลา 10 มิลลิวินาที }

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


    POP-XT  85

4.3 ฟงกชันอิ ่ นพุตเอาตพุตอะนาลอก 4.3.1 คําอธิบายและการเรียกใชฟงกชัน่ 4.3.1.1 int

analogRead(pin)

อานคาจากขาพอรตทีกํ่ าหนดใหเปนอินพุตอะนาลอกของแผงวงจรหลัก POP-XT โดยแผงวงจร POP-XT มีวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอลความละเอียด 10 บิตในตัว จึงแปลงคาแรงดันอิน พุต 0 ถึง +5V ใหเปนขอมูลตัวเลขจํานวนเต็มระหวาง 0 ถึง 1023 พารามิเตอร pin - หมายเลขของขาอินพุตอะนาลอก มีคา 0 ถึง 5 หรือเปนตัวแปรที่ใชแทนคา 0 ถึง 5 คาทีส่ งกลับ เลขจํานวนเต็มจาก 0 ถึง 1023 หมายเหตุ สําหรับขาที่เปนอินพุตอะนาลอกไมจําเปนตองประกาศแจงวาเปนอินพุตหรือเอาตพุต ตัวอยางที่ 4-8 int ledPin = 4; // ตอแผงวงจร ZX-LED เขาที่พอรต 4 int analogPin = 0; // ตอแผงวงจร ZX-POTH เขาที่พอรตอินพุต A0 int val = 0; // กําหนดตัวแปรรับคาอะนาลอก int threshold = 512; // กําหนดคาอางอิง void setup() { pinMode(ledPin, OUTPUT); // กําหนดใหพอรต 4 เปนเอาตพุต } void loop() { val = analogRead(analogPin); // อานคาอินพุตอะนาลอก A0 if (val >= threshold) { digitalWrite(ledPin, HIGH); // ขับ LED } else { digitalWrite(ledPin, LOW); // ดับ LED } } ตัวอยางนีจะสั ้ ่งใหพอรต 4 เปนลอจิก “1” เมื่ออานคาจากพอรตอินพุต A0 แลวมีคามากกวาหรือเทากับ คาอางอิงทีกํ่ าหนดไว (ในตัวอยาง คาอางอิงหรือ threshold = 255) แตถามีคานอยกวา พอรต 4 จะเปนลอจิก “0” ทําให LED ดับ


86      POP-XT

4.3.1.2 analogWrite(pin,

value)

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

ผูใชงานสามารถนําสัญญาณที่ไดจากคําสั่งนี้ไปใชในการปรับความสวางของ LED หรือตอ ขยายกระแสเพือต ่ อปรับความเร็วของมอเตอรได หลังจากเรียกใชคําสั่งนีแล ้ วทีขาพอร ่ ตที่กําหนดจะ มีสัญญาณ PWM สงออกมาอยางตอเนื่อง จนกวาจะมีการเรียกคําสัง่ analogWrite (หรือเรียกคําสัง่ digitalRead หรือ digitalWrite ทีขาเดี ่ ยวกัน) ตัวอยางที่ 4-9 int ledPin = 3; int analogPin = 0; int val = 0; int threshold = 512; void setup() { pinMode(ledPin, OUTPUT); } void loop() { val = analogRead(analogPin); analogWrite(ledPin, val / 4);

// ตอแผงวงจร ZX-LED เขาที่พอรต 3 // ตอแผงวงจร ZX-POTH เขาที่พอรตอินพุต A0 // กําหนดตัวแปรรับคาอะนาลอก // กําหนดคาอางอิง // กําหนดใหพอรต 3 เปนเอาตพุต // เก็บขอมูลที่อานไดจากอินพุตอะนาลอกลงในตัวแปร // ปรับคาที่ไดจากการแปลงสัญญาณ 0 ถึง 1023 // เปนคา 0 ถึง 255 แลวสงไปยังพอรตเอาตพุตอะนาลอก

} ตัวอยางนีเป ้ นการควบคุมความสวางของ LED ที่ตอกับพอรต 3 ใหเปนไปตามคาที่อานไดจากแผงวงจร ZX-POTH (แผงวงจรตัวตานทานปรับคาได) ที่ตอกับพอรต A0


    POP-XT  87

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

shiftOut(dataPin, clockPin, bitOrder, value)

เปนฟงกชันสํ ่ าหรับเลื่อนขอมูลขนาด 1 ไบต (8 บิต) ออกจากขาพอรตที่กําหนดไว สามารถ กําหนดไดวา จะใหเริ่มเลื่อนบิตขอมูลจากบิตที่มีความสําคัญสูงสุด (MSB หรือบิตซายสุด) หรือบิตที่ มีความสําคัญตําสุ ่ ด (LSB - บิตขวาสุด) โดยบิตของขอมูลจะออกที่ขา dataPin และใชอีกหนึ่งขาคือ clockPin เปนตัวกําหนดจังหวะการเลื่อนขอมูล การสงขอมูลวิธีทีว่ านีเรี้ ยกวา การสงขอมูลอนุกรมแบบโปรโตคอลซิงโครนัส ซึงเป ่ นวิธีทัวไปที ่ ่ ไมโครคอนโทรเลอรใชติดตอกับตัวตรวจจับหรือไมโครคอนโทรลเลอรตัวอืน่ อุปกรณทังสองตั ้ วตอง ทํางานประสานกัน (ซิงโครไนซกัน) และติดตอกันทีความเร็ ่ วสูงสุด เนืองจากอุ ่ ปกรณทังสองตั ้ วจะใช สัญญาณนาฬิกาเดียวกัน จะเรียกชืออี ่ กอยางวา เปนการสือสารแบบ ่ SPI (synchronous peripheral interface) พารามิเตอร dataPin - พอรตที่กําหนดใหเปนเอาตพุตเพื่อสงขอมูลออก (ตัวแปรชนิด int) clockPin - พอรตทีกํ่ าหนดใหทําหนาทีส่ งสัญญาณนาฬิกาเพือกํ ่ าหนดจังหวะการเลือนข ่ อมูลของ dataPin bitOrder - กําหนดลําดับการเลื่อนบิตขอมูล เลือกไดวาเปน MSBFIRST หรือ LSBFIRST value - ไบตขอมูลที่ตองการสงแบบอนุกรม พอรตที่เปน dataPin และ clockPin จะตองกําหนดใหเปนเอาตพุตกอน ดวยการเรียกใชฟงกชัน่ pinMode

4.4.1.1 การเขียนโปรแกรมที่ผิดพลาดทีพบบ ่ อยของฟงกชัน่ shiftOut เนื่องจากฟงกชันนี ่ ้สามารถสงขอมูลไดครั้งละ 1 ไบต (8 บิต) เทานั้น ถาเปนตัวแปร int หนึ่ง ตัวเก็บขอมูลขนาด 2 ไบต (16 บิต) ทําใหไมสามารถสงคาไดโดยใชคําสังนี ่ ้เพียงครั้งเดียว ถาสังเพี ่ ยง ครั้งเดียว คาทีได ่ จะผิดพลาด ดังตัวอยางโปรแกรมที่ผิดพลาดตอไปนี้ ตัวอยางที่ 4-10 int data; int clock; int cs; ... digitalWrite(cs, LOW); data = 500; shiftOut(data, clock, MSBFIRST, data) digitalWrite(cs, HIGH); ขอมูลที่ตองการเลือนเท ่ ากับ 500 ดังนันจึ ้ งมีขนาด 2 ไบต (เพราะ 1 ไบตเก็บคาไดสูงสุด 256 คา) แต เนื่องจากในโปรแกรมเลื่อนเพียง 1 ไบต คาที่ไดจึงเทากับ 244 เนื่องจากขอมูล 8 บิตบนของตัวแปร data มีคาเทากับ 244


88      POP-XT

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

4.4.2 unsigned

long pulseIn(pin, value)

ใชอ านคาบเวลาของพัลส (ไมวาเปน HIGH หรือ LOW) ที่เกิดขึ้นที่ pin (ขาพอรตอินพุต ดิจิตอล) ที่กําหนด เชน ถากําหนด value เปน HIGH คําสัง่ pulseIN() จะรอใหขาทีกํ่ าหนดไวมีสถานะ เปน HIGH เพือเริ ่ มจั ่ บเวลา และจับเวลาตอไปจนกวาสถานะของขานันจะเป ้ น LOW จึงหยุดจับเวลา คาที่ ฟงกชันคื ่ นกลับมาเปนคาบเวลาของพัลสในหนวยไมโครวินาที แสดงการทํางานในรูปที่ 4-1 คาฐานเวลาของฟงกชั่นประมาณคาไดจากการทดลอง และอาจผิดพลาดไดในกรณีที่พัลสมี ความกวางมาก ฟงกชันนี ่ ้ทํางานไดดีกับสัญญาณพัลสที่มีคาบเวลา 10 ไมโครวินาทีถึง 3 นาที พารามิเตอร pin - ขาพอรตที่ตองการอานคาคาบเวลาพัลส (ตัวแปรชนิด int) value - ระดับสัญญาณที่ตองการตรวจจับ กําหนดเปน HIGH หรือ LOW (ตัวแปรชนิด int) โดย HIGH คือ ลอจิกสูง และ LOW คือ ลอจิกตํ่า value = HIGH

value = LOW

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

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

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

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

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


    POP-XT  89

คาทีส่ งกลับจากฟงกชัน่ คาบเวลาของพัลสในหนวยไมโครวินาที ตัวอยางที่ 4-12 int pin = 7; unsigned long duration; void setup() { pinMode(pin, INPUT); } void loop() { duration = pulseIn(pin, HIGH); } ฟงกชันนี ่ ไม ้ มีกลไกการหมดเวลา ถาไมมีพัลสเกิดขึน้ จะวนรอไปตลอดเวลา ทําใหโปรแกรมคางได

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

unsigned long millis()

คืนคาเปนคาเวลาในหนวยมิลลิวินาที นับตั้งแตโมดูล POP168 เริ่มรันโปรแกรมปจจุบัน คาทีส่ งกลับจากฟงกชัน่ คาเวลาในหนวยเปนมิลลิวินาทีตังแต ้ เริ่มรันโปรแกรมปจจุบัน คืนคาเปน unsigned long คาตัวเลขจะเกิด การโอเวอรโฟลว (คาเกินแลวกลับเปนศูนย) เมือเวลาผ ่ านไปประมาณ 9 ชัวโมง ่ ตัวอยางที่ 4-13 long time; void setup() { Serial.begin(9600); } void loop() { Serial.print(“Time: “); time = millis(); // อานคาเวลา Serial.println(time); // แสดงคาเวลา Serial.flush(); delay(1000); }


90      POP-XT

4.5.2

delay(ms)

เปนฟงกชันชะลอการทํ ่ างาน หรือหนวงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยมิลลิวินาที พารามิเตอร ms - ระยะเวลาที่ตองการหนวงเวลา หนวยเปนมิลลิวินาที (1000 ms เทากับ 1 วินาที) ตัวอยางที่ 4-14 int ledPin = 4; // ตอแผงวงจร OBEC-LED กับพอรต 4 void setup() { pinMode(ledPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop() { digitalWrite(ledPin, HIGH); // ขับ LED delay(1000); // หนวงเวลา 1 วินาที digitalWrite(ledPin, LOW); // ดับ LED delay(1000); // หนวงเวลา 1 วินาที }

4.5.3

delayMicroseconds(us)

เปนฟงกชันชะลอการทํ ่ างานหรือหนวงเวลาของโปรแกรมตามเวลาทีกํ่ าหนดในหนวยไมโคร วินาที เพือให ่ หนวงเวลาไดอยางแมนยํา ฟงกชันนี ่ จะหยุ ้ ดการทํางานของอินเตอรรัปต ทําใหการทํางาน บางอยาง เชน การรับขอมูลจากพอรตอนุกรม หรือการเพิ่มคาทีจะส ่ งกลับคืนโดยฟงกชัน่ milis() จะไมเกิดขึ้น ดังนั้นควรจะใชฟงกชันนี ่ สํ้ าหรับการหนวงเวลาสันๆ ้ ถาตองการหนวงเวลานานๆ แนะ นําใหใชฟงกชัน่ delay() แทน พารามิเตอร us - คาหนวงเวลาในหนวยไมโครวินาที (1000 ไมโครวินาที = 1 มิลลิวินาที และหนึงล ่ านไมโครวินาที = 1 วินาที) ตัวอยางที่ 4-15 int outPin = 4; // ตอแผงวงจร OBEC-LED กับพอรต 4 void setup() { pinMode(outPin, OUTPUT); // กําหนดเปนพอรตเอาตพุต } void loop() { digitalWrite(outPin, HIGH); // ขับ LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวินาที digitalWrite(outPin, LOW); // ดับ LED delayMicroseconds(50); // หนวงเวลา 50 ไมโครวินาที } จากตัวอยางนี้ กําหนดใหพอรต 4 ทํางานเปนเอาตพุตเพื่อสงสัญญาณพัลสที่มีคาบเวลา 100 ไมโครวินาที คํ าเตื อน ฟงก ชั่นนี้ทํ างานอย างแมนยําในช วงตั้งแต 3 ไมโครวิ นาที ขึ้นไป ไมอาจประกันไดวา delayMicroseconds จะทํางานไดอยางเที่ยงตรงสําหรับคาหนวงเวลาที่ตํากว ่ านี้


    POP-XT  91

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

min(x, y)

หาคาตัวเลขทีน่ อยทีสุ่ ดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวที่สอง เปนขอมูลประเภทใดก็ได คาทีส่ งกลับจากฟงกชัน่ คาที่นอยที่สุดของตัวเลขสองตัวที่ให ตัวอยางที่ 4-16 sensVal = min(sensVal, 100); ตัวอยางนีจะได ้ คาของ sensVal ที่ไมเกิน 100 กลับจากฟงกชัน่

4.6.2

max(x, y)

หาคาตัวเลขทีมากที ่ ่สุดของตัวเลขสองตัว พารามิเตอร x - ตัวเลขตัวแรก เปนขอมูลประเภทใดก็ได y - ตัวเลขตัวที่สอง เปนขอมูลประเภทใดก็ได คาทีส่ งกลับจากฟงกชัน่ คาที่มากที่สุดของตัวเลขสองตัวที่ให ตัวอยางที่ 4-17 sensVal = max(senVal, 20); จากตัวอยางนี้ คาของ sensVal จะมีคาอยางนอย 20

4.6.3

abs(x)

หาคาสัมบูรณ (absolute) ของตัวเลข พารามิเตอร x - ตัวเลข คาทีส่ งกลับจากฟงกชัน่ x เมื่อ x มีคามากกวาหรือเทากับศูนย (x มีคาเปนบวกหรือศูนย) -x เมื่อ x มีคานอยกวาศูนย (x มีคาติดลบ)


92      POP-XT

4.6.4

constrain(x, a, b)

ปดคาตัวเลขทีน่ อยกวาหรือมากกวาใหอยูในช  วงทีกํ่ าหนด พารามิเตอร x - ตัวเลขที่ตองการปดคาใหอยูในชวงที่กําหนด สามารถเปนขอมูลชนิดใดก็ได a - คาตําสุ ่ ดของชวงที่กําหนด b - คาสูงสุดของชวงที่กําหนด คาทีส่ งกลับจากฟงกชัน่ x เมื่อ x มีคาอยูระหวาง a และ b a เมือ่ x มีคานอยกวา a b เมื่อ x มีคามากกวา b ตัวอยางที่ 4-18 sensVal = constrain(sensVal, 10, 150); จากตัวอยางนี้ คาของ sensVal จะอยูในชวง 10 ถึง 150

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

randomSeed(seed)

ใชกําหนดตัวแปรสําหรับสรางตัวเลขสุม โดยสามารถใชตัวแปรไดหลากหลายรูปแบบ โดยทัว่ ไปจะใชคาเวลาปจจุบัน (จากฟงกชัน่ milis()) แตสามารถใชคาอยางอืนได ่ เชน คาทีได ่ เมือผู ่ ใช  กดสวิตช หรือคาสัญญาณรบกวนที่อานไดจากขาอินพุตอะนาลอก พารามิเตอร seed เปนคาตัวเลขแบบ long int ตัวอยางที่ 4-19 long randNumber; void setup() { Serial.begin(19200); } void loop() { randomSeed(analogRead(0)); randNumber = random(300); Serial.println(randNumber); } ในตัวอยางนี้ กําหนดใหเกิดการสุมตั  วเลขเมืออ ่ านคาจากอินพุตอะนาลอกชอง 0 ยานของตัวเลขสุมคือ 0 ถึง 300 เมือสุ ่ มตัวเลขแลว ใหแสดงคานันที ้ ่หนาตาง Serial Monitor


    POP-XT  93

4.7.2

long random(max), long random (min,max)

ใชสรางตัวเลขสุมเสมื  อน (pseudo-random numbers) เพือนํ ่ าไปใชในโปรแกรม กอนใชฟงกชัน่ นี้จะตองเรียกใชฟงกชัน่ randomSeed() กอน พารามิเตอร min กําหนดคาตัวเลขสุมไมนอยกวาคานี้ (เปนออปชั่นเพิ่มเติม) max กําหนดคาสูงสุดของตัวเลขสุม คาทีส่ งกลับจากฟงกชัน่ คืนคาเปนตัวเลขสุมในชวงที่กําหนด (เปนตัวแปร long int) ตัวอยางที่ 4-20 long randNumber; void setup() { Serial.begin(9600); } void loop() { randomSeed(analogRead(0)); // สุมค  าจากการอานคาอินพุตอะนาลอก randNumber = random(50,300); // สุมค  าในชวง 50 ถึง 300 Serial.println(randNumber); Serial.flush(); delay(50); } เมื่อรันโปรแกรมนี้ คาที่ไดจากจะอยูในชวง 50 ถึง 300 แมวาจะปรับคาแรงดันอินพุตที่พอรต A0 เปน 0 หรือ +5V (ซึ่งปกติมีคา 0 ถึง 1023) ทั้งนีเป ้ นผลมาจากฟงกชัน่ random(min,max)


94      POP-XT

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

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

4.8.2 อินพุตรับสัญญาณอินเตอรรัปต แผงวงจร POP-XT มีอินพุตสําหรับรับสัญญาณอินเตอรรัปตจากภายนอก 4 ขาคือ INT0 ถึง INT3 ซึ่งตรงกับขา 3, 2, 0 และ 1 ตามลําดับ ซึ่งใชงานรวมกับขา SCL และ SDA (ขาสัญญาณสําหรับ ติดตออุปกรณระบบบัส I2C), RxD, TxD (ขารับสงขอมูลอนุกรม UART1)

4.8.3

attachInterrupt(interrupt, function, mode)

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


    POP-XT  95

พารามิเตอร Interrupt - หมายเลขของชองอินพุตอินเตอรรัปต (เปน int) function - ฟงกชันที ่ ่จะกระโดดไปทํางานเมื่อเกิดอินเตอรรัปต ไมรับคาพารามิเตอรและไมมีการคืนคา mode - เลือกประเภทสัญญาณที่ใชกระตุนให  เกิดการอินเตอรรัปต LOW เกิดอินเตอรรัปตเมื่อขาสัญญาณเปนลอจิก “0” CHANGE เกิดอินเตอรรัปตเมื่อมีการเปลี่ยนแปลงลอจิก RISING เกิดอินเตอรรัปตเมือมี ่ การเปลี่ยนลอจิก “0” เปน “1” FALLING เกิดอินเตอรรัปตเมื่อมีการเปลียนลอจิ ่ ก “1” เปน “0” ตัวอยางที่ 4-21 int pin = 4; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } ตัวอยางนีเลื ้ อกอินพุตอินเตอรรัปตชอง 0 กําหนดใหไปทํางานที่ฟงกชัน่ blink เมื่อเกิดอินเตอรรัปตขึน้

4.8.4

detachInterrupt(interrupt)

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


    POP-XT  97



  แผงวงจรไมโครคอนโทรลเลอร POP-XT ไดรับการออกแบบใหรองรับกับการเรียนรูดาน เทคโนโลยีและฝกกระบวนการคิดผานทางการเขียนโปรแกรมควบคุมดวยภาษา C/C++ เปนหลัก ในบทนี้เปนการนําเสนอถึงองคประกอบทั้งหมดโดยสรุปของสื่อการเรียนรูชุดนี้พรอมกับแนะนํา ตัวอย างการใชงานเครื่ องมือสําหรับพัฒนาโปรแกรมและตัวอยางของการทดสอบการทํางานทาง ฮารดแวรในขันต ้ น เพือใช ่ เปนแนวทางในการพัฒนาโปรแกรมสําหรับควบคุมแผงวงจรโปรแกรมได เพื่อการศึกษาตัวนี้

5.1 องคประกอบหลักทางฮารดแวรที่ใชในการพัฒนาโครงงาน 1. แผงวงจรควบคุม POP-XT เปนแผงวงจรหลักทีใช ่ ในการประมวลผลและควบคุมการทํางาน ที่มีจอแสดงผลแบบกราฟก LCD สี สําหรับแสดงผลการทํางาน 2. ชุดเฟองขับมอเตอรไฟตรงและเซอรโวมอเตอร ทําหนาทีเป ่ นอุปกรณขับเคลือนกลไก ่ ทําให เกิดการเคลื่อนไหว 3. ตัวตรวจจับชนิดตางๆ ทั้งแบบดิจิตอลและอะนาลอก 4. อุปกรณโครงสรางและอุปกรณทางกล

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


98      POP-XT

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

สรางไฟลสเก็ตช เขียนโปรแกรมภาษา C บน Arduino IDE คอมไพล อัปโหลดโปรแกรม พอรต USB

อัปโหลดโปรแกรมผานพอรต USB 1. ตอสาย USB-miniB เขากับพอรต USB และแผงวงจร POP-XT 2. ตรวจสอบตําแหนง USB Serial port (COMx) ที่เกิดขึน้ 3. เลือกฮารดแวรเปน POP-XT ซึ่งเขากันไดกับ ฮารดแวร Arduino Leonardo 4. ทําการอัปโหลดโปรแกรม

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

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


    POP-XT  99

5.4 ทดสอบการทํางานของแผงวงจร POP-XT หลังจากที่ติดตังโปรแกรมและไดรเวอร ้ ของ POP-XT เรียบรอยแลวตั้งแตบทที่ 2 ในหัวขอนี้ เปนการทดสอบการทํางานในเบื้องตน ดวยการนําโปรแกรมตัวอยางมาคอมไพลและอัปโหลด โปรแกรมไปยังแผงวงจร POP-XT เรียกโปรแกรม Arduino1.0 ขึ้นมาใชงาน โดยคลิกปุม Start > Arduino1.0 > Arduino เมื่อ Arduino ทํางานในครั้งแรกจะมีหนาจอดังรูป

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


100      POP-XT

5.4.1.1 เลือกเบอรของไมโครคอนโทรลเลอร เลือกเมนู Tools > Board > POP-XT ดังรูป

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

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


    POP-XT  101

5.4.2 ทดลองสรางไฟลสเก็ตชตัวอยาง Arduino จะเรียกโปรแกรมทีเขี ่ ยนขึนว ้ า สเก็ตช (Sketch) เริมต ่ นสรางไฟลสเก็ตชดวยคําสัง่ New (1) คลิกเลือกเมนู File > New จากนั้นพิมพโคดตัวอยางดังตอไปนี้ #include <popxt.h> void setup() { glcd(1,0,"Hello World"); } void loop() {}

// ผนวกไฟลไลบรารี POP-XT // แสดงขอความที่จอแสดงผล GLCD สี

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

(3) คอมไพลโปรแกรม เลือกเมนู Sketch > Verify/Compile ดังรูปหรือคลิกที่ปุม

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


102      POP-XT

5.4.3 อัปโหลดโปรแกรมไปยังแผงวงจร POP-XT หลังจากที่คอมไพลโปรแกรมเสร็จสมบูรณแลว ขั้นตอนตอมาเปนการอัปโหลดโปรแกรม ภาษาเครื่องไปยังแผงวงจร POP-XT ในซอฟตแวร Arduino เรี ยกกระบวนการการสงขอมูลของ โปรแกรมภาษา C ที่คอมไพลแลวไปยังฮารดแวรวา อัปโหลด (upload) ซึ่งแตกตางจากการพัฒนา โปรแกรมของไมโครคอนโทรลเลอรอื่นๆ ซึ่งเรียกวา การดาวนโหลด (download) มีขันตอนโดยสรุ ้ ปดังนี้ (1) เปดสวิตชของแผงวงจร POP-XT ตอสาย USB เขากับคอมพิวเตอร

ตอกับพอรต USB ของคอมพิวเตอร สาย USB-miniB F 0 2 2 F 0 0 1

0 0 1

คอมพิวเตอร

ATMega32U4

TB6612

แผงวงจร POP-XT

(2) อัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกที่ปุม Upload

หรือเลือกที่เมนู File >


    POP-XT  103

(3) รอจนการอัปโหลดเสร็จสิ้น โปรแกรมจะเริ่มทํางานทันที หรือกดสวิตช RESET อีกครั้ง โปรแกรม HelloWorld เปนการสงขอความ Hello World ออกไปที่บรรทัด 1 คอลัมน 0 ของจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT

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


    POP-XT  105



   หลังจากการแนะนําขันตอนแนวทางการพั ้ ฒนาโปรแกรมภาษา C/C++ ดวย Arduino1.0 ไป แลวในบทที่ 5 เพื่อใหการเรียนรูเปนไปอยางตอเนื่อง ในบทนี้จึงนําเสนอตัวอยางการทดสอบการ ทํางานในสวนตางๆ ที่สําคัญของแผงวงจร POP-XT เพื่อเปนแนวทางในการตอยอดสูการพัฒนา โปรแกรมเพือควบคุ ่ มหุนยนต  และพัฒนาเปนโครงงานอยางเต็มรูปแบบตอไป หัวขอกิจกรรมสําหรับทดสอบการทํางานของแผงวงจร POP-XT มีทังสิ ้ น้ 4 กิจกรรม ประกอบ ดวย กิจกรรมที่ 1 แสดงผลขอความที่หนาจอภาพกราฟก LCD (มีกิจกรรมยอย 5 กิจกรรม) กิจกรรมที่ 2 ขับเสียงออกลําโพงเปยโซ กิจกรรมที่ 3 อานคาจากปุม KNOB และสวิตช OK บนแผงวงจร POP-XT กิจกรรมที่ 4 ขับอุปกรณเอาตพุตอยางงาย ขันตอนการพั ้ ฒนาโปรแกรมในแตละกิจกรรมจะเหมือนกัน นันคื ่ อ เปดโปรแกรม Arduino1.0 ทําการเขียนโปรแกรม คอมไพล และอัปโหลดลงบนแผงวงจร POP-XT จากนั้นทดสอบการทํางาน สิงสํ ่ าคัญทีต่ องเนนยําคื ้ อ ทุกครังที ้ เป ่ ดสวิตชจายไฟแกแผงวงจร POP-XT หรือหุนยนต  POP-BOT XT ตองรอใหตัวควบคุมพรอมทํางานเสียกอน ซึงใช ่ เวลาประมาณ 10 วินาทีหลังจากเปดไฟเลียงหรื ้ อหลัง จากการกดสวิตช RESET หากมีการอัปโหลดกอนทีแผงวงจร ่ POP-XT จะพรอมทํางาน อาจทําใหเกิด ความผิดพลาดในการเชือมต ่ อ หรือโคดทีอั่ ปโหลดลงไปไมทํางานตามทีควรจะเป ่ น แตจะไมสงผลจนทํา ใหแผงวงจรเกิดความเสียหาย สิงที ่ เกิ ่ ดขึนมี ้ เพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานัน้


106      POP-XT

     (A1.1.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-1 แลวบันทึกไฟล (A1.1.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร

ตอกับพอรต USB ของคอมพิวเตอร สาย USB-miniB F 0 2 2 F 0 0 1

0 0 1

คอมพิวเตอร

ATMega32U4

TB6612

แผงวงจร POP-XT

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


    POP-XT  107

#include <popxt.h> // ผนวกไลบรารีหลัก void setup() { glcd(1,0,"Hello World"); // แสดงขอความบนจอแสดงผล } void loop() { } คําอธิบายโปรแกรม โปรแกรมนี้จะทํางานโดยสงขอความ Hello World ออกไปแสดงผลที่บรรทัด 1 คอลัมน 0 ของจอ แสดงผล จะทํางานเพียงครั้งเดียว จึงเขียนโปรแกรมไวที่ตําแหนงของ void setup() เทานัน้

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

(A1.1.5) คอมไพลและอัปโหลดไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม

หรือเลือกทีเมนู ่ File > Upload

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

100 F

World

ATMega32U4

220 F

100 TB6612


108      POP-XT

  จอแสดงผลของแผงวงจร POP-XT มีขนาด 128 x 160 พิกเซล แสดงตัวอักษรความละเอียด 5 x 7 จุด จํานวน 21 ตัวอักษร 16 บรรทัด ผูใช  งานสามารถระบุตําแหนงบรรทัดและตําแหนงคอลัมน ทีต่ องการแสดงผลได โดยกําหนดผานคําสัง่ glcd ซึ่งมีอยูในไฟลไลบรารี popxt.h นอกจากนันคํ ้ าสัง่ glcd ยังมีอักขระพิเศษเพื่อระบุตําแหนงแทนการใชคาตัวเลข ดังแสดงใน โปรแกรมที่ A1-2 #include <popxt.h> // ผนวกไฟลไลบรารีหลัก int i,j; void setup() { glcdFillScreen(GLCD_WHITE); // กําหนดใหสีของพื้นหลังของจอแสดงผลเปนสีขาว setTextColor(GLCD_BLACK); // กําหนดสีตัวอักษรเปนสีดํา setTextBackgroundColor(GLCD_WHITE); // กําหนดสีพื้นหลังของตัวอักษรเปนสีขาว for (i=0;i<16;i++) // วนลูป 16 รอบเพื่อแสดงขอความ { glcd(i,i,"Row %d ",i); // แสดงขอความที่จอแสดงผล } } void loop() {} คําอธิบายโปรแกรม ในโปรแกรมนี้เพิมเติ ่ มคําสั่งสําหรับการใชงานจอแสดงผลอีก 3 คําสั่งคือ 1. glcdFillScreen เปนคําสั่งกําหนดสีพืนหลั ้ งของจอแสดงผล 2. setTextColor สําหรับกําหนดสีใหแกตัวอักษร 3. setTextBackground สําหรับกําหนดสีพืนหลั ้ งของตัวอักษร เมื่อตั้งคาของจอแสดงผลแลว จึงทําการสงขอความ Row ตามดวยหมายเลขบรรทัดซึงมาจากการ ่ เพิมค ่ าของตัวแปร i และมีการเลือนตํ ่ าแหนงตามคาของ i ดวย ดังนันที ้ บรรทั ่ ดแรก ขอความ Row0 ถูกแสดง ที่คอลัมน 0 ที่บรรทัด 2 แสดงขอความ Row 1 ที่คอลัมน 1 ไลไปตามลําดับจนถึงบรรทัด 15 (บรรทัดที่ 16) จะแสดงเปน Row 15 ที่คอลัมน 15

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


    POP-XT  109

(A1.2.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-2 แลวบันทึกไฟล (A1.2.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร

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

หรือเลือกทีเมนู ่

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

ATMega32U4

Row00 Row01 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


110      POP-XT

      ขนาดตัวอักษรปกติทีแสดงบนจอแสดงผลของแผงวงจร ่ POP-XT เมือเริ ่ มต ่ นทํางานเปนขนาด เล็กสุด ใชจํานวนจุดตอตัวอักษรคือ 6 x 10 จุด (อักษรจริงมีขนาด 5 x 7 จุด) ถาตองการปรับขนาด ตัวอักษรใหใหญขึน้ จะมีคําสัง่ setTextSize ไวสําหรับปรับขนาด โดยคาทีกํ่ าหนดจะเปนจํานวนเทา ของตัวอักษรปกติ เชน setTextSize(2) หมายถึงขนาดตัวอักษรใหญขึนเป ้ น 2 เทา ใช 12 x 20 พิกเซลตอ 1 ตัวอักษร setTextSize(3) หมายถึงขนาดตัวอักษรใหญขึนเป ้ น 3 เทา ใช 18 x 30 พิกเซลตอ 1 ตัวอักษร เมื่อปรับขนาดตัวอักษรมีขนาดใหญขึน้ จํานวนตัวอักษรตอบรรทัดก็ตองลดลง จากเดิม 21 ตัวอักษร 16 บรรทัด เมื่อขนาดของตัวอักษรเพิ่มขึ้นเปนสองเทา ก็จะทําใหแสดงได 10 ตัวอักษร 8 บรรทัดแทน ดังนั้นเมื่อเขียนโปรแกรมจะตองคํานึงถึงคาเหลานีด้ วย นอกจากขนาดตัวอักษรแลว ยังกําหนดทิศทางการแสดงผลของจอแสดงผลได โดยใชคําสัง่ glcdMode() โดยมีคาตังต ้ นคือ โหมด 0 (glcdMode(0)) นันคื ่ อ แสดงผลในแนวตั้ง สําหรับอีก 3 โหมดคือ โหมด 1, 2 และ 3 ใชปรับใหการแสดงผลหมถนไปโหมดละ 90 องศา นันคื ่ อ โหมด 1 หมุน ไป 90 องศา, โหมด 2 หมุนไป 180 องศา และโหมด 3 หมุนไป 270 องศา #include <popxt.h> int x,m; void setup() { setTextColor(GLCD_RED); } void loop() { for (x=1;x<6;x++) { setTextSize(x); for(m=0;m<4;m++) { glcdClear(); glcdMode(m); glcd(0,0,"%dX",x); glcd(1,0,"M=%d",m); sleep(500); } } }

// กําหนดสีตัวอักษรเปนสีแดง

// กําหนดขนาดตัวอักษร // เคลียรหนาจอ // กําหนดทิศทาง // แสดงขนาดตัวอักษร // แสดงโหมดทิศทาง

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


    POP-XT  111

(A1.3.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-3 แลวบันทึกไฟล (A1.3.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร (A1.3.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT โดยคลิกทีปุ่ ม

หรือเลือกทีเมนู ่ File > Upload

ที่หนาจอแสดงผลกราฟก LCD ของแผงวงจร POP-XT แสดงขอความแจงขนาดของตัวอักษร

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

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

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


112      POP-XT

   ฟงกชัน่ glcd เปนฟงกชันหลั ่ กในการติดตอกับจอแสดงผลกราฟก LCD นอกจากมีคําสังแสดง ่ ขอความแลว ยังมีคําสังในการวาดลายเส ่ นกราฟกอีกหลายคําสัง่ ประกอบดวย glcdRect(int x1,int y1,int width,int height,uint color)

เปนคําสัง่

สรางรูปสี่เหลียม ่ glcdFillRect(int x1,int y1,int width,int height,uint color)

เปน

คําสั่งสรางพื้นสี่เหลี่ยม เปนคําสังลากเส ่ น ่ นวง color) เปนคําสังวาดเส

glcdLine(int x1, int y1, int x2, int y2,uint color) glcdCircle(int x, int y, int radius,uint

กลม glcdFillCircle(int x, int y, int radius,uint color)

เปนคําสังสร ่ าง

พืนที ้ วงกลม ่ เปนการเคลียรหนาจอแสดงผล โดยทดสอบเขียนโปรแกรมไดดังโปรแกรมที่ A1-4 แลวอัปโหลดเพือทดสอบการทํ ่ างานไปยัง แผงวงจร POP-XT จะไดผลดังรูป glcdClear(uint color)


    POP-XT  113

#include <popxt.h> int i,j; void setup() {} void loop() { glcdClear; sleep(300); for (i=0;i<160;i+=4) { glcdLine(0,0,128,i,GLCD_WHITE); } for (i=0;i<128;i+=4) { glcdLine(0,0,i,160,GLCD_RED); } sleep(2000); glcdRect(32,40,64,80,GLCD_BLUE); sleep(300); glcdFillCircle(32,40,31,GLCD_GREEN); glcdFillCircle(96,40,31,GLCD_YELLOW); glcdFillCircle(32,120,31,GLCD_MAGENTA); glcdFillCircle(96,120,31,GLCD_SKY); sleep(1000); glcdCircle(64,40,31,GLCD_GREEN); glcdCircle(32,80,31,GLCD_BLUE); glcdCircle(64,120,31,GLCD_YELLOW); glcdCircle(96,80,31,GLCD_SKY); sleep(1000); glcdFillRect(0,0,128,160,GLCD_YELLOW); sleep(1000); }

// ผนวกไฟลไลบรารีหลัก

// เคลียรหนาจอและพื้นหลังเปนสีดํา

// วาดเสนสีขาวจากพิกัด 0,0 ไปยังจุดที่กําหนด

// วาดเสนสีแดงจากพิกัด 0,0 ไปยังจุดที่กําหนด // วาดเสนกรอบสีเหลี ่ ่ยมสีนําเงิ ้ น // สรางวงกลมพื้นสีเขียว // สรางวงกลมพื้นสีเหลือง // สรางวงกลมพื้นสีบานเย็น // สรางวงกลมพื้นสีฟา // วาดเสนรอบวงกลมสีเขียว // วาดเสนรอบวงกลมสีนําเงิ ้ น // วาดเสนรอบวงกลมสีเหลือง // วาดเสนรอบวงกลมเสนสีฟา // สรางรูปสีเหลี ่ ่ยมสีเหลือง

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


114      POP-XT

   นอกจากวงกลมและสี่เหลี่ยมแลว เสนโคงก็เปนสวนประกอบสําคัญในการสรางภาพกราฟก ในชุดคําสังเกี ่ ่ยวกับการแสดงผลจอภาพแบบกราฟกสีของแผงวงจร POP-XT ยังมีคําสัง่ glcdArc() สําหรับสรางเสนโคง โดยมีพารามิเตอรหรือตัวแปรทีต่ องกําหนดอยูพอสมควร  ดูรายละเอียดเพิ่มเติม ในบทที่ 7 เกียวกั ่ บไฟลไลบรารี popxt.h ซึ่งบรรจุคําสังพิ ่ เศษเหลานีไว ้ (A1.5.1) เปดโปรแกรม Arduino1.0 พิมพโปรแกรมที่ A1-5 แลวบันทึกไฟล (A1.5.2) เปดสวิตชจายไฟแกแผงวงจร POP-XT แลว เชื่อมตอสาย USB เขากับคอมพิวเตอร #include <popxt.h> int i; // ฟงกชันสร ่ างรูปหนายิม้ void face() { glcdFillCircle(64,70,50,GLCD_WHITE); glcdArc(48,60,16,30,150,GLCD_RED); glcdCircle(48,55,5,GLCD_BLUE); glcdCircle(80,55,5,GLCD_BLUE); glcdArc(80,60,16,30,150,GLCD_RED); glcdFillCircle(64,70,7,GLCD_YELLOW); glcdArc(64,80,30,220,320,GLCD_RED); glcdArc(64,80,29,220,320,GLCD_RED); } void setup() {} void loop() { for(i=0;i<4;i++) { glcdClear(); glcdMode(i); // สังหมุ ่ นการแสดงผล face(); sleep(1000); } }

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


    POP-XT  115

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

หรือเลือกทีเมนู ่

(A1.5.4) รันโปรแกรม ดูผลการทํางานทีจอแสดงผลของแผงวงจร ่ POP-XT ทีจอแสดงผลแสดงเป ่ นรูปการตูนหนายิมนาน ้ 1 วินาที แลวหมุนไปครั้งละ 90 องศา แลววน กลับมาทีหน ่ าเริ่มตน จะวนแสดงผลไปตลอดเวลา


116      POP-XT

    บนแผงวงจร POP-XT มีสวนขับเสียงโดยใชลําโพงเปยโซ โดยตัวลําโพงเปยโซขนาดเล็กนีตอบ ้ สนองความถี่เสียงในชวงความถี่ประมาณ 300 ถึง 3,000Hz สําหรับไฟลไลบรารี popxt.h มีคําสัง่ สําหรับขับเสียงออกลําโพงเปยโซ 2 คําสังคื ่ อ beep() และ sound()

ในโปรแกรมที่ A2-1 เปนตัวอยางการใชคําสัง่ beep() เพือขั ่ บเสียง “ติด” ้ ความถี่เดียวออกทาง ลําโพงทุกๆ 1 วินาที สวนในโปรแกรมที่ A2-2 เปนตัวอยางการใชคําสั่ง sound() เพื่อขับเสียงที่มีความถี่ตามที่ กําหนดออกทางลําโพงเปยโซ ตามเวลาที่กําหนดในโปรแกรม การทดสอบโปรแกรมทังสองให ้ ดําเนินการเหมือนกับในกิจกรรมทีผ่ านมา นันคื ่ อ เปดโปรแกรม Arduino1.0 แลวสรางไฟลสเก็ตชขึนใหม ้ จากนันพิ ้ มพโปรแกรมที่ A2-1 หรือ A2-2 ตามตองการ แลว บันทึกไฟล จากนันทํ ้ าการคอมไพลและอัปโหลดไปยังแผงวงจร POP-XT #include <popxt.h> void setup() {} void loop() { beep(); sleep(1000); }

// ผนวกไฟลไลบรารีหลัก

// ขับเสียง “ติด” ้ ออกลําโพง

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


    POP-XT  117

#include <popxt.h> void setup() {} void loop() { sound(500,500); sound(2500,500); }

// ผนวกไฟลไลบรารีหลัก

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

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


118      POP-XT

   ในระบบควบคุมพืนฐานจะต ้ องมีการปรับตังค ้ า มีเมนู มีสวิตชในการสังงานต ่ างๆ บนแผงวงจร POP-XT ก็มีสวนติดตตอกับผูใช  งานดวยเชนกัน ประกอบดวยปุม KNOB สําหรับปรับเลือกรายการ และสวิตช OK สําหรับยืนยันการเขาสูรายการทางเลื  อกนั้นๆ 100 F

ATMega32U4

220 F

100 TB6612

เขียนโปรแกรมที่ A3-1 แลวบันทึกไฟลชื่อ KnobSwitchTest.ino จากนั้นทําการคอมไพลและ อัปโหลดไปยังแผงวงจร POP-XT แลวรันโปรแกรมทดสอบการทํางาน เมื่อโปรแกรมเริ่มทํางาน ทีหน ่ าจอแสดงผลของแผงวงจร POP-XT แสดงขอความ Press OK (ขนาดตัวอักษรใหญขนาด 2x) ใหทําการกดสวิตช OK เพื่อเริ่มการทํางาน จะไดยินเสียง “ติด” ้ 1 ครั้ง จากนั้นจอแสดงผลจะแสดงขอความ Knob value (ขนาดตัวอักษรใหญขนาด 2x) XXXX (ขนาดตัวอักษรใหญขึนเป ้ นขนาด 3x) โดยที่ xxxx มีคาไดตังแต ้ 80 ถึง 1023 ทดลองปรับปุม KNOB บนแผงวงจร POP-XT คาของ Knob ทีจอแสดงผลจะต ่ องเปลียนแปลงตามการปรั ่ บที่ปุม KNOB จากนั้นทําการกดสวิตช OK จะไดยินเสียงของความถี่ 500Hz ดังนาน 0.5 วินาที และแผงวงจร POP-XT จะขับ เสียงความถี่นีทุ้ กครั้งที่มีการกดสวิตช OK


    POP-XT  119

#include <popxt.h> void setup() { glcdClear; setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); beep(); glcdClear; } void loop() { if (sw_ok()) { sound(500,500); } glcd(1,0,"Knob value"); setTextSize(3); glcd(2,2,"%d ",knob()); setTextSize(2); }

// ผนวกไฟลไลบรารีหลัก // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // ขับเสียง “ติด” ้ ออกลําโพง // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // ตรวจสอบการกดสวิตช OK // หากมีการกดสวิตช ขับเสียงความถี่ 500 Hz นาน 0.5 วินาที // แสดงขอความที่จอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาที่อานไดจากการปรับปุม KNOB ที่หนาจอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

โปรแกรมที่ A3-1 ไฟล KnobSwitchTest.ino สําหรับทดสอบอานคาจากปุม KNOB และสวิตช OK


120      POP-XT

   ในไฟลไลบรารี popxt.h มีคําสัง่ out(int num,int _dat) ซึ่งชวยใหสงลอจิก “0” หรือ “1” ออกไปยังขาพอรตทีต่ องการได ทําใหนําแผงวงจร POP-XT ไปใชขับอุปกรณเอาตพุตพื้นฐานได งายขึน้ ยกตัวอยางงายทีสุ่ ดคือ ไดโอดเปลงแสงหรือ LED ในกิจกรรมนีจึ้ งนําแผงวงจร ZX-LED อันเปนแผงวงจร LED แสดงผลแบบเดียวที ่ จะติ ่ ดสวาง เมื่อไดรับลอจิก “1” และดับลงเมื่อไดรับลอจิก “0” มาตอกับแผงวงจร POP-XT เพื่อทดลองใชงาน (A4.1) นํา ZX-LED ชุดที่ 1 ตอเขากับจุดตอพอรต 6 /A7 และชุดที่ 2 ตอกับจุดตอพอรต 4/A6 LED

LED OBEC-LED

OBEC-LED S

S

+

+ S

+

+ S

100 F

A TM e g a 3 2 U 4

220 F

TB 6 6 1 2

100

(A4.2) เขียนโปรแกรมที่ A4-1 บันทึกไฟลชื่อ LEDTest.ino (A4.3) เปดสวิตชจายไฟแกแผงวงจร POP-XT รอประมาณ 10 วินาที เพื่อใหแผงวงจรพรอมทํางาน จากนั้นตอสาย USB เขากับคอมพิวเตอร (A4.4) คอมไลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT บนหุนยนต  POP-BOT XT (A4.5) รันโปรแกรม สังเกตการทํางานของ ZX-LED เมื่อรันโปรแกรม ทีหน ่ าจอแสดงผลของแผงวงจร POP-XT แสดงขอความ Press OK

ใหกดสวิตช OK เพื่อเริ่มการทํางาน จะเห็น LED บนแผงวงจร ZX-LED ทังสองชุ ้ ดติดและ ดับสลับกันไปอยางตอเนือง ่


    POP-XT  121

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); } void loop() { out(4,1); out(6,0); sleep(400); out(4,0); out(6,1); sleep(400); }

// ผนวกไฟลไลบรารีหลัก // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความออกหนาจอ GLCD // วนรอการกดสวิตช OK

// ทําให LED ที่ตออยูกั บพอรต 4 ติดสวาง // ทําให LED ที่ตออยูกั บพอรต 6 ดับ // ทําให LED ที่ตออยูกั บพอรต 4 ดับ // ทําให LED ที่ตออยูกั บพอรต 6 ติดสวาง

โปรแกรมที่ A4-1 ไฟล LEDTest.ino สําหรับทดสอบการขับอุปกรณเอาตพุตอยางงาย


122      POP-XT


    POP-XT  123



 การพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับแผงวงจรไมโครคอนโทรลเลอร POPXT ดําเนินการภายใตการสนับสนุนของไฟลไลบรารี popxt.h ทั้งนี้เพื่อชวยลดขั้นตอนและความซับ ซอนในการเขียนโปรแกรมควบคุมสวนตางๆ ของฮารดแวรลง เนื่องจากตองการใหความสําคัญไป อยูที ่การเขียนโปรแกรมสําหรับรองรับการเรียนรูและกิ  จกรรมการแขงขัน โครงสรางของไฟลไลบรารี popxt.h แสดงดังรูป                                   

                            


124      POP-XT

7.1 ไลบรารียอยภายในไฟลไลบรารี popxt.h บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับแสดงผลขอความ, ตัวเลข และสรางภาพกราฟกสีที่ จอแสดงผลแบบกราฟก LCD สีของ POP-BOT XT (ยังไมรองรับการทํางานกับไฟลรูปภาพ) ่ าสังสํ ่ าหรับการหนวงเวลา  sleep บรรจุฟงกชันและคํ  in _out บรรจุ ฟ งก ชั่ นและคํ าสั่ งสําหรั บอ านค าอิ นพุ ตดิจิ ตอลและสงคาออกทางขา พอรตเอาตพุตดิจิตอล ่ าสังสํ ่ าหรับอานคาจากอินพุตอะนาลอกที่ตอกับตัวตรวจจับ  analog บรรจุฟงกชันและคํ  sound บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับสรางเสียงเพือขั ่ บออกลําโพง  motor บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับขับมอเตอรไฟตรง  servo บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับขับเซอรโวมอเตอร  serial บรรจุฟงกชันและคํ ่ าสังสํ ่ าหรับสือสารข ่ อมูลอนุกรมผานทางพอรต USB และผาน ทางขาพอรต TxD และ RxD ของแผงวงจร POP-XT ในการเรียกใชงานชุดคําสังย ่ อยตางๆ เพือการพั ่ ฒนาโปรแกรมควบคุมหุนยนต POP-BOT XT ผูพั ฒนาตองผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง  glcd

#include <popxt.h>

เพือประ ่ กาศใหใหตัวแปลภาษาหรือคอมไพเลอรรูจักชุดคําสังย ่ อยตางๆ ที่กําลังจะถูกเรียกใช

งานจากไฟลไลบรารี popxt.h


    POP-XT  125

7.2 รายละเอียดของฟงกชันหรื ่ อคําสังหลั ่ กในไฟลไลบรารี popxt.h 7.2.1 ฟงกชันเกี ่ ่ยวกับการแสดงผลจอภาพแบบกราฟก LCD สี 7.2.1.1 glcd เปนฟงกชันแสดงข ่ อความที่หนาจอแสดงผลกราฟก LCD สี โดยแสดงตัวอักษรขนาดปกติได 21 ตัวอักษร 16 บรรทัด รูปแบบ

void glcd(unsigned char x, unsigned char y ,char *p,...) พารามิเตอร x คือตําแหนงบรรทัดมีคาตังแต ้ 0 ถึง 15 y คือตําแหนงตัวอักษรมีคาตังแต ้ 0 ถึง 20 *p คือขอความที่ตองการนํามาแสดงรวมถึงรหัสที่ใชกําหนดรูปแบบพิเศษเพื่อรวมแสดงผลขอมูลตัวเลขใน รูปแบบอืนๆ ่ ประกอบดวย %c หรือ %C - รับคาแสดงผลตัวอักษร 1 ตัวอักษร %d หรือ %D - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -32,768 ถึง 32,767 %l หรือ %L - รับคาแสดงผลตัวเลขจํานวนเต็มในชวง -2,147,483,648 ถึง 2,147,483,647 %f หรือ %F - รับคาเพื่อแสดงผลตัวเลขจํานวนจริง (แสดงทศนิยม 3 หลัก) ตัวอยางที่ 7-1 glcd(2,0,“Hello World“); // แสดงขอความ Hello World ทีตํ่ าแหนงซายสุดของบรรทัด 2 (บรรทัดที่ 3) 100 F HelloRWorld RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07

ตัวอยางที่ 7-2 int x=20; glcd(1,2,”Value = %d”,x);

Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07

// แสดงตัวอักษรและตัวเลขบนบรรทัดเดียวกัน // เริมต ่ นที่คอลัมน 2 ของบรรทัด 1 (บรรทัดที่ 2) 100 F


126      POP-XT

7.2.1.2 colorRGB เปนฟงกชันเปลี ่ ่ยนคาสีในรูปแบบ RGB (แดง เขียว นํ้าเงิน) ใหอยูในรู  ปของตัวเลข 16 บิต โดย แบงเปนคาของสีแดง 5 บิต ตอดวยสีเขียว 6 บิต และปดทายดวยคาของสีนํ้าเงิน 5 บิต รูปแบบ

unsigned int colorRGB(uint red,uint green,uint blue) พารามิเตอร red - เปนคาของสีแดง มีคาระหวาง 0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31 green - คาของสีเขียว มีคาระหวาง 0 ถึง 63 ถาคาที่ปอนมากกวา 63 จะถูกปรับลดใหเทากับ 63 blue - คาของสีนําเงิ ้ น มีคาระหวาง0 ถึง 31 ถาคาที่ปอนมากกวา 31 จะปรับลดใหเทากับ 31 ตัวอยางที่ 7-3 #include <popxt.h> int colors; void setup() { int colors; colors=colorRGB(31,0,0); // สงคาสี 16 บิตของสีแดงใหตัวแปร colors glcdFillScreen(colors); // นําคาไปแสดงเปนสีพื้นของจอแสดงผล } void loop() {}

100 F

ATMega32U4

Row00 RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


    POP-XT  127

7.2.1.3 color[ ] เปนตัวแปรอะเรยทีใช ่ กําหนดสีจํานวน 8 สีทีเป ่ นสีพืนฐาน ้ ผูพั ฒนาโปรแกรมสามารถเรียกใช ตัวแปร color[] หรือเรียกใชชือสี ่ ตรงๆ ก็ได รูปแบบ

unsigned int color[]= { GLCD_RED, GLCD_GREEN, GLCD_BLUE, GLCD_YELLOW, GLCD_BLACK, GLCD_WHITE, GLCD_SKY, GLCD_MAGENTA}; พารามิเตอร GLCD_RED - ใชกําหนดสีแดง GLCD_GREEN - ใชกําหนดสีเขียว GLCD_BLUE - ใชกําหนดสีนําเงิ ้ น GLCD_YELLOW - ใชกําหนดสีเหลือง GLCD_BLACK - ใชกําหนดสีดํา GLCD_WHITE - ใชกําหนดสีขาว GLCD_SKY - ใชกําหนดสีฟา GLCD_MAGENTA - ใชกําหนดสีบานเย็น ตัวอยาง 7-4 glcdFillScreen(color[5]) // กําหนดใหพื้นหลังเปนสีขาว ตัวอยาง 7-5 glcdFillScreen(GLCD_BLUE) // กําหนดใหพื้นหลังเปนสีนําเงิ ้ น


128      POP-XT

7.2.1.4 setTextColor เปนการกําหนดคาสีของตัวอักษรที่แสดงดวยฟงกชัน่ glcd() โดยคาตังต ้ นกําหนดเปนสีขาว รูปแบบ

void setTextColor(unsigned int newColor) พารามิเตอร newColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-6 setTextColor(GLCD_YELLOW); // กําหนดใหสีของตัวอักษรเปนสีเหลือง

7.2.1.5 setTextBackgroundColor เปนฟงกชันกํ ่ าหนดสีของพื้นหลังตัวอักษร โดยคาตังต ้ นเปนสีดํา สีของพื้นหลังตัวอักษรจะ เปนคนละสวนกับสีของพืนจอภาพ ้ (screen background) ซึงต ่ องกําหนดคาผานฟงกชัน่ glcdFillScreen รูปแบบ

void setTextBackgroundColor(unsigned int newColor) พารามิเตอร newColor คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-7 setTextBackgroundColor(GLCD_GREEN); // กําหนดใหสีพื้นหลังตัวอักษรเปนสีเขียว

100 F

ATMega32U4

Hello World RRValueR=R20 RRRow02 RRRRow03 RRRRRow04 RRRRRRow05 RRRRRRRow06 RRRRRRRRow07 RRRRRRRRRow08 RRRRRRRRRRow09 RRRRRRRRRRRow010 RRRRRRRRRRRRow011 RRRRRRRRRRRRRow012 RRRRRRRRRRRRRRow013 RRRRRRRRRRRRRRRow014 RRRRRRRRRRRRRRRRow015

100

220 F

TB6612


    POP-XT  129

7.2.1.6 glcdClear เปนการเคลียรหนาจอแสดงผล สีของพืนหลั ้ งจะเปนสีพืนหลั ้ งของตัวอักษรลาสุด ถาไมไดกําหนด ดวยคําสัง่ setTextBackGroundColor() มากอน หลังจากทําคําสัง่ glcdClear() แลวพืนหลั ้ งจะเปนสีดํา รูปแบบ

void glcdClear() ตัวอยางที่ 7-8 glcdClear();

// เคลียรหนาจอแสดงผล

7.2.1.7 glcdFillScreen เปนการเคลียรหนาจอแสดงผล แลวเปลี่ยนสีพื้นหลังของจอแสดงผลดวยสีทีระบุ ่ รูปแบบ

void glcdFillScreen(unsigned int color) พารามิเตอร color คือสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-9 glcdFillScreen(GLCD_BLUE); // กําหนดสีพื้นหลังของจอภาพเปนสีนําเงิ ้ น

[จอภาพสีดํา]

[จอภาพสีนําเงิ ้ น]


130      POP-XT

7.2.1.8 glcdMode เปนการกําหนดทิศทางแสดงผลใหขอความหรือภาพหนาจอหมุนจอภาพ ใหแสดงภาพตังฉาก ้ ตรงหนา (โหมด 0), หมุนขวา 90 องศา (โหมด 1), หมุน 180 องศาหรือกลับหัว (โหมด 2) และหมุน 270 องศา (โหมด 3) รูปแบบ

glcdMode(unsigned int modeset) พารามิเตอร modeset คือคาทิศทางของการหมุนมีคา 0 ถึง 3 โดยใชแทนทิศทาง 0 องศา 90 องศา 180 องศา หรือ 270 องศา โดยเมือเริ ่ มต ่ นคาทิศทางคือ 0 องศา ทํางานอยูในแนวตัง้

ตัวอยางที่ 7-10 #include <popxt.h> void setup() { setTextSize(2); } void loop() { glcdClear(); glcdMode(0); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(1); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(2); glcd(0,0,”POP-BOTXT”); sw_ok_press(); glcdClear(); glcdMode(3); glcd(0,0,”POP-BOTXT”); sw_ok_press(); }

// ขนาดตัวอักษร 2 เทา // เคลียรหนาจอ // โหมด 0 องศา // แสดงขอความ // รอกดสวิตชเขาโหมดตอไป


    POP-XT  131

7.2.1.9 setTextSize เปนการกําหนดขนาดตัวอักษรโดยระบุเปนจํานวนเทาของขนาดปกติ คาตังต ้ นเมือเริ ่ ่มทํางาน ทุกครั้งคือ ขนาดตัวอักษรปกติ ใชพื้นที่รวมระยะชองไฟคือ 6x10 พิกเซลตอ 1 ตัวอักษร จึงแสดงได 21 ตัวอักษร 16 บรรทัดในแนวตัง้ รูปแบบ

setTextSize(unsigned int newSize) พารามิเตอร newSize คือคาขนาดจํานวนเทาของขนาดปกติ มีคา 1 ถึง 16 เพื่อใหตัวอักษรที่แสดงไมลนหนาจอ ตัวอยางที่ 7-11 #include <popxt.h> void setup() { setTextSize(1); // กําหนดขนาดขอความ 1 เทา setTextColor(GLCD_GREEN); // สีตัวอักษรเปนสีเขียว glcd(0,0,"Size1"); // แสดงขอความ setTextSize(2); glcd(1,0,"Size2"); // กําหนดขนาดขอความ 2 เทา setTextSize(3); glcd(2,0,"Size3"); // กําหนดขนาดขอความ 3 เทา setTextSize(4); glcd(3,0,"Size4"); // กําหนดขนาดขอความ 4 เทา } void loop() {}


132      POP-XT

7.2.1.10 getTextColor เปนคําสังคื ่ นคาสีปจจุบันของตัวอักษร รูปแบบ

unsigned int getTextColor() การคืนคา textColor เปนคาสีแสดงอยูในรู  ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB() ตัวอยางที่ 7-12 unsigned int color; color=getTextColor(); // นําคาสีของตัวอักษรเก็บไวที่ตัวแปร color

7.2.1.11 getTextBackgroundColor เปนคําสังคื ่ นคาสีพื้นหลังของตัวอักษรในปจจุบัน รูปแบบ

unsigned int getTextBackgroundColor() การคืนคา textBackgroundColor เปนคาสีแสดงอยูในรู  ปของตัวเลข 16 บิต ดูรูปแบบไดจากฟงกชัน่ colorRGB() ตัวอยางที่ 7-13 unsigned int color; color=getTextBackgroundColor(); // นําคาสีพื้นหลังของตัวอักษรเก็บในตัวแปร color

7.2.1.12 getTextSize คืนคาขนาดของตัวอักษรออกมาเปนจํานวนเทาของคาปกติ รูปแบบ

unsigned int getTextSize() การคืนคา textSize เปนคาจํานวนเทาของขนาดตัวอักษร ตัวอยางที่ 7-14 unsigned int textSize; textSize=getTextSize(); // นําคาจํานวนเทาของขนาดของตัวอักษรเก็บในตัวแปร textSize


    POP-XT  133

7.2.1.13 glcdGetMode เปนคําสังคื ่ นคาของโหมดทิศทางการแสดงผลในปจจุบัน รูปแบบ

unsigned int glcdGetMode() การคืนคา mode เปนคาของโหมดทิศทางการแสดงผล เปนตัวเลข 0 ถึง 3 เพื่อแสดงผลในทิศทาง 0 องศา, หมุน 90 องศา, หมุน 180 องศา และหมุน 270 องศาตามลําดับ ตัวอยางที่ 7-15 unsigned int Mode; Mode=glcdGetMode(); // คืนคาทิศทางการแสดงผลของหนาจอ GLCD

7.2.1.14 glcdPixel เปนคําสังพล็ ่ อตจุดบนจอภาพตามพิกัดที่กําหนด โดยอางอิงจอภาพขนาด 128 x 160 พิกเซล รูปแบบ

void glcdPixel(unsigned int x,unsigned int y,unsigned int color) พารามิเตอร x คือคาพิกัดในแนวนอนหรือแกน x มีคาระหวาง 0 ถึง 127 y คือคาพิกัดในแนวตังหรื ้ อแกน y มีคาระหวาง 0 ถึง 159 color คือคาของสีที่ตองการ เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-16 #include <popxt.h> int i; void setup() { for (i=0;i<128;i+=4) { glcdPixel(i,80,GLCD_RED); // พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน x กลางจอ } for (i=0;i<160;i+=4) { glcdPixel(64,i,GLCD_RED); // พล็อตจุดทุกๆ 4 พิกเซลในแนวแกน y กลางจอ } } void loop() {}


134      POP-XT

7.2.1.18 glcdRect เปนฟงกชันลากเส ่ นจากพิกัดทีกํ่ าหนดมายังพิกัดปลายทาง รูปแบบ

void glcdRect(unsigned int x1,unsigned int y1,unsigned int width,unsigned int height,unsigned int color) พารามิเตอร x1 คือ คาตําแหนงเริมต ่ นของรูปสีเหลี ่ ่ยมในแกน x มีคาระหวาง 0 ถึง 127 y1 คือ คาตําแหนงเริมต ่ นของรูปสีเหลี ่ ่ยมในแกน y มีคาระหวาง 0 ถึง 159 width คือ คาความกวางของรูปสีเหลี ่ ่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128 height คือ คาความสูงของรูปสีเหลี ่ ่ยม (แนวตัง)้ มีคาระหวาง 1 ถึง 158 color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-17 #include <popxt.h> void setup() { glcdRect(32,40,64,80,GLCD_RED); // วาดรูปสีเหลี ่ ่ยมเสนสีแดง ขนาด 64 x 80 พิกเซล } void loop() {}


    POP-XT  135

7.2.1.19 glcdFillRect เปนการระบายสีพืนของรู ้ ปสีเหลี ่ ยม ่ โดยกําหนดจุดเริมต ่ นและความกวางยาวของรูปสีเหลี ่ ยม ่ ที่ตองการ ฟงกชันนี ่ ้เปนการสรางรูปสี่เหลี่ยมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชัน่ glcdRect เปนการวาดรูปกรอบสี่เหลี่ยมที่กําหนดสีของเสนกรอบได แตภายในกรอบไมมีสี รูปแบบ

void glcdFillRect(unsigned int x1, unsigned int y1, unsigned int width, unsigned int height,unsigned int color) พารามิเตอร x1 คือ คาตําแหนงเริมต ่ นของรูปสีเหลี ่ ่ยมในแกน x มีคาระหวาง 0 ถึง 127 y1 คือ คาตําแหนงเริมต ่ นของรูปสีเหลี ่ ่ยมในแกน y มีคาระหวาง 0 ถึง 159 width คือ คาความกวางของรูปสีเหลี ่ ่ยม (แนวนอน) มีคาระหวาง 1 ถึง 128 height คือ คาความสูงของรูปสีเหลี ่ ่ยม (แนวตัง)้ มีคาระหวาง 1 ถึง 158 color คือ สีของเสน เปนคาตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-18 #include <popxt.h> void setup() { glcdFillRect(32,40,64,80,GLCD_RED); // สรางภาพสีเหลี ่ ่ยมพื้นสีแดง ขนาด 64 x 80 พิกเซล } void loop() {}


136      POP-XT

7.2.1.20 glcdLine เปนฟงกชันลากเส ่ นจากจุดหนึ่งไปยังอีกจุดหนึ่ง กําหนดเปนพิกัดในแนวแกนนอน (x) และ แกนตัง้ (y) รูปแบบ

void glcdLine(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2,unsigned int

color) พารามิเตอร x1 คือคาตําแหนงเริมต ่ นของเสนบนแกน x มีคาระหวาง 0 ถึง 127 y1 คือคาตําแหนงเริมต ่ นของเสนบนแกน y มีคาระหวาง 0 ถึง 159 x2 คือคาตําแหนงสินสุ ้ ดของเสนบนแกน x มีคาระหวาง 0 ถึง 127 y2 คือคาตําแหนงสินสุ ้ ดของเสนบนแกน y มีคาระหวาง 0 ถึง 159 color คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-19 #include <popxt.h> void setup() { glcdLine(0,0,127,159,GLCD_RED); // ลากเสนสีแดงทแยงมุมจากดานบนซายลงมาดานลางขวา } void loop() {}


    POP-XT  137

7.2.1.21 glcdCircle เปนฟงกชันวาดเส ่ นรูปวงกลมจากการกําหนดจุดกึงกลางของวงกลมและความยาวของรั ่ ศมี รูปแบบ

void glcdCircle(unsgined int x, unsgined int y, unsgined int radius,unsgined int color) พารามิเตอร x คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127 y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159 radius คือ คารัศมีของวงกลม color คือ คาสีของเสน เปนตัวเลข 16 บิต หรือเปนคาตัวแปรที่กําหนดคาไวแลวจากตัวแปร color[] ก็ได ตัวอยางที่ 7-20 #include <popxt.h> void setup() { glcdCircle(32,120,31,GLCD_MAGENTA); // สรางเสนวงกลมสีบานเย็น มีรัศมี 31 พิกเซล } void loop() {}


138      POP-XT

7.2.1.22 glcdFillCircle เปนฟงกชันวาดรู ่ ปวงกลม ทีมี่ สีพืนจากการกํ ้ าหนดจุดศูนยกลางของวงกลมและความยาวของ รัศมี ฟงกชันนี ่ ้เปนการสรางรูปวงกลมที่มีสีพื้นแตไมมีเสนกรอบ ในขณะที่ฟงกชัน่ glcdCircle เปน การวาดรูปวงกลมที่กําหนดสีของเสนรอบวงได แตภายในวงกลมไมมีสี รูปแบบ

void glcdFillCircle(unsigned int x,unsigned int y,unsigned int radius,unsigned int color) พารามิเตอร x คือ พิกัดจุดศูนยกลางของวงกลมบนแกน x มีคาระหวาง 0 ถึง 127 y คือ พิกัดจุดศูนยกลางของวงกลมบนแกน y มีคาระหวาง 0 ถึง 159 radius คือ คารัศมีของวงกลม color คือ คาสีของพื้นวงกลม เปนตัวเลข 16 บิต หรือเปนคาตัวแปรทีกํ่ าหนดคาไวแลวจากตัวแปร color[] ตัวอยางที่ 7-21 #include <popxt.h> void setup() { glcdFillCircle(32,120,31,GLCD_MAGENTA); // สรางรูปวงกลมพื้นสีบานเย็น รัศมี 31 พิกเซล } void loop() {}


    POP-XT  139

7.2.1.23 glcdArc เปนฟงกชันวาดส ่ วนโคงของวงกลม โดยระบุตําแหนงจุดกึงกลาง ่ รัศมี ตําแหนงจุดเริม่ จุดสินสุ ้ ด และสีของเสน รูปแบบ

void glcdArc(unsigned int x,unsigned int y,unsigned int r,int start_angle,int end_angle,uint color) พารามิเตอร x คือตําแหนงจุดกึ่งกลางในแนวแกน x y คือตําแหนงจุดกึ่งกลางในแนวแกน y r คือรัศมีของเสนโคง start_angle คือตําแหนงมุมของจุดเริมต ่ นของวงกลม end_angle คือตําแหนงมุมจุดสิ้นสุดของวงกลม color คือสีของเสนวงกลม ตัวอยางที่ 7-22 #include <popxt.h> void setup() { glcdArc(48,80,16,30,150,GLCD_RED); glcdCircle(48,75,5,GLCD_BLUE); glcdCircle(80,75,5,GLCD_BLUE); glcdArc(80,80,16,30,150,GLCD_RED); glcdFillCircle(64,90,7,GLCD_GREEN); glcdArc(64,100,30,220,320,GLCD_RED); } void loop() {}


140      POP-XT

7.2.2 ฟงกชันเกี ่ ่ยวกับเวลา 7.2.2.1 sleep และ delay เปนฟงกชันหน ่ วงเวลาโดยประมาณภายในโปรแกรมในหนวยมิลลิวินาที รูปแบบ

void sleep(unsigned int ms) void delay(unsigned int ms)

พารามิเตอร ms - กําหนดคาเวลาที่ตองการหนวงในหนวยมิลลิวินาที มีคา 0 ถึง 65,535 ตัวอยางที่ 7-23 sleep(20); // หนวงเวลาประมาณ 20 มิลลิวินาที delay(1000); // หนวงเวลาประมาณ 1 วินาที

7.2.2.2 delay_us เปนฟงกชันหน ่ วงเวลาโดยประมาณภายในโปรแกรมในหนวยไมโครวินาที รูปแบบ

void delay_us(unsigned int us)

พารามิเตอร us - กําหนดคาเวลาที่ตองการหนวงในหนวยไมโครวินาที มีคา 0 ถึง 65,535 ตัวอยางที่ 7-24 delay_us(100); // หนวงเวลาประมาณ 100 ไมโครวินาที


    POP-XT  141

7.2.3 ฟงกชันเกี ่ ่ยวกับเสียง 7.2.3.1 beep เปนฟงกชันกํ ่ าเนิดเสียง “ติด” ๊ มีความถี่ 500Hz นาน 100 มิลลิวินาที เพื่อขับออกลําโพงเปยโซ ของ POP-BOT XT รูปแบบ

void beep()

ตัวอยางที่ 7-25 beep();

// กําเนิดเสียงความถี่ 500Hz นาน 100 มิลลิวินาที

7.2.3.2 sound เปนฟงกชันกํ ่ าเนิดสัญญาณเสียงที่กําหนดความถี่และระยะเวลาในการกําเนิดสัญญาณได รูปแบบ

void sound(int freq,int time)

พารามิเตอร freq - กําหนดความถีสั่ ญญาณเสียง มีคา 0 ถึง 32,767 time - กําหนดคาเวลาในการกําเนิดสัญญาณเสียงในหนวย 1 มิลลิวินาที มีคา 0 ถึง 32,767 ตัวอยางที่ 7-26 sound(1200,500); // กําเนิดสัญญาณเสียงความถี่ 1200Hz นาน 500 มิลลิวินาที


142      POP-XT

7.2.4 ฟงกชันเกี ่ ่ยวกับพอรตอินพุตเอาตพุต 7.2.4.1 in เปนฟงกชันอ ่ านคาสถานะลอจิกของพอรตทีกํ่ าหนด เปนหนึ่งในฟงกชันการอ ่ านและเขียนคา กับพอรตอินพุตเอาตพุตของหุนยนต  POP-BOT XT รูปแบบ

char in(x) พารามิเตอร x - กําหนดขาพอรตที่ตองการอานคา การคืนคา เปน 0 หรือ 1 ตัวอยางที่ 7-27 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ x = in(2); // อานคาดิจิตอลจากพอรตดิจิตอล 2 มาเก็บไวที่ตัวแปร x

7.2.4.2 out เปนฟงกชันกํ ่ าหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนด รูปแบบ out(char _bit,char _dat) พารามิเตอร _bit - กําหนดขาพอรตที่ตองการ ตัวอยางที่ 7-28 out(4,1); // กําหนดใหขาพอรต 4/A6 เปนเอาตพุตดิจิตอลและมีคาเปน “1” out(6,0); // กําหนดใหขาพอรต 6/A7 เปนเอาตพุตดิจิตอลและมีคาเปน “0”


    POP-XT  143

7.2.5 ฟงกชันเกี ่ ่ยวกับการติดตอกับตัวตรวจจับ 7.2.5.1 analog เปนฟงกชันอ ่ านคาขอมูลดิจิตอล ทีได ่ จากการแปลงสัญญาณอะนาลอกของไมโครคอนโทรลเลอร ทีขาพอร ่ ต A0 ถึง A7 ซึงใช ่ เชือมต ่ อกับตัวตรวจจับทีให ่ ผลการทํางานในรูปแรงดันไฟฟาในยาน 0 ถึง +5V รูปแบบ

unsigned int analog(unsigned char channel) พารามิเตอร channel - กําหนดชองอินพุตอะนาลอกที่ตองการ มีคา 0 ถึง 7 ซึงตรงกั ่ บขาพอรต A0 ถึง A7 การคืนคา เป นขอมูลที่ ไดจากการแปลงสัญญาณของโมดูลแปลงสัญญาณอะนาลอกเปนดิจิตอลภายในไมโคร คอนโทรลเลอรจากชองอินพุตที่กําหนด โดยขอมูลมีความละเอียด 10 บิต ดังนันค ้ าที่เปนไปไดคือ 0 ถึง 1,023

7.2.5.2 knob เปนฟงกชันอ ่ านคาขอมูลจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT มีการทํางาน เหมือนกับคําสัง่ analog(8) แตคาทีอ่ านไดมีคาในชวง 80 ถึง 1023 เนื่องจากตัวตานทานปรับคาไดนี้ เชือมต ่ อกับสวิตช OK ที่ติดตังบนแผงวงจร ้ POP-XT ดวย รูปแบบ

unsigned int knob() การคืนคา คาที่อานไดจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT มีคาระหวาง 80 ถึง 1023 ตัวอยางที่ 7-29 int val=0; // กําหนดคาตัวแปรสําหรับเก็บคาอะนาลอก val=knob(); // อานคาจากตัวตานทานปรับคาได KNOB บนแผงวงจร POP-XT เก็บในตัวแปร val


144      POP-XT

7.2.5.3 sw_ok() เปนฟงกชันตรวจสอบสถานะสวิ ่ ตช OK บนแผงวงจร POP-XT โดยใหสถานะ “เปนจริง” เมือ่ มีการกดสวิตชและ “เปนเท็จ” เมื่อไมมีการกดสวิตช รูปแบบ

unsigned char sw_ok() การคืนคา 1 (เปนจริง) เมื่อมีการกดสวิตช 0 (เปนเท็จ) เมือไม ่ มีการกดสวิตช หมายเหตุ การกดสวิตช OK มีผลทําใหคาที่อานไดจาก Knob เปน 0 ดวย ตัวอยางที่ 7-30 if(sw_ok()) { beep(); // เมือกดสวิ ่ ตช OK จะมีเสียง “ติด” ้ ดังออกลําโพง }

7.2.5.4 sw_ok_press() เปนฟงกชันวนตรวจสอบการกดสวิ ่ ตช OK บนแผงวงจร POP-XT ตองรอจนกระทั่งสวิตชถูก ปลอยหลังจากการกดสวิตชจึงจะผานฟงกชันนี ่ ้ไปกระทําคําสังอื ่ ่นๆ ตัวอยางที่ 7-31 ........ sw_ok_press(); ......

// รอจนกระทั่งเกิดกดสวิตช OK


    POP-XT  145

7.2.6 ฟงกชันเกี ่ ่ยวกับการขับมอเตอรไฟตรง 7.2.6.1 motor เปนฟงกชันขั ่ บเคลื่อนมอเตอรไฟตรง รูปแบบ

void motor(char _channel,int _power) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรงของหุนยนต POP-BOT XT มีคา 1 และ 2 _power - กําหนดกําลังขับมอเตอร มีคาในชวง -100 ถึง 100 ถากําหนดคา _power เปนบวก (1 ถึง 100) ทําใหมอเตอรหมุนไปในทิศทางหนึง่ ถากําหนดคา _power เปนลบ (-1 ถึง -100) มอเตอรจะถูกขับใหหมุนไปในทิศทางตรงขาม ถากําหนดคา _power เปน 0 มอเตอรหยุดหมุน ไมแนะนําใหกําหนดคาเปน 0 หากตองการใหมอเตอร หยุดหมุนควรเรียกใชฟงกชัน่ motor_stop ตัวอยางที่ 7-32 motor(1,60); // ขับมอเตอรชอง A ดวยกําลัง 60% ของกําลังสูงสุด motor(1,-60); // ขับมอเตอรชอง A ดวยกําลัง 60% มีทิศทางการหมุนตรงขามกับคําสังก ่ อนหนา ตัวอยางที่ 7-33 motor(2,100); // ขับมอเตอรชอง B ดวยกําลัง 100% อันเปนคากําลังสูงสุด

7.2.6.2 motor_stop เปนฟงกชันหยุ ่ ดขับมอเตอร รูปแบบ

void motor_stop(char _channel) พารามิเตอร _channel - กําหนดชองเอาตพุตมอเตอรไฟตรง มีคา 1, 2 และ ALL โดย ALLเปนการเลือกใหมอเตอรทัง้ 2 ชองหยุดทํางานพรอมกัน ตัวอยางที่ 7-34 motor_stop(1); // หยุดขับมอเตอรชอง A motor_stop(2); // หยุดขับมอเตอรชอง B ตัวอยางที่ 7-35 motor_stop(ALL); // มอเตอรทั้ง 2 ชองหยุดทํางานพรอมกัน


146      POP-XT

7.2.6.3 fd

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา forward เปนฟงกชันกํ ่ าหนดใหหุนยนต  POP-BOT XT เคลื่อนที่ไปขางหนา รูปแบบ

fd(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตังแต ้ 0 ถึง 100 ตัวอยางที่ 7-36 fd(60); // สังให ่ หุนยนตเคลื่อนที่ไปขางหนาดวยความเร็ว 60 เปอรเซ็นต

7.2.6.4 fd2

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา forward2 เปนฟงกชันที ่ กํ่ าหนดใหหุนยนต  POP-BOT XT เคลือนที ่ ไปข ่ างหนาแบบ กําหนดความเร็วมอเตอรแยกอิสระ รูปแบบ

fd2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือ คาความเร็วของมอเตอร A มีคาตังแต ้ 0 ถึง 100% speed2 คือ คาความเร็วของมอเตอร B มีคาตังแต ้ 0 ถึง 100% ตัวอยางที่ 7-37 fd2(30,80); // ควบคุมใหหุนยนต  เคลือนที ่ เป ่ นวงกลม เนืองจากมอเตอร ่ B หมุนเร็วกวามอเตอร A มาก

7.2.6.5 bk

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา backward เปนฟงกชันกํ ่ าหนดใหหุนยนต  POP-BOT XT เคลื่อนที่ถอยหลัง รูปแบบ

bk(unsigned int speed) พารามิเตอร speed คือเปอรเซ็นตความเร็วของมอเตอรมีคาตังแต ้ 0 ถึง 100 ตัวอยางที่ 7-38 bk(90); // กําหนดใหหุนยนต POP-BOT XT เคลื่อนที่ถอยหลังดวยความเร็ว 90 เปอรเซ็นต


    POP-XT  147

7.2.6.6 bk2

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา backward2 เปนฟงกชันกํ ่ าหนดใหหุนยนต  POP-BOT XT เคลื่อนทีถอยหลั ่ งแบบ กําหนดความเร็วมอเตอรอิสระ รูปแบบ

bk2(unsigned int speed1 ,unsigned int speed2) พารามิเตอร speed1 คือเปอรเซ็นตความเร็วของมอเตอร A มีคาตังแต ้ 0 ถึง 100 speed2 คือเปอรเซ็นตความเร็วของมอเตอร B มีคาตังแต ้ 0 ถึง 100 ตัวอยางที่ 7-39 bk2(80,80); // เปนคําสังเคลื ่ ่อนถอยหลังตรงดวยความเร็วเทากัน ซึงทํ ่ างานเหมือนกับคําสัง่ bk()

ทังฟ ้ งกชัน่ fd2() และ bk2() มีไวเพือปรั ่ บแตงการทํางานของมอเตอรไฟตรงทัง้ 2 ตัวของหุนยนต  POP-BOT XT ซึงอาจแตกต ่ างกันดานความเร็วในการหมุน ใหทํางานไดอยางใกลเคียงกันดวยการปรับคา speed1 และ speed2

7.2.6.7 tl และ tr

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา turn left และ turn right หรือเลียวซ ้ ายและเลียวขวานั ้ นเอง ่ โดยการเลียวของฟ ้ งกชัน่ ทังสองนี ้ จะกํ ้ าหนดใหมอเตอรตัวใดตัวหนึงของหุ ่ นยนต  หยุดอยูกั บที่ จุดหมุนของหุนยนต  จะอยูที ล่ อของ มอเตอรทีหยุ ่ ดอยูกั บที่ รูปแบบ

tl(unsigned int speed) และ tr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคาตังแต ้ 0 ถึง 100 เปอรเซ็นต ตัวอยางที่ 7-40 tl(60); // กําหนดใหหุนยนตเลียวซ ้ ายดวยความเร็ว 60 เปอรเซ็นต tr(100); // กําหนดใหหุนยนตเลียวขวาด ้ วยความเร็ว 100 เปอรเซ็นต


148      POP-XT

7.2.6.8 sl และ sr

[ใชกับหุนยนต  POP-BOT XT]

มาจากคําวา spin left และ spin right หรือหมุนตัวทางซายและทางขวา ในฟงกชันนี ่ จะกํ ้ าหนด ใหมอเตอรไฟตรงทังสองตั ้ วของหุนยนต  หมุนในทิศทางตรงกันขาม จุดหมุนของการเลียวจึ ้ งอยูทีกึ่ ่ง กลางของหุนยนต รูปแบบ

sl(unsigned int speed) และ sr(unsigned int speed) พารามิเตอร speed คือ คาความเร็วของมอเตอร มีคา 0 ถึง 100% ตัวอยางที่ 7-41 sl(70); // กําหนดใหหุนยนตเลียวซ ้ ายดวยความเร็ว 70% sr(100); // กําหนดใหหุนยนตเลียวขวาด ้ วยความเร็ว 100%

7.2.6.9 ao มาจากคําวา all motor off เปนฟงกชันหยุ ่ ดการทํางานของมอเตอรทั้งสองตัวพรอมกันเหมือน กับการเรียกใชฟงกชัน่ motor_stop(ALL); รูปแบบ

ao() ตัวอยางที่ 7-42 void setup() { fd(100); sleep(2000); ao(); }

// หุนยนตเคลื่อนที่ไปขางหนาดวยความเร็วสูงสุด // เปนเวลา 2 วินาที // กําหนดใหมอเตอรหยุดทํางาน หุนยนตจะหยุดเคลื่อนที่ทันที

7.2.7 ฟงกชันเกี ่ ่ยวกับการขับเซอรโวมอเตอร ในไฟลไลบรารีนี้มี 1 ฟงกชันคื ่ อ servo เปนฟงกชันกํ ่ าหนดตําแหนงแกนหมุนของเซอรโว มอเตอร ควบคุมได 3 ตัว รูปแบบ

void servo(unsigned char _ch, int _pos)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 1 ถึง 3 _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 และ -1 ถากําหนดเปน -1 หมายถึง ไมใชงานเซอรโวมอเตอรที่ชองนันๆ ้


    POP-XT  149

7.2.8 ฟงกชันเกี ่ ่ยวกับการสื่อสารขอมูลอนุกรม เปนไฟลไลบรารีสนับสนุนชุดคําสังเกี ่ ่ยวกับการรับสงขอมูลผานโมดูลสือสารข ่ อมูลอนุกรม (UART)

7.2.8.1 การเชื่อมตอทางฮารดแวร เมื่อตองการใชงานชอง UART0 ใหตอสายจากจุดตอพอรต USB บนแผงวงจร POP-XT (เปนจุดตอเดียวกับทีใช ่ ในการอัปโหลด) เขากับพอรต USB ของคอมพิวเตอร เมื่อตองการใชงานชอง UART1 ตอสายสัญญาณเขากับจุดตอ RXD (ขาพอรต 2) และ TXD (ขาพอรต 3)

7.2.8.2 uart เปนฟงกชันส ่ งขอมูลสายอักขระออกจากโมดูล UART0 มีอัตราบอดเริมต ่ นที่ 4,800 บิตตอวินาที รูปแบบ

void uart(char *p,...)

พารามิเตอร p - รับรหัสของกลุมขอความที่ตองการสงออกจากภาคสงของโมดูล UART0 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพื่อใชรวมในการแสดงผลไดดังนี้ การทํางาน รหัสบังคับ %c หรือ %C แสดงผลตัวอักษร 1 ตัว %d หรือ %D แสดงผลตัวเลขฐานสิบชวงตังแต ้ -32,768 ถึง +32,767 %l หรือ %L แสดงผลตัวเลขฐานสิบชวงตังแต ้ -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F แสดงผลขอมูลแบบจํานวนจริง(แสดงทศนิยม 3 หลัก) \r กําหนดใหขอความชิดไปทางดานซายของบรรทัด \n กําหนดใหขอความขึนบรรทั ้ ดใหม

7.2.8.3 uart_set_baud เปนฟงกชันกํ ่ าหนดอัตราบอดในการสื่อสารของโมดูล UART0 กับคอมพิวเตอร รูปแบบ

void uart_set_baud(unsigned int baud)

พารามิเตอร baud - อัตราบอดในการสือสารของโมดู ่ ล UART0 กับคอมพิวเตอร มีคา 2400 ถึง 115,200 ตัวอยางที่ 7-43 uart_set_baud(4800); // กําหนดอัตราบอดในการสือสารข ่ อมูลเปน 4,800 บิตตอวินาที


150      POP-XT

7.2.8.4 uart_available เปนฟงกชันตรวจสอบการรั ่ บขอมูลเขามาของโมดูล UART0 เมือติ ่ ดตอกับคอมพิวเตอร รูปแบบ

unsigned char uart_available(void)

การคืนคา - เปน “0” เมือยั ่ งไมมีขอมูลเขามา - มากกวา 0 เมือมี ่ ขอมูลเขามา โดยมีคาเทากับจํานวนของอักขระที่ไดรับ ตัวอยางที่ 7-44 char x =uart_available(); // ตรวจสอบวา มีขอมูลเขามาทางภาครับของโมดูล UART0 หรือไม ถา x มีคามากกวา 0 แสดงวา // มีขอมูลเขามายังภาครับแลว ควรอานขอมูลออกดวยฟงกชัน่ uart_getkey ในลําดับถัดไปทันที

7.2.8.5 uart_getkey เปนฟงกชันอ ่ านขอมูลจากบัฟเฟอรตัวรับของโมดูล UART0 รูปแบบ

char uart_getkey(void) การคืนคา - เปน “0” เมือไม ่ มีการรับอักขระใดๆ เขามายังวงจรภาครับของโมดูล UART - เปนคาของอักขระที่รับไดในรูปแบบของรหัสแอสกี้ ตัวอยางที่ 7-45 #include <popxt.h> // เรียกใชฟงกชันพื ่ ้นฐาน void setup() { glcdClear(); // ลางจอภาพ setTextSize(2); // กําหนดขนาดตัวอักษรเปน 2 เทา glcdMode(1); // เลือกแสดงผลในแนวนอน } void loop() // ลูปการทํางานหลัก { if(uart_available()) // ตรวจสอบวามีขอมูลเขามาหรือไม { if(uart_getkey()=='a') // ตรวจจับการกดคีย a วา ถูกกดหรือไม { glcd(1,0,"Key a Active!"); // แสดงขอความเพื่อตอบสนองตอการตรวจพบวามีการคีย a sleep(1000); // หนวงเวลาแสดงขอความประมาณ 1 วินาที } else { glcdClear; // เคลียรขอความที่จอแสดงผล } } }


    POP-XT  151

เมือรั ่ นโปรแกรมนี้ ตองเปดหนาตาง Serial Monitor ของ Arduino1.0 แลวเลือกการปดทายขอความเปนแบบ No line ending อัตราบอด 115200 และคลิกเพื่อปลดเครื่องหมายใดๆ ที่ชอง Autoscroll จากนันพิ ้ มพ a ที่ชองสง ขอมูล แลวคลิกปุม Send เพื่อสงขอมูลจากคอมพิวเตอรไปยังแผงวงจรควบคุม POP-XT ผานทางพอรต USB ทีถู่ กกําหนด ใหทํางานเปนพอรตอนุกรมเสมือนหรือ USB Serial port

เมือแผงวงจร ่ POP-XT ไดรับตัวอักษร a ก็จะแสดงขอความ Key a Active!บนจอแสดงผล ่ ยกใชฟงกชัน่ uart เพือส ่ งขอมูลออกทางโมดูลพอรตอนุกรมหรือ UART และ uart_getkey เพือ่ หมายเหตุ เมือเรี ตรวจจับอักขระใดๆ นัน้ อัตราบอดจะถูกกําหนดเปน 115,200 บิตตอวินาที ขอมูล 8 บิต และไมมีการตรวจสอบพาริตีโดย ้ อัตโนมัติ และเปนคาตังต ้ น เพือลดความซั ่ บซอนในการเขียนโปรแกรมลง หากตองการเปลียนอั ่ ตราบอดตองใช uart_set_baud อยางไรก็ตาม ตองคํานึงดวยวา เมืออั ่ ตราบอดสูงขึนอาจส ้ งผลกระทบตอความถูกตองในการสือสารข ่ อมูล


152      POP-XT

7.2.8.6 uart1 เปนฟงกชันส ่ งขอมูลออกทางภาคสงของโมดูล UART1 มีอัตราบอดเริมต ่ นที่ 9,600 บิตตอวินาที รูปแบบ

void uart1(char *p,...)

พารามิเตอร p - รับรหัสของกลุมขอความที่ตองการสงออกจากภาคสงของโมดูล UART1 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพื่อใชรวมในการแสดงผลเหมือนกับฟงกชัน่ uart

7.2.8.7 uart1_set_baud เปนฟงกชันกํ ่ าหนดอัตราบอดในการสือสารของโมดู ่ ล UART1 กับคอมพิวเตอร รูปแบบ

void uart1_set_baud(unsigned int baud)

พารามิเตอร baud - กําหนดคาอัตราบอดในการสือสารของโมดู ่ ล UART1 มีคา 2400 ถึง 115,200 ตัวอยางที่ 7-46 uart1_set_baud(19200); // กําหนดอัตราบอดในการสือสารเป ่ น 19,200 บิตตอวินาที

7.2.8.8 uart1_available เปนฟงกชันตรวจสอบการรั ่ บขอมูลเขามาของโมดูล UART1 เมื่อติดตอกับคอมพิวเตอร รูปแบบ

unsigned char uart1_available(void)

การคืนคา - เปน 0 เมือไม ่ มีขอมูลเขามา - มากกวา 0 โดยมีคาเทากับจํานวนของอักขระที่ไดรับ ตัวอยางที่ 7-47 char x =uart1_available(); // ตรวจสอบวามีขอมูลเขามาทางภาครับของโมดูล UART1 หรือไม // ถา x มีคามากกวา 0 แสดงวามีขอมูลเขามาแลว ควรอานออกไปดวยฟงกชัน่ uart1_getkey ทันที

7.2.8.9 uart1_getkey เปนฟงกชันอ ่ านขอมูลจากบัฟเฟอรตัวรับของโมดูล UART1 รูปแบบ

char uart1_getkey(void) การคืนคา - เปน 0 เมือยั ่ งไมมีการรับอักขระใดๆ - เปนคาของอักขระที่รับไดในรูปแบบของรหัสแอสกี้


    POP-XT  153

7.3 ไลบรารีเพิมเติ ่ มสําหรับใชงาน GP2D120 โมดูลวัดระยะทางดวยแสงอินฟราเรด นอกจากไลบรารี popbot.h ซึงเป ่ นไลบรารีหลักของการเขียนโปรแกรมเพือควบคุ ่ มการทํางานของ แผงวงจร POP-XT และหุนยนต  POP-BOT XT ยังมีไฟลไลบรารีสําหรับติดตอกับตัวตรวจจับหนาทีพิ่ เศษ อืนๆ ่ ทีมิ่ ไดรวมไวในไฟลไลบรารี popxt.h ดังนันเมื ้ อต ่ องการใชงานจึงตองผนวกเพิมเติ ่ มไวในตอนตน ของโปรแกรม สําหรับตัวตรวจจับแบบพิเศษทีมี่ ในชุดหุนยนต  POP-BOT XT (รุน Standard kit) คือ GP2D120 อันเปนโมดูลตรวจจับและวัดระยะทางดวยแสงอินฟราเรด ไฟลไลบรารีสําหรับใชงาน GP2D120 คือ gp2d120_lib.h ไลบรารี gp2d120_lib.h มีฟงกชันสนั ่ บสนุนการทํางานกับ GP2D120 โมดูลตรวจจับและวัด ระยะทางดวยแสงอินฟราเรด กอนเรียกใชงานฟงกชันภายในไลบรารี ่ นี้จะตองผนวกไฟลไลบรารีไว ในตอนตนของโปรแกรมดวยคําสัง่ #include <gp2d120_lib.h>

เนื่องจากโมดูล GP2D120 ใหผลการทํางานเปนแรงดันไฟตรงที่สัมพันธกับระยะทางที่ตรวจ วัดได ดังนันในการใช ้ งานผูพั ฒนาจึงตองตอโมดูลตรวจจับนีเข ้ ากับอินพุตสัญญาณอะนาลอกใดๆ ของ POP-BOT XT นั่นคือ พอรต A0 ถึง A7

7.3.1 getdist เปนฟงกชันอ ่ านคาระยะทางที่วัดไดจากโมดูลวัดระยะทางดวยแสงอินฟราเรด GP2D120 รูปแบบ

unsigned int getdist(char adc_ch) พารามิเตอร adc_ch ทําหนาที่รับการกําหนดชองอะนาลอกที่ใชงานตังแต ้ 0 ถึง 7 การคืนคา ระยะทางในหนวยเซนติเมตร ตัวอยางที่ 7-48 dist = getdist(3); // อานคาระยะทางจาก GP2D120 ที่ตอกับพอรต A3


154      POP-XT


    POP-XT  155



   หลังจากการแนะนําขันตอนแนวทางการพั ้ ฒนาโปรแกรมภาษา C/C++ ดวยซอฟตแวร Arduino, ฟงกชันพื ่ นฐานต ้ างๆ และไฟลไลบรารี popxt.h ไปแลวตังแต ้ บทที่ 2 ถึง 7 เพือให ่ การเรียนรูเป  นไปอยาง ตอเนือง ่ ในบทนีจึ้ งนําเสนอตัวอยางการทดสอบการทํางานในสวนตางๆ ทีสํ่ าคัญของแผงวงจร POP-XT เพือเป ่ นแนวทางในการตอยอดสูการพั  ฒนาโปรแกรมเพือสร ่ างโครงงานและหุนยนต  อัตโนมัติอยางเต็ม รูปแบบตอไป ตัวอยางทดสอบการทํางานของแผงวงจร POP-XT กับอุปกรณภายนอก มีทั้งสิ้น 8 ตัวอยาง ประกอบดวย 1. ขับอุปกรณเอาตพุตอยางงาย 2. ใชงานสวิตช 3. อานคาสัญญาณอะนาลอกมาแสดงผลที่แผงวงจร POP-XT 4. ควบคุมการเปดปด LED ดวยแผงวงจรตรวจจับแสง 5. เครื่องวัดอุณหภูมิระบบตัวเลขอยางงาย 6. ตรวจจับคาวมตางสีของพืนที ้ ่ 7. ควบคุมมอเตอรไฟตรง 8. ขับเซอรโวมอเตอร ขั้นตอนการพัฒนาโปรแกรมในแตละกิจกรรมจะเหมือนกัน นั่นคือ เปดซอฟตแวร Arduino ทําการเขียนโปรแกรม คอมไพล และอัปโหลดลงบนแผงวงจร POP-XT จากนั้นทดสอบการทํางาน

้ เป ่ ดสวิตชจายไฟแกแผงวงจร POP-XT และตอ สิงสํ ่ าคัญทีต่ องเนนยํ้าคือ ทุกครังที สายเขากับพอรต USB ตองรอใหตัวควบคุมพรอมทํางานกอน ซึงใช ่ เวลาประมาณ 3 ถึง 5 วินาทีหลังจากเปดไฟเลียงหรื ้ อหลังจากการกดสวิตช RESET หากมีการอัปโหลดกอนที่แผงวงจร POP-XT จะพรอมทํางาน อาจทําใหเกิดความผิดพลาดใน การเชือมต ่ อ หรือโคดที่อัปโหลดลงไปไมทํางานตามที่ควรจะเปน แตจะไมสงผลจนทําใหแผงวงจร เกิดความเสียหาย สิ่งทีเกิ ่ ดขึ้นมีเพียงแผงวงจรไมทํางานหรือทํางานไมถูกตองเทานั้น


156      POP-XT

   ในตัวอยางนีนํ้ าแผงวงจร ZX-LED อันเปนแผงวงจร LED แสดงผลแบบเดียวที ่ จะติ ่ ดสวางเมื่อ ไดรับลอจิก “1” และดับลงเมื่อไดรับลอจิก “0” มาตอกับแผงวงจร POP-XT เพื่อทดลองใชงาน (8.1.1) ตอแผงวงจร ZX-LED ชุดที่ 1 เขาทีพอร ่ ต 4 และตอแผงวงจร ZX-LED ชุดที่ 2 เขาทีพอร ่ ต6 ของแผงวงจร POP-XT ดังรูปที่ 8-1 (8.1.2) เขียนโปรแกรมที่ 8-1 บันทึกไฟลชื่อ popXT_LED (8.1.3) เปดสวิตชจายไฟแกแผงวงจร POP-XT จากนั้นทําการคอมไพลและอัปโหลดโปรแกรม (8.1.4) รันโปรแกรม สังเกตการทํางานของแผงวงจร ZX-LED เมื่อรันโปรแกรม LED บนแผงวงจร ZX-LED ทังสองชุ ้ ดติดและดับสลับกันไปอยางตอเนื่อง LED

LED OBEC-LED

OBEC-LED S

S

+

+ S

+

+ S

100 F

A TM e g a 3 2 U 4

220 F

TB 6 6 1 2

100

รูปที่ 8-1 แสดงการตออุปกรณเพือทดสอบการขั ่ บอุปกรณเอาตพุตอยางงายของแผงวงจร POP-XT


    POP-XT  157

#include <popxt.h> void setup() {} void loop() { out(4,1); out(6,0); sleep(400); out(4,0); out(6,1); sleep(400); }

// ผนวกไฟลไลบรารีหลัก

// ทําให LED ที่ตออยูกั บพอรต 4 ติดสวาง // ทําให LED ที่ตออยูกั บพอรต 6 ดับ // ทําให LED ที่ตออยูกั บพอรต 4 ดับ // ทําให LED ที่ตออยูกั บพอรต 6 ติดสวาง

โปรแกรมที่ 8-1 ไฟล popXT_LED.ino สําหรับทดสอบการขับอุปกรณเอาตพุตอยางงาย

  บนแผงวงจร POP-XT มีลําโพงเปยโซติดตั้งมาพรอมใชงาน ตอบสนองความถี่เสียงในชวง ความถี่ประมาณ 300 ถึง 3,000Hz ในการเขียนโปรแกรมเพื่อขับเสียงออกลําโพงเปยโซ ทําไดโดยใช คําสัง่ beep() และ sound() (8.1.5) เขียนโปรแกรมที่ 8-2 บันทึกไฟลชื่อ popXT_Beep (8.1.6) เปดสวิตชจายไฟแกแผงวงจร POP-XT จากนั้นทําการคอมไพลและอัปโหลดโปรแกรม (8.1.7) รันโปรแกรม จะไดยินเสียง “ติด” ้ ดังเปนจังหวะในทุกๆ 1 วินาทีจากลําโพงของแผงวงจร POP-XT #include <popxt.h> void setup() {} void loop() { beep(); sleep(1000); }

// ผนวกไฟลไลบรารีหลัก

// ขับเสียง “ติด” ้ ออกลําโพง

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


158      POP-XT

#include <popxt.h> void setup() {} void loop() { sound(500,500); sound(2500,500); }

// ผนวกไฟลไลบรารีหลัก

// ขับเสียงความถี่ 500Hz นาน 0.5 วินาที ออกลําโพง // ขับเสียงความถี่ 2500Hz นาน 0.5 วินาที ออกลําโพง

โปรแกรมที่ 8-3 ไฟล popXT_SoudTest.ino สําหรับทดสอบการขับเสียงออกลําโพงของแผงวงจร POPXT แบบกําหนดความถีและเวลาได ่ (8.1.8) เขียนโปรแกรมที่ 8-3 บันทึกไฟลชื่อ popXT_SoundTest แลวอัปโหลดโปรแกรม เพื่อทดสอบ การทํางานอีกครั้ง จะไดยินสัญญาณเสียง 2 ความถี่ดังสลับกันออกจากลําโพงของแผงวงจร POP-XT


    POP-XT  159

     ในตัวอยางนีเป ้ นการตรวจสอบการกดสวิตช OK บนแผงวงจร POP-XT เพื่อนํามาใชควบคุม การทํางานของแผงวงจร ZX-LED (8.2.1) ตอแผงวงจร ZX-LED เขากับแผงวงจร POP-XT ที่พอรต 4 ตามรูปที่ 8-2 (8.2.2) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_OKtest พิมพโปรแกรมที่ 8-4 จากนั้นคอมไพล และอัปโหลดโปรแกรม (8.2.3) รันโปรแกรม สังเกตการทํางานของแผงวงจร ZX-LED และทดลองกดสวิตช OK บนแผงวงจร POP-XT สังเกตการทํางานของ ZX-LED ทังในจั ้ งหวะทีมี่ การกดและไมกดสวิตช OK เมื่อรันโปรแกรม LED บนแผงวงจร ZX-LED ติดสวาง เมื่อกดสวิตช OK ทําให LED ดับลง นาน 2 วินาที จากนั้นจะกลับมาติดใหม หากกดสวิตช OK อีก LED ก็จะดับอีก 2 วินาที แลวกลับ มาติดสวางใหม เปนเชนนีไปตลอดการทํ ้ างาน จนกวาจะมีการรีเซตระบบ หรือปดเปดจายไฟเลี้ยง ใหม LED 100 F

S

+

+ S A TM e g a 3 2 U 4

220 F

TB 6 6 1 2

100

  

รูปที่ 8-2 การตออุปกรณเพื่อทดสอบการอานคาสวิตช OK บนแผงวงจร POP-XT


160      POP-XT

#include <popxt.h> void setup() { setTextSize(2); glcd(1,1,"Press OK"); sw_OK_press(); glcdClear(); } void loop() { if (sw_OK()) { out(4,0); delay(2000); } out(4,1); }

// ผนวกไฟลไลบรารีหลัก // กําหนดขนาดตัวอักษร 2 เทา // แสดงขอความออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา

// ตรวจสอบการกดสวิตช OK // ดับ LED ที่จุดตอพอรต 4 // นาน 2 วินาที // ขับ LED ที่จุดตอพอรต 4 ใหติดสวาง

โปรแกรมที่ L8-4 ไฟล popXT_OKtest.ino โปรแกรมภาษา C/C++ สําหรับทดลองควบคุม LED ดวยสวิตช

   ในตัวอยางนีเป ้ นการตรวจสอบอานคาสวิตชทีต่ อกับพอรตของแผงวงจร POP-XT เพื่อนํามา ควบคุมการนับจํานวน โดยแสดงผลการนับบนจอแสดงผลของแผงวงจร POP-XT (8.2.4) ตอแผงวงจร ZX-SWITCH01 กับจุดตอพอรต 18 (หรือ A0) ของแผงวงจร POP-XT ดังรูปที่ 8-3 (8.2.5) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_SwitchTest พิมพโปรแกรมที่ 8-5 จากนั้นทําการ คอมไพลและอัปโหลดโปรแกรม (8.2.6) รันโปรแกรม ทดลองกดสวิตชบนแผงวงจร ZX-SWITCH01 แลวสังเกตผลของการทํางานที่ จอแสดงผลของแผงวงจร POP-XT ทีจอแสดงผลของแผงวงจร ่ POP-XT แสดงขอความ Start ใหกดสวิตช OK (8.2.7) กดสวิตช OK 1 ครั้ง แลวปลอย ทีจอแสดงผลของแผงวงจร ่ POP-XT แสดงขอความ COUNTER ใหเริ่มการนับดวยการกด สวิตชทีต่ อกับพอรต 18 (หรือ A0)


    POP-XT  161

 

ZX-Switch01 D

100 F

+ S +

S

Counter A TM e g a 3 2 U 4

27 220 F

TB 6 6 1 2

100

 

รูปที่ 8-3 การตออุปกรณเพือทดสอบการอ ่ านคาสวิตชจากจุดตอพอรตของแผงวงจร POP-XT (8.2.8) กดสวิตชทีแผงวงจร ่ ZX-SWITCH01 ทีต่ อกับพอรต 18 สังเกตการทํางานทีจอแสดงผลของ ่ แผงวงจร POP-XT ทีจอแสดงผลจะเริ ่ ่มตนแสดงคาการนับจํานวนการกดสวิตช โดยเริ่มจาก 0 คาจะเปลี่ยนทัน ทีที่ มี่ การกดสวิตชทีพอร ่ ต 18 และจะทําการับคาตอไปได ก็ตอเมื่อมีการปลอยสวิตช แลวกดใหม หากสวิตชยังถูกกดคาง คาการนับจะไมมีการเปลี่ยนแปลง จนกวาสวิตชจะถูกปลอย และกดเขามา ใหม จากทังสองปฏิ ้ บัติการผูพั ฒนาสามารถนําไปประยุกตใชงานสวิตชหลายๆ ตัวพรอมกันและมี ความสามารถทีแตกต ่ างกันไปแลวแตจุดประสงค เชน สวิตชบางตัวสามารถกําหนดใหเมื่อกดสวิตช คางแลวสามารถเพิมค ่ าหรือลดคาขอมูลทีกํ่ าหนดได ในขณะทีสวิ ่ ตชบางตัวอาจกําหนดใหไมสามารถ กดคางได เปนตน


162      POP-XT

#include <popxt.h> int i=0; void setup() { setTextSize(2); glcd(1,3,"Start"); sw_ok_press(); glcdClear(); glcd(1,2,"COUNTER"); setTextSize(3); glcd(3,3,"0"); } void loop() { if (in(18)==0) { i=i++; glcd(3,3,"%d",i); while(in(18)==0) delay(5); } } คําอธิบายโปรแกรม

// ผนวกไฟลไลบรารีหลัก // ประกาศตัวแปรเก็บคาการนับ // กําหนดขนาดตัวอักษร 2 เทา // แสดงขอความ Start ออกหนาจอแสดงผล // วนรอจนกระทั่งกดสวิตช OK // เคลียรหนาจอแสดงผล กําหนดพื้นหลังเปนสีดํา // แสดงขอความ COUNTER เพื่อแจงชือการทดลอง ่ // กําหนดขนาดตัวอักษร 3 เทา // กําหนดคาเริมต ่ นเปน 0

// ตรวจสอบการกดสวิตชที่พอรต 18 // เพิ่มคาตัวนับ // แสดงคาการนับ // ตรวจสอบการปลอยสวิตช

โปรแกรมนีใช ้ ฟงกชัน่ in ในการตรวจจับและอานคาจากการกดสวิตชทีพอร ่ ต 18 โดยตรงสอบวาทีพอร ่ ต 16 เปนลอจิก “0” หรือไม ถาใชแสดงวา มีการกดสวิตชเปดขึน้ จากนั้นจะทําการเพิมค ่ าตัวนับ แลวนํามาแสดง ผลที่จอแสดงผลกราฟก LCD ของแผงวงจร POP-XT คําสัง่ while(in(18)==0) และ dealy(5); ทําหนาที่ลดสัญญาณรบกวนที่เกิดจากการกดสวิตช โดยจะ ตรวจสอบวา มีการปลอยสวิตชแลวหรือไม ถาไม ก็จะวนทํางานอยูที่คําสังนั ่ ้น ชวยใหไมเกิดการนับคาโดยไม ตั้งใจขึน้ ดังนั้นการกดสวิตชที่พอรต 18 ในแตละครังจึ ้ งมีความแนนอนสูง

โปรแกรมที่ 8-5 ไฟล popXT_SwitchTest.ino โปรแกรมภาษา C/C++ สําหรับทดลองใชงานสวิตชในการ สรางเครืองนั ่ บจํานวนอยางงาย


    POP-XT  163

     เปนตัวอยางการเขียนโปรแกรมเพื่ออานคาตําแหนงของการปรับหมุนแกนของตัวตานทาน ปรับคาไดของแผงวงจร ZX-POTH ทีต่ อกับพอรตอินพุต A0 ถึง A7 ของแผงวงจร POP-XT แลวนําคา ทีอ่ านไดมาแสดงทีจอแสดงผลของ ่ POP-XT โดยผลลัพธมีคาในชวง 0 ถึง 1,023 (8.3.1) ตอแผงวงจร ZX-POTH เขากับแผงวงจร POP-XT ที่พอรตอินพุต A0 ตามรูปที่ 8-4 (8.3.2) สรางไฟลสเก็ตชขึนใหม ้ ตั้งชื่อเปน popXT_AnalogTest พิมพโปรแกรมที่ 8-6

A

ZX-POTH POTENTIOMETER

100 F

Analog

0 ATMega32U4

Volts

0.000

220 F

100 TB6612

รูปที่ 8-4 แสดงการตออุปกรณเพือทดสอบการอ ่ านคาจากอินพุตอะนาลอกอันเปนพืนฐานของการอ ้ านคา จากตัวตรวจจับสัญญาณไฟฟา


164      POP-XT

#include <popxt.h> int val; float volts; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(0,2,"Analog"); val = analog(0); setTextSize(3); glcd(1,2,"%d ",val); setTextSize(2); glcd(5,3,"Volts"); volts = (float(val)*5)/1024; setTextSize(3); glcd(4,1,"%f",volts); setTextSize(2); }

// ผนวกไฟลไลบรารีหลัก

// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

// แสดงขอความที่จอแสดงผล // อานคาของสัญญาณชอง A0 มาเก็บไวที่ตัวแปร val // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความ Volts // แปลงขอมูลเปนหนวยแรงดัน // เลือกขนาดตัวอักษรใหญเปน 3 เทาจากขนาดปกติ // แสดงคาแรงดันความละเอียดทศนิยม 3 ตําแหนง // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

โปรแกรมที่ 8-6 ไฟล popXT_AnalogTest.ino โปรแกรมภาษา C/C++ สําหรับอานคาสัญญาณอะนาลอก จากพอรตอินพุตอะนาลอกของแผงวงจร POP-XT (8.3.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.3.4) รันโปรแกรม ทดลองหมุนแกนของตัวตานทานบนแผงวงจรตัวตานทานปรับคาได ZX-POTH สังเกตผลการทํางานผานทางจอแสดงผลของแผงวงจร POP-XT ทีจอแสดงผลกราฟ ่ ก LCD ชวงบนแสดงคาขอมูลที่ไดจากการแปลงสัญญาณที่จุดตอ A0 ซึ่ง ตอกับแผงวงจรตัวตานทานปรับคาได ZX-POTH โดยมีคาระหวาง 0 ถึง 1023 (เทียบกับแรงดัน 0 ถึง +5V) ถาปรับแกนหมุนมายังตําแหนงกึงกลาง ่ คาทีอ่ านไดเปน 512 ทีช่ วงลางของจอแสดงผลกราฟก LCD สีแสดงคาแรงดันไฟตรงในหนวย โวลต (Volts) ทีได ่ จากการปรับคาของตัวตานทานบนแผงวงจรตัวตานทานปรับคาได ZX-POTH โดยมีคาระหวาง 0.000 ถึง 4.995 (เทียบกับขอมูล 0 ถึง 1023)


    POP-XT  165

      ในตัวอยางนีเป ้ นการนําขอมูลทีได ่ จากการแปลงสัญญาณไฟฟาซึงมาจากการปรั ่ บคาของ ZXPOTH) แผงวงจรตัวตานทานปรับคาไดมากําหนดเงื่อนไขในการเปด/ปด LED เพื่อใหเห็นแนวทาง ในการประยุกตใชงานเบื้องตน (8.3.5) เชือมต ่ อแผงวงจร ZX-LED เขากับจุดตอพอรต 4 และตอเอาตพุตปรับแรงดันเพิมเมื ่ อหมุ ่ นตาม ตามเข็มนาฬิกาของแผงวงจร ZX-POTH กับจุดตอพอรต A0 ของแผงวงจร POP-XT ตามรูปที่ 8-5 (8.3.6) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_AnalogSwitch พิมพโปรแกรมที่ 8-7

LED

A

 

ZX-POTH POTENTIOMETER

100 F

Analog control Switch

S

+

+ S

A TM e g a 3 2 U 4

108 TB 6 6 1 2

220 F

100

รูปที่ 8-5 การตออุปกรณเพือทดลองควบคุ ่ มการเปดปด LED ดวยแผงวงจรตัวตานทานปรับคาได (8.3.7) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.3.8) รันโปรแกรม ทดลองหมุนแกนของตัวตานทานบนแผงวงจรตัวตานทานปรับคาได ZX-POTH สังเกตผลการทํางานผานทางจอแสดงผลของแผงวงจร POP-XT และ LED บนแผงวงจร ZX-LED เมื่อปรับคาทีแกนของตั ่ วตานทาน สังเกตผลลัพธทีจอแสดงผล ่ มันจะแสดงคา 0 ถึง 1023 เมื่อปรับคาทีแผงวงจร ่ ZX-POTH ถามีคานอยกวา 512 ตัวเลขจะเปนสีขาว และ LED ดับ เมื่อใดปรับคาจนไดมากกวา 512 คาตัวเลขทีจอแสดงผลจะเปลี ่ ่ยนเปนสีแดง และ LED ทีต่ อกับ พอรต 4 ติดสวาง


166      POP-XT

#include <popxt.h> int val=0; void setup() { glcdClear(); setTextSize(2); glcd(1,2,"Analog"); glcd(2,2,"control"); glcd(3,2,"Switch"); } void loop() { val = analog(0); if(val>512) { setTextSize(4); setTextColor(GLCD_RED); glcd(3,1,"%d ",val); out(4,1); } else { setTextSize(4); setTextColor(GLCD_WHITE); glcd(3,1,"%d ",val); out(4,0); } setTextSize(2); } คําอธิบายโปรแกรม

// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรเก็บคาทีได ่ จากการแปลงสัญญาณแลว

// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความที่จอแสดงผล

// อานคาของสัญญาณชอง A0 มาเก็บไวที่ตัวแปร val // ตรวจสอบวาคาที่อานไดมากกวา 512 หรือไม // เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // เปลียนเปนสีแดง // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // ถาคา val มากกวา 512 ทําการขับ LED ที่พอรต 4

// เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // แสดงตัวอักษรสีขาว // แสดงคาที่อานไดจากจุดตอ A0 ที่หนาจอแสดงผล // ถาคา val นอยกวา 512 ทําการปด LED ที่พอรต 4 // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

สัญญาณไฟฟาจากแผงวงจรตัวตานทานปรับคาไดจะถูกอานดวยคําสัง่ analog() เก็บไวที่ตัวแปร val เพื่อนําไปตรวจสอบและสงไปแสดงผลยังจอแสดงผลกราฟก LCD สี หากคาที่ได นอยกวา 512 ตัวเลขที่แสดง ผลยังเปนสีขาว และสงขอมูล “0” ไปยังพอรต 4 ทําให LED ที่ตออยูไมทํางาน เมื่อคาของ val มากกวา 512 ตัวเลขแสดงผลจะเปลียนเป ่ นสีแดง และมีการสงขอมูล “1” ไปยังพอรต 4 ทําให LED ที่ตออยูติดสวาง

โปรแกรมที่ 8-7 ไฟล popXT_AnalogSwitch.ino โปรแกรมภาษา C/C++ สําหรับอานคาสัญญาณไฟฟาเพือนํ ่ ามาควบคุมอุปกรณเอาตพุต


    POP-XT  167

   ในตัวอยางนีเป ้ นการตอยอดจากตัวอยางที่ 8-2 หัวขอที่ 2 โดยเปลียนจากการปรั ่ บคาของ ZXPOTH แผงวงจรตัวตานทานปรับคาไดเปนการตรวจจับแสงโดยใชแผงวงจรตัวตานทานแปรคาตาม แสดงหรือ ZX-LDR โดยยังคงใชเงื่อนไขในการเปด/ปด LED ในแบบเดียวกัน หรือเอาตพุตแรง (8.4.1) เชื่อมตอแผงวงจร ZX-LED เขากับจุดตอพอรต 4 และตอเอาตพุต ดันแปรคาตามแสงของแผงวงจร ZX-LDR กับจุดตอพอรต A2 ของแผงวงจร POP-XT ตามรูปที่ 8-6 +

(8.4.2) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_NightSwitch พิมพโปรแกรมที่ 8-8 (8.4.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT A

 

ZX-LDR Light

+

+

LED 100 F

Night Switch S

+

+ S A TM e g a 3 2 U 4

98

 

TB 6 6 1 2

220 F

100

รูปที่ 8-6 การตออุปกรณเพือทดสอบการทํ ่ างานของแผงวงจรตรวจจับแสงเพือใช ่ กําหนดเงือนไขในการ ่ เปด-ปดอุปกรณเอาตพุต


168      POP-XT

#include <ipst.h> int val=0; void setup() { glcdClear(); setTextSize(2); setTextColor(GLCD_YELLOW); glcd(1,2,"Night"); glcd(2,2,"Switch"); } void loop() { val = analog(2); if(val<100) { setTextSize(4); setTextColor(GLCD_WHITE); glcd(3,1,"%d ",val); out(4,1); } else { setTextSize(4); setTextColor(GLCD_BLUE); glcd(3,1,"%d ",val); out(4,0); } setTextSize(2); } คําอธิบายโปรแกรม

// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรสําหรับเก็บคาที่ไดจากการแปลงสัญญาณ

// เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ // แสดงขอความที่จอแสดงผล

// อานคาของสัญญาณชอง A2 มาเก็บไวที่ตัวแปร val // ตรวจสอบวาคาที่อานไดมากกวา 512 หรือไม // เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // เปลียนเปนสีขาว // แสดงคาที่อานไดจากจุดตอ A2 ที่หนาจอแสดงผล // ถาคา val นอยกวา 100 ทําการขับ LED ที่พอรต 4

// เลือกขนาดตัวอักษรใหญเปน 4 เทาจากขนาดปกติ // แสดงตัวอักษรสีนําเงิ ้ น // แสดงคาที่อานไดจากจุดตอ A2 ที่หนาจอแสดงผล // ถาคา val มากกวา 100 ทําการปด LED ที่พอรต 4 // เลือกขนาดตัวอักษรใหญเปน 2 เทาจากขนาดปกติ

ในโปรแกรมนีจะตรวจสอบค ้ าจากแผงวงจรตรวจจับแสงทีอ่ านดวยคําสัง่ analog(2); เก็บไวทีตั่ วแปร val หากคาที่ไดมากกวา 100 ตัวเลขที่แสดงผลเปนสีนํ้าเงิน และสงขอมูล “0” ไปยังพอรต 4 ทําให LED ที่ตออยูไม ทํางาน เมื่อคาของ val นอยกวา 100 ตัวเลขแสดงผลจะเปลียนเป ่ นสีขาว และมีการสงขอมูล “1” ไปยังพอรต 4 ทําให LED ที่ตออยูติดสวาง

โปรแกรมที่ 8-8 ไฟล popXT_NightSwitch.pde โปรแกรมภาษา C/C++ สําหรับควบคุมการเปดปดอุปกรณ เอาตพุตดวยแสง


    POP-XT  169

(8.4.4) รันโปรแกรม ทดลองใชมือหรือแผนกระดาษทึบแสงบังแสงทีส่ องมายังตัวตานทานแปรคาตาม แสงหรือ LDR บนแผงวงจร ZX-LDR สังเกตการทํางานของจอแสดงผลบนแผงวงจร POP-XT และ LED บนแผงวงจร ZX-LED หาก ZX-LDR ไดรับแสงมาก สังเกตไดจากคาทีแสดงบนจอแสดงผล ่ นันคื ่ อ มีคามากกวา 100 (ตัวเลขเปนสีนําเงิ ้ น) จะสมมติสถานการณวา เปนตอนกลางวัน จึงไมมีเปดไฟสองสวาง ซึ่งใน ทีนี่ ใช ้ LED บนแผงวงจร ZX-LED ทําหนาทีแทน ่ แตถัาหาก ZX-LDR ไดรับแสงลดลงจนตํากว ่ า 100 จะถือวา เปนตอนกลางคืน ระบบจะทํางาน สังให ่ LED ทีพอร ่ ต 17 ติดสวาง จนกวา ZX-LDR จะไดรับแสงมากเพียงพอ ซึงอาจตี ่ ความวา เปนตอน เชาแลว วงจรขับ LED หยุดทํางาน ทําให LED ทีพอร ่ ต 4 ดับ ดังนัน้ จึงอาจเรียกการทํางานของปฏิบัติการนีว้ า สวิตชสนธยา (Twilight Switch) หรือสวิตช กลางคืน (Night Switch) ก็ได


170      POP-XT

    ในตัวอยางนีเป ้ นการนําไอซีวัดอุณหภูมิเบอร MCP9701 ทีให ่ ผลการทํางานเปนแรงดันไฟฟา มาเชื่อมตอกับแผงวงจร POP-XT เพื่อสรางเปนเครื่องวัดอุณหภูมิระบบตัวเลขอยางงาย

รูจั กกับ MCP9701 ไอซีวัดอุณหภูมิ เปนอุปกรณตรวจจับและวัดอุณหภูมิทีให ่ ผลการทํางานเปนแรงดันไฟฟาแบบเชิงเสน รับรูการ  เปลียนแปลงของอุ ่ ณหภูมิภายในเวลาไมถึง 2 วินาที เชือมต ่ อกับอินพุตอะนาลอก A0 ถึง A7 ของแผง วงจร POP-XT ได คุณสมบัติทางเทคนิคของ MCP9701 ทีควรทราบ ่  เปนไอซีวัดอุณหภูมิในกลุมเทอร  มิสเตอรแบบแอกตีฟที่ใหผลการทํางานแบบเชิงเสน  ยานวัด -40 ถึง +125 องศาเซลเซียส  ผลการวัดอางอิงกับหนวยขององศาเซลเซียสโดยตรง ่ 2 องศาเซลเซียส  ความผิดพลาดเฉลีย  ยานไฟเลี้ยง +3.1 ถึง +5.5V กินกระแสไฟฟาเพียง 6uA ใชแบตเตอรี่เปนแหลงจายไฟได  คาแรงดันเอาตพุต 500mV (ที่ 0๐C) ถึง 2.9375V (ที่ 125๐)  ค าแรงดั นเอาต พุ ตต อการเปลี่ยนแปลงอุณหภูมิ 19.5mV/๐C ใช งานกับวงจรแปลง สัญญาณอะนาลอกเปนดิจิตอลความละเอียดตั้งแต 8 บิตได โดยมีความคลาดเคลือนตํ ่ ่า

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


    POP-XT  171

 







    

สวนประกอบของสายวัดอุณหภูมิ MCP9701

    

  



  

รูปที่ 8-8 แนวทางการใชงานไอซีวัดอุณหภูมิ MCP9701 ทีมาในรู ่ ปของสายวัดอุณหภูมิ


172      POP-XT

#include <popxt.h> int val,i; float Temp; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(1,2,"Digital"); glcd(2,2,"THERMO"); glcd(3,3,"METER"); val=0; for (i=0;i<20;i++) { val = val+analog(4); } val = val/20; Temp = (float(val)*0.25) - 20.51 ; setTextSize(3); setTextColor(GLCD_YELLOW); glcd(3,1,"%f",Temp); setTextColor(GLCD_WHITE); setTextSize(2); glcd(6,2,"Celsius"); delay(500);

// ผนวกไฟลไลบรารีหลัก // กําหนดตัวแปรเก็บคาที่อานไดจาก MCP9701 // ประกาศตัวแปรคาอุณหภูมืในแบบทศนิยม // เคลียรจอแสดงผล // เลือกขนาดตัวอักษร 2 เทา

// แสดงขอความเริมต ่ น

// กําหนดรอบการอานคาจาก MCP9701 รวม 20 ครั้ง // อานคาจากอินพุต A4 // หาคาเฉลียจากการอ ่ านคา 20 ครั้ง // แปลงคาเปนอุณหภูมิในหนวยองศาเซลเซียส // เปลียนขนาดตั ่ วอักษรเปน 3 เทา // เปลียนสีตัวอักษรเปนสีเหลือง // แสดงคาอุณหภูมิดวยความละเอียดทศนิยม 3 ตําแหนง // เปลียนสีตัวอักษรเปนสีขาว // เปลียนขนาดตั ่ วอักษรเปน 2 เทา // แสดงหนวยองศาเซลเซียส // หนวงเวลากอนเริมต ่ นการอานคาในรอบใหม

} คําอธิบายโปรแกรม ในโปรแกรมนี้หัวใจสําคัญคือ การคํานวณเพื่อเปลี่ยนขอมูลดิจิตอลทีได ่ จากการแปลงแรงดันเอาตพุต ของไอซี MCP9701 เปนคาอุณหภูมิในหนวยองศาเซลเซียส กระบวนการจะเริมจากการอ ่ านและแปลงคาของ แรงดันไฟตรงที่จุดตอ A4 ซึ่งไดมาจากการทํางานของไอซี MCP9701 มาเก็บไวในตัวแปร val จากนันนํ ้ าขอมูล ที่ไดมาคํานวณดวยสูตร Temp = (val x 0.25) - 20.51 จากนั้นนําคาอุณหภูมิไดมาแสดงผลดวยความละเอียด ทศนิยม 3 ตําแหนง

โปรแกรมที่ 8-9 : ไฟล popXT_TempMeter.ino โปรแกรมภาษา C/C++ สําหรับพัฒนาแผงวงจร POP-XT เปนเครืองวั ่ ดอุณหภูมิระบบตัวเลขอยางงาย


    POP-XT  173

100 F

Digital THERMO METER A TM e g a 3 2 U 4

26.740 Celsius 220 F

TB 6 6 1 2

100

 

รูปที่ 8-9 การตออุปกรณเพื่อใชงานแผงวงจร POP-XT กับไอซีวัดอุณหภูมิ MCP9701 (8.5.1) เชื่อมตอไอซี MCP9701 เขากับจุดตอพอรต A4 ของแผงวงจร POP-XT ตามรูปที่ 8-9 (8.5.2) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_TempMeter พิมพโปรแกรมที่ 8-9 (8.5.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.5.4) รันโปรแกรม ทดลองใชมือจับทีตั่ วไอซีวัดอุณหภูมิ หรือนําหัววัดอุณหภูมิไปแชในนําแข็ ้ ง สังเกต การทํางานทีจอแสดงผลบนแผงวงจร ่ POP-XT แผงวงจร POP-XT แสดงขอความแจงหนาทีการทํ ่ างาน และแสดงคาอุณหภูมิในหนวยองศา เซลเซียส (Celsius) ดวยความละเอียดทศนิยม 3 ตําแหนง โดยที่คาของอุณหภูมิจะแสดงดวยตัว เลขสีเหลืองขนาดใหญ (3x)


174      POP-XT

  

ZX-03R

ในตัวอยางนีเป ้ นการนําแผงวงจรตรวจจับแสงสะทอน ZX-03R มาเชื่อมตอกับแผงวงจร POPXT เพื่อตรวจสอบวา สีของพื้นผิวอยางงาย

100 F

Color Reading A TM e g a 3 2 U 4

497 220 F

TB 6 6 1 2

 

100

รูปที่ 8-10 การตออุปกรณเพือตรวจสอบสี ่ ของพื้นผิวอยางงาย #include <popxt.h> int reflect = 0; void setup() { glcdClear(); setTextSize(2); } void loop() { glcd(1,2,"Color"); glcd(2,2,"Reading"); reflect=analog(0); setTextSize(3); setTextColor(GLCD_YELLOW); glcd(3,1, "%d", reflect); setTextColor(GLCD_WHITE); setTextSize(2); sleep(200); }

// ผนวกไฟลไลบรารหลัก // เคลียรจอแสดงผล // เลือกขนาดตัวอักษร 2 เทา // แสดงขอความเริมต ่ น // อานคาการตรวจจับแสงสะทอนจากชอง A0 // เปลียนขนาดตั ่ วอักษรเปน 3 เทา // เปลียนสีตัวอักษรเปนสีเหลือง // แสดงคาแสงสะทอน // เปลียนสีตัวอักษรเปนสีขาว

โปรแกรมที่ 8-10 ไฟล popXT_ColorReading.ino โปรแกรมภาษา C/C++สําหรับอานคาแสงสะทอนจาก พืนผิ ้ วทีมี่ สีแตกตางกันของแผงวงจร ZX-03R มาแสดงผลทีแผงวงจร ่ POP-XT


    POP-XT  175

(8.6.1) เชื่อมตอแผงวงจร ZX-03R เขากับจุดตอพอรต A0 ของแผงวงจร POP-XT ตามรูปที่ 8-10 (8.6.2) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_ColorTest พิมพโปรแกรมที่ 8-10 (8.6.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.6.4) เตรียมแผนพลาสติกทึบแสงแบบผิวดานหรือกระดาษสีขนาดใหญกวาแผงวงจร ZX-03R หลายๆ สี เชน แดง, เหลือง, เขียว, ขาว และดํา (8.6.5) นําแผงวงจร ZX-03R วางเหนือแผนพลาสติกหรือกระดาษสีประมาณ 5 มิลลิมเตร อานคาที่ ไดบนจอแสดงผลของแผงวงจร POP-XT แลวบันทึกคาแสงสะทอนที่อานไดของพื้นผิวแตละสี









    

 859  560  250  420  125

จากผลการทดสอบแสดงใหเห็นวา ดวยการทํางานรวมกันระหวางแผงวงจร POP-XT และแผง วงจรตรวจจับแสงสะทอน ZX-03 สามารถตรวจสอบสีของพื้นผิวเรียบดานไดพอสมควร แบงกลุมของ  สีออกไดประมาณ 5 เฉดสี นอกจากนัน้ อาจใชแผงวงจรตรวจจับแสงสะทอน ZX-03R ในการตรวจจับแสงสวางไดดวย โดยหงายตัวตรวจจับขึ้นเพื่อรับแสงสวางจากภายนอก เนื่องจากภายใน ZX-03R เลือกใชโฟโต ทรานซิสเตอรแบบตอบสนองตอแสงขาวมาเปนตัวตรวจจับแสง โดยคาทีอ่ านไดเมือรั ่ บแสงจากหลอด ฟลูออเรสเซนตในหองทํางานปกติคือ 500 ถึง 600 เมือเอามื ่ อบังแสง คาทีได ่ จะลดลงเหลือประมาณ 200 ถึง 300


176      POP-XT

   ตัวอยางนีเป ้ นการเขียนโปรแกรมเพือควบคุ ่ มใหแผงวงจร POP-XT ขับมอเตอรไฟตรงอยางงาย (8.7.1) เชื่อมตอมอเตอรไฟตรง 2 ตัวเขากับเอาตพุตมอเตอรไฟตรงชอง A และ B ของแผงวงจร POPXT ดังรูปที่ 8-11 100 F

A TM e g a 3 2 U 4



220 F

TB 6 6 1 2

100

 รูปที่ 8-11 การตออุปกรณเพือทดสอบการขั ่ บมอเตอรไฟตรงพืนฐานของแผงวงจร ้ POP-XT #include <popxt.h> void setup() {} void loop() { motor(1,30); motor(2,30); sleep(3000); motor(1,-30); motor(2,-30); sleep(3000); }

// ผนวกไฟลไลบรารีหลัก

// ขับมอเตอรชอง 1 ดวยกําลัง 70% ของกําลังสูงสุด // ขับมอเตอรชอง 2 ดวยกําลัง 70% ของกําลังสูงสุด // หนวงเวลา 3 วินาทีกอนกลับทิศทางการหมุนของมอเตอร // ขับมอเตอรชอง 1 ดวยกําลัง 70% มีทิศทางการหมุนตรงขามกับคากําลังที่เปนบวก // ขับมอเตอรชอง 2 ดวยกําลัง 70% มีทิศทางการหมุนตรงขามกับคากําลังที่เปนบวก // หนวงเวลา 3 วินาทีกอนกลับทิศทางการหมุนของมอเตอร

โปรแกรมที่8-11 ไฟล popXT_MotorTest.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับมอเตอรไฟตรง ของแผงวงจรหลัก POP-XT


    POP-XT  177

(8.7.2) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_MotorTest พิมพโปรแกรมที่ 8-11 (8.7.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.7.4) รันโปรแกรม มอเตอรไฟตรงที่ชอง 1 และ 2 หมุน และมีการหมุนกลับทิศทางในทุกๆ 3 วินาที

  ตัวอยางนีเป ้ นการเขียนโปรแกรมเพื่อควบคุมมอเตอรไฟตรง 2 ตัว ใหหมุนเปนเวลา 3 วินาที หลังจากนันหยุ ้ ดขับเปนเวลา 3 วินาทีสลับกันอยางตอเนื่อง (8.7.5) ยังคงใชการตออุปกรณตามรูปที่ 8-11 ในการทดสอบการทํางาน (8.7.6) สรางไฟลสเก็ตชขึนใหม ้ ตังชื ้ อเป ่ น popXT_MotorTest02 พิมพโปรแกรมที่ 8-12 (8.7.7) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.7.8) รันโปรแกรม มอเตอรไฟตรงทีต่ อกับชอง 1 และ 2 ของแผงวงจร POP-XT ถูกขับหมุนเปนเวลา 3 วินาที แลวหยุด 3 วินาที จากนันหมุ ้ นอีก 3 วินาที สลับกันอยางตอเนื่อง #include <popxt.h> void setup() {} void loop() { motor(1,30); motor(2,30); sleep(3000); motor_stop(1); motor_stop(2); sleep(3000); }

// ผนวกไฟลไลบรารีหลัก

// ขับมอเตอรชอง 1 ดวยกําลัง 30% ของกําลังสูงสุด // ขับมอเตอรชอง 2 ดวยกําลัง 30% ของกําลังสูงสุด // หนวงเวลา 3 วินาที // หยุดขับมอเตอรชอง 1 // หยุดขับมอเตอรชอง 2 // หนวงเวลา 3 วินาที

โปรแกรมที่ 8-12 ไฟล popXT_MotorTest02.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับและ หยุดขับมอเตอรไฟตรงของแผงวงจร POP-XT


178      POP-XT

    ตัวอยางนีเป ้ นการเขียนโปรแกรมควบคุมแกนหมุนของเซอรโวมอเตอรโดยใชแผงวงจร POPXT โดยตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร SV1 ใหหมุนไปยังตําแหนง 60 องศา แลวหยุด เพือล็ ่ อกตําแหนงไวเปนเวลา 5 วินาที จากนันเปลี ้ ยนมายั ่ งตําแหนง 120 องศา แลวหยุดล็อกตําแหนง ไว 5 วินาทีเชนกัน จากนั้นหมุนแกนกลับไปยังตําแหนง 60 องศาอีกครั้ง สลับตําแหนงไปมาเชนนี้ อยางตอเนื่อง (8.8.1) ตอเซอรโวมอเตอรเขากับเอาตพุตเซอรโวมอเตอรชอง 1 หรือ SV1 ดังรูปที่ 8-12 (8.8.2) สรางไฟลสเก็ตชขึนใหม ้ ตั้งชื่อเปน popXT_Servo01 พิมพโปรแกรมที่ 8-13 (8.8.3) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.8.4) รันโปรแกรม แกนหมุนของเซอรโวมอเตอรจะหมุนไปมาระหวางตําแหนง 60 และ 120 องศาทุกๆ 5 วินาที 100 F

A TM e g a 3 2 U 4

220 F

STANDARD SERVO MOTOR TB 6 6 1 2

100

รูปที่ 8-12 การตออุปกรณเพือทดสอบการขั ่ บและควบคุมเซอรโวมอเตอรของแผงวงจร POP-XT


    POP-XT  179

#include <popxt.h> void setup() {} void loop() { servo(1,60); sleep(1000); servo(1,120); sleep(1000); }

// ผนวกไฟลไลบรารีหลัก

// ขับเซอรโวมอเตอรชอง 1 ไปยังตําแหนง 60 องศา // หนวงเวลา 1 วินาที // ขับเซอรโวมอเตอรชอง 1 ไปยังตําแหนง 120 องศา // หนวงเวลา 1 วินาที

โปรแกรมที่ 8-13 ไฟล popXT_ServoTest01.ino โปรแกรมภาษา C/C++ สําหรับทดสอบการขับเซอรโว มอเตอรของแผงวงจร POP-XT

      ตัวอยางนีเป ้ นการเขียนโปรแกรมเพือปรั ่ บตําแหนงแกนหมุนของเซอรโวมอเตอร ดวยการปรับ ปุม KNOB บนแผงวงจร POP-XT (8.8.5) ยังคงใชการตออุปกรณตามรูปที่ 8-12 ในการทดสอบ (8.8.6) สรางไฟลสเก็ตชขึนใหม ้ ตั้งชื่อเปน popXT_ServoTest02 พิมพโปรแกรมที่ 8-14 #include <popxt.h> int x; void setup() { glcdMode(1); setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcdClear(); } void loop() { x=map(knob(),80,1023,0,180); glcd(2,1,"Servo = %d ",x); servo(1,x); }

// ผนวกไฟลไลบรารีหลัก

// เลือกการแสดงผลโหมด 1 แสดงผลในแนวนอน // กําหนดขนาดตัวอักษรเปน 2 เทา // แสดงขอความเริ่มตน // ตรวจสอบการกดสวิตช OK

// อานคาจาก KNOB แปลงเปนคา 0 ถึง 180 เก็บในตัวแปร x // สงคาตําแหนงของเซอรโวมอเตอรไปแสดงที่หนาจอแสดงผล // สงคาตําแหนงไปยังเซอรโวมอเตอรชอง SV1

โปรแกรมที่ 8-14 ไฟล popXT_ServoTest02.ino โปรแกรมภาษา C/C++ ของ Arduino1.0 สําหรับควบคุม เซอรโวมอเตอรดวยการปรับคาแรงดันอะนาลอกปอนใหแกแผงวงจร POP-XT


180      POP-XT

(8.8.6) คอมไพลและอัปโหลดโปรแกรมไปยังแผงวงจร POP-XT (8.8.7) รันโปรแกรม กดสวิตช OK เพื่อเริ่มการทํางาน ตามดวยปรับปุม KNOB บนแผงวงจร POPXT สังเกตการทํางานของเซอรโวมอเตอร เมื่อหมุนปรับคาของปุม KNOB ทีจอแสดงผลจะแสดงค ่ าของ KNOB และเซอรโวมอเตอร ถูกขับใหแกนหมุนไปมาตามทิศทางของการหมุนปุม KNOB F 0 2 2 F 0 0 1

0 0 1

Servo

=

116

ATMega32U4

STANDARD SERVO MOTOR

TB6612

 

POP-XT Educationkit manual