Issuu on Google+

      1

   ArduinoPOP-BOT

POP-BOT Arduino compatible robot kit activity manual


    2  

        

สงวนลิขสิทธิ์ตาม พ.ร.บ. ลิขสิทธิ์ พ.ศ. 2537 หามการลอกเลียนไมวาสวนหนึงส ่ วนใดของหนังสือเลมนี้ นอกจากจะไดรับอนุญาต

ใครควรใชหนังสือเลมนี้ 1. นักเรียน นิสิต นักศึกษา และบุคคลทัวไปที ่ มี่ ความสนใจในการนําไมโครคอนโทรลเลอรไปประยุกตใชในการทดลอง เกียวกั ่ บการทํางานของระบบอัตโนมัติ หรือสนใจในการเรียนรูและทดลองไมโครคอนโทรลเลอร  ในแนวทางใหมทีใช ่ กิจกรรมหุนยนต  อัตโนมัติเปนสือ่ 2. สถาบันการศึกษา โรงเรียน วิทยาลัย มหาวิทยาลัย ทีมี่ การเปดการเรียนการสอนวิชาอิเล็กทรอนิกสหรือภาควิชา วิศวกรรมอิเล็กทรอนิกสและคอมพิวเตอร 3. คณาจารยทีมี่ ความตองการศึกษา และเตรียมการเรียนการสอนวิชาไมโครคอนโทรลเลอร รวมถึงวิทยาศาสตร ประยุกตทีต่ องการบูรณาการความรูทางอิเล็กทรอนิกส-ไมโครคอนโทรลเลอร-การเขียนโปรแกรมคอมพิวเตอรการทดลองทางวิทยาศาสตร ในระดับมัธยมศึกษา อาชีวศึกษา และปริญญาตรี

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

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


      3



       โครงการชุดหุนยนต  POP-BOT เปนโครงการทีต่ อยอดจาก POP-Builder kit ชุดเรียนรูไมโคร คอนโทรลเลอรอยางงายดวยซอฟตแวร Arduino เพือนํ ่ าเสนอแนวทางและกิจกรรมในการประยุกตใช ไมโครคอนโทรลเลอรและซอฟตแวรโปรแกรมภาษา C/C++ ระบบเปดหรือโอเพนซอรส มาสรางเปน หุนยนต  อัตโนมัติขนาดเล็กหรือ Programmable Mobile Robot โดยหุนยนต  ทีใช ่ ในโครงการนีเป ้ นชุด หุนยนต  อัตโนมัติทีขั่ บเคลือนด ่ วยมอเตอรไฟตรงทีมี่ เฟองทดในตัว วัตถุประสงคในการดําเนินการโครงการนี้คือ 1.เพือให ่ นําเสนอแนวทางในการนําโมดูลไมโครคอนโทรลเลอร POP-168 หรือ POP-MCU ไปใชในกิจกรรมทีมี่ ความหลากหลาย โดยเฉพาะอยางยิงกั ่ บการจัดกิจกรรมเกียวกั ่ บการควบคุมหุนยนต  อัตโนมัติ 2.เพื่อเปนตัวอยางหรือทางเลือกในการขยายโอกาส สําหรับการพัฒนาสื่อการเรียน การสอนวิทยาศาสตรและเทคโนโลยีทีใช ่ หุนยนต  เปนสื่อสําหรับครู-อาจารย 3. เพื่อเตรียมการสําหรับการฝกอบรมเพื่อการประลองความรูความสามารถในการ เขียนโปรแกรมควบคุมหุนยนตอัตโนมัติ สําหรับการจัดสือหรื ่ อคูมื อประกอบในการเรียนรูและดํ  าเนินกิจกรรมนัน้ ไดจัดทําหนังสือสราง และพัฒนาโปรแกรมควบคุมหุนยนต  อัตโนมัติดวยโปรแกรมภาษา C/C++ กับ Arduino และPOP-BOT เพือใช ่ ประกอบในการเรียนรูและทดลอง  พรอมกันนีสามารถใช ้ หนังสือเรียนรูระบบควบคุ  มอยางงาย ดวยโปรแกรมภาษา C กับ Arduino และบอรดไมโครคอนโทรลเลอร POP-MCU ประกอบในการเรียน รูและทํ  าความเขาใจรวมดวยได ชุด POP-BOT robot kit และ POP-BOT Lite robot kit เปนสือการเรี ่ ยนรูทางเลือกสําหรับครู-อาจารย, นักเรียน และนักพัฒนาระบบสมองกลฝงตัวอิสระทีมี่ ความประสงคในการตอยอดหรือประยุกตใชโมดูลไมโครคอนโทรลเลอร POP-168 และซอฟตแวร Arduino ในกิจกรรมดานหุนยนตอัตโนมัติทีควบคุ ่ มดวยโปรแกรมภาษา C/C++ ดําเนิน การโดย บริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด การจัดหาสื่อการเรียนรูนีเป ้ นไปในรูปแบบสมัครใจ การบริการ เกียวกั ่ บการจัดหาและซอมแซมอุปกรณอยูภายใต  ความรับผิดชอบของบริษัท อินโนเวตีฟ เอ็กเพอริเมนต จํากัด


    4  

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


      5

 บทที่ 1 แนะนําอุปกรณทางฮารดแวรของ POP-BOT.............................................................7 บทที่ 2 ลงมือสรางหุนยนต  POP-BOT.................................................................................... 21 บทที่ 3 แนะนําโปรแกรม Arduino IDE..................................................................................27 บทที่ 4 โครงสรางโปรแกรมของ Arduino..................................................................................31 บทที่ 5 การพัฒนาโปรแกรมสําหรับหุนยนต  POP-BOT ดวย Arduino................................59 บทที่ 6 ไลบรารีสําหรับการพัฒนาโปรแกรมของหุนยนต  POP-BOT.....................................75 บทที่ 7 ขับเคลือนหุ ่ นยนต  POP-BOT......................................................................................87 บทที่ 8 หุนยนต  POP-BOT กับโมดูล SLCD16x2..................................................................95 บทที่ 9 ���ุนยนต  POP-BOT กับภาระกิจตรวจจับเสน..........................................................101 บทที่ 10 หุนยนต  POP-BOT กับการตรวจจับวัตถุแบบไมสัมผัส...........................................109 บทที่ 11 หุนยนต  POP-BOT กับการขับเซอรโวมอเตอร.........................................................117 บทที่ 12 หุนยนต  POP-BOT คนหาวัตถุ...................................................................................129


    6  


     7



   POP-BOT เปนชุดอุปกรณสําหรับสรางและพัฒนาโปรแกรมเพื่อควบคุมหุนยนตอัตโนมัติขนาดเล็กทีขั่ บ เคลือนด ่ วยมอเตอรไฟตรงและชุดเฟองขับ มีดวยกัน 2 รุนคือ 1. POP-BOT Lite kit ในชุดนี้ประกอบดวย แผงวงจรควบคุมหลักซึงมี ่ ไมโครคอนโทรลเลอร POP-MCU เปนอุปกรณหลัก, โมดูลแสดงผล SLCD16x2, แผงวงจรอุปกรณตรวจจับสัญญาณหรือเซนเซอร (sensor) พื้นฐาน, มอเตอรไฟตรงพรอมชุดเฟองขับหรือ DC motor gearbox และชินส ้ วนทางกลทีจํ่ าเปน ทําใหนําชุด POP-BOT Lite นีไปใช ้ ในการเรียนรูและเขียนโปรแกรมเพื่อควบคุมหุนยนตอัตโนมัติดวยภาษา C/C++ ในเบื้องตนได ภายใตงบ ประมาณที่เหมาะสม 2. POP-BOT Standard kit ในชุดประกอบดวยอุปกรณหลักเหมือนกับชุด POP-BOT Lite มีการเพิ่มตัว ตรวจจับระยะทางดวยแสงอินฟราเรด, เซอรโวมอเตอร และชิ้นตอพลาสติกเพิ่มเติม เพื่อใหนําหุนยนต POP-BOT นีมาใช ้ ในการเรียนรู, ทดลองและพัฒนาหุนยนตอัตโนมัติแบบโปรแกรมได ทั้งยังรองรับกิจกรรมการแขงขันได เปนอยางดี

1.1 รายการอุปกรณที่ใชในหุนยนต  POP-BOT 1. โมดูลไมโครคอนโทรลเลอร POP-MCU 2. แผงวงจรควบคุมหุนยนต RBX-168 ที่ติดตั้งกะบะถาน AA แบบ 4 กอน 3. แผงวงจรแสดงผลโมดูล LCD ขนาด 16 ตัวอักษร 2 บรรทัดแบบอนุกรม มีไฟสองหลัง 4. แผงวงจรสวิตช 2 ชุด 5. แผงวงจรตรวจจับแสงสะทอนอินฟราเรด ZX-03 จํานวน 2 ชุด 6. มอเตอรไฟตรงพรอมชุดเฟองขับรุน BO2 อัตราทด 48:1 พรอมสายเชื่อมตอแบบ IDC จํานวน 2 ตัว 7. ลอพลาสติกกลมสําหรับชุดเฟองขับมอเตอรและยาง จํานวน 2 ชุด 8. แผนกริดขนาด 80x60 เซนติเมตรและ 80x80 เซนติเมตร จํานวน 2 ชุด 9. แผนฐานกลมพรอมลออิสระ 1 แผน 10. ชิ้นตอ/แทงตอพลาสติก * 11. ชุดฉากโลหะ * 12. ชุดนอตและสกรู 13. แผนทดสอบการเคลือนที ่ ตามเส ่ นของหุนยนต 14. สายเชื่อมตอพอรตพอรต USB สําหรับดาวนโหลดโปรแกรมและสื่อสารขอมูล 15. ซีดีรอมบรรจุซอฟตแวรและตัวอยางโปรแกรมการทดลอง


     8

16. หนังสือการสรางและทดลองเขียนโปรแกรมควบคุมหุนยนตอัตโนมัติดวยภาษา C (เลมนี)้ 17. โมดูลตรวจจับและวัดระยะทางแบบอินฟราเรด GP2D120** 18. เซอรโวมอเตอร** * จัดใหมีจํานวนเพิ่มขึนในชุ ้ ด POP-BOT Standard kit ** เปนอุปกรณที่มีเพิ่มเติมในชุด POP-BOT Standard kit

1.2 คุณสมบัติของชุดอุปกรณในสวนไมโครคอนโทรลเลอรหลัก 1.2.1 โมดูลไมโครคอนโทรลเลอร POP-MCU POP-MCU เปนโมดูลไมโครคอนโทรลเลอรสําเร็จรูปที่ ใชไมโครคอนโทรลเลอรตระกูล AVR เบอร ATmega168 ของ Atmel (www.atmel.com) โมดูล POP-MCU มีการจัดเรียงขาสัญญาณ 24 ขาเชนเดียวกับโมดูลไมโคร คอนโทรลเลอร BASIC Stamp (www.parallax.com) โดยมีการรวมสวนเชือมต ่ อพอรตอนุกรม RS-232 เพือใช ่ ในการ สือสารข ่ อมูลและดาวนโหลดโปรแกรม จึงทําใหการใชงานงายและสะดวกมาก รวมถึง POP-MCU ไดเลือกใชฮารดแวร ที่ตรงกับฮารดแวรของโครงการไมโครคอนโทรลเลอรระบบเปด (โอเพนซอรส : open source) ที่ชื่อ Arduino (www.arduino.cc/en) ในรุน Arduino Mini จึงทําใหสามารถนําชุดพัฒนาของ Arduino มาใชงานได ภายในชุดพัฒนา ของ Arduino จะมีไลบรารีฟงกชันภาษาซีสําหรับติดตอกับฮารดแวรจํานวนมากไวให ทําใหสามารถเขียนโปรแกรม สังงานอุ ่ ปกรณตางๆ ไดงาย โดยไมจําเปนตองศึกษาลงไปในรายละเอียดของไมโครคอนโทรลเลอรมากนัก แตถาหาก มีความตองการพัฒนาในระดับที่สูงขึ้น ก็สามารถนํา POP-MCU ไปใชรวมกับเครื่องมือพัฒนาโปรแกรมรวมถึง คอมไพเลอรอืนๆ ่ ไดเชนกัน วงจรของโมดูล POP-MCU แสดงในรูปที่ 1-1 มีคุณสมบัติโดยสรุปดังนี้  ใชไมโครคอนโทรลเลอรขนาด 8 บิตเบอร ATmega168 ของ Atmel  ภายในมีโมดูลแปลงสัญญาณอะนาลอกเปนดิจิตอลความละเอียด 10 บิต  มีหนวยความจําโปรแกรมแบบแฟลช 16 กิโลไบต โปรแกรมใหมได 10,000 ครั้ง  มีหนวยความจําขอมูลอีอีพรอม 512 ไบต  หนวยความจําขอมูลแรม 1 กิโลไบต  สัญญาณนาฬิกา 16MHz จากคริสตอล  ขาใชงานหลัก 16 ขา(จัดขาแบบไมโครคอนโทรลเลอรเบสิกแสตมป, i-Stamp และ i-Stamp2P24 ทําใหสามารถนํา POP-MCU ใสแทนที่และใชงานไดโดยไมตองดัดแปลง  มีไฟแสดงสถานะไฟเลียงและไฟทดสอบเอาต ้ พุตในตัว  มีสวิตชกดติดปลอยดับบนโมดูลสําหรับเขาสูโหมดโปรแกรมหรือใชงานทั่วไป  มีวงจรเชื่อมตอพอรตอนุกรม RS-232 ในตัวแยกอิสระ  สามารถดาวนโหลดโปรแกรมไดทังแบบบู ้ ตโหลดเดอรทีบรรจุ ่ มาในโมดูลผานพอรตอนุกรม หรือ ใชชุดโปรแกรมแบบ ISP มาตรฐาน 10 ขา ได (แนะนําเครื่องโปรแกรม PX-400 หรือ PX-4000 ของ inex)  ใชไฟเลียงในย ้ าน +3.3 ถึง +5V กระแส 50mA


     9

R1 4k7

R2 R3 10k 4k7

PD2

PD3

PIN13 PIN24

R5

+5V

R6 CR1 16MHz

GND

PB2

PB5 AVCC AN6 AREF

+5V

MOSI

IC1 ATMega168-20AU (TQFP32)

AGND AN7 AN0 AN1

C1 0.1F

AN2

C2 0.1F

PD5

RST

C4 0.1F

+5V PB7 PB6 VCC GND

+5V

2 4 C6 0.1F

C3 0.1F

VCC GND PD4 PD3

5

16

R9 68

R10 150

1

IC2 MAX3232

3

C5 0.1F

7

10 9

PD2

GND

R5-R8 150 x4

R8

PD7 PD6

SCK

PD0 PD1

GND

PB3 PB2 PB1 PB0

MISO

AN3 AN4 AN5 RST

GND

PB4

R7

Vcc

PD4

PD5

PD6

PD7

PB0

PB1

R4 4k7

K1 AVR In-System Programming Connector

+5V

RST

LED2 Green

+5V +5V LED1 Blue

+5V

+5V

GND

+5V

8 15

6 C7 0.1F

SW1 BL Bootloader Mode switch

AN7

AN6

AN5

AN4

AN3

AN2

AN1

AN0

GND

TX

PIN12 RX

PIN1

+5Vdc RESET

โหมดโปรแกรม : ติดคาง แจงการเขาสูโหมดโปรแกรม โหมดรัน : LED แสดงสถานะลอจิกขา Di 13 การจัดขาคอนเน็กเตอร ISP GND GND GND GND +VDD

Di 12 (PB4:MISO) Di 13 (PB5:SCK) Blue LED RESET Di 10 (PB2:SS) PWM Di 11 (PB3:MOSI) PWM

13

ATMEGA168

คอนเน็กเตอร DB-9 ตัวเมีย ตอพอรตอนุกรม

2

12

TxD RxD NC GN D An0 (PC0) An 1 (PC1) An2 (PC2) An 3 (PC3) An4/SDA (PC4) An5/SCL (PC5) An 6 (AN6) An 7 (AN7)

1

สวิตช BL เลือกโหมดโปรแกรม

LED ไฟเลี้ยง (สีเขียว) POP-MCU

LED แสดงการทํางาน (สีน้ําเงิน)

NC GND RESET VDD (+5Vdc) Di 9/PWM (PB1) Di 8 (PB0) Di 7 (PD7) Di 6/PWM (PD6) Di 5/PWM (PD5) Di 4 (PD4) Di 3/PWM (PD3) Di 2 (PD2)

GND

3 5

รูปที่ 1-1 วงจร, การจัดขาและการตอใชงานเบืองต ้ นของโมดูล POP-MCU


     10

1.2.2 RBX-168 แผงวงจรควบคุมหุนยนต  สําหรับโมดูล Arduino POP-MCU เปนแผงวงจรเสริมที่มีซ็อกเก็ตสําหรับติดตั้งโมดูล POP-MCU มีสวนประกอบที่สําคัญแสดงในรูปที่ 1-3 สวนวงจรสมบูรณแสดงในรูปที่ 1-4 คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้  มีจุดตอไฟเลียง ้ (DC INPUT) ผานทางจุดตอสายแบบขันสกรู สามารถรับไฟเลี้ยงไดตังแต ้ 4.8 ถึง 12V โดยมีสวิตชเปด-ปดเพื่อตัดตอไฟเลียงแก ้ แผงวงจร ้ +5V แบบสวิตชิงสํ ่ าหรับรักษาระดับไฟเลียงให ้ แกไมโครคอนโทรลเลอร  มีวงจรควบคุมไฟเลียง  มีสวิตชกดติดปลอยดับพรอมใชงาน 2 จุด ตอกับขาพอรต Di2 และ Di4 ของ Arduino POP-MCU โดยตอรวมกับ LED แสดงการทํางานดวย  จุดตอพอรตอินพุตเอาตพุตดิจิตอลหรืออะนาลอก 5 ชอง คือ An1 (Di15) ถึง An5 (Di19) และอินพุต อะนาลอกอยางเดียว 2 ชองคือ An6 และ An7  จุดตอพอรตดิจิตอลรองรับระบบบัส I2C 1 ชุด คือ จุดตอ An4 (SDA) และ An5 (SCL)  มีวงจรเชื่อมตอกับพอรตอนุกรม RS-232 ตอสายสัญญาณผานแจกโมดูลาร  มีวงจรขับมอเตอรไฟตรง 2 ชอง พรอมไฟแสดงผล  มีจุดตอขาพอรตของไมโครคอนโทรลเลอรสําหรับขับเซอรโวมอเตอร 2 ชองคือ Di7 ���ละ 8  มีลําโพงเปยโซสําหรับขับเสียง (ติดตั้งอยูดานลาง) โดยตอกับขาพอรต An0/Di14 จุดตอพอรตอนุกรม RS-232 (ใชไดกับตัวแปลง USB เปนพอรตอนุกรม)

A B

สวิตชกดเพือ่ เลือก โหมดโปรแกรม

1

RESET

ATMEGA168

16/A2

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

-

Di4

POP-168

จุดตออินพุตอะนาลอก

สวิตช RESET โมดูลไมโครคอนโทรลเลอร Arduino POP-168

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

(อยูบนโมดูล Arduino POP-168)

จุดตอเซอรโวมอเตอร

+Vm 7

13

A7

12

A6

จุดตอมอเตอรไฟตรง

BAT

15/A1

จุดตอพอรตของ Arduino POP-168

POWER

17/A3 18/SDA/A4 19/SCL/A5

ไฟแสดงสถานะไฟเลีย้ ง ไฟแจงแบตเตอรีอ่ อน

+ ON

MOTOR

SERVO PORT

สวิตชเปด-ปดไฟเลี้ยง

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

4-12Vdc

ไฟแสดงการทํางานของมอเตอร RS-232

จุดตอไฟเลีย้ ง

LED และสวิตช สําหรับทดสอบการติดตอ กับอุปกรณภายนอก


รูปที่ 1-3 วงจรสมบูรณของแผงวงจรควบคุม RBX-168

+5V

+5V

+5V

+5V

K6 19/A5/SCL

K5 18/A4/SDA

K4 17/A3

K3 16/A2

S2 Di4

LED4 P4

+5V

+5V

R7 510

S1 Di2

R5 510 LED3 P2

+5V

+5V

K7 An6

K2 15/A1

+5V

2 3 4

K8 An7

RxD TxD DTR GND

1

J1 DOWNLOAD RJ-11 6P4C

R8 220

R6 220 Di2

An1

An2

An3

An4

An5

An6

Di3/PWM

An0/Di14

RESET

Di8

Di7

Di6/PWM

Di9/PWM

Di5/PWM

An7

SK1 POP-MCU socket

TxD

RxD

15 Di4

13

6

7

8

9

10

11

12

2

1

+5V 21

19

18

K10 SERVO2

K9 SERVO1

Di8-SERVO2 +Vm GND

S S S G

D D D D

FDS6680

15

4

3

24

GND

CE OUT NC

EXT

C2 100F 10V

L1 10uH

11

8

7

12

+- O

KIA 7031

BO2

BO2

BO1

BO1

AO2 5 6 AO2

AO1

2

1

Q1 FDS6680A

AO1

9 10 18

NCP1450

4

PWMB

16 BIN2

17

PWMA

AIN2

AIN1

17 BIN1

23

14

+Vm

IC4 TB6612FNG

20

23

12

Di7-SERVO1 +Vm GND

13 19 STBY 20 Vcc

+5V

IC2 KIA78R05 G O I

R2 47k

LED1 LOW-BAT

3

16

+Vm

SP1 PIEZO

GND 2

RESET

1 +V

R1 1k

21

C5 10F 16V

SW2 RESET

IC1 KIA7031

C1 100F 16V

D1 1N5819

14

5

22

R4 4.7k

+5V

K1 BATT. 4.8-12V

SW1 ON

+Vm

C6 0.1/63V

OUT

C7 0.1/63V

R10 1k

LED5 MOTOR A-DIR.

R9 1k

GND

CE

LED6 MOTOR B-DIR.

4

5

IC3 NCP1450-5.0

D2 MBR340

K12 MOTOR-B

K11 MOTOR-A

C4 0.01F 50V

C3 1000F 6.3V

LED2 ON

R3 1k

+5V

     11


     12

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

1.3.2 เซอรโวมอเตอรแบบมาตรฐาน (เปนอุปกรณเสริม มีในชุด POP-BOT Standard kit) มีสายตอใชงาน 3 เสนคือ สายสัญญาณ (S) สายไฟเลียง ้ (+V) และกราวด (G) ภายในเซอรโวมอเตอรมี วงจรควบคุมการหมุนติดตังอยู ้  ดังแสดงในรูปที่ 1-10 คุณสมบัติทางเทคนิคที่สําคัญมีดังนี้  ตองการไฟเลียงในย ้ าน +4.8 ถึง +6Vdc ่ 60 รอบตอนาที (ที่ไฟเลียง ้ +5V และไมมีโหลด)  ความเร็วเฉลีย  นําหนั ้ ก 45 กรัม  แรงบิด 3.40 กิโลกรัม-เซนติเมตร หรือ 47 ออนซ-นิ้ว ้  ขนาด (กวาง x ยาว x สูง) 40.5 x 20 x 38 มิลลิเมตร หรือ 1.60 x 0.79 x 1.50 นิว


     13

1.3.3 SLCD : โมดูล LCD ขนาด 16 ตัวอักษร 2 บรรทัดติดตอแบบอนุกรม ในชุด POP-BOT ไดบรรจุอุปกรณแสดงผลที่ใชการสื่อสารขอมูลอนุกรม นันคื ่ อ SLCD โมดูล LCD แบบ อนุกรม ขนาด 16 ตัวอักษร 2 บรรทัด โดยปกติการติดตอกับโมดูล LCD จะตองใชพอรตของไมโครคอนโทรลเลอร อยางนอย 6 เสนคือ สายขอมูล 4 เสน และสายควบคุม 2 เสน เนืองจาก ่ POP-BOT มีจุดตออุปกรณภายนอกจํากัด การสือสารข ่ อมูลอนุกรมจึงเปนสิงจํ ่ าเปน คุณสมบัติทางเทคนิคที่สําคัญของโมดูล SLCD มีดังนี้  แสดงผลตัวอักษร 16 ตัวอักษร 2 บรรทัด  ตอพอรตของไมโครคอนโทรลเลอรโดยใชสายสัญญาณเพียงเสนเดียว  เลือกรูปแบบการสือสารเป ่ นแบบตรง (Direct) หรือกลับลอจิก (Invert) ก็ได  เลือกบอดเรตได 2 คาคือ 2400 และ 9600 บิตตอวินาที รูปแบบขอมูล 8 บิต ไมมีพาริตี้ บิตหยุด 1 บิต (8N1)  ใชสายตอ 3 เสนคือ Vcc (+),Serial Input (S) และ GND (G) ใชไฟเลียง ้ +5V

1.4 คุณสมบัติของชุดอุปกรณตรวจจับสัญญาณ 1.4.1 แผงวงจรสวิตช : ZX-SWITCH มีวงจรและรูปรางแสดงในรูปที่ 1-4 ประกอบดวยสวิตชพรอมไฟแสดงผล ถากดสวิตชจะสงลอจิก “0” ไฟสีแดงติด

LED1

Indicator

+V

R2 10k R1 510

R3 220

DATA

Signal output S1 GND Switch

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


     14

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

OUT GND

10k

510

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

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

1.4.3 GP2D120 โมดูลตรวจจับระยะทางแบบอินฟราเรด (เปนอุปกรณเสริม มีในชุด POP-BOT Standard kit) GP2D120 เปนโมดูลตรวจจับระยะทางแบบอินฟราเรดมีขาตอใชงาน 3 ขาคือ ขาตอไฟเลียง ้ (Vcc), ขา กราวด (GND) และขาแรงดันเอาตพุต (Vout) การอานคาแรงดันจาก GP2D120 จะตองรอใหพนชวงเตรียมความ พรอมของโมดูลกอน ซึงใช ่ เวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที (โดย 1 มิลลิวินาทีเทากับ 0.001 วินาที) ดังนัน้ ในการอานคาแรงดันจึงควรรอใหพนชวงเวลาดังกลาวไปกอน ดังแสดงขอมูลเบื้องตนในรูปที่ 1-6 คาแรงดันเอาตพุตของ GP2D120 ที่ระยะทาง 30 เซนติเมตรที่ไฟเลียง ้ +5V อยูในชวง 0.25 ถึง 0.55V โดย คากลางคือ 0.4V ชวงของการเปลี่ยนแปลงแรงดันเอาตพุตทีระยะทาง ่ 4 เซนติเมตรคือ 2.25V 0.3V


     15

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

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

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

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

GP2D12 GP2D120

2.4 Vout

GND

Vcc

2.0 1.6

ไฟเลี้ยง

1.2 0.8

38.3ฑ9.6 มิลลิวินาที

0.4

การวัดระยะหาง แรงดันเอาตพุต

วัดครั้งที่ 1

วัดครั้งที่ 2

ไมแนนอน

วัดครั้งที่ n

เอาตพุตครั้งที่ 1 เอาตพุตครั้งที่ 2

0

4

8

FA X

20

24

28

32

วัตถุ

L A

L F  A X

L

16

* ใชกระดาษเทาขาวรุน R-27 ของ Kodak ซึ่ง ดานขาวมีอัตราการสะทอนแสง 90% เปน วัตถุสําหรับสะทอนแสงเพื่อวัดระยะทาง

5 มิลลิว ินาที

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

12

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

เอาตพุตครั้งที่ n

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

0

F สวนรับแสง

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

X

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

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


     16

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

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

GND S +5V

1.5.2 สาย UCON-4 : สายเชื่อมตอพอรต USB สาย UCON-4 ใชเชื่อมตอแผงวงจรควบคุม RBX-168 กับพอรต USB ของคอมพิวเตอร โดยทํางานเปนสาย แปลงสัญญาณพอรต USB เปนพอรตอนุกรม RS-232 ใชไฟจากพอรต USB เลียงวงจร ้ ใชไดกับพอรต USB1.0/ 2.0 รองรับอัตราบอดสูงถึง 115,200 บิตตอวินาท มีี สายสัญญาณภายใน 4 เสน ปลายดานหนึงใช ่ ตอกับพอรต USB สวนอีกดานหนึงติ ่ ดตังปลั ้ กโมดู ๊ ลาร (RJ-11 6P4C : แบบเดียวกับที่ใชในเครื่องโทรศัพท) มีการจัดขาดังนี้ MCU_TxD MCU_RxD MCU_DTR GND


     17

1.6 ขอมูลของอุปกรณทางกลที่ใชในชุดหุนยนต  POP-BOT 1.6.1 ลอพลาสติกสําหรับชุดเฟองขับมอตอรและยาง เปนลอกลม มีเสนผานศูนยกลาง 65 มิลลิเมตร สามารถสวมเขากับแกนของชุดเฟองขับมอเตอรไดทันที โดยไมตองดัดแปลงเพิมเติ ่ ม ขันยึดดวยสกรูเกลียวปลอย 2 มิลลิเมตร สวนยางขอบลอทีใช ่ รวมดวยผลิตจากยางพารา ผิวมีดอกยางเพื่อชวยเพิ่มสมรรถนะในการเกาะพื้นผิว

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

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


     18

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

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

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


     19

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

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

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

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


     20


      21

 

 หุนยนต  POP-BOT เปนหุนยนต  อัตโนมัติขนาดเล็กทีควบคุ ่ มดวยไมโครคอนโทรลเลอร AVR เบอร ATmega168 โดยใชโมดูล POP-MCU ซึงสามารถสร ่ างขึนจากอุ ้ ปกรณและชินส ้ วนจํานวนไมมาก แตรองรับความตองการในการเรียน รูได  อยางครบถวนรอบดาน ไมวาจะเปนการควบคุมมอเตอรไฟตรงเพือขั ่ บเคลือนหุ ่ นยนต  ในลักษณะตางๆ ทางเคลือนที ่ ่ ตรง ถอยหลัง หมุนตัว เลียวซ ้ ายและขวา การอานคาจากตัวตรวจจับชนิดตางๆ ทังแบบดิ ้ จิตอลและอะนาลอกเพือนํ ่ ามาใช ประกอบการตัดสินใจในการทํางานภายใตภาวะเงือนไขต ่ างๆ การติดตอกับอุปกรณแสดงผลอยางโมดูล LCD ในบทนีนํ้ าเสนอการประกอบตัวหุนยนต  POP-BOT แบบมาตรฐาน และจะใชโครงสรางนีเป ้ นหลักในการเขียน โปรแกรมเพือควบคุ ่ มการทํางาน อยางไรก็ตาม ผูสร  างสามารถดัดแปลงใหแตกตางออกไปได หากแตเมือนํ ่ ามาเขียน โปรแกรมจะตองคํานึงถึงผลของการดัดแปลงทางโครงสรางทีมี่ ตอการทํางานของตัวตรวจจับและโปรแกรมดวย

POP-BOT POP-MCU micro-robot ขั บเคลือนด ่ วยมอเตอรไฟตรงพรอมชุดเฟองขับและลอกลม  ควบคุมดวยไมโครคอนโทรลเลอร ATmega168 โดยใชโมดูล POP-MCU โปรแกรมไดในตัว  สามารถติดตังแผงวงจรตรวจจั ้ บแสงสะทอน อินฟราเรดเพือตรวจจั ่ บเสน, แผงวงจรสวิตช ตรวจจับการชน, โมดูลวัดระยะทางแบบอินฟราเรด เพื่อวัดระยะทางและหลบหลีกส���่งกีดขวางแบบไมสัมผัส, แผงวงจรเชือมต ่ อกับจอยสติกของเครื ๊ ่องเลนเกมส เพื่อควบคุมแบบใชสาย, แผงวงจรรับแสงอินฟราเรด เพื่อควบคุมจากระยะไกล, โมดูลสื่อสารขอมูลไรสาย ผานระบบบลูทูธ  มีโมดูล LCD 16 ตัวอักษร 2 บรรทัดสําหรับแสดงผลการทํางาน  สามารถขับ RC เซอรโวมอเตอรได 2 ชอง จึงสามารถ ติดตั้งกลไกเคลื่อนไหวเพิ่มเติมได  ใชไฟเลียงจากแบตเตอรี ้ ่ AA แบบอัลคาไลนหรือแบบประจุได จํานวน 4 กอน  ดาวนโหลดโปรแกรมผานทางพอรตอนุกรมของคอมพิวเตอร สามารถใชไดกับตัวแปลงสัญญาณพอรต USB เปนพอรต อนุกรม RS-232 (มีใหในชุด) 


    22  



แผนฐานพลาสติกกลม x 1

ลอพลาสติกพรอมยาง x 2

โมดูล SLCD x 1

บอรด RBX-168 x1

ชุดเฟองขับมอเตอร x 2

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

ถาดรองกะบะถาน x 1

เสารองโลหะ 33 มม. x 4

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

สกรูเกลียวปลอย 2 มม. x 2 ชุดชิ้นตอพลาสติก

ชุ ดเสารองพลาสติก

ฉากโลหะ 2x2 x 2

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


      23

 (1) นําชุดเฟองขับมอเตอรยึดเขากับถาดรองกะบะถาน โดยใชสกรูหัวตัดขนาด 3 x 8 มม. ขันยึดในตําแหนงดังรูป

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

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


    24  

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

(5) นําแผงวงจรตรวจจับแสงสะทอนอินฟราเรด รอยดวยสกรู 3 x 10 มม. และคั่นดวยเสารอง 3 มม. ทําเหมือนกัน 2 ชุด

แผงวงจรตรวจจับ แสงสะทอนอินฟราเรด เสารอง 3 มม. สกรู 3x10 มม. (6) ยึดแผงวงจรตรวจจับแสงสะทอนอินฟราเรดจากขั้นตอนที่ (5) เขาที่ดานหนาของหุนยนตทั้งทางซายและขวา ตําแหนงยึด ZX-03

นอต 3 มม. แผนฐาน แผงวงจรตรวจจับ แสงสะทอนอินฟราเรด


      25

(7) จะไดโครงหุนยนต  ทีติ่ ดตังแผงวงจรตรวจจั ้ บแสงสะทอนอินฟราเรดสําหรับตรวจจับพืนที ้ และเส ่ น ดังรูป

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

นอต 3 มม. ชินต ้ อมุมฉาก

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

สกรู 3x10 มม. (9) นําชินต ้ อตรงยึดเขากับบริเวณดานหนาของหุนยนต  ทังด ้ านซายและขวา ขันยึดดวยสกรู 3x10 มม. และนอต 3 มม. จากนันนํ ้ าแผงวงจรสวิตช ติดตังเข ้ ากับชินต ้ อตรงที่ตัวหุนยนต  ทัสองด ้ านดังรูป


    26  

(10) นําโมดูล SLCD ยึดเขากับเสารองโลหะ 33 มม. ทังสองด ้ านดังรูป ขันยึดดวยสกรูขนาด 3x6 มม. จากนันนํ ้ าปลาย ดานหนึงของเสารองโลหะ ่ ติดยึดเขากับชินต ้ อตรงโดยใชสกรู 3x10 มม.ขันยึด

(11) นําโมดูล LCD ติดตังบริ ้ เวณดานหลังของตัวหุนยนต  ในตําแหนงดังรูป โดยใชสกรูขนาด 3x10 มม. ขันยึดทีบริ ่ เวณ ชินต ้ อตรงกับฐานของหุนยนต

(12) นําบอรด RBX-168 ติดตังเข ้ ากับโครงสรางหุนยนต  แลวเสียบสายสัญญาณตาง เริมจากสายมอเตอร ่ ดานซายตอ กับชอง MOTOR A และสายของมอเตอรดานขวาตอกับชอง MOTOR B ตอสายสัญญาณของแผงวงจรตรวจจับแสง สะทอนแสงอินฟราเรดดานซายเขากับจุด A7 ดานขวาเขากับจุด A6 ตอสายสัญญาณของแผงวงจรสวิตชดานซายเขา  POP-BOT ทีพร ่ อมสําหรับ ¡Ñ º ¨Ø ´ 15/A1 ดานขวาเขากับจุด 17/A3 และโมดูล SLCD เขากับจุด 18/A4 จะไดหุนยนต การเขียนโปรแกรมตอไป

มอเตอร A มอเตอร B


     27



 ในบทนีจะอธิ ้ บายสวนประกอบและรายละเอียดของโปรแกรม Arduino IDE ที่ใชในการเขียนโปรแกรม คอมไพลโปรแกรม และอัปโหลดโปรแกรมไปยังโมดูล POP-MCU

3.1 สวนประกอบของหนาจอโปรแกรม Arduino IDE เมื่อเรียกใหโปรแกรมทํางาน จะมีหนาตาดังรูปที่ 3-1 ตัวโปรแกรมประกอบดวยสวนตางๆ ดังนี้  เมนู (Menu) ใชเลือกคําสั่งตางๆ ในการใชงานโปรแกรม  ่อใหเรียกใชคําสั่งได  แถบเครื่ องมือ (Toolbar) เป นการนําคําสั่งที่ใชงานบอยๆ มาสรางเปนปุมเพื รวดเร็วขึ้น เมนู (Menu) แถบเครืองมื ่ อ (Tools bar) แถบเลือกโปรแกรม (Tab)

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

พืนที ้ แสดงสถานะการทํ ่ างาน (Message area) พืนที ้ แสดงข ่ อมูล (Text area)

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


     28

แถบเลือกโปรแกรม (Tabs) เปนแถบทีใช ่ เลือกไฟลโปรแกรมแตละตัว (กรณีทีเขี ่ ยนโปรแกรมขนาด ใหญประกอบดวยไฟลหลายตัว)  พื้นที่เขียนโปรแกรม (Text editor) เปนพื้นทีสํ ่ าหรับเขียนโปรแกรมภาษา C  พื้ นที่ แสดงสถานะการทํางาน (Message area) เปนพื้นทีโปรแกรมใช ่ แจงสถานะการทํางานของ โปรแกรม เชน ผลการคอมไพลโปรแกรม ่ และยัง  พื้นที่แสดงขอมูลบ (Text area) ใชแจงวาโปรแกรมที่ผานการคอมไพลแลวมีขนาดกีไบต ใชเปนหนาตางแสดงผลของการติดตอผานพอรตอนุกรมหรือทํางานเปนหนาตางแสดงผลการทํางานของโปรแกรม เทอรมินอล (terminal) นันเอง ่ 

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

3.2.1 เมนู File ใน Arduino จะเรียกโปรแกรมที่พัฒนาขึนว ้ า สเก็ตช (Sketch) และในโปรแกรมของผูใช  งานอาจมีไฟล โปรแกรมหลายตัว จึงเรียกรวมวาเปน สเก็ตชบุก (Sketchbook) ในเมนูนีจะเกี ้ ยวข ่ องกับการเปด-บันทึก-ปดไฟล ดังนี้  New : ใชสรางสเก็ตชบุกตัวใหม เพื่อเริ่มเขียนโปรแกรมใหม  Sketchbook : เมื่อเรียกแลวจะมีเมนูยอยคือ - Open ใชเปดสเก็ตชบุกที่บันทึกไวกอนหนานี้ - Example ใชเปดสเก็ตชบุกตัวอยางที่มาพรอมกับโปรแกรม  Save : ใชในการบันทึกไฟลสเก็ตชปจจุบัน  Save as : ใชบันทึกไฟลสเก็ตชโดยเปลียนชื ่ ่อไฟล  Upload to I/O board : ใชอัปโหลดโปรแกรมไปยังโมดูล POP-168 หรือฮารดแวรของ Arduino  Preference : ใชกําหนดคาการทํางานของโปรแกรม  Quit : ใชจบการทํางานและออกจากโปรแกรม POP-Note ในการสงขอมูลของโปรแกรมภาษา C ที่คอมไพลแลวไปยังโมดูล POP-MCU ของซอฟตแวร Arduino จะเรียกกระบวนการ นี้ ว า อัปโหลด (upload) ซึ่งแตกตางจากการพัฒนาโปรแกรมของไมโครคอนโทรลเลอรอื่นๆ ซึ่งเรียกวา การดาวนโหลด (download)


     29

3.2.2 เมนู Edit ในขณะทีพิ่ มพโปรแกรม สามารถใชคําสังในเมนู ่ นีในการสั ้ งยกเลิ ่ กคําสังที ่ แล ่ ว ทําซํา้ ฯลฯ มีเมนูตางๆ ดังนี้  Undo : ยกเลิกคําสั่งหรือการพิมพครั้งสุดทาย  Redo : ทําซํ้าคําสั่งหรือการพิมพครั้งสุดทาย  Cut : ตัดขอความที่เลือกไวไปเก็บในคลิปบอรดของโปรแกรม  Copy : คัดลอกขอความที่เลือกไวมาเก็บในคลิปบอรด  Paste : นําขอความที่อยูในคลิปบอรดมาแปะลงในตําแหนงที่เคอรเซอรชี้อยู  Select All : เลือกขอความทั้งหมด  Find : คนหาขอความ  Find Next : คนหาขอความถัดไป

3.2.3 เมนู Sketch เปนเมนูที่บรรจุคําสั่งที่ใชในการคอมไพลโปรแกรม เพิ่มไฟลไลบรารี ฯลฯ โดยมีเมนูยอยดังนี้  Verify/Compile : ใชคอมไพลแปลโปรแกรมภาษาซีใหเปนภาษาเครื่อง  Stop : หยุดการคอมไพลโปรแกรม  Add file : เพิ่มไฟลใหกับสเก็ตชบุกปจจุบัน เมื่อใชคําสั่งนีโปรแกรม ้ Arduino จะทําการคัดลอก ไฟลที่เลือกไวมาเก็บไวในโฟลเดอรเดียวกันกับโปรแกรมของเรา ่ ยกใชไลบรารีเพิมเติ ่ ม เมือคลิ ่ กเลือกคําสังนี ่ แล ้ ว โปรแกรม Arduino IDE  Import Library : เปนคําสังเรี จะแสดงไลบรารีใหเลือก เมือเลื ่ อกแลว โปรแกรมจะแทรกบรรทัดคําสัง่ #include ลงในสวนตนของไฟล ่ ดโฟลเดอรทีเก็ ่ บโปรแกรมของผูใช   Show Sketch folder : สังเป

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


     30

3.2.5 เมนู Help เมื่อตองการความชวยเหลือ หรือขอมูลเกียวกั ่ บโปรแกรมใหเลือกเมนูนี้ เมื่อเลือกเมนูยอย ตัวโปรแกรม จะเปดไฟลเว็บเพจ (ไฟลนามสกุล .html) ที่ เกียวข ่ องกับหัวขอนั้นๆ โดยไฟลจะเก็บในเครื่องของผู ใชภายใน โฟลเดอรที่เก็บ Arduino IDE โดยมีเมนูตางๆ ดังนี้  Getting Start : เริ่มตนใชงานบอรดกับ Arduino  Troubleshooting : แกไขปญหาตางๆ ่ บเมนู และทูลลบาร  Environment : อธิบายเกียวกั ่ บโครงสรางโปรแกรม ภาษา ฟงกชั่นของ Arduino  Reference : แจงขอมูลเกียวกั  Frequently Asked Question : แจงขอมูลคําถามที่พบบอย  Visit www.arduino.cc : เรียกโปรแกรมเวบบราวเซอรและเขาไปยังเวบ http:://www.arduino.cc  About Arduino : แสดงชื่อโปรแกรมและรุนของ Arduino IDE

3.3 แถบเครื่องมือ (ทูลบาร : Tools bar) สําหรับคําสั่งที่มีการใชบอยๆ ตัวโปรแกรม Arduino IDE จะนํามาสรางเปนปุมบนแถบเครื  ่องมือ เพื่อให สามารถคลิกเลือกไดทันที ปุมตางๆ บนแถบเครื่องมือมีดังนี้ Verfy/Compile ใชตรวจสอบการเขียนคําสังในโปรแกรมว ่ า มีถูกตองตามหลักไวยกรณหรือไม และคอมไพลโปรแกรม Stop ใชหยุดการทํางานของ Serial monitor หรือหยุดการทํางานของปุมอื่นๆ New ใชสรางสเก็ตไฟล (ไฟลโปรแกรม) ตัวใหม Open ใชแทนเมนู File  Sketchbook เพื่อเปดสเก็ตชบุก (ไฟลโปรแกรม) ที่มีในเครื่อง Save ใชบันทึกไฟลสเก็ตชบุกที่เขียนขึน้ Upload to I/O Board ใชอัปโหลดโปรแกรมทีเขี ่ ยนขึนไปยั ้ งบอรดหรือฮารดแวร Arduino กอน จะอัปโหลดไฟล ตองแนใจวาไดบันทึกไฟลและคอมไพลไฟลสเก็ตชเรียบรอยแลว Serial Monitor ใช แสดงขอมูลที่รับสงผานพอรตอนุกรมของเครื่องคอมพิวเตอรไปยังบอรด Arduino (ในที่นีคื้ อ POP-MCU หรือ Arduino Mini) ในการสงขอมูลไปยังบอรดใหพิมพขอความและคลิกปุม send หรือกดปุม enter ในการรับสงขอมูลตองกําหนดอัตราเร็วในการถายทอดขอมูลหรือบอดเรต (baud rate) ใหกับ โปรแกรมในคําสัง่ Serial.begin กรณีทีใช ่ งานกับคอมพิวเตอร Mcintosh หรือคอมพิวเตอรที่ติดตั้งระบบปฏิบัติการ Linux ตัวฮารดแวรของ Arduino จะรีเซ็ตเมื่อเริ่มเปดใชงาน Serial monitor


     31



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

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

และ void loop()

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


     32

4.1.1 สวนของฟงกชัน่ setup() ฟงกชั่นนีจะเขี ้ ยนที่สวนตนของโปรแกรม ทํางานเมือโปรแกรมเริ ่ ่มตนเพียงครั้งเดียว ใชเพื่อกําหนดคา ของตัวแปร โหมดการทํางานของขาตางๆ เริ่มตนเรียกใชไลบรารี่ ฯลฯฯ ตัวอยางที่ 4-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 ทีใช ่ C คอมไพ เลอรแบบ GCC สําหรับไมโครคอนโทรลเลอร AVR) จะเขียนไดดังนี้ int main(void) { init(); setup(); for (;;) loop(); return ;

ตรงกับ void

setup()

ตรงกับ void

loop()

}

4.1.2 สวนของฟงกชัน่ loop() หลังจากที่เขียนฟงกชั่น setup()ที่กําหนดคาเริ่มตนของโปรแกรมแลว สวนถัดมาคือฟงกชั่น loop() ซึ่งมีการทํางานตรงตามชื่อคือ จะทํางานตามฟงกชั่นนี้วนตอเนืองตลอดเวลา ่ ภายในฟงกชั่นนี้จะมีโปรแกรมของ ผูใช เพื่อรับคาจากพอรต ประมวล แลวสังเอาต ่ พุตออกขาตางๆ เพื่อควบคุมการทํางานของบอรด ตัวอยางที่ 4-2 int buttonPin = 3; // setup initializes serial and the button pin void setup() { beginSerial(9600); pinMode(buttonPin, INPUT); } // loop checks the button pin each time and will send serial if it is pressed void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite(‘H’); else serialWrite(‘L’); delay(1000); }


    ��� 33

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

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


     34

4.2.2 คําสั่ง

if...else

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

หลังคําสั่ง else สามารถตามดวยคําสัง่ if สําหรั บการทดสอบอืนๆ ่ ทําใหรูปแบบคําสังกลายเป ่ น if....else...if เปนการทดสอบเงื่อนไขตางๆ เมื่อเปนจริงใหทําตามที่ตองการ ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-4 if (pinFiveInput < 500) { // do Thing A } else if (pinFiveInput >= 1000) { // do Thing B } else { // do Thing C }

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


     35

4.2.3 คําสั่ง

for()

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

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

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

4.2.4 คําสั่ง

switch-case

ใชทดสอบเงือนไขเพื ่ อกํ ่ าหนดการทํางานของโปรแกรม ถาตัวแปรทีทดสอบตรงกั ่ บเงือนไขใดก็ ่ ใหทํางาน ตามที่กําหนดไว พารามิเตอร var ตัวแปรทีต ่ องการทดสอบวาตรงกับเงื่อนไขใด default ถาไมตรงกับเงือนไขใดๆ ่ เลยใหทําคําสังต ่ อทายนี้ break เปนสวนสําคัญมาก ใชเขียนตอทาย case ตางๆ เมื่อพบเงื่อนไขนั้นแลวทําตามคําสั่งตางๆ แลวใหหยุดการทํางานของคําสั่ง switch-case ถาลืมเขียน break เมื่อพบเงื่อนไขทําตามเงื่อนไขแลว โปรแกรม จะทํางานตามเงื่อนไขตอไปเรือยๆ ่ จนกวาจะพบคําสั่ง break ตัวอยางที่ 4-6 switch (var) { case 1: //do something when var == 1 break; case 2: //do something when var == 2 break; default: // if nothing else matches, do the default }


     36

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

พารามิเตอร expression

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

ตัวอยางที่ 4-7 var = 0; while(var < 200){ // do something repetitive 200 times var++; }


     37

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

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

พารามิเตอร value1 : เปนคาของตัวแปรหรือคาคงที่ใดๆ value2: เปนคาของตัวแปรหรือคาคงที่ใดๆ ตัวอยางที่ 4-8 y = y + 3; x = x - 7; i = j * 6; r = r / 5;

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


     38

4.4.2 ตัวกระทํา % หารเอาเศษ ใชหาคาเศษที่ไดของการหารเลขจํานวนเต็ม 2 ตัว ตัวกระทําหารเอาเศษไมสามารถใชงานกับตัวแปรเลข ทศนิยม (float) รูปแบบคําสัง่ result = value1 % value2;

พารามิเตอร - เปนตัวแปรประเภท byte,char,int หรือ long value2 - เปนตัวแปรประเภท byte,char,int หรือ long ผลที่ได เศษจากการหารคาเล���จํานวนเต็ม เปนขอมูลชนิดเลขจํานวนเต็ม ตัวอยางที่ 4-9 value1

x = 7 % 5; x = 9 % 5;

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

x = 5 % 5;

// x now contains 0

x = 4 % 5;

// x now contains 4

ตัวกระทําหารเอาเศษ นีใช ้ ประโยชนมากในงานที่ตองการใหเหตุการณเกิดขึ้นดวยชวงเวลาทีสมํ ่ ่าเสมอ หรือใชทําใหหนวยความทีเก็ ่ บตัวแปรอะเรยเกิดการลนคากลับ (roll over) ตัวอยางที่ 4-10 // check a sensor every 10 times through a loop void loop() { i++; if ((i % 10) == 0) { x = analogRead(sensPin); // read sensor every ten times through loop } / ... } // setup a buffer that averages the last five samples of a sensor int senVal[5]; // create an array for sensor data int i, j; // counter variables long average; // variable to store average ... void loop() { // input sensor data into oldest memory slot sensVal[(i++) % 5] = analogRead(sensPin); average = 0; for (j=0; j<5; j++) { average += sensVal[j]; // add samples } average = average / 5; // divide by total


     39

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

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

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

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

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

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

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

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


     40

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

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

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

0 1

1 0

1 1

Operand1 Operand2

—————————— 0

0

0

1

Returned result

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

92;

// in binary: 0000000001011100

int b = 101;

// in binary: 0000000001100101

int c = a & b; // result:

0000000001000100 or 68 in decimal.

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


     41

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

0

1

Operand1

0 1 0 1 ——————————

Operand2

0

Returned result

1

1

1

1

ตัวอยางที่ 4-16 สวนของโปรแกรมแสดงการใชตัวกระทําระดับบิต OR int a =

92;

// in binary: 0000000001011100

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

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


     42 int i;

// counter variable

int j; void setup() { DDRD = DDRD | B11111100; // set direction bits for pins 2 to 7, // leave 0 and 1 untouched (xx | 00 == xx) // same as pinMode(pin,OUTPUT) for pins 2 to 7 Serial.begin(9600); } void loop() { for (i=0; i<64; i++) { PORTD = PORTD & B00000011; // clear out bits 2 - 7, leave pins 0 // and 1 untouched (xx & 11 == xx) j = (i << 2); // shift variable up to pins 2 - 7 to avoid pins 0 and 1 PORTD = PORTD | j; // combine the port information with the new information for LED pins Serial.println(PORTD, BIN); delay(100);

// debug to show masking

} }

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

0

1

1

Operand1

0

1

0

1

Operand2

—————————— 0 1 1 0

Returned result

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

// binary: 1100 // binary: 1010

int z = x ^ y;

// binary: 0110, or decimal 6


     43

ตัวกระทําระดับบิต XOR จะใชมากในการสลับคาบางบิตของตัวตัวแปร int เชน กลับจาก “0” เปน “1” หรือกลับจาก “1” เปน “0” เมื่อใชตัวกระทําระดับบิต XOR ถาบิตของ mask เปน “1” ทําใหบิตนั้นถูกสลับคา ถา mask มีคาเปน “1” บิตนั้นมีคาคงเดิม ตัวอยางตอไปนีเป ้ นโปรแกรมแสดงการสั่งใหขาด���จิตอล 5 (Di 5) มีการกลับลอจิกตลอดเวลา ตัวอยางที่ 4-19 // Blink_Pin_5 // demo for Exclusive OR void setup() { DDRD = DDRD | B00100000; Serial.begin(9600);

// set digital pin five as OUTPUT

} void loop() { PORTD = PORTD ^ B00100000;

// invert bit 5 (digital pin 5), // leave others untouched

delay(100); }

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

1

————— 1 0

Operand1 ~ operand1

int a = 103;

// binary: 0000000001100111

int b = ~a;

// binary: 1111111110011000

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


     44

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

พารามิเตอร variable

เปนตัวแปรเลขจํานวนเต็มที่มีจํานวนบิตนอยกวาหรือเทากับ 32 บิต (หรือตัวแปรประ

เภท byte, int หรือ long) ตัวอยางที่ 4-20 int a = 5;

// binary: 0000000000000101

int b = a << 3;

// binary: 0000000000101000 or 40 in decimal

int c = b >> 3;

// binary: 0000000000000101 or back to 5

ตัวอยางที่ 4-21 เมื่อสั่งเลื่อนคาตัวแปร x ไปทางซายจํานวน y บิต (x ตัวจะหายไป เนื่องจากถูกเลื่อนหายไปทางซายมือ

<< y

) บิตขอมูลทีอยู ่ ด านซายสุดของ x จํานวน y

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

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

0

==

1

1 <<

1

==

2

1 << 1 <<

2 3

== ==

4 8

... 1 <<

8

==

256

1 <<

9

==

512

1 << 10 ...

== 1024

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

// binary: 1111111111110000 // binary: 1111111111111110


     45

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

// binary: 1111111111110000 // binary: 0001111111111110

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

// integer division of 1000 by 8, causing y = 125.

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

;

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

ใชเขียนแจงวา จบคําสั่ง ตัวอยางที่ 4-23 int a = 13;

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

4.7.2 {

}

(วงเล็บปกกา - curly brace)

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


     46

ตําแหนงที่ใชวงเล็บปกกา ฟงกชั่น (Function) void myfunction(datatype argument){ statements(s) }

คําสั่งวนรอบ (Loops) while (boolean expression) { statement(s) } do { statement(s) } while (boolean expression); for (initialisation; termination condition; incrementing expr) { statement(s) }

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

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


     47

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

อยาลืมเครืองหมาย ่ # ตัวอยางที่ 4-24 #define ledPin 3

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

4.7.5 #include ใชสังให ่ รวมไฟลอืนๆ ่ เขากับไฟลโปรแกรมของเรากอน แลวจึงทําการคอมไพลโปรแกรม รูปแบบคําสัง่ #include <file> #include “file”

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

บรรทัดแรกจะสั่งใหเรียกไฟล stdio.h มารวมกับไฟลโปรแกรมของเรา โดยคนหาไฟลจากตําแหนงที่เก็บ ไฟลระบบของ Arduino โดยปกติเปนไฟลมาตรฐานที่มาพรอมกับ Arduino บรรทัดที่ 2 สั่งใหรวมไฟล lcd.h มารวมกับไฟลโปรแกรมของเรา โดยหาไฟลจากตําแหนงที่อยูของไฟล  ภาษาซีของเรากอน ปกติเปนไฟลทีผู่ ใชสรางขึ้นเอง


     48

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

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

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

คือชือของตั ่ วแปรประเภท char ทีต่ องการ ่ องการกําหนดใหกับตัวแปร ในทีนี่ เป ้ นตัวอักษรหนึงตั ่ ว x คือคาทีต var

4.8.2 byte : ตัวแปรประเภทตัวเลบ 8 บิตหรือ 1 ไบต ตัวแปร byte ใชเก็บคาตัวเลขขนาด 8 บิต มีคาไดจาก 0 - 255 ตัวอยางที่ 4-26 byte b = B10010;

// “B” is the binary formatter (18 decimal)

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

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


     49

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

เทคนิคสําหรับการเขียนโปรแกรม เมื่อตัวแปรมีคามากกวาคาสูงสุดที่เก็บได จะเกิดการ “ลนกลับ” (roll over) ไปยังคาตํ่าสุดที่เก็บได และ เมื่อมีคานอยกวาคาตํ่าสุดที่เก็บไดจะลนกลับไปยังคาสูงสุด ดังตัวอยางตอไปนี้ ตัวอยางที่ 4-28 int x = x = x = x =

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

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

พารามิเตอร var คือชือของตั ่ วแปร int ทีต่ องการ val คือคาทีต ่ องการกําหนดใหกับตัวแปร ตัวอยางที่ 4-29 unsigned int ledPin = 13;

เทคนิคสําหรับการเขียนโปรแกรม เมือตั ่ วแปรมีคามากกวาคาสูงสุดจะลนกลับไปคาตําสุ ่ ด และเมือมี ่ คานอยกวาคาตํ่าสุดจะลนกลับเปนคา สูงสุด ดังตัวอยาง ตัวอยางที่ 4-30 unsigned int x x = 0; x = x - 1; // x now contains 65535 - rolls over in neg direction x = x + 1; // x now contains 0 - rolls over


     50

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

พารามิเตอร ่ วแปร long ที่ตองการ var คือชือของตั ่ องการกําหนดใหกับตัวแปร val คือคาทีต ตัวอยางที่ 4-31 long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print(“Time: “); time = millis(); //prints time since program started Serial.println(time); // wait a second so as not to send // massive amounts of data delay(1000); }

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

พารามิเตอร var คือชือของตั ่ วแปร unsigned long ทีต่ องการ val คือคาทีต ่ องการกําหนดใหกับตัวแปร ตัวอยางที่ 4-32 long time; void setup(){ Serial.begin(9600); } void loop(){ Serial.print(“Time: “); time = millis(); //prints time since program started Serial.println(time); // wait a second so as not to send // massive amounts of data delay(1000); }


     51

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

พารามิเตอร ่ วแปร float ทีต่ องการ var คือชือของตั ่ องการกําหนดใหกับตัวแปร val คือคาทีต ตัวอยางที่ 4-33 float myfloat; float sensorCalbrate = 1.117;

ตัวอยางที่ 4-34 int x; int y; float z; x = 1; y = x / 2;

// y now contains 0, integers can’t hold fractions

z = (float)x / 2.0;

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


     52

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

4.8.9 string : ตัวแปรประเภทขอความ เปนตัวแปรเก็บขอความ ซึงในภาษาซี ่ จะนิยามเปนอะเรยของตัวแปรประเภท char ตัวอยางที่ 4-35 ตัวอยางการประกาศตัวแปรสตริง char Str1[15]; char Str2[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’,‘o’}; char Str3[8] = {‘a’,‘r’,‘d’,‘u’,‘i’,‘n’, ‘o’,’\0'}; char Str4[ ] = “arduino”; char Str5[8] = “arduino”; char Str6[15] = “arduino”;

เปนการประกาศตัวแปรสตริงโดยไมไดกําหนดคาเริมต ่ น  Str2 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง คอมไพเลอร จะเพิ่ม null character ใหเอง  Str3 ประกาศตัวแปรสตริงพรอมกําหนดคาใหกับขอความทีละตัวอักษร จากตัวอยาง เพิ่มคา null string เอง  Str4 ประกาศตัวแปรสตริงคพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูด จากตัวอยาง ไมไดกําหนด ขนาดตัวแปร คอมไพเลอรจะกําหนดขนาดใหเองตามจํานวนตัวอักษร + 1 สําหรับ null string  Str5 ประกาศตัวแปรสตริงพรอมกําหนคคาตัวแปรในเครื่องหมายคําพูด จากตัวอยาง กําหนดขนาด ตัวแปรเอง  Str6 ประกาศตัวแปรสตริง โดยกําหนดขนาดเผื่อไวสําหรับขอความอื่นที่ยาวมากกวานี้  Str1

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

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


     53

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

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

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

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

4.8.10.2 อะเรยและคําสั่งวนรอบ for โดยทัวไปเราจะพบการใช ่ งานตัวแปรอะเรยภายในคําสั่ง for โดยใชคาตัวแปรนับรอบของคําสัง่ for เปน คาดัชนีของตัวแปรอะเรย ดังตัวอยาง การพิมพคาสมาชิกแตละตัวของตัวแปรอะเรยผานพอรตอนุกรม ใหเขียน โปรแกรมดังนี้ int i; for (i = 0; i < 5; i = i + 1) { Serial.println(myPins[i]); }

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


     54

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

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

// any function will see this variable // ...

} void loop(){ int i; float f; }

// “i” is only “visible” inside of “loop” // “f” is only “visible” inside of “loop”

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

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

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


     55

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

POP-Note การกําหนดคาคงที่เลขจํานวนเต็มเปนเลขฐานตางๆ ของ Arduino คาคงที่เลขจํานวนเต็มก็คือตัวเลขที่คุณเขียนในโปรแกรมของ Arduino โดยตรงเชน 123 โดยปกติแลวตัวเลขเหลานี้ จะเปนเลขฐานสิบ (decimal) ถาตองการกําหนดเปนเลขฐานอืนจะต ่ องใชเครื่องหมายพิเศษระบ ุเชน ฐาน ตัวอยาง 10 (decimal) 123 2 (binary) B1111011 8 (octal) 0173 16 (hexadecimal) 0x7B Decimal ก็คือเลขฐานสิบ ซึ่งเราใชในชีวิตประจําวัน ตัวอยาง 101 == 101 decimal ((1 * 2^2) + (0 * 2^1) + 1) Binary เปนเลขฐานสอง ตัวเลขแตละหลักเปนไดแค 0 หรือ 1 ตัวอยาง B101 == 5 decimal ((1 * 2^2) + (0 * 2^1) + 1) เลขฐานสองจะใชงานไดไมเกิน 8 บิต (ไมเกิน 1 ไบต) มีคาจาก 0 (B0) ถึง 255 (B11111111) ถาตองการปอนเลข ฐานสองขนาด 16 บิต (ตัวแปรประเภท int) จะตองปอนคาสองขั้นตอนดังนี้ myInt = (B11001100 * 256) + B10101010; // B11001100 is the high byte

Octal เปนเลขฐานแปด ตัวเลขแตละหลักมีคาจาก 0 ถึง 7 เทานัน้ ตัวอยาง 0101 == 65 decimal ((1 * 8^2) + (0 * 8^1) + 1) ขอควรระวังในการกําหนดคาคงที่ อยาเผลอใสเลข 0 นําหนา มิฉะนั้นตัวคอมไพเลอรจะแปลความหมายผิดไปวา คาตัวเลขเปนเลขฐาน 8 Hexadecimal (hex) เปนเลขฐานสิบหก ตัวเลขแตละหลักมีคาจาก 0 ถึง 9 และตัวอักษร A คือ 10, B คือ 11 ไปจนถึง F ซึ่งเทากับ 15 ตัวอยาง 0x101 == 257 decimal ((1 * 16^2) + (0 * 16^1) + 1)


     56

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

เมื่อ

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

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

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

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

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


     57

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

# Datatypes

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

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

null # Port Constants DDRB PINB PORTB DDRC PINC PORTC DDRD PIND PORTD

# 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 ++ != 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


     58


     59



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

5.1 องคประกอบหลักทางฮารดแวรที่ใชสรางหุนยนต  POP-BOT 5.1.1 แผงวงจรควบคุมหลัก RBX-168 และโมดูลไมโครคอนโทรลเลอร POP-MCU เปนแผงวงจรหลักที่ ใชในการประมวลผลและควบคุมการทํางาน 5.1.2 โมดูล LCD 16 ตัวอักษร 2 บรรทัดแบบอนุกรม เปนแผงวงจรแสดงผลการทํางานของหุนยนต 5.1.3 ชุดเฟองขับมอเตอรไฟตรง จํานวน 2 ตัว ทําหนาที่เปนอุปกรณขับเคลือนของหุ ่ นยนต 5.1.4 ตัวตรวจจับชนิดตางๆ ทั้งแบบดิจิตอลและอะนาลอก 5.1.5 ชุดโครงสรางหุนยนตและอุปกรณทางกล

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

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


     60

ติดตั้งซอฟตแวร - Arduino IDE ซอฟตแวรพัฒนาโปรแกรมภาษา C/C++ มีทงั้ สวนของ เท็กซเอดิเตอรสําหรับเขียนโปรแกรม, คอมไพเลอร และซอฟตแวร สําหรับโปรแกรมไมโครคอนโทรลเลอร - ไดรเวอรของสายแปลงสัญญาณพอรต USB เปนพอรตอนุกรม RS-232

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

คอมไพล อัปโหลดโปรแกรม พอรต USB

อัปโหลดโปรแกรมผานพอรต USB 1. ตอสาย UCON-4 เขากับพอรต USB 2. ตรวจสอบตําแหนง USB Serial port ที่เกิดขึน้ 3. ตอสาย UCON-4 มายังหุน ยนต POP-BOT 4. เลือกใหหุนยนต POP-BOT เขาสูโหมดโปรแกรม 5. ทําการโปรแกรม

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

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


     61

5.4 การเตรียมการใชงาน UCON-4 สายแปลงสัญญาณพอรต USB เปนพอรต อนุกรม แผงวงจรควบคุมของหุนยนต  POP-BOT ตองเชือมต ่ อกับคอมพิวเตอรและซอฟตแวร Arduino IDE เพือทํ ่ า การอัปโหลดโปรแกรม โดยปกติจะใชพอรตอนุกรม (COM port) สําหรับในคอมพิวเตอรสมัยใหมจะมีพอรตใหตอ ใชงานหลักเปนพอรต USB ดังนันจึ ้ งตองใชอุปกรณทีเรี่ ยกวา สายแปลงสัญญาณพอรต USB เปนพอรตอนุกรม ซึง่ ในชุดหุนยนต  POP-BOT ไดจัดเตรียมมาใหดวยแลว

5.4.1 ติดตั้งไดรเวอร กอนการใชงาน จะตองมีการติดตั้งไดรเวอรเสียกอน โดยมีขันตอนต ้ อไปนี้ (1) ดับเบิลคลิกทีไฟล ่ USBDriverInstallerV2.0.0.exe (เลขเวอรชันอาจเปลียนแปลงตามการปรั ่ บปรุงลา สุด) จากซีดีรอมในชุด POP-BOT เพือเริ ่ มต ่ นการติดตังไดรเวอร ้ จะปรากฏไดอะล็อกบ็อกแจงการติดตังเสร็ ้ จเรียบรอย

กรณีที่คอมพิวเตอรมีการติดตั้งโปรแกรมปองกันไวรัสจําพวก SpyBot หรือ AdAware อาจมีขอ ความแจงเตือนการเขียน Registry ของระบบ ขอใหเลือก “ยอมรับ” เพื่ออนุญาตใหเขาไปเขียนได มิฉะนันไดรเวอร ้ จะไมสามารถทํางานไดอยางสมบูรณ (2) จากนันเสี ้ ยบสาย UCON-4 เขาที่พอรต USB รอสักครู (3) ตรวจสอบตําแหนงของพอรตอนุกรมเสมือนทีเกิ ่ ดขึน้ โดยคลิกทีปุ่ ม Start เลือกไปที่ Control Panel (4) จากนั้นดับเบิลคลิกเลือกที่ System (5) เลือกไปที่แท็ป Hardware แลวคลิกที่ Device Manager


     62

(6) ตรวจสอบรายการฮารดแวรที่หัวขอ Port จะพบ USB Serial port ใหดูวามีการเลือกตําแหนงของ พอรตอนุกรม USB Serial port ไวที่ตําแหนงใด ปกติจะเปน COM3 ขึ้นไป ใหใชคาของตําแหนงของพอรต อนุกรมเสมือนหรือ USB Serial port นีในการเชื ้ ่อมตอกับโปรแกรมตอไป

5.4.2 การใชงาน UCON-4 กับซอฟตแวร Arduino IDE ในก���รทํางานปกติของ Arduino IDE ตัวซอฟตแวรจะรองรับการติดตอกับพอรตอนุกรมไดถึง COM9 ถาหลังจากการติดตั้งไดรเวอรและเชื่อมตอ UCON-4 แลวเกิด USB Serial port หรือพอรตอนุกรมเสมือนที่ ทํางานผานพอรต USB ในตําแหนงที่สูงกวา COM9 จะตองมีขันตอนเพิ ้ ่มเติมเพื่อเปลี่ยนตําแหนงของพอรตอนุกรม เสมือน โดยใหดําเนินการตามขันตอนดั ้ งตอไปนี้ (1) ตอสาย UCON-4 เขากับพอรต USB (2) คลิกที่ปุม Start แลวเลือกไปที่ Control Panel (3) จากนั้นดับเบิลคลิกเลือกที่ (4) เลือกไปที่แท็ป Hardware แลวคลิกที่ Device Manager


     63

(5) ตรวจสอบรายการฮารดแวรที่หัวขอ Port จะพบ USB Serial port ใหดูวามีการเลือกตําแหนงของ พอรตอนุกรม USB Serial port ไวที่ตําแหนงใด ถาหากเปน COM9 ขึนไป ้ (จากตัวอยางเปน COM10) ใหคลิก เมาสปุมขวาที่ตําแหนง USB Serial port นั้น แลวเลือก Properties

(6) จะปรากฏหนาตาง USB Serial Port (COM10) Properties (หมายเลข COM อาจเปลียนแปลงได ่ ในคอมพิวเตอรแตละเครือง) ่ ใหเลือกไปทีแท็ ่ ป Port Setting ซึงแสดงค ่ ากําหนดรูปแบบการสือสารข ่ อมูลอนุกรม ให กําหนดคาตางๆ ดังรูป จากนันคลิ ้ กทีปุ่ ม Advance


     64

(7) หนาตาง Advanced Setting for COM10 ปรากฏขึน้ (หมายเลข COM อาจเปลี่ยนแปลงได) คลิก ่ าง COM1 ถึง 9 ) ·Õ èªèÍ § COM Port Number เพื่อเปลี่ยนเปน COM4 (หรือหมายเลขอืนระหว

(8) จากนันทํ ้ าการกําหนดคาตางๆ ตามรูป โดยเฉพาะที่ชอง Latency Timer (msec) ควรกําหนดเปน 1 และทําเครืองหมายที ่ ่ชอง Serial Enumerator แลวคลิกปุม OK


     65

(9) จะกลับมายังหนาตาง USB Serial Port Properties อีกครั้ง แตหมายเลข COM port ทีไตเติ ่ ลบารจะ เปลี่ยนเปน COM4 คลิกปุม OK เพื่อผานขันตอนนี ้ ้ไป

(10) จากนันให ้ ปลดสาย UCON-4 ออกจากพอรต USB ของคอมพิวเตอร แลวเสียบเขาไปใหมอีกครัง้ จากนันทํ ้ าการตรวจสอบตําแหนงของพอรตอนุกรมเสมือนดวยวิธีการเดิม ทีได ่ นําเสนอไปแลว จะพบวาตําแหนงของ พอรตอนุกรมเสมือนจะเปลียนเป ่ น COM4 อยางสมบูรณ


     66

5.5. ทดสอบการทํางานของแผงวงจรควบคุมของหุนยนต  POP-BOT หลังจากทีติ่ ดตังโปรแกรมและไดรเวอร ้ ของตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรมเสร็จเรียบรอย แลว จะเริ่มทดสอบการทํางานของโมดูล POP-MCU ซึงเป ่ นอุปกรณหลักของแผงวงจรควบคุมของหุนยนต POPBOT ดวยการนําโปรแกรมตัวอยางมาคอมไพล และอัปโหลดโปรแกรมไปยังโมดูล เรียกโปรแกรม Arduino ขึนมาใช ้ งาน โดยคลิกปุม Start  All Programs POP-168 Software Package  Arduino เมื่อ Arduino ทํางานในครั้งแรกจะมีหนาจอดังรูป


     67

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

5.5.1.1 เลือกเบอรของไมโครคอนโทรลเลอร เลือกเมนู Tools  Board  POP-168 หรือ Arduino Mini (ใชไดทั้งสองรุน) ดังรูป

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

พอรตอนุกรมที่ใชกับโมดูล POP-MCU เปนไดทั้งพอรตอนุกรมปกติที่มาพรอมกับคอมพิวเตอร ปกติคือ พอรต COM1 หรือ COM2 และพอรตอนุกรมเสมือน (virtual COM port) ที่ติดตั้งเพิ่มเติมผานสายแปลงสัญญาณ พอรต USB เปนพอรตอนุกรม RS-232 ปกติคือพอรต COM ที่มีหมายเลขมากกวา 2 ขึนไป ้ ในตัวอยางเลือกพอรต COM3 ซึงเป ่ นพอรตอนุกรมที่มาจากสายแปลงจากพอรต USB เปนพอรตอนุกรม


     68

5.5.2 ทดลองเปดโปรแกรมตัวอยาง Arduino จะเรียกโปรแกรมที่เขียนขึนว ้ า สเก็ตชบุก (Sketchbook) และใน Arduino มีตัวอยางโปรแกรม มาพรอมสําหรับการทดสอบในเบืองต ้ น การอัปโหลดโปรแกรมทําไดโดยคลิกเลือกเมนู File  Sletchbook  Examples  Digital  Blink ดังรูป

เมื่อเลือกไฟลแลว ที่พื้นทีแสดงโปรแกรมของ ่ Arduino จะแสดงซอรสโคดภาษาซีของโปรแกรมดังรูป


     69

5.5.3 คอมไพลโปรแกรม เมือเป ่ ดไฟลโปรแกรมแลว จากนันทํ ้ าการคอมไพลโปรแกรม เลือกเมนู Sketch  Verify/Compile ดังรูป หรือกดที่ปุม

เมือคอมไพล ่ โปรแกรมแลว สามารถตรวจสอบการคอมไพลทีแถบแสดงสถานะและหน ่ าตางแสดงผลการ คอมไพล ซึ่งเปนหนาตางสีดําอยูดานลางของโปรแกรม ที่แถบแสดงสถานะจะปรากฏขอความ Done compiling และหนาตางแสดงผลแสดงขอความวา Binary sketch size: 1108 bytes (of a 14336 byte maximum) ดังแสดงใน รูปที่ 5-2 แสดงวาโปรแกรมภาษาเครื่องทีได ่ จากการคอมไพลมีขนาด 1,108 ไบต จากขนาดของหนวยความจําแฟลช ของไมโครคอนโทรลเลอรทั้งหมดทีใช ่ งานได 14,336 ไบต แถบแสดงสถานะ

หนาตางแสดงผลการทํางาน

รูปที่ 5-2 แถบสถานะแสดงขอความ Done Compiling เพือแจ ่ งวา การคอมไพลถูกตอง พรอมกันนันยั ้ งแจง ขนาดของไฟลทีได ่ จากการคอมไพลดวย


     70

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

ตอกับพอรต USB ของคอมพิวเตอร สาย UCON-4

1

15/A1 RESET

ATMEGA168

16/A2

14/A0 18/SDA/A4 19/SCL/A5

A

SERVO PORT

BAT

POWER

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

-

+Vm 7 Di4

13

A7

12

A6

MOTOR B

+ON

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

4-12Vdc

RS-232

คอมพิวเตอร

POP-168

หุนยนต POP-BOT


     71

(2) กําหนดใหโมดูล POP-MCU เขาสูโหมดโปรแกรม ซึงทํ ่ าได 2 แบบคือ

(2.1) ใชสวิตช RESET และ BL ของโมดูล POP-MCU

+ON

A

MOTOR

1

B

ON

4-12Vdc

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

RS-232

(2.1.1) กดสวิตช RESET คางไว (สวิตชกดปุมสีดําบนบอรด RBX-168) (2.1.2) กดสวิตช BL บนโมดูล POP-MCU คางไว

BAT

POWER

ATMEGA168

SERVO PORT

1

16/A2

14/A0 18/SDA/A4 19/SCL/A5

15/A1 RESET

Port function

-

+Vm 7 Di4

13

12

A7

+Vm 8

Di2

Number : Digital Ax : Analog pin x

A6

2

-

กดสวิตช RESET คางไว กดสวิตช BL คางไว

POP-168

หุนยนต POP-BOT

(2.1.3) ปลอยสวิตช RESET กอน ถัดมาจึงปลอยสวิตช BL

A

4

BAT

1

15/A1 RESET

ATMEGA168

16/A2

14/A0 18/SDA/A4 19/SCL/A5

5 SERVO PORT

POWER

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

ปลอยสวิตช RESET ปลอยสวิตช BL LED สีน้ําเงินติดสวาง แจงวา เขาส���โหมดโปรแกรมแลว

-

+Vm 7 Di4

13

A7

12

A6

MOTOR B

+ON

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

4-12Vdc

RS-232

3

POP-168

หุนยนต POP-BOT


     72

(2.1.4) สังเกต LED สีนําเงิ ้ นบนโมดูล POP-MCU จะติดคาง แสดงวา ตัวโมดูล POP-MCU เขาสูการ ทํางานในโหมดโปรแกรม พรอมสําหรับการอัปโหลดโปรแกรมแลว

LED แสดงการทํางาน (สีน้ําเงิน) โหมดโปรแกรม : ติดคาง แจงการเขาสูโหมดโปรแกรม โหมดรัน : LED แสดงสถานะลอจิกขา Di 13

POP-168

13

ATMEGA168

1

12

(2.2 ) ใชสวิตชเปดปดไฟเลี้ยง และสวิตชกด BL ของโมดูล POP-MCU

2

กดสวิตช BL คางไว

A

MOTOR

ATMEGA168

16/A2

RESET

SERVO PORT

1

15/A1

14/A0 18/SDA/A4 19/SCL/A5

ปดสวิตช POWER

BAT

POWER

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

-

+Vm 7 Di4

13

A7

12

A6

1

B

+ON

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

4-12Vdc

RS-232

(2.2.1) ปดสวิตชไฟเลียงหรื ้ อ POWER (สวิตชเลือนบนบอร ่ ด RBX-168) (2.2.2) กดสวิตช BL บนโมดูล POP-MCU คางไว

POP-168

หุนยนต POP-BOT


     73

(2.2.3) เปดสวิตช POWER เพื่อจายไฟเลียงก ้ อน ถัดมาจึงปลอยสวิตช BL

A

4

BAT

POWER

5 1

RESET

ATMEGA168

16/A2

14/A0 18/SDA/A4 19/SCL/A5

15/A1 Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

เปดสวิตช POWER ปลอยสวิตช BL LED สีน้ําเงินติดสวาง แจงวา เขาสูโหมดโปรแกรมแลว

-

+Vm 7 Di4

13

A7

12

A6

MOTOR B

+ON

SERVO PORT

ON

4-12Vdc

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

RS-232

3

POP-168

หุนยนต POP-BOT

(2.2.4) สังเกต LED สีนําเงิ ้ นบนโมดูล POP-MCU จะติดคาง แสดงวา ตัวโมดูล POP-MCU เขาสูการ ทํางานในโหมดโปรแกรม พรอมสําหรับการอัปโหลดโปรแกรมแลว

LED แสดงการทํางาน (สีน้ําเงิน) โหมดโปรแกรม : ติดคาง แจงการเขาสูโหมดโปรแกรม โหมดรัน : LED แสดงสถานะลอจิกขา Di 13

POP-168

13

ATMEGA168

1

12

(3) ที่โปรแกรม Arduino เลือกเมนู File  Upload to I/O Board


     74

(4) เมื่ออัปโหลดเสร็จสมบูรณที่แถบแสดงสถานะของโปรแกรมจะขึนข ้ อความ Done Uploading

(5) เมื่ออัปโหลดโปรแกรมเสร็จแลว ใหกดสวิตช RESET อีกครั้งเพื่อใหโปรแกรมทํางาน โปรแกรม Blink จะสั่งให LED ที่ตอกับขาพอรต 13 ของ Arduino Mini หรือ POP-MCU ซึ่งคือ LED สีนําเงิ ้ นที่อยูมุมบนซายของโมดูล POP-MCU ติดสวางนาน 1 วินาทีและดับ 1 วินาทีสลับกันไปตลอดเวลา ถา LED สีนําเงิ ้ น ติดดับสลับกัน แสดงวาฮารดแวรและซอฟตแวรของบอรดทํางานไดปกติ ทั้งหมดนี้คือ การเตรียมการและการพัฒนาโปรแกรมภาษา C ดวย Arduino สําหรับหุนยนต POP-BOT ขันต ้ น ในการพัฒนาโปรแกรมควบคุมหุนยนตของกิจกรรมถัดไปนับจากนีจะใช ้ ขั้นตอนในการพัฒนาโปรแกรม และอัปโหลดหรือดาวนโหลดโปรแกรมในลักษณะเดียวกัน จะเห็นไดวา การพัฒนาโปรแกรมภาษา C สําหรับ ไมโครคอนโทรลเลอรหรือหุนยนตอัตโนมัติดวย Arduino มีความสะดวกและสามารถดําเนินการขันตอนทั ้ งหมด ้ ภายในหนาตางการทํางานหลักเพียงหนาตางเดียว


     75



  การพัฒนาโปรแกรมภาษา C/C++ ดวย Arduino สําหรับหุนยนต  POP-BOT ดําเนินการภายใตการสนับสนุน ของไฟลไลบรารี popbot.h ทังนี ้ เพื ้ อช ่ วยลดขันตอนและความซั ้ บซอนในการเขียนโปรแกรมเพือควบคุ ่ มสวนตางๆ ของฮารดแวรลง

6.1 ชุดคําสังภายในไลบรารี ่ popbot.h สําหรับแสดงผลขอความและตัวเลขที่โมดูล SLCD16x2 ของ POP-BOT  sleep เปนคําสั่งสําหรับหนวงเวลา  in เปนคําสั่งอานคาอินพุตดิจิตอล  out เปนคําสั่งสงคาออกทางขาพอรตเอาตพุตดิจิตอล ่ อกับตัวตรวจจับ  analog เปนคําสั่งอานคาจากอินพุตอะนาลอกทีต  sound เปนคําสั่งสรางเสียงที่เปลี่ยนความถี่ไดเพื่อขับออกลําโพง  beep เปนคําสั่งขับเสียงเตือนออกลําโพง  motor เปนคําสั่งขับมอเตอร  motor_stop เปนคําสั่งหยุดขับมอเตอร  off เปนคําสั่งหยุดขับมอเตอร  ao เปนคําสั่งหยุดขับมอเตอรทั้งหมดพรอมกัน  servo เปนคําสั่งขับเซอรโวมอเตอร  servo_stop เปนคําสั่งหยุดขับเซอรโวมอเตอร  servo_read เปนคําสั่งอานคาตําแหนงแกนหมุนของเซอรโวมอเตอร  servo_get_status เปนคําสั่งอานคาสถานะของเซอรโวมอเตอร  uart เปนคําสังส ่ งขอความอนุกรมของ POP-BOT  uart_putc เปนคําสั่งกําหนดตัวอักษรที่ตองการสง  uart_puts เปนคําสั่งกําหนดขอความสายอักขระที่ตองการสง  uart_set_baud เปนคําสั่งกําหนดอัตราเร็วในการถายทอดขอมูลอนุกรม  uart_get_baud เปนคําสั่งอานคาอัตราเร็วในการถายทอดขอมูลอนุกรม  uart_available เปนคําสั่งเปดการสือสารข ่ อมูลอนุกรม  uart_getkey เปนคําสั่งอานคาขอมูลอนุกรม 

lcd


     76

ในการเรียกใชงานชุดคําสั่งยอยตางๆ เพื่อการพัฒนาโปรแกรมควบคุมหุนยนต POP-BOT ผูพัฒนาตอง ผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง #include <popbot.h>

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

6.2 รายละเอียดของฟงกชั่นหรือคําสังหลั ่ กในไฟลไลบรารี popbot.h 6.2.1 ฟงกชันเกี ่ ่ยวกับการแสดงผลผานโมดูล SLCD16x2 6.2.1.1 lcd เปนคําสั่งแสดงผลขอความที่โมดูล SLCD16x2 การเชื่อมตอทางฮารดแวร - ตอสายสัญญาณของโมดูล SLCD16x2 เขากับพอรต Di 16 (หรือ An 3) ของหุนยนต  POP-BOT รูปแบบ

void lcd(char *p,...) พารามิเตอร p - รับรหัสสําหรับกําหนดกลุมขอความที่ตองการแสดงผลทีโมดู ่ ล SLCD16x2 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพือร ่ วมแสดงผลคาขอมูลตัวเลขรูปแบบอืนๆ ่ อันไดแก รหัสบังคับ การทํางาน %c หรือ %C รับคาการแสดงผลตัวอักษร 1 ตัว %d หรือ %D รับคาการแสดงผลตัวเลขฐานสิบในชวง -32,768 ถึง +32,767 %l หรือ %L รับคาการแสดงผลตัวเลขฐานสิบในชวง -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F รับคาเพือแสดงผลข ่ อมูลแบบจํานวนจริง (แสดงทศนิยม 3 หลัก) #c คําสังเคลี ่ ยรขอความกอนแสดงผลในครั้งถัดไป #n คําสังตั ่ ดขอความไปแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง) ตัวอยางที่ 6-1 lcd(“Hello LCD”); // แสดงขอความ Hello LCD ที่โมดูล LCD ผลลัพธที่โมดูล LCD

H e l l o o L C D rb o a r d r W i r i n g I / Ob R o b o t d


     77

ตัวอยางที่ 6-2 lcd(“abcdefghijklmnopqrstuvwxyz”); // แสดงผลขอความเมือสายอั ่ กขระเกิน 16 ตัวอักษร อักขระตัวถัดไปจะขึนบรรทั ้ ดที่ 2 (บรรทัดลาง) ทันที ผลลัพธที่โมดูล LCD abcdefghijklmnop q r s t u v w x yz R o b o t d

ตัวอยางที่ 6-3 lcd(“Value: %d unit “,518); // แสดงขอความรวมกับขอมูลตัวเลข (518) ทีโมดู ่ ล LCD ผลลัพธที่โมดูล LCD Value:g518kunitp q r s t u v w x yz R o b o t d

ตัวอยางที่ 6-4 lcd(“Value: %d “,analog(4)); ผลลัพธที่โมดูล LCD

// แสดงผลคาอะนาลอกชอง ADC4 ที่โมดูล LCD

Value:gxxxkunitp q r s t u v w x yz R o b o t d

โดยที่ xxx คือคาที่อานได มีคาตั้งแต 0 ถึง 1023 ตัวอยางที่ 6-5 char c_test=’j’; lcd(“abcd%cxyz”,c_test);// แสดงอักขระ j รวมกับขอความอื่นๆ ผลลัพธที่โมดูล LCD abcdjxyzxxkunitp q r s t u v w x yz R o b o t d


     78

ตัวอยางที่ 6-6 lcd(“Value: %f “,125.450); // แสดงขอความรวมกับตัวเลขที่โมดูล LCD (แสดงทศนิยม 3 หลัก) ผลลัพธที่โมดูล LCD

Value:g125.450tp q r s t u v w x yz R o b o t d

ตัวอยางที่ 6-7 lcd(“count1: %d #ncount2: %d”,12,48); // แสดงขอความรวมกับ 2 รหัสควบคุม และคียพิเศษ #n // เพือกํ ่ าหนดใหกลุมขอความที่ตอทาย #n จะถูกนํามาแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง) ผลลัพธที่โมดูล LCD

count1:112.450tp c o u n t 2 : x 48 R o b o t d

6.2.1.2 slcdPin ใชเลือกขาพอรตของ POP-BOT สําหรับเชื่อมตอกับโมดูล SLCD16x2 เลือกได 2 พอรตคือ Di15 (ตรงกับขา An1) และ Di16 (ตรงกับขา An2) โดย Di16 เปนพอรตตั้งตน ควรใชคําสั่งนีในการเลื ้ อกพอรต ตังแต ้ ใน สวนของฟงกชั่น setup กอนเรียกคําสั่งการแสดงผลที่โมดูล SLCD16x2 รูปแบบ

slcdPin(pin); พารามิเตอร pin - ขาพอรตทีต่ องการตอกับโมดูล SLCD16x2 มีคา 15 และ 16 โดยคา 16 เปนคาตั้งตน ตัวอยางที่ 6-8 slcdPin(15); // กําหนดการใชงานโมดูล SLCD16x2 ใหตอกับพอรต 15 แทนพอรต 16 ของ POP-BOT


     79

6.2.2 ฟงกชันเกี ่ ่ยวกับเวลา มีฟงกชั่นเดียวคือ sleep

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

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

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

void beep() ตัวอยางที่ 6-10 beep();

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

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

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


     80

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

char in(x) พารามิเตอร x - กําหนดขาพอรตทีต่ องการอานคา มีคาเปน 2, 4 และ 15 ถึง 19 ซึงก็ ่ คือขา Di2, Di4, Di15 ถึง Di19 การคืนคา เปน 0 หรือ 1 ตัวอยางที่ 6-12 char x; // ประกาศตัวแปร x เพื่อเก็บคาผลลัพธจาการอานคาระดับสัญญาณ x = in(2); // อานคาดิจิตอลจากพอรต Di2 มาเก็บไวทีตั่ วแปร x

6.2.4.2 out เปนฟงกชั่นกําหนดระดับสัญญาณหรือขอมูลดิจิตอลไปยังพอรตที่กําหนด รูปแบบ out(char _bit,char _dat) พารามิเตอร _bit - กําหนดขาพอรตทีต่ องการ มีคาเปน 2, 4 และ 15 ถึง 19 ซึ่งก็คือขา Di2, Di4, Di15 ถึง Di19 ตัวอยางที่ 6-13 out(4,1); // กําหนดใหขาพอรต Di4 เปน “1” out(15,0); // กําหนดใหขาพอรต Di15 เปน “0”

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

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


     81

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

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

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

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


     82

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

void servo(unsigned char _ch,unsigned int _pos)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180 ผูพัฒนาโปรแกรมจําเปน ตองเขียนโปรแกรมทดสอบปรับคาตําแหนงใหเหมาะสมกับเซอรโวมอเตอรในแตละรุนหรือตางผูผลิตกันไป

6.2.6.2 servo_stop เปนฟงกชั่นหยุดขับเซอรโวมอเตอร รูปแบบ

void servo_stop(char _ch)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 (พอรต Di7), 8 (พอรต Di8) และ ALL ในกรณีทีต่ องการหยุดขับ เซอรโวมอเตอรทุกชอง

6.2.6.3 servo_read เปนฟงกชั่นอานคาตําแหนงแกนหมุนของเซอรโวมอเตอร รูปแบบ

int servo_read(char ch)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT การคืนคา คาตําแหนงแกนหมุนของเซอรโวมอเตอรทีกํ่ าลังขับอยู ณ ปจจุบัน

6.2.6.4 servo_get_status เปนฟงกชั่นอานสถานะการทํางานของเซอรโวมอเตอร รูปแบบ

int servo_get_status(char _ch)

พารามิเตอร _ch - กําหนดชองของเซอรโวมอเตอรทีใช ่ งาน  มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT การคืนคา - เปน “1” เมื่อเซอรโวมอเตอรในชองที่เรียกอานสถานะถูกใชงานอยู - เปน “0” เมื่อเซอรโวมอเตอรในชองที่เรียกอานสถานะไมไดถูกใชงาน


     83

6.2.7 ฟงกชันเกี ่ ่ยวกับการสื่อสารขอมูลอนุกรมกับคอมพิวเตอร 6.2.7.1 uart เปนฟงกชั่นสําหรับสงขอมูลสายอักขระออกจากโมดูล UART ของ POP-BOT ไปยังคอมพิวเตอรผานทาง สาย UCON-4 ซึงต ่ อกับพอรต USB ของคอมพิวเตอร โดยสาย UCON-4 ทําหนาที่เปนตัวแปลงสัญญาณพอรต USB เปนพอรตอนุกรม เพื่อทําใหหุนยนต POP-BOT ติดตอสือสารข ่ อมูลอนุกรมกับคอมพิวเตอรผานทางพอรต USB ได มีอัตราบอดเริ่มตนที่ 9,600 บิตตอวินาที รูปแบบ

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 กําหนดใหขอความขึ้นบรรทัดใหม

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

void uart_set_baud(unsigned int baud) พารามิเตอร baud - อัตราบอดในการสือสารของโมดู ่ ล UART กับคอมพิวเตอร มีคา 2400 ถึง 38,400 บิตตอวินาที ตัวอยางที่ 6-18 uart_set_baud(4800); // กําหนดอัตราบอดในการสื่อสารขอมูลเปน 4,800 บิตตอวินาที


     84

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

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

6.2.7.4 uart_getkey เปนฟงกชั่นอานขอมูลจากบัฟเฟอรตัวรับของโมดูลสือสารข ่ อมูลอนุกรมภายในไมโครคอนโทรลเลอร รูปแบบ

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


     85

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

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

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

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

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


     86


     87



  ในบทนีนํ้ าเสนอการเขียนโปรแกรมเพือขั ่ บเคลือนหุ ่ นยนต  POP-BOT โดยหัวใจหลักคือ การเขียนโปรแกรม เพือควบคุ ่ มใหโมดูลไมโครคอนโทรลเลอร POP-MCU สงสัญญาณไปยังวงจรขับมอเตอรซึงใช ่ ไอซีเบอร TB6612 เพือขั ่ บใหมอเตอรหมุนไปในทิศทางและดวยความเร็วตามทีต่ องการ

7.1 ไมโครคอนโทรลเลอรกับการขับมอเตอรไฟตรง การใชงานไมโครคอนโทรลเลอรเพือขั ่ บโหลดกระแสสูงอยางมอเตอร มีวิธีการควบคุมอยางมากมาย ตังแต ้ ควบคุมใหหมุนหรือหยุดหมุน, ควบคุมการล็อกหรือปลอยแกนหมุน, ควบคุมทิศทางการหมุน และควบคุมความเร็ว ในการหมุน ซึงแต ่ ละวิธีจะใชอุปกรณและวิธีการทีแตกต ่ างกัน แตสิงหนึ ่ งที ่ จํ่ าเปนอยางยิงคื ่ อ วงจรขับมอเตอร (motor driver) ทังนี ้ เนื ้ องจากไมโครคอนโทรลเลอร ่ มีความสามารถในการจายกระแสทีจํ่ ากัดและคอนขางตําคื ่ อ 20mA (ใน กรณีใชไมโครคอนโทรลเลอร ATmega168) ในขณะทีมอเตอร ่ ตองการกระแสไฟฟามากกวานัน้ ดังนันวงจรขั ้ บ มอเตอรจะเขามาทําหนาทีนั่ น้ โดยรับสัญญาณกระตุน และสัญญาณกําหนดความเร็วในการควบคุมมอเตอรมาจาก ไมโครคอนโทรลเลอร สวนวงจรขับมอเตอรทําหนาทีขั่ บมอเตอรโดยตรง ใหหมุนหรือล็อกแกน หรือหมุนในทิศทางใด และถายทอดพลังงานไปยังมอเตอรเพือให ่ สามารถหมุนไดเร็วตามทีกํ่ าหนดมาจากไมโครคอนโทรลเลอร

7.2 ควบคุมความเร็วของมอเตอร ในการขับมอเตอรโดยปกติจะปอนแรงดันไฟตรงใหโดยตรง มอเตอรจะทํางานเต็มกําลัง ซึงอาจมี ่ ความเร็ว มากเกินไป ดังนันการปรั ้ บความเร็วของมอเตอรจึงใชวิธีลดแรงดันไฟฟาทีป่ อนใหกับมอเตอร วิธีทีนิ่ ยมคือ การปอน พัลสไปขับมอเตอรแทน แลวปรับความกวางพัลสชวงบวก เพือให ่ ไดคาแรงดันเฉลียตามต ่ องการ วิธีการนีเรี้ ยกวา พัลสวิดธมอดูเลเตอร (PWM) โดยความกวางพัลสชวงบวกเมือเที ่ ยบกับความกวางพัลสทังหมดเรี ้ ยกวา ดิวตีไซเกิ ้ ล โดย จะคิดคาดิวตีไซเกิ ้ ลเปนเปอรเซ็นตของคาความกวางพัลสทังหมด ้ ตัวอยางจากรูปที่ 7-1 (ข) มีคาดิวตี้ไซเกิล 50% หมายถึง ความกวางของพัลสชวงบวกมีความกวางเปน 50% ของความกวางทั้งหมด ดังนันแรงดั ้ นเฉลียที ่ ่ไดเทากับ (50 x 4.8) /100 = 2.4V สําหรับรูปที่ 7-1 (ค) และ (ง) เปนการ กําหนดคาดิวตี้ไซเกิล 75% และ 25% ตามลําดับ


     88

แรงดัน (V)

แรงดัน (V)

4.8V

4.8V

แรงดันเฉลี่ย

ดิวตี้ไซเกิล 50%

2.4V

(ก) แรงดัน (V)

แรงดันเฉลี่ย

เวลา

ดิวตี้ไซเกิล 75%

4.8V

(ข) แรงดัน (V)

เวลา

แรงดันเฉลี่ย ดิวตี้ไซเกิล 25 %

4.8V

3.6V 1.2V

(ค)

เวลา

(ง)

เวลา

รูปที่ 7-1 แสดงการเปรียบเทียบคาแรงดันทีเกิ ่ ดขึนเมื ้ อใช ่ PWM (ก) ปอนสัญญาณไฟตรง (ข) PWM มีดิวตี้ไซเกิล 50% (ค) PWM มีดิวตี้ไซเกิล 75% (ง) PWM มีดิวตี้ไซเกิล 25%

7.3 การสรางสัญญาณ PWM ของ Arduino ใน Arduino มีฟงกชัน่ analogWrite() ทําใหโมดูลไมโครคอนโทรลเลอ��� POP-MCU สามารถสรางสัญญาณ อะนาลอกสงออกทางขาพอรตเอาตพุตได โดยอาศัยเทคนิคการสรางสัญญาณ PWM (Pulse Width Modulation) หรือ สัญญาณมอดูเลชันทางความกว ่ างพัลส ผูใช  งานสามารถปรับคาดิวตีไซเกิ ้ ลของสัญญาณพัลสได โดยคาดิวตีไซเกิ ้ ลมี คาระหวาง 0 ถึง 255 เมือค ่ าเปน 0 แรงดันทีขาที ่ กํ่ าหนดไวจะมีคาคงทีเป ่ น 0V เมือมี ่ คาเปน 255 แรงดันทีขาพอร ่ ตนัน้ เทากับ +5V สําหรับคาระหวาง 0 ถึง 255 จะทําใหขาทีกํ่ าหนดไวมีแรงดันเปลียนแปลงสลั ่ บไปมาระหวาง 0 และ 5V ถามีคาสูงขึนช ้ วงเวลาทีขาพอร ่ ตนันเป ้ น 5V จะนานขึน้ ถาคาเปน 51 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานาน 20% ของคาบเวลา และมีแรงดัน 0V นาน 80% ของคาบเวลา หรือมีคาดิวตี้ไซเกิลเทากับ 20%นันเอง ่ ถามีคาเปน 127 สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานครึ่งหนึ่งของคาบเวลา และ 0V นานครึ่งหนึ่งของคาบเวลา หรือมีคาดิวตี้ไซเกิล 50% ถามีคาเปน 191 นันคื ่ อ สัญญาณพัลสจะมีระดับสัญญาณ +5V เปนเวลานานสามสวนสีของคาบเวลา ่ และมีแรงดัน 0V นานหนึงส ่ วนสีของคาบเวลา ่ หรือมีคาดิวตี้ไซเกิล 75% ในรูปที่ 7-2 แสดงสัญญาณ PWM ที่คาดิวตี้ไซเกิลตางๆ


     89

ดิวตีไซเกิ ้ ลของสัญญาณพัลส สามารถคํานวณไดจาก

20%

tW 50%

T t D  w  100% T

75%

โดยที่ tw คือความกวางของพัลส T คือ คาบเวลาของสัญญาณ พัลส 1 ลูก นั่นหมายความวา ความถี่จะ ไมมีผลตอการปรับหรือเปลียนแปลง ่ ดิวตี้ไซเกิลแตอยางใด

รูปที่ 7-2 แสดงสัญญาณ PWM ทีค่ าดิวตี้ไซเกิลตางๆ คาแรงดันของสัญญาณพัลสจะไดเปนคาเฉลียของสั ่ ญญาณพัลส ซึงสามารถคํ ่ านวณไดจากความสัมพันธทาง คณิตศาสตรตอไปนี้ Outout_voltage = (on_time / off_time) * max_voltage เราสามารถนําสัญญาณ PWM ที่ไดจากคําสั่ง analogWrite() นีไปปรั ้ บความสวางของ LED หรือตอ ขยายกระแสเพือควบคุ ่ มความเร็วของมอเตอรไฟตรงได หลังจากเรียกใชคําสังนี ่ แล ้ วขาพอรตทีกํ่ าหนดจะมีสัญญาณ PWM สงออกมาอย างตอเนื่อง จนกวาจะมีการเรียกใชคําสั่ง a na logWrite ในรอบใหม หรือเรียกคําสั่ง digitalRead หรือ digitalWrite ที่ขาพอรตเดียวกัน ฮารดแวร Arduino มีขาพอรตทีทํ่ าหนาทีเป ่ นเอาตพุตอะนาลอกได 6 ขา คือ ขา 3, 5, 6, 9,10 และ 11 สําหรับ โมดูล POP-MCU จะมีขาตอใหเห็นชัดเจนคือขา 3, 5, 6 และ 9 ทีเขี ่ ยนเปน Di 3, Di 5, Di 6 และ Di 9 สวนขา 10 จะตอออกทีขา ่ PB2 และขา 11 จะตอกับขา MOSI ของคอนเน็กเตอร In-System Programming (ISP) การสังให ่ ขาพอรตทํางานสรางสัญญาณ PWM ตองสั่งผานฟงกชั่น analogWrite() ซึงมี ่ รูปแบบดังนี้ analogWrite(pin,value);

เมือ่ pin คือ หมายเลขขาพอรตทีต่ องการ (3, 5, 6, 9 ถึง 11 สําหรับ POP-MCU กําหนดได 4 ขาคือ 3, 5, 6 และ 9) value

คาดิวตี้ไซเกิลทีต่ องการ คาจาก 0 ถึง 255


     90

7.4 ฟงกชั่นขับมอเตอร เพื่อใหการเขียนโปรแกรมภาษา C/C++ เพื่อขับมอเตอรของหุนยนต POP-BOT ทําไดงายขึ้น จึงมีการ สรางฟงกชั่นขับมอเตอรขึน้ รวมเขาไวในไฟลไลบรารี popbot.h ดังมีรายละเอียดของคําสั่งตางๆ ดังนี้

7.4.1 motor เปนฟงกชั่นขับเคลือนมอเตอร ่ ไฟตรง รูปแบบ

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

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

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


     91

       เปดโปรแกรม Arduino IDE เพือเขี ่ ยนโปรแกรมที่ A1-1 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันปลดสายดาวน ้ โหลดออก นําหุนยนต  มาวางทีพื่ นแล ้ วเปดสวิตชจายไฟ สังเกตการทํางานของหุน ยนต หลังจากเปดสวิตชเพื่อจายไฟใหหุนยนต  ทํางาน หุนยนต  จะเริมเคลื ่ ่อนทีทั่ นที โดยเริมเคลื ่ ่อนที่ตรงไป ขางหนากอน จะสังเกตเห็นวาไฟ LED ทีตํ่ าแหนงมอเตอรทังคู ้ ติดเปนสีเขียว จากนันอี ้ ก 1 วินาที LED จะเปลี่ยน เปนสีแดง ใหดูทิศทางการเคลือนที ่ ของหุ ่ นยนต  วาถูกตองหรือไมถาหุนยนต  เคลือนไม ่ ถูกตองใหสลับสายของมอเตอร จนหุนยนตเคลื่อนที่ไดถูกตอง /******************************************************************************* * POP-BOT V1.0 * Filename : Forward_Backward.pde * Running Forward/Backward Full Speed ********************************************************************************/ #include <popbot.h> // Include Library for POP-BOT #define POW 80 void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void backward(unsigned int time) { motor(1,-POW); motor(2,-POW); sleep(time); } void setup() {

12

A7 Number : Digital Ax : An alog pin x

Di2

16/A2

Port function ATMEGA16 8

14/A0 18/SDA/A4 19/SCL/A5

13

POP-168 A6

RESET

SERVO PORT

Di4 +Vm 7

-

+Vm 8

POWER

-

BAT

+ ON

A

RS- 232

ON

B

14: Speak er 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

4-12Vdc

1

15/A1

} void loop() { forward(1000); backward(1000); } /******************************************************************************/ MOTOR

- oRobo - SpinnerR ArduinoPOPRrobot

โปรแกรมที่ A1-1 ไฟล Forward_Backward.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน ่ หุนยนต  POP-BOT ใหเคลือนที ่ ไปข ่ างหนาและถอยหลังสลับกันอยางตอเนือง ่


     92

   โปรแกรมที่ A1-2 เปนการขับเคลื่อนหุนยนตโดยกําหนดคาการจายกําลังใหกับลอแตละลอไมเทากัน สง ผลใหหุนยนต  เคลื่อนที่เปนวงกลม นอกจากนี้ในโปรแกรมนี้ยังเพิ่มเติมคําสั่งตรวจสอบการกดสวิตชเพื่อหยุดการ ทํางานของหุนยนต  ดวย ถาหากกดสวิตช Di4 บนบอรดควบคุม หุนยนต  จะหยุดทํางาน

12

POP-168 AT MEG A168

16/A2 15/A1

POWER ON

Di4 +Vm 7

-

+Vm 8

-

BA T ON

+

B

RS-232

A

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

4-12Vdc

Di2

RESET 1

14/A0 18/SD A/A4 19/SCL/A5

A7 Nu mber : Digita l Ax : Ana log pin x

Port function

SERVO PORT

MOT OR

} void loop() { drive(30,90); if(in(4)==0) { motor_stop(ALL); while(1); } }

A6

13

/******************************************************************************* * POP-BOT V1.0 * Filename : MotorSpeedControl.pde * Left Motor Lowspeed and Right Motor Highspeed POP-BOT Run in Circle ********************************************************************************/ #include <popbot.h> // Include Library for POP-BOT void drive(char leftPow,char rightPow) { motor(1,leftPow); motor(2,rightPow); } void setup() {

- oRob o - Spin nerR Ardui noPOPR robot

/******************************************************************************/

โปรแกรมที่ A1-2 ไฟล MotorSpeedControl.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน ่ หุนยนต POP-BOT ใหเคลื่อนทีเป ่ นวงกลม ดวยการกําหนดใหความเร็วของมอเตอรแตละตัวของ หุนยนต  ไมเทากัน


     93

     โปรแกรมที่ A1-3 เปนการสังงานให ่ หุนยนต  เคลือนที ่ ตรงแล ่ วเลียวสลั ้ บกันไป โดยการเลือกทิศทางการเลียว ้ นันขึ ้ นอยู ้ กับการกดสวิตช SW1 หรือ SW2 ในขั้นตอนแรกกอนเริ่มตนการเคลื่อนที่ /******************************************************************************* * POP-BOT V1.0 * Filename : Rectangle_Running.pde * Running 90 Degree Turnleft And Turnright ********************************************************************************/ #include <popbot.h> // Include Library for POP-BOT #define POW 80 void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void turn_left(unsigned int time) { motor(1,-POW); motor(2,POW); sleep(time); } void turn_right(unsigned int time) { motor(1,POW); motor(2,-POW); sleep(time); } void setup() { 12

15/A1

14/A0 18/SDA/A4 19/SCL/A5

A7

+ ON

Number : Digital Ax : Analog pin x

Di2

RESET

1

16/A2

POWER

ATMEGA1 68

Port function

Di4

+Vm 7

-

+Vm 8

-

BAT

B

RS-232

A

14: Speak er 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

4-12Vdc

13

POP-168

A6

ON

SERVO PORT

MOTOR

- oRobo - SpinnerR ArduinoPOPRrobot

} void loop() { if(in(2)==0) { while(1) { forward(900); turn_left(400); } } if(in(4)==0) { while(1) { forward(900); turn_right(400); } } } /******************************************************************************/

โปรแกรมที่ A1-3 ไฟล Rectangle_Running.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบขับเคลือน ่ หุนยนต  POP-BOT ใหเคลือนที ่ เป ่ นสีเหลี ่ ยม ่


     94


     95



  ในชุด POP-BOT ไดบรรจุอุปกรณแสดงผลทีสามารถสํ ่ าหรับเชือมต ่ อกับแผงวงจรควบคุมหลักโดยใชการ สือสารข ่ อมูลอนุกรมในการสงขอมูล นันคื ่ อ SLCD16x2 โมดูล LCD แบบอนุกรม ขนาด 16 ตัวอักษร 2 บรรทัดแบบ มีไฟสองหลัง การติดตอจะใชสายสัญญาณเพียงเสนเดียว (ไมรวมไฟเลียง ้ +5V และกราวด) ทําใหสะดวกตอการ ใชงานมาก ตัวโมดูลจะมีจุดตออยูทางด  านหลัง และมีการกําหนดคาตางๆ ดังรูปที่ 7-1 ในการใชงานโมดูล SLCD16x2 เมื่อสั่งใหทํางานในโหมดมาตรฐาน กําหนดอัตราถายทอดขอมูลหรือ อัตราบอด 9600 บิตตอวินาที (bps : bit per second) จะสามารถใชงานดวยคําสั่งที่เหมือนกับโมดูล LCD แบบมาตร ฐาน สามารถสงรหัสตัวอักษร ASCII มายังโมดูล SLCD16x2 เพื่อแสดงผลไดทันที ในตารางที่ 7-1 แสดงรายละเอียดคําสั่งมาตรฐานของโมดูล LCD

8.1 การใชงานโมดูล SLCD16x2 จากรูปที่ 8-1 แสดงรายละเอียดของแผงวงจรดานหลังของโมดูล SLCD บนบอรดมีจัมเปอร ๊ เพื่อควบคุม การทํางานทังสิ ้ ้น 4 ตัว ดังมีรายละเอียดดังตอไปนี้

ปรับความสวางจอภาพ ตอกราวด ตอสัญญาณอนุกรม ตอไฟเลียง ้ + 5V

เลือกโหมดคําสั่ง

เลือกการแสดงผล

เลือกบอดเรต

เลือกลักษณะสัญญาณ

คําสั่งเพิ่มเติม (EX)

8 หลักตอบรรทัด (8)

9600 บิตตอวินาที (96)

กลับลอจิกหรือ RS-232 (IN)

คําสั่งมาตรฐาน (ST)

16 หลักตอบรรทัด (16)

2400 บิตตอวินาที (24)

เชื่อมตอโดยตรง (DI)

รูปที่ 8-1 แสดงการกําหนดรูปแบบการทํางานของโมดูล SLCD16X2 เมือนํ ่ ามาใชกับโมดูล POP-MCU (สังเกตจากสวนทีแรเงา) ่


    96

(1) จั๊มเปอรเลือกโหมดคําสั่ง (Mode command jumper) ใชเลือกโหมดของคําสั่งเพื่อควบคุมการ แสดงผลของโมดูล LCD ซึงเลื ่ อกได 2 โหมดคือ โหมดคําสั่งมาตรฐาน (ST) ซึงจะตรงกั ่ บโมดูล LCD ของ Scott Edwards ทีได ่ รับความนิยมทัวโลก ่ และโหมดคําสังเพิ ่ มเติ ่ ม (Extended mode command : EX) สําหรับการใชงานกับ POP-BOT สามารถเลือกไดทั้งแบบ ST และ EX (2) จั๊มเปอรเลือกบรรทัดของการแสดงผล (lines jumper) ใชเลือกจํานวนบรรทัดของการแสดงผล มีดวยกัน 2 แบบคือแบบ 1/8 Duty หมายถึง เลือกแสดงผล 8 หลักตอบรรทัด และแบบ 1/16 Duty หมายถึง เลือก แสดงผล 16 หลักหรือตัวอักษรตอบรรทัดหรือมากกวา ปกติเลือกไวที่ 1/16 ซึงหมายถึ ่ ง เลือกการแสดงผลแบบหลาย บรรทัด (3) จั๊มเปอรเลือกบอดเรตหรืออัตราเร็วในการสื่อสารขอมูลอนุกรม (baudrate select jumper) เลือก ได 2 คาคือ 2400 บิตตอวินาที และ 9600 บิตตอวินาที ในรูปแบบจํานวนบิตขอมูล 8 บิต ไมมีบิตพาริตี้ และมีบิต หยุด 1 บิต ปกติเลือกไวที่ 9600 (4) จัมเปอร ๊ เลือกรูปแบบของสัญญาณเชื่อมตอ (interface signal jumper) มีดวยกัน 2 แบบคือ แบบก ลับลอจิก (invert logic TTL/CMOS level : IN) กับแบบเชื่อมตอโดยตรง (direct logic TTL/CMOS level : DI) สําหรับการใชงานกับ POP-BOT เลือกติดตอแบบ DI การปรับความสวางของจอแสดงผลทําไดโดยปรับที่ตําแหนง BRIGHTNESS จุดเชือมต ่ อกับอุปกรณภายนอกมี 3 จุดคือ จุดตอไฟเลียง ้ +Vcc (+), อินพุตสัญญาณอนุกรม (serial input : S) และจุดตอกราวด (GND : G)

8.2 ฟงกชั่นของโปรแกรมภาษา C/C++ สําหรับติดตอกับโมดูล SLCD16x2 ของหุนยนต  POP-BOT การติดตอกับโมดูล SLCD16x2 ของหุนยนต POP-BOT โดยใชฟงกชั่นทีอยู ่ ภายในไลฟไลบรารี popbot.h จึงตองผนวกไฟลไลบรารีหลัก popbot.h ไวในตอนตนของโปรแกรมดวยคําสั่ง #include <popbot.h>

8.2.1 slcdPin ใชเลือกขาพอรตของ POP-BOT สําหรับติดตอกับโมดูล SLCD16x2 เลือกได 2 พอรตคือ Di15 (ตรงกับ ขา An1) และ Di16 (ตรงกับขา An2) โดย Di16 เปนพอรตตั้งตน ควรใชคําสั่งนีในการเลื ้ อกพอรต ตังแต ้ ในสวน ของฟงกชั่น setup กอนเรียกคําสั่งการแสดงผลที่โมดูล SLCD16x2 รูปแบบ

slcdPin(pin); พารามิเตอร pin - ขาพอรตทีต่ องการตอกับโมดูล SLCD16x2 มีคา 15 และ 16 โดยคา 16 เปนคาตั้งตน ตัวอยางที่ 8-1 slcdPin(15); // กําหนดใหตอโมดูล SLCD16x2 กับพอรต 15 แทนพอรต 16 ของ POP-BOT


     97

8.2.2 lcd เปนคําสั่งแสดงผลขอความที่โมดูล SLCD16x2 รูปแบบ

void lcd(char *p,...) พารามิเตอร p - รับรหัสสําหรับกําหนดกลุมขอความที่ตองการแสดงผลทีโมดู ่ ล SLCD16x2 โดยสามารถกําหนดรูปแบบ การแทรกสัญลักษณพิเศษเพือร ่ วมแสดงผลคาขอมูลตัวเลขรูปแบบอืนๆ ่ อันไดแก รหัสบังคับ การทํางาน %c หรือ %C รับคาการแสดงผลตัวอักษร 1 ตัว %d หรือ %D รับคาการแสดงผลตัวเลขฐานสิบในชวง -32,768 ถึง +32,767 %l หรือ %L รับคาการแสดงผลตัวเลขฐานสิบในชวง -2,147,483,648 ถึง +2,147,483,647 %f หรือ %F รับคาเพือแสดงผลข ่ อมูลแบบจํานวนจริง (แสดงทศนิยม 3 หลัก) #c คําสังเคลี ่ ยรขอความกอนแสดงผลในครั้งถัดไป #n คําสังตั ่ ดขอความไปแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง) ตัวอยางที่ 8-2 lcd(“Hello LCD”); // แสดงขอความ Hello LCD ที่โมดูล LCD ตัวอยางที่ 8-3 lcd(“abcdefghijklmnopqrstuvwxyz”); // แสดงผลขอความเมือสายอั ่ กขระเกิน 16 ตัวอักษร อักขระตัวถัดไปจะขึนบรรทั ้ ดที่ 2 (บรรทัดลาง) ทันที ตัวอยางที่ 8-4 lcd(“Value: %d unit “,518); // แสดงขอความรวมกับขอมูลตัวเลข (518) ทีโมดู ่ ล LCD ตัวอยางที่ 8-5 lcd(“Value: %d “,analog(4)); // แสดงผลคาอะนาลอกชอง ADC4 ที่โมดูล LCD ตัวอยางที่ 8-6 char c_test=’j’; lcd(“abcd%cxyz”,c_test); // แสดงอักขระ j รวมกับขอความอื่นๆ ตัวอยางที่ 8-7 lcd(“Value: %f “,125.450); // แสดงขอความรวมกับตัวเลขที่โมดูล LCD (แสดงทศนิยม 3 หลัก) ตัวอยางที่ 8-8 lcd(“count1: %d #ncount2: %d”,12,48); // แสดงขอความรวมกับ 2 รหัสควบคุม และคียพิเศษ #n // เพือกํ ่ าหนดใหกลุมขอความที่ตอทาย #n จะถูกนํามาแสดงผลยังบรรทัดที่ 2 (บรรทัดลาง)


    98

     A2.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A2-1 A2.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันรั ้ นโปรแกรม สังเกตผลการทํางานผาน จอแสดงผลของโมดูล SLCD โมดูล SLCD แสดงขอความ Hello World

!

/******************************************************************************* * POP-BOT V1.0 * Filename : SimpleLCD.pde * Show Text on LCD ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** #include <popbot.h> // Include Library for POP-BOT void setup() { } void loop() { lcd(“Hello World!”); while(1); }

โปรแกรมที่ A2-1 ไฟล SimpleLCD.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบการติดตอและ แสดงขอความผานโมดูล SLCD16x2 ของหุนยนต  POP-BOT


     99

    การติดตอกับโมดูล SLCD ผูใช  งานสามารถกําหนดบรรทัดในการแสดงผลขอมูล เคลียรจอแสดงผล หรือ เลือกรูปแบบในการแสดงผลขอมูลได ดวยการสงคําสั่งควบคุมตามที่กําหนดในฟงกชัน่ lcd A3.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A3-1 A3.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันรั ้ นโปรแกรม สังเกตผลการทํางานผาน จอแสดงผลของโมดูล SLCD โมดูล SLCD แสดงขอความหลากหลายตามที่มีการกําหนดจากโปรแกรม /******************************************************************************* * POP-BOT V1.0 * Filename : LCD_Running_Text.pde * Show Running Text on Serial LCD ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** #include <popbot.h> // Include Library for POP-BOT int x=0; int i; void setup() { } void loop() { lcd(“POP-BOT#nHello World!#c”); // Display message and auto clear sleep(2000); for(i=0;i<10;i++) { lcd(“Count: %d”,i); sleep(1000); } while(1);

// Loop display number 0-9

}

โปรแกรมที่ A3-1 ไฟล LCD_Running_Text.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบการแสดง ขอความผานโมดูล SLCD16x2 ของหุนยนต  POP-BOT ในลักษณะตางๆ

INNOVATIVE EXPERIMENT


    100


     101



  หนึงภาระกิ ่ จของการเรียนรูเพื  อควบคุ ่ มหุนยนต  อัตโนมัติขนาดเล็กคือ การตรวจจับเสนและการเคลือนที ่ ตาม ่ เสน สําหรับชุดหุนยนต  POP-BOT ก็สามารถปฏิบัติภาระกิจนีได ้ โดยเนือหาในบทนี ้ จะเริ ้ มต ่ นดวยการอธิบายการทํา งานของตัวตรวจจับแสงสะทอนอินฟราเรดซึงนํ ่ ามาประยุกตใชงานเปนตัวตรวจจับเสน การอานคาจากตัวตรวจจับใน พื้นทีที่ ่มีสีตางกัน จากนันเข ้ าสูการทดลองเขี  ยนโปรแกรมภาษา C เพือควบคุ ่ มใหหุนยนต POP-BOT เคลือนที ่ ตามเส ่ น ทังแบบไม ้ พิจารณาทางแยกและพิจารณาทางแยก

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

510 10k

+V

TCRT5000

OUT

แรงดันเอาตพุตคาสูง

510

GND

LED อินฟราเรด

10k

กระแสไฟฟา

TCRT5000

กระแสไฟฟา

+V

OUT

แรงดันเอาตพุตคาต่ํา GND

LED อินฟราเรด โฟโตทรานซิสเตอร พื้นสีขาว

โฟโตทรานซิสเตอร พื้นสีดํา

รูปที่ 9-1 แสดงการทํางานของแผงวงจรตรวจจับแสงสะทอนอินฟราเรดกับพืนผิ ้ วสีขาวและดํา


    102

9.2 การเตรียมความพรอมกอนพัฒนาโปรแกรมเพือขั ่ บเคลือนหุ ่ นยนต  ตรวจจับเสน 9.2.1 เตรียมอุปกรณสําหรับสรางสนามทดสอบ ในการพัฒนาโปรแกรมเพือควบคุ ่ มใหหุนยนต  เคลือนที ่ ตามเส ่ น โดยใชตัวตรวจจับแสงสะทอนอินฟราเรดใน การวิเคราะหเสนและพืนสนามนั ้ น้ จะเปนการกําหนดเงือนไขเพี ่ อเปรี ่ ยบเทียบกับคาอางอิงคาหนึงที ่ ได ่ จากการทดสอบ อานคาของสภาวะแสงทีได ่ จากเสนและพืนสนามที ้ ใช ่ งานจริง โดยอาศัยความแตกตางของการสะทอนแสงอินฟราเรด ของแตละพืนผิ ้ วทีมี่ สีตางกัน เชน พืนผิ ้ วสีขาวสามารถสะทอนแสงอินฟราเรดไดดี สวนพืนผิ ้ วสีดําสามารถสะทอนแสง อินฟราเรดไดนอย เนืองจากสี ่ ดํามีความสามารถในการดูดกลืนแสงอินฟราเรดไดมาก การเรียนรูในบทนี  เลื ้ อกใชสนาม ทดสอบอางอิงทีมี่ พืนสนามเป ้ นสีขาวและเสนเปนสีดํา ดังนันขอแนะนํ ้ าใหผูพั ฒนาสรางสนามทดสอบขึนมาก ้ อน สําหรับสนามทดสอบตัวอยางที่ใชในหนังสือเลมนี้ ทําจากแผนพลาสติกลูกฟูก (หรือชื่อเรียกกันทัวไปว ่ า แผนฟวเจอรบอรด) มาติดเทปสีดํา โดยมีอุปกรณและเครื่องมือที่ใชดังนี้ 1. แผนพลาสติกลูกฟูก (หรือชือเรี ่ ยกทัวไปว ่ า แผนฟวเจอรบอรด) สีขาวและดํา ขนาด 90 x 60 เซนติเมตร อาจเล็กใหญกวานีก็้ ไดอยางละ 1 แผนขอใหมีพืนที ้ มากพอสํ ่ าหรับการเคลือนที ่ ของหุ ่ นยนต  POP-BOT 2. เทปพันสายไฟสีดําขนาด 1 นิว้ จํานวน 2 มวน แนะนํายีห่ อ 3M เนืองจากมี ่ ความยืดหยุนสู  ง สามารถ ติดเปนเสนโคงไดดี 3. กรรไกรสําหรับตัดเทปพันสายไฟ

9.2.2 กําหนดคาอางอิงเพือแยกความแตกต ่ างระหวางเสนและพืนสนาม ้ ในการกําหนดคาอางอิงเพือใช ่ ในการเปรียบเทียบเพือให ่ หุนยนต  ทราบวา ตัวตรวจจับพบเสนหรือพืนสนามนั ้ น้ โดยทัวไปจะอาศั ่ ยการเขียนโปรแกรมอานคาอะนาลอกจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดแตละตัวขึนมา ้ แสดงผลเพือสั ่ งเกตคาผลลัพธทีได ่ จากเสนและพืนสนามมี ้ คาแตกตางกันเพียงไร ปกติแลวคาทังสองต ้ องแตกตางกันพอ สมควร ในการเขียนโปรแกรมภาษา C ดวย Arduino เพื่ออานคาจากแผงวงจรตรวจจับแสงสะทอนอินฟราเรดของ แผงวงจรควบคุมในหุนยนต POP-BOT จะใชฟงกชั่น analogRead ซึงให ่ คาผลลัพธ 0 ถึง 1023 เมื่อแผงวงจรตรวจ จับแสงสะทอนอินฟราเรดไปอยูบริเวณตําแหนงของเสนสีดําจะใหคาตํามี ่ แนวโนมเอียงไปทางคา 0 ถาไปอยูใน บริเวณพื้นสนามสีขาวจะใหคาสูงที่มีแนวโนมเอียงไปทางคา 1023 สามารถทดสอบไดจากกิจกรรมที่ 6 ซึงช ่ วยให ผูพั ฒนาโปรแกรมสามารถกําหนดคาอางอิงสําหรับใชเปรียบเทียบเพือแยกแยะระหว ่ างเสนและพืนสนาม ้ ซึงจะนํ ่ า ไปใชในการพัฒนาโปรแกรมเพื่อควบคุมใหหุนยนต POP-BOT สามารถตรวจจับและเคลือนที ่ ตามเส ่ นได


     103

   การเขียนโปรแกรมใหหุนยนต  เคลื่อนที่ตามเสน หุนยนต  จะตองแยกแยะใหออกกอนวา เสนที่หุนยนต เคลื่อนที่ไปนันมี ้ ความแตกตางจากพื้นปกติอยางไร เชน พื้นของสนามเปนสีขาว เสนที่ตองการใหหุนยนต  เคลื่อน ทีนั่ นเป ้ นสีดํา การทีจะให ่ หุนยนต  สามารถแยกแยะได ผูใช  งานจะตองทําการทดสอบอานคาพืนผิ ้ วกอนวา คาสีขาว และสีดํามีคาแตกตางกันอยางไร A4.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A4-1 A4.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก /******************************************************************************* * POP-BOT V1.0 * Filename : AnalogRead.pde * Read Analog From ZX-03 Show on SLCD ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** // *** in this example GP2D120 connected to pin A5 *** #include <popbot.h> // Include library for POP-BOT void setup() { } void loop() { lcd(“L: %d #nR: %d “,analog(3),analog(1)); sleep(200); }

โปรแกรมที่ A4-1 ไฟล AnalogRead.pde โปรแกรมภาษา C ของ Arduino สําหรับอานคาจากแผงวงจร ตรวจจับแสงสะทอนอินฟราเรดแสดงผลผานโมดูล SLCD16x2 ของหุนยนต  POP-BOT A4.3 สรางแผนทดสอบสี โดยกําหนดพื้นผิวทังสี ้ ขาวและสีดํา มีขนาดไมนอยกวา 30x30 ซม. ดังรูป

A4.4 นําหุนยนต  POP-BOT ทีโปรแกรมแล ่ วจากขันตอนที ้ ่ A4.2 ไปวางบนแผนทดสอบสวนสีดํา แลวเปดสวิตช ใหหุนยนต  ทํางาน อานคาของตัวตรวจจับทางซายและขวาเมื่อตรวจจับบนพื้นสีดําและสีขาว บันทึกผลทีเกิ ่ ดขึ้น จากการทดลองพบวา คาทีอ่ านไดจากสีขาวมีคาอยูประมาณ  650 ถึง 950 คาทีอ่ านไดจากสีดํามีคาอยู ประมาณ 100 ถึง 350 ดังนั้นคาทีเหมาะสม ่ เพื่อใชเปนคาอางอิงจะอยูที ่ (650+350) /2 = 500


    104

    รูปแบบเบืองต ้ นของการเขียนโปรแกรมใหหุนยนต  เคลื่อนที่ตามเสนมี 3 รูปแบบคือ 1. กรณีทีแผงวงจรตรวจจั ่ บแสงสะทอนอินฟราเรดทังสองชุ ้ ดครอมอยูบนเส  น การสังการจากโปรแกรม ่ จะกําหนดใหหุนยนต  เคลื่อนที่ไปดานหนา 2. กรณีที่แผงวงจรดานซายตรวจจับพบเสนสีดํา แสดงวา หุนยนต  เอียงตัวออกนอกเสนไปทางขวา ใหเอียงตัวทางซายเพื่อกลับไปครอมอยูบนเส  น 3. กรณีทีแผงวงจรด ่ านขวาตรวจจับพบเสนสีดํา แสดงวา หุนยนต  เอียงตัวออกนอกเสนทางดานซาย มือ ใหเอียงตัวทางขวา กลับไปครอมอยูบนเส  น

15/A1

13

12 1

16/A2

16/A2

14/A0 18/SDA/A4 19/SCL/A5

15/A1

ATMEGA168

12 ATMEGA168

1

A7 Number : Digital Ax : Analog p in x

Di2

Port function 16/A2

-

A6

13

14/A0 18/SDA/A4 19/SCL/A5 4-12Vdc

-

+Vm 8

12

+ ON

POWER

MOTOR

Di4 +Vm 7

18/SDA/A4 19/SCL/A5

-

POP-168

Di2

RESET

14/A0

+Vm 8

A7 Number : Digital Ax : Analog p in x

Port function

RESET

15/A1

-

BAT RS-232

A

4-12Vdc

RESET

Di4 +Vm 7

ATMEGA16 8

+ ON

POWER

A6

Di2

Port function

1

A7 Number : Digital Ax : Analog p in x

13

POP-168

POP-168 A6

B

Di4 +Vm 7

-

+Vm 8

-

BAT RS-232

POWER

A

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

B

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

MOTOR

4- 12Vdc

BAT

+ ON

A

RS-232

ON

B

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

SERVO PORT

ON

SERVO PORT

SERVO PORT

MOTOR

- oRob o - SpinnerR Ardui noPOPRrobot

- oRobo - Sp innerR ArduinoPO PRrobot

เหตุการณที่ 1 เหตุการณที่ 2 แผงวงจรตรวจจับครอมเสน แผงวงจรตรวจจับทางซาย พบเสนดํา

- o Robo - Spin nerR Ar duinoPOPR robot

เหตุการณที่ 3 แผงวงจรตรวจจับทางขวา พบเสนดํา

จากเหตุการณทังสามนํ ้ าไปเขียนเปนโปรแกรมที่ A5-1 A5.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A5-1 A5.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A5.3 นําหุนยนต  POP-BOT ไปวางครอมบนเสนสีดํา เปดสวิตช POWER ใหหุนยนต  เริมต ่ นเคลื่อนที่ หุนยนต  จะสามารถเคลื่อนที่ตามเสนสีดําได ถาการตรวจจับเสนยังแมนยําไมเพียงพอ ใหปรับคาอางอิง ในโปรแกรม แลวทําการทดสอบใหมอีกครั้ง


     105

/******************************************************************************* * POP-BOT V1.0 * Filename : SimpleTrackline.pde * simple track black line ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** #include <popbot.h> // Include library for POP-BOT #define POW 80 #define Ref 500 int left; int right; void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void turn_left(unsigned int time) { motor(1,-POW); motor(2,POW); sleep(time); } void turn_right(unsigned int time) { motor(1,POW); motor(2,-POW); sleep(time); } void setup() { } void loop() { left = analog(3); right = analog(1); if(left>Ref && right>Ref) { forward(1); } if(left<Ref && right>Ref) { turn_left(10); } if(left>Ref && right<Ref) { turn_right(10); } }

โปรแกรมที่ A5-1 ไฟล SimpleTrackline.pde โปรแกรมภาษา C ของ Arduino สําหรับควบคุมใหหุนยนต  POP-BOT เคลือนที ่ ตามเส ่ นสีดํา


    106

   ดวยการใชแผงวงจรตรวจจับแสงสะทอนอินฟราเรด 2 ชุดทํางานเปนตัวตรวจจับเสนนั้น ยังสามารถนํา ไปใชตรวจจับเสนไดอีกรูปแบบหนึงคื ่ อ ตรวจสอบเสนตัด ทางแยก เมือหุ ่ นยนต  เคลือนที ่ มาถึ ่ งทางแยกหรือเสนตัด แผงวงจรตรวจจับแสงสะทอนอินฟราเรดทังสองจะพบเส ้ น สีดํา ดังนั้นจึงตองเพิ่มเติมเงื่อนไขนี้ลงในโปรแกรมในกรณีทีแผงวงจรทั ่ ้งสองตรวจพบสีดํา ดังแสดงในโปรแกรม ที่ A6-1

12

15 /A1

14 /A0 18/SDA/A4 19/SCL/A5

A7

+ON

Number : Digi tal Ax : Analog pin x

Di2

RESET 1

16 /A2

POWER

ATMEGA168

Po rt function

Di4 +Vm 7

-

+Vm 8

-

BAT

B

RS-232

A

14 : Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

4-12Vdc

13

POP-168 A6 ON

SERVO PORT

MOTOR

- oRobo - SpinnerR ArduinoPOPRrobot

ในโปรแกรมนี้เมื่อหุนยนต  พบทางแยก จะหยุดทีแยกนั ่ น้ พรอมทังส ้ งเสียงออกมาทีลํ่ าโพง จากนันเมื ้ ่อพบ ทางแยกตอไป ก็จะขับเสียงออกมาเพิ่มขึ้นตามจํานวนทางแยกทีพบ ่ ขอสังเกต : การหยุดการทํางานของมอเตอรเพื่อใหหุนยนตหยุดการเคลื่อนทีทั่ นทีทันใดนั้น การเบรก มอเตอรเพียงอยางเดียวอาจจะไมเพียงพอ ดังนันต ้ องสังมอเตอร ่ ใหทํางานเพือเคลื ่ อนที ่ ถอยหลั ่ งดวยระยะเวลาสันๆ ้ ชวยดวย หุนยนต  จึงสามารถหยุดการเคลื่อนที่ไดในตําแหนงที่ตองการ A6.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A6-1 A6.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A6.3 นําหุนยนต  POP-BOT ไปวางครอมบนเสนสีดํา เปดสวิตช POWER ใหหุนยนต  เริมต ่ นเคลื่อนที่ หุนยนต จะสามารถเคลื่อนทีตามเส ่ นสีดําได เมื่อหุนยนต  พบทางแยก จะหยุดที่แยกนั้น พรอมทั้งสง เสียงออกมาทีลํ่ าโพง แลวเคลือนที ่ ตรงต ่ อไป จากนันเมื ้ อพบทางแยกต ่ อไป ก็จะขับเสียงออกมาเพิมขึ ่ นตามจํ ้ านวน ทางแยกที่พบ


     107

/******************************************************************************* * POP-BOT V1.0 * Filename : CheckCrossLine.pde ********************************************************************************/

#include <popbot.h> // Include library for POP-BOT #define POW 80 #define Ref 500 int left; int right; void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void turn_left(unsigned int time) { motor(1,-POW); motor(2,POW); sleep(time); } void turn_right(unsigned int time) { motor(1,POW); motor(2,-POW); sleep(time); } void setup() { } void loop() { left = analog(3); right = analog(1); if(left<Ref && right<Ref) { forward(1); beep(); sleep(100); } else if(left>Ref && right>Ref) { forward(1); } else if(left<Ref && right>Ref) { turn_left(10); } else if(left>Ref && right<Ref) { turn_right(10); } } /******************************************************************************/

โปรแกรมที่ A6-1 ไฟล CheckCrossLine.pde โปรแกรมภาษา C ของ Arduino สําหรับ ควบคุมใหหุนยนต  POP-BOT เคลือนที ่ ตามเส ่ นสีดําและขับเสียงเมือตรวจจั ่ บพบทางแยก


     109



       อีกหนึงตั ่ วอยางของการใชงานอินพุตอะนาลอกของไมโครคอนโทรลเลอร POP-168 และฟงกชั่นอานคา สัญญาณอะนาลอกของ Arduino คือ การติดตอกับตัวตรวจจับพิเศษทีให ่ ผลการทํางานเปนแรงดัน แตสามารถใหผล การทํางานเปนคาหรือปริมาณทางฟสิกสทีชั่ ดเจน โมดูลวัดระยะทางดวยแสงอินฟราเรด GP2D120 เปนตัวอยางของ ตัวตรวจจับทีมี่ การทํางานในลักษณะนี้ ผลของการตรวจจับของ GP2D120 สามารถนําไปคํานวณดวยกระบวนการทาง ซอฟตแวรเพือให ่ ไดผลการทํางานออกมาเปนระยะทางในหนวยเซนติเมตรหรือนิวได ้ ตามตองการ การใชงานโมดูล GP2D120 ในหุนยนต POP-BOT คือ นํามาใชตรวจจับวัตถุแบบไมสัมผัส (contact less) รวมไปถึงสามารถนําไปใชในการคนหาวัตถุหรือสิงกี ่ ดขวางได

10.1 คุณสมบัติของ GP2D120 ใชการตรวจจับระยะทางดวยการสะทอนแสงอินฟราเรด  วัดระยะทางได 4 ถึง 30 เซนติเมตร  ไฟเลียง ้ 4.5 ถึง 5V กระแสไฟฟา 33 mA  ใหเอาตพุตเปนแรงดันในยาน 0.4 ถึง 2.4V ทีไฟเลี ่ ยง ้ +5V 

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

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

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

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

GP2D120

2.4 Vout GND

Vcc

2.0 1.6

ไฟเลี้ยง

1.2 0.8

38.3ฑ9.6 มิลลิวินาที

0.4

การวัดระยะหาง แรงดันเอาตพุต

วัดครั้งที่ 1 ไมแนนอน

วัดครั้งที่ 2

วัดครั้งที่ n

เอาตพุตครั้งที่ 1 เอาตพุตครั้งที่ 2 5 มิลลิว ินาที

0

เอาตพุตครั้งที่ n

0

4

8

12

16

20

24

28

32

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

* ใชกระดาษเทาขาวรุน R-27 ของ Kodak ซึ่ง ดานขาวมีอัตราการสะทอนแสง 90% เปน วัตถุสําหรับสะทอนแสงเพื่อวัดระยะทาง

รูปที่ 10-1 แสดงการจัดขา ไดอะแกรมเวลาจังหวะการทํางาน และกราฟแสดงการทํางานของ GP2D120


    110

GP2D120 เปนโมดูลตรวจจับระยะทางแบบอินฟราเรดมีขาตอใชงาน 3 ขาคือ ขาตอไฟเลียง ้ (Vcc), ขากราวด (GND) และขาแรงดันเอาตพุต (Vout) การอานคาแรงดันจาก GP2D120 จะตองรอใหพนชวงเตรียมความพรอมของ โมดูลกอน ซึงใช ่ เวลาประมาณ 32.7 ถึง 52.9 มิลลิวินาที ดังนันในการอ ้ านคาแรงดันจึงควรรอใหพนชวงเวลาดังกลาว ไปกอน ดังแสดงขอมูลเบืองต ้ นในรูปที่ 10-1 คาแรงดันเอาตพุตของ GP2D120 ทีระยะทาง ่ 30 เซนติเมตรที่ไฟเลียง ้ +5V อยูในชวง 0.25 ถึง 0.55V โดย คากลางคือ 0.4V ชวงของการเปลี่ยนแปลงแรงดันเอาตพุตทีระยะทาง ่ 4 เซนติเมตรคือ 2.25V 0.3V

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

10.3 การอานคาขอมูลจาก GP2D120 ดวยวงจรแปลงสัญญาณอะนาลอกเปนดิจิตอล คาแรงดันเอาตพุตจาก GP2D120 จะเปลียนแปลงตามระยะทางที ่ ตรวจวั ่ ดได เชน วัดแรงดัน Vout เทากับ 0.5V จะเทียบเปนระยะทางได 26 เซนติเมตร หรือที่ Vout เทากับ 2V จะเทียบเปนระยะหางจากวัตถุ 6 เซนติเมตร เปนตน สามารถสรุปขอมูลการเทียบคา Vout กับระยะทางในตารางที่ 10-1 อยางไรก็ตาม เพือช ่ วยใหการอานคาจากโมดูล GP2D120 ทําไดงายขึ้น จึงไดสรางไฟลไลบรารีสําหรับใช งานกับโมดูล GP2D120 โดยเฉพาะขึ้นมา นันคื ่ อไลบรารี gp2d120_lib.h จะตองผนวกไฟลไลบรารีไวในตอน ตนของโปรแกรมกอนใชงานดวยคําสัง่ #include <gp2d120_lib.h>

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

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


     111

ตารางที่ 10-1 แสดงความสัมพันธระหวางระดับแรงดัน Vout ของ GP2D120 กับคาจากวงจรแปลง สัญญาณอะนาลอกเปนดิจิตอลและระยะทางทีวั่ ดได (ไดจากการคํานวณ)


    112

   

-

+Vm 7

Di4 Di2

-

+Vm 8

B

A

SERVO PORT

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

POP-168

13

ATMEGA16 8

12

A7 A6

Port function

16/A2

Number : Digital Ax : Analog pin x

BAT

14/A0 18/SDA/A4 19/SCL/A5

POWER

+ ON

15/A1

ON

4-12Vdc

RESET

1

RS-232

RAWoData=i307rR Distance=P8robCM

MOTOR

ผลลัพธทีได ่ จากโมดูล GP2D120 เปนคาการเปลียนแปลงแรงดั ่ น เมือนํ ่ ามาเชือมต ่ อกับหุนยนต  POP-BOT และทําการเขียนโปรแกรมภาษา C ดวย Arduino IDE เพื่ออานคา จะใชฟงกชั่น getdist() จากไฟลไลบรารี gp2d120_lib.h เพื่ออานคาจากโมดูล GP2D120 ซึงในกิ ่ จกรรมนีต้ อทีจุ่ ดตอ An5 สวนโปรแกรมทีใช ่ ในการทดสอบการทํางานแสดงในโปรแกรมที่ A7-1 โดยในโปรแกรมนี้นอกจากจะอาน คาจากโมดูล GP2D120 แลว ยังทําการสงคาระยะทางทีวั่ ดไดนันไปแสดงผลที ้ โมดู ่ ล SLCD16x2 ดวย A7.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A7-1 A7.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันรั ้ นโปรแกรม A7.3 ทดลองนําวัตถุมาวางขวางหนาหุนยนต POP-BOT แลวเลื่อนใหเขาใกลหรือหางออกจากตัวตรวจจับ โมดูล GP2D120 สังเกตผลการทํางานผานจอแสดงผลของโมดูล SLCD16x2

ปรับระยะหางของสิ่งกีดขวาง ใหเขาใกลและหางออก ในชวง 4 ถึง 32 เซนติเมตร


     113

/******************************************************************************* * POP-BOT V1.0 * Filename : GP2D120_LCD.pde * Show Data reading from GP2D120 on SLCD ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** // *** in this example GP2D120 connected to pin A5 *** #include <popbot.h> // Include Library for POP-BOT #include <gp2d120_lib.h> int dist; void setup() { } void loop() { dist = getdist(5); lcd(“Dist: %d cm “,dist); sleep(200); } /******************************************************************************/

โปรแกรมที่ A7-1 ไฟล GP2D120_LCD.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบการติดตอ เพืออ ่ านคาจากโมดูลวัดระยะทาง GP2D120 แสดงผลผานโมดูล SLCD16x2 ของหุนยนต  POP-BOT


    114

     จากโปรแกรมที่ A7-1 แสดงใหเห็นวา โมดูล GP2D120 สามารถตรวจจับวัตถุและตรวจสอบระยะหางจาก วัตถุไดอยางแมนยําในระยะ 4 ถึง 30 เซนติเมตร สําหรับในกิจกรรมนีเป ้ นการสั่งงานใหหุนยนต  เคลื่อนที่ และเมื่อ หุนยนต  ตรวจพบสิ่งกีดขวางอยูด านหนาในระยะ 15 เซนติเมตร หุนยนต  จะถอยหลังออกจากสิ่งกีดขวางนัน้ แลว เปลี่ยนทิศทางการเคลื่อนที่เพื่อหลบหลีกสิ่งกีดขวางนั้น A8.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A8-1 A8.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT ปลดสายตอคอมพิวเตอรออก A8.3 นําหุนยนต  POP-BOT มาวางบนพื้น จากนันเป ้ ดสวิตชเพื่อรันโปรแกรม สังเกตการเคลื่อนที่ของหุนยนต  หุนยนต  POP-BOT จะเคลื่อนที่ตรงไปขางหนาอยางตอเนื่อง A8.4 นําวัตถุมาวางขวางหนาหุนยนต  แลวสังเกตการเคลื่อนที่ของหุนยนต  เพื่อตรวจจับพบสิงกี ่ ดขวาง เมื่อหุนยนต  POP-BOT เคลื่อนที่เขาใกลวัตถุมากกวา 15 เซนติเมตร (โดยประมาณ) หุนยนต  จะทําการ เคลื่อนทีถอยหลั ่ งเปนเวลา 0.6 วินาที และเลียวซ ้ ายอีก 0.5 วินาที


     115

/******************************************************************************* * POP-BOT V1.0 * Filename : Robot_Survey.pde ********************************************************************************/ #include <popbot.h> // Include library for POP-BOT #include <gp2d120_lib.h> #define POW 80 int dist; void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void backward(unsigned int time) { motor(1,-POW); motor(2,-POW); sleep(time); } void turn_left(unsigned int time) { motor(1,-POW); motor(2,POW); sleep(time); } void setup() { } void loop() { dist = getdist(5); if(dist<15) { backward(600); turn_left(500); } else { forward(1); } }

การทํางานของโปรแกรม (1) เริมต ่ นโปรแกรม หุนยนต  จะสงเสียงออกมา 1 ครัง้ โดยเสียงนี้เปนตัวแสดงสถานะของหุนยนต  ถาใน ระหวางทีหุ่ นยนต  ทํางาน เกิดมีเสียงดังขึน้ แสดงวา ไมโครคอนโทรลเลอรรีเซต สาเหตุมักมาจากแบตเตอรีหมด ่ (2) อานคาจากโมดูล GP2D120 แลวตรวจสอบวา นอยกวา 15 หรือไม ถานอยกวา แสดงวา วัตถุทีอยู ่  ดานหนาของหุนยนต  มีระยะหางนอยกวา ใกลกวา 15 เซนติเมตร (โดยประมาณ) ตองสั่งใหหุนยนต  ถอยหลัง 0.6 วินาที และเลียวซ ้ ายอีก 0.5 วินาที ถาคาทีอ่ านไดมากกวา 15 หุนยนต  จะยังคงเคลื่อนที่ไปขางหนา (3) ทําคําสั่งเหลานีซํ้ าไปเรื ้ ่อยๆ ไมมีทีสิ่ ้นสุดจากอันเกิดจาก void

loop ()

โปรแกรมที่ A8-1 ไฟล Robot_Survey.pde โปรแกรมภาษา C ของ Arduino สําหรับทดสอบ การทํางานของ POP-BOT ในการตรวจจับวัตถุแบบไมสัมผัส


    116


     117



  ในบทนีนํ้ าเสนอการควบคุมเซอรโวมอเตอรของหุนยนต  POP-BOT โดยแผงวงจรควบคุมหลักของหุนยนต  สามารถขับเซอรโวมอเตอรได 2 ตัว ผานทางจุดตอพอรต Di7 และ Di8 ซึงจะเรี ่ ยกวา เอาตพุตเซอรโวมอเตอร

11.1 หลักการทํางานของเซอรโวมอเตอร เซอรโวมอเตอรที่ใชในหุนยนต POP-BOT เปนเซอรโวมอเตอรแบบอะนาลอกขนาดเล็ก บางครั้งเรียกวา R/C เซอรโวมอเตอร โดย R/C มาจากคําวา Radio Control เนืองจากในอดี ่ ต เซอรโวมอเตอรมักนําไปใชในการขับ เคลือนกลไกในเครื ่ ่องบิน, รถ หรือเรือที่บังคับดวยคลืนวิ ่ ทยุ การกําหนดชือ่ R/C เพื่อใหทราบถึงประเภทของงาน ที่นําเซอรโวมอเตอรนีไปใช ้ นันเอง ่ เซอรโวมอเตอรเปนอุปกรณแมเหล็กไฟฟาแบบหนึงที ่ ใช ่ ในการหมุนตัวขับ (actuator) ไปยังตําแหนงตางๆ ดวย ความแมนยํา ปกติแลวเซอรโวมอเตอรทียั่ งไมไดรับการปรับแตงใดๆ นันจะใช ้ งานกันอยูในรถ,  เรือ หรือเครืองบิ ่ นบังคับ วิทยุ เพือทํ ่ าหนาทีควบคุ ่ มตําแหนงของอุปกรณ เชน การบังคับเลียวของรถบั ้ งคับวิทยุ หรือใชสําหรับปรับหางเสือของ เรือหรือเครืองบิ ่ น ซึงงานเหล ่ านีต้ องการแรงบิดของมอเตอรทีสู่ งพอสมควรดังนันเซอร ้ โวมอเตอรจึงมีอัตราทดทีมาก ่ พอสมควรเพือให ่ สามารถรองรับงานดังกลาวได เซอรโวมอเตอรมีมุมในการหมุนมาตรฐานคือ 0 ถึง 90 องศา และ 0 ถึง 180 องศา ปจจุบันนิยมในแบบ 0 ถึง 180 องศา โดยสามารถดัดแปลงใหหมุนไดครบรอบ 360 องศาดวย สายตอใชงานมาตรฐานมี 3 เสนคือ สายสัญญาณ (S), สายไฟเลียง ้ (+V) และสายกราวด (G) โดยในรูปที่ 11-1 แสดงสวนประกอบตางๆ และการจัดขาของปลั๊กหรือ คอนเน็กเตอรของเซอรโวมอเตอร

       รูปที่ 11-1 แสดงสวนประกอบของเซอรโวมอเตอร

STANDARD SERVO MOTOR


    118

  รูปที่ 11-2 ลักษณะคอนเน็กเตอรของเซอรโวมอเตอร ปจจุบันเซอรโวมอเตอรมีดวยกัน 2 ชนิดหลักๆ คือ ชนิดอะนาลอกและดิจิตอล รูปรางภายนอกของเซอรโว มอเตอรทังสองชนิ ้ ดจะคลายกันมาก ความแตกตางจะอยูที วงจรควบคุ ่ มทีอยู ่ ภายใน  โดยในชนิดอะนาลอกจะใชวงจร อิเล็กทรอนกสทีประกอบด ่ วยอุปกรณสารกึงตั ่ วนํา จําพวก ทรานซิสเตอร มอสเฟต หรือไอซีออปแอมปเปนหลัก ใน ขณะทีชนิ ่ ดดิจิตอลจะใชไมโครโปรเซสเซอรหรือไมโครคอนโทรลเลอรเปนตัวควบคุมหลัก

11.1.1 คอนเน็กตอรของเซอรโวมอเตอร รูปที่ 11-2 แสดงลักษณะของคอนเน็กเตอรทีใช ่ ในการเชือมต ่ อของเซอรโวมอเตอร มีดวยกัน 2 มาตรฐานคือ แบบ S และแบบ J การจัดขาจะเหมือนกัน ความแตกตางคือ ลักษณะของคอนเน็กเตอรและการกําหนดสีของสาย สัญญาณ สําหรับยีห่ อ Futaba ของญีปุ่ น กําหนดใหคอนเน็กเตอรแบบ J มีปกยืนออกมาเพิ ่ มขึ ่ นในด ้ านเดียวกับสาย สัญญาณ และกําหนดใหสายสัญญาณมีสีขาว สวนแบบ S สายสัญญาณจะเปนสีขาว และคอนเน็กเตอรจะเรียบเหมือน กันทังสองด ้ านของสายเชือมต ่ อ สวนสายไฟเลียงเป ้ นสีแดง และสายกราวดเปนสีดําเหมือนกันทังสองแบบ ้ อยางไรก็ตาม มีความเปนไปไดที่ผูผลิตอืนๆ ่ อาจกําหนดรูปแบบและสีของสายสัญญาณแตกตางออกไป แตการจัดเรียงตําแหนงจะเหมือนกัน

11.1.2 โครงสรางของเซอรโวมอเตอร ในรูปที่ 11-3 แสดงโครงสรางภายในของเซอรโวมอเตอร สวนประกอบหลักคือ มอเตอรไฟตรงขนาดเล็ก, ชุดเฟองทด, แผงวงจรควบคุม และตัวตานทานปรับคาได (POT : Potentiometer) แกนของมอเตอรไฟตรงจะตอเขา กับชุดเฟอง เพือลดความเร็ ่ วรอบลง สงผลใหแรงบิดทีแกนหมุ ่ นมากขึน้ ทังหมดทํ ้ างานรวมกันภายใตความสัมพันธ P = kwg โดยที่ P คือ พลังงานทีป่ อนใหแกมอเตอร k คือ คาคงที่ w คือ ความเร็วรอบ ในหนวย รอบตอนาที (rpm : round per minute) g คือ แรงบิดหรือทอรค (torque) ถาหากพลังงานทีจ่ ายใหคงที่ เมื่อลดความเร็วรอบลง นันย ่ อมทําแรงบิดของมอเตอรเพิ่มขึ้น


     119

 



 

 

    

รูปที่ 11-3 โครงสรางภายในของเซอรโวมอเตอร การหมุนของมอเตอรไดรับการควบคุมจากวงจรควบคุม โดยมี POT เปนตัวกําหนดขอบเขตของแกนหมุน ซึงหากไม ่ มีการปรับแตงใดๆ แกนหมุนของมอเตอรจะสามารถหมุนไดในขอบเขต 0 ถึง 180 องศา ดังนันในการปรั ้ บ แตงใหเซอรโวมอเตอรสามารถขับแกนหมุนไดรอบตัวจึงมักจะใชวีการถอด POT ออก แลวแทนทีด่ วยตัวตานทานคา คงที่ 2 ตัว หรือดัดแปลงใหแกนหมุนของ POT สามารถหมุนไดรอบตัว แกนหมุนของเซอรโวมอเตอรจะมีสวนปลายเปนรองเฟอง (spline) เพือให ่ สามารถติดตังอุ ้ ปกรณทีใช ่ ในการ เชือมโยงไปยั ่ งตัวขับหรือกลไกอืนๆ ่ อุปกรณทีใช ่ เชือมโยงนั ่ นเรี ้ ยกวา ฮอรน (horn) ซึงมี ่ ดวยกันหลายรูปแบบทังแบบ ้ เปนแขน, เปนแทง, กากบาท, แผนกลม เปนตน สําหรับรองเฟองของเซอรโวมอเตอรแตละยีห่ อก็มีจํานวนไมเทากัน โดยของ Hitec จะมี 24 รองเฟอง สวนของ Futaba มี 25 รองเฟอง ทําใหฮอรนของทังสองยี ้ ห่ อใชรวมกันไมได

11.1.3 สัญญาณพัลสสําหรับควบคุมเซอรโวมอเตอร การควบคุมเซอรโวมอเตอรทําไดโดยการสรางสัญญาณพัลสปอนใหกับวงจรควบคุมภายในเซอรโวมอเตอร ดังใน รูปที่ 11-4 เริมต ่ นใหสรางพัลสคาบเวลา 20 มิลลิวินาที แลวปรับความกวางของพัลสชวงบวก โดยพัลสกวาง 1 มิลลิวินาที มอเตอรจะหมุนไปตําแหนงซายมือสุด ถาสงพัลสกวาง 1.5 มิลลิวินาที แกนหมุนของมอเตอรจะเคลือนที ่ ไปยั ่ งตําแหนง กึงกลาง ่ และถาสงพัลสกวาง 2 มิลลิวินาที แกนหมุนของมอเตอรจะเคลือนที ่ ไปยั ่ งตําแหนงขวามือสุด การปอนสัญญาณพัลสที่มีคาบเวลาชวงบวกตั้งแต 1.5 ถึง 2 มิลลิวินาทีจะทําใหเซอรโวมอเตอรหมุนทวน เข็มนาฬิกา โดยถาคาความกวางพัลสยิ่งหางจาก 1.5 มิลลิวินาทีมากเทาใด ความเร็วในการหมุนก็จะมากขึ้นเทานัน้ นันคื ่ อ ความเร็วสูงสุดของการหมุนทวนเข็มนาฬิกาจะเกิดขึ้นเมือสั ่ ญญาณพัลสควบคุมที่ความกวาง 2 มิลลิวินาที การปอนสัญญาณพัลสที่มีคาบเวลาชวงบวกตั้งแต 1 ไปจนถึง 1.5 มิลลิวินาที ทําใหเซอรโวมอเตอรหมุน ตามเข็มนาฬิกา ซึงถ ่ าคาความกวางพัลสเขาใกล 1 มิลลิวินาทีความเร็วในการหมุนของเซอรโวมอเตอรก็จะมาก นันคื ่ อ ความเร็วสูงสุดของการหมุนตามเข็มนาฬิกาจะเกิดขึ้นเมือสั ่ ญญาณพัลสควบคุมที่ความกวาง 1 มิลลิวินาที


    120





 



  

STANDARD SERVO MOTOR



 

STANDARD SERVO MOTOR



   รูปที่ 11-4 แสดงพัลสทีใช ่ ควบคุมเซอรโวมอเตอร

STANDARD SERVO MOTOR


     121

11.1.4 การทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก การหมุนของเซอรโวมอเตอรนันจะไม ้ ไดหมุนเปนอิสระเหมือนมอเตอรทั่วๆ ไป โดยชวงระยะการหมุน ปกติจะอยูระหว  าง 0 ถึง 180 องศา ตําแหนงการหมุนของแกนมอเตอรในเซอรโวมอเตอรนีสามารถควบคุ ้ มไดอยาง แมนยํา เนืองจากภายในเซอร ่ โวมอเตอรมีวงจรอิเล็กทรอนิกสทําหนาที่ตรวจสอบตําแหนงของเซอรโวมอเตอรอยู ตลอดเวลา ลักษณะการตรวจสอบจะใชการปอนกลับคาตําแหนงจากตัวตานทานปรับคาได แลวนําคานีไปเปรี ้ ยบ เทียบกับคาพัลสที่ปอนเขาทางขาควบคุม คาของผลตางที่ไดจะไปปรับตําแหนงของมอเตอรจนไมเกิดคาผลตาง ก็จะไดตําแหนงของมอเตอรที่แมนยํา ในรูปที่ 11-5 แสดงไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก สัญญาณ พัลสควบคุมถูกสงเขามาทางอินพุต จะถูกสงไปยังวงจรกําเนิดสัญญาณพัลสภายในดวย โดยมีความกวางที่เปนสัด สวนกับตําแหนงของแกนหมุนในปจจุบัน ทั้งสัญญาณพัลสที่กําเนิดขึนภายในกั ้ บสัญญาณพัลสควบคุมจะถูกสงไป ยังวงจรเปรียบเทียบ เพือทํ ่ าการหักลางสัญญาณ โดยทิศทางของสัญญาณจะขึ้นอยูกับวา ระหวางสัญญาณพัลสควบ คุมทางอินพุตกับสัญญาณพัลสภายใน สัญญาณพัลสใดมีความกวางมากกวา โดยเอาตพุตทีได ่ เปนสัญญาณลอจิก “0” หรือ “1” แลวสงไปยังวงจรขับมอเตอรแบบ H-บริดจ เพื่อกําหนดทิศทางการหมุน ทางดานคาความแตกตางที่ เกิดขึ้นระหวางพัลสทั้งสองสัญญาณจะถูกสงไปยังวงจรเพิ่มความกวางพัลส เพื่อสรางสัญญาณพัลสสําหรับสงไป ขับมอเตอรผานวงจรขับมอเตอรแบบ H-บริดจ โดยความแตกตางของความกวางพัลส 1% ทําใหเกิดสัญญาณพัลส สําหรับขับมอเตอรในระดับ 50% และความเร็วนีจะลดลงเมื ้ อแกนหมุ ่ นของมอเตอรเคลือนที ่ เข ่ าสูตํ าแหนงทีกํ่ าหนด อันเปนผลมาจากความแตกตางของความกวางสัญญาณพัลสเริ่มลดลง และหยุดลงเมือสั ่ ญญาณพัลสที่นํามาเปรียบ เทียบมีคาความกวางเทากัน  

    

 



   



  



รูปที่ 11-5 ไดอะแกรมการทํางานของแผงวงจรควบคุมในเซอรโวมอเตอรชนิดอะนาลอก


    122

11.1.5 วัสดุของเฟองในเซอรโวมอเตอร ชุดเฟองในเซอรโวมอเตอรโดยสวนใหญผลิตมาจากวัสดุ 3 ชนิดคือ (1) ไนลอน : เปนวัสดุทีนิ่ ยมนํามาใชผลิตเฟองมากที่สุด เนืองจากมี ่ นําหนั ้ กเบา และมีเสียงรบกวนนอย เมื่อทํางาน ความทนทานพอสมควร มักพบในเซอรโวมอเตอรขนาดเล็กและราคาถูก (2) โลหะ : เฟองทีผลิ ่ ตดวยโลหะมีความทนทานสูง แข็งแรง สามารถทนแรงเสียดทานเมือเฟ ่ องขบกัน ไดสูงมาก ทําใหสามารถนํามาสรางเซอรโวมอเตอรทีมี่ แรงบิดสูงมากได โลหะทีพบมากที ่ สุ่ ดในการนํามาผลิตเฟองคือ ทองเหลือง และถาหากมีงบประมาณมากเพียงพอ ควรเลือกใชเซอรโวมอเตอรทีใช ่ เฟองทีผลิ ่ ตจากไทเทเนียม (3) คารบอไนต (Karbonite) : เปนวัสดุพิเศษทีทํ่ ามาจากคารบอน แลวแปรรูปเปนวัสดุทีคล ่ ายพลาสติก Hitec เปนผูที ่นําเทคโนโลยีนีมาใช ้ เปนวัตถุดิบในการผลิตเฟอง โดยคารบอไนตจะมีความแข็งแรงและทนทานมาก กวาเฟองไนลอน ในขณะที่มีนําหนั ้ กเบา ดังในเซอรโวมอเตอรสมัยใหมจึงนิยมใชเฟองที่ผลิตจากวัสดุชนิดนี้

11.1.6 คุณสมบัติทางเทคนิคที่สําคัญของเซอรโวมอเตอร มี 2 คาคือ ความเร็ว (speed) และ แรงบิดหรือทอรค (torque) ความเร็วหมายถึง ระยะเวลาทีทํ่ าใหแกนหมุน ของมอเตอรเคลือนที ่ สู่ ตํ าแหนงมุมทีกํ่ าหนด อาทิ เซอรโวมอเตอรมีความเร็ว 0.15 วินาทีสําหรับ 60 องศา หมายถึง เซอรโวมอเตอรตัวนีสามารถขั ้ บใหแกนหมุนเคลือนที ่ ไปยั ่ งตําแหนงมุม 60 องศาภายในเวลา 0.15 วินาที สวนแรงบิดมักจะปรากฏในหนวยของออนซ-นิว้ (ounce-inches : oz-in) หรือ กิโลกรัม-เซนติเมตร (kg-cm) เปนคุณสมบัติที่จะบอกตอผูใชงานวา เซอรโวมอเตอรตัวนี้มีแรงในการขับโหลดที่มีนําหนั ้ กในหนวยออนซให สามารถเคลือนที ่ ไปได ่ 1 นิว้ หรือนําหนั ้ กในหนวยกิโลกรัมใหเคลือนที ่ ไปได ่ 1 เซนติเมตร (นํ้าหนัก 1 ออนซเทา กับ 0.028 กิโลกรัมโดยประมาณ หรือ 1 กิโลกรัมเทากับ 35.274 ออนซ) อยางไรก็ตาม คาของความเร็วและแรงบิดตองสัมพันธกับแรงดันไฟเลียงที ้ จ่ ายใหแกเซอรโวมอเตอรดวย ซึง่ มักจะแรงดัน 4.8 หรือ 6V นอกจากนันยั ้ งมีปจจัยเกียวกั ่ บแรงเสียดทานในระบบเฟองภายในเซอรโวมอเตอร การหลอลืน่ การเชือมโยงระหว ่ างเฟองตอเฟองในชุดเฟองทด ทีส่ งผลใหความเร็วและแรงบิดของเซอรโวมอเตอรเปลียนแปลงไปได ่ 


     123

11.2 ฟงกชั่นสําหรับขับเซอรโวมอเตอรของ POP-BOT การควบคุมเซอรโวมอเตอรของหุนยนต POP-BOT จะใชฟงกชั่นทีอยู ่ ในไฟลไลบรารี popbot.h ดังนี้

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

void servo(unsigned char _ch,unsigned int _pos)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT _pos - กําหนดตําแหนงแกนหมุนของเซอรโวมอเตอร มีคาในชวง 0 ถึง 180

11.2.2 servo_stop เปนฟงกชั่นหยุดขับเซอรโวมอเตอร รูปแบบ

void servo_stop(char _ch)

พารามิเตอร��� _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 (พอรต Di7), 8 (พอรต Di8) และ ALL ในกรณีหยุดขับทุกชอง

11.2.3 servo_read เปนฟงกชั่นอานคาตําแหนงแกนหมุนของเซอรโวมอเตอร รูปแบบ

int servo_read(char ch)

พารามิเตอร _ch - ชองเอาตพุตเซอรโวมอเตอร มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT การคืนคา คาตําแหนงแกนหมุนของเซอรโวมอเตอรทีกํ่ าลังขับอยู ณ ปจจุบัน

11.2.4 servo_get_status เปนฟงกชั่นอานสถานะการทํางานของเซอรโวมอเตอร รูปแบบ

int servo_get_status(char _ch)

พารามิเตอร _ch - กําหนดชองของเซอรโวมอเตอรทีใช ่ งาน  มีคา 7 และ 8 ซึงก็ ่ คือพอรต Di7 และ Di8 ของ POP-BOT การคืนคา - เปน “1” เมื่อเซอรโวมอเตอรในชองที่เรียกอานสถานะถูกใชงานอยู - เปน “0” เมื่อเซอรโวมอเตอรในชองที่เรียกอานสถานะไมไดถูกใชงาน


    124

       ในกิจกรรมนีนํ้ าเสนอตัวอยางการขับเซอรโวมอเตอรขนาดเล็กอยางงาย A9.1.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A9-1 A9.1.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A9.1.3 ตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร Di7 หรือ Di8 บนแผงวงจรควบคุมของ POP-BOT

B

A

MOTOR

1

RESET

ATMEGA16 8

16/A2

14/A0 18/SDA/A4 19/SCL/A5

15/A1

SERVO PORT

BAT

POWER

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

-

+Vm 7 Di4

STANDARD SERVO MOTOR

13

A7

12

A6

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

+ON

RS-232

RAWoData=i307rR Distance=P8robCM 4-12Vdc

POP-168

A9.1.4 เปดสวิตชเพื่อจายไฟใหแก POP-BOT. แลวสังเกตการทํางานของเซอรโวมอเตอร เมือจ ่ ายไฟแกวงจร เซอรโวมอเตอรจะถูกขับจากซายสุดมายังขวาสุด แลวเปลียนทิ ่ ศทางการหมุนแกนจาก ขวากลับมายังซายสุด แลวกลับทิศทางอีกครั้ง เปนเชนนี้อยางตอเนื่อง


     125

/******************************************************************************* * POP-BOT V1.0 * Filename : SimpleServo.pde * Simple servo motor controlling ********************************************************************************/ #include <popbot.h> // Include Library for POP-BOT int i=0; void setup() { } void loop() { for(i=20;i<160;i++) { servo(7,i); servo(8,i); sleep(20); } for(i=160;i>20;i—) { servo(7,i); servo(8,i); sleep(20); } }

โปรแกรมที่ A9-1 ไฟล SimpleServo.pde โปรแกรมภาษา C ของ Arduino สําหรับควบคุมเซอรโวมอเตอร ของหุนยนต  POP-BOT


    126

      ในกิจกรรมนี้จะเพิ่มเติมสวิตชเขาไปเพื่อใชในการควบคุมทิศทางการหมุนของเซอรโวมอเตอร A9.2.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A9-2 A9.2.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A9.2.3 ตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร Di7 หรือ Di8 บนแผงวงจรควบคุมของ POP-BOT

B

A

MOTOR

1

15/A1 RESET

ATMEGA168

16/A2

14/A0 18/SDA/A4 19/SCL/A5

SERVO PORT

BAT

POWER

Port function

Di2

Number : Digital Ax : Analog pin x

-

+Vm 8

-

+Vm 7 Di4

STANDARD SERVO MOTOR

13

A7

12

A6

14: Speaker 3 : MotorA1 5 : MotorA2 9 : MotorB1 6 : MotorB2

ON

+ON

RS-232

RAWoD ata=i30 7r R Dista nce=P8r ob CM 4-12Vdc

POP-168

  A9.2.4 เปดสวิตชจายไฟแก POP-BOT แลวกดสวิตช Di2 และ Di4 บนแผงวงจรควบคุมหลักของ POP-BOT สังเกต การทํางานของเซอรโวมอเตอร สวิตช Di2 ใชในการควบคุมใหแกนหมุนของเซอรโวมอเตอรเคลื่อนที่มายังตําแหนงทางขวาสุด สวิตช Di4 ใชในการควบคุมใหแกนหมุนของเซอรโวมอเตอรเคลื่อนที่มายังตําแหนงทางซายสุด เมื่อเซอรโวมอเตอรถูกควบคุมใหแกนหมุนเคลื่อนที่ไปยังตําแหนงทังซายและขวาสุด สวนควบคุมจะขับ สัญญาณเสียงแจงเตือน ดังนั้นดวยการใชสวิตชทังสองตั ้ วจึงสามารถควบคุม และกําหนดตําแหนงในการเคลื่อนที่ของแกนหมุน ของเซอรโวมอเตอรได โดยที่ SLCD แสดงคาตําแหนงของแกนหมุนใหทราบอยางตอเนื่องดวย


     127

/******************************************************************************* * POP-BOT V1.0 * Filename : SwitchControlServo.pde * Control a servo motor with 2 button switches at Di2 and Di4. Show on SLCD ********************************************************************************/ #include <popbot.h> // Include Library for POP-BOT int pos=100; void setup() { } void loop() { if(in(2)==0) { if(pos<180) { pos += 20; } else { beep(); } } if(in(4)==0) { if(pos > 0) { pos -= 20; } else { beep(); } } servo(7,pos); servo(8,pos); lcd(“Pos: %d “,pos); sleep(100); }

การทํางานของโปรแกรม จุดมุงหมายของโปรแกรมนี  ้คือ ควบคุมตําแหนงแกนหมุนของเซอรโวมอเตอรโดยใชสวิตช 2ตัว และมี การแสดงคาตําแหนงไปยังโมดูล SLCD เพือแจ ่ งใหผูใชงานทราบดวย โปรแกรมจะตรวจสอบการกดสวิตชทีขา ่ พอรต Di2 และ Di4 ถาหากสวิตชทีขา ่ Di2 ถูกกด คาตําแหนงของเซอรโวมอเตอร (คาของตัวแปร i) จะเพิ่มขึ้น ครั้งละ 20 แตถาหากเปนสวิตช Di4 ถูกกด คาตําแหนงของเซอรโวมอเตอรจะลดลงครั้งละ 20 เชนกัน เมือค ่ าของตําแหนง (pos) สูงขึ้นหรือลดตําลงจนเท ่ ากับคาตําหนงสูงสุดหรือตํ่าสุด ฟงกชัน่ beep จะถูก เรียกใชงานเพื่อขับเสียงออกทางลําโพงเปยโซของหุนยนต  POP-BOT

โปรแกรมที่ A9-2 ไฟล SwitchControlServo.pde โปรแกรมภาษา C ของ Arduino สําหรับควบคุมการเคลือนที ่ ของแกนหมุ ่ นของเซอรโวมอเตอร


    128


     129



  ในบทนีเป ้ นการนําเสนอตัวอยางการนําเซอรโวมอเตอรมาตอรวมกับโมดูลวัดระยะทาง GP2D120 และติด ตังเข ้ ากับหุนยนต POP-BOT เพื่อใชในการคนหาวัตถุ

12.1 การดัดแปลงหุนยนต  POP-BOT ใหเปนหุนยนตคนหาวัตถุ 12.1.1 อุปกรณเพิมเติ ่ ม ประกอบดวย

ชิ้นตอแนวตรง x 4

โมดูล GP2D120

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

สกรู 3x15 มม. x2

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

เสารอง 10 มม. x 2 เซอรโวมอเตอรมาตรฐาน

สกรู 3x10 มม. x 4

นอต 3 มม. x 4

เสารองโลหะ 33 มม. x 2


    130

12.1.2 ขันตอนการสร ้ าง (1) ถอดตัวตรวจจับที่ตออยูกับตัวถังของหุนยนต POP-BOT ออกทั้งหมด

(2) ถอดกานหมุนของเซอรโวมอเตอรออก แลวยึดเสารองโลหะ 33 มม. 2 ตัวและเสารองพลาสติก 10 มม. 2 ตัวเขา กับรูยึดของเซอรโวมอเตอร โดยใชสกรู 3x15 มม. ดังรูป รูยึดเซอรโวมอเตอร

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

เสารองพลาสติก 10 มม. สกรู 3x15 มม. (3) ยึดเซอรโวมอเตอรที่ติดตั้งเสารองจากขันตอนที ้ ่ (2) เขากับดานหนาของฐานหุนยนต POP-BOT ดวยสกรู 3x10 มม. ขันยึดใหแนนจากทางดานลาง


     131

(4) นําฃิ้นตอแนวตรง 2 ชิ้นยึดเขากับโมดูล GP2D120 ดวยสกรู 3x10 มม. และนอต 3 มม.

(5) ติดตั้งชิ้นตอมุมฉากเขากับกานหมุนของเซอรโวมอเตอรดวยสกรูเกลียวปลอย 2 มม. 2 ตัว

(6) นําโมดูล GP2D120 ที่ติดตั้งชิ้นตอแนวตรงจากขันตอน ้ (4) มาตอเขากับชิ้นตอมุมฉาก

(7) เสียบโครงสรางกานหมุนของเซอรโวมอเตอรที่มีโมดูล GP2D120 เขากับแกนหุมนของเซอรโวมอเตอร แลว ใชสกรูของเซอรโวมอเตอรขันยึดใหแนน


    132

(8) ตอสายของเซอรโวมอเตอรเขาที่จุดตอเซอรโวมอเตอร Di7 ของแผงวงจรควบ���ุมหุนยนต POP-BOT โดยตอ วตรวจสอบขัวต ้ อใหดี สายสีแดงของเซอรโวมอเตอรตองตอเขาที่ขัว้ + , สายสีดําตอกับขั้ว - และสายสัญญาณตอ เขาที่ขัวของสั ้ ญญาณ (S) จากนั้นตอสายจากโมดูล GP2D120 เขาที่จุดตอ 19/SCL/A5 ของ POP-BOT

(9) จะไดหุนยนต POP-BOT ที่พรอมสําหรับการเขียนโปรแกรมเพื่อปฏิบัติภารกิจคนหาวัตถุ ดังรูป


     133

  

     +

RAWoData=i307rRDistance=P8robCM



+

RAWoData=i307rRDistance=P8robCM



RAWoData=i307rRDistance=P8robCM

 

RAWoData=i307rRDistance=P8robCM

 



RAWoData=i307rRDistance=P8robCM

 

+

+

RAWoData=i307rRDistance=P8robCM

+

+

RAWoData=i307rRDistance=P8robCM

+





RAWoData=i307rRDistance=P8robCM

+

     

+

 

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

RAWoData=i307rRDistance=P8robCM

POP-BOT ทําการอานคาจากโมดูล GP2D120 ในแตละตําแหนงที่แกนหุมนของเซอรโวมอเตอรเคลื่อน ทีไป ่ นํามาแสดงที่โมดูล SLCD หลังจากอานคาครบทั้ง 9 ตําแหนง จะนํามาจัดลําดับแลวเลือกคาขอมูลสูงสุด เนื่องจากหากโมดูล GP2D120 ตรวจจับวัตถุได คาทีอ่ านไดจะเปนคาสูง A10.1 เปดโปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A10-1 A10.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A10.3 ตอเซอรโวมอเตอรเขาทีจุ่ ดตอเซอรโวมอเตอร Di 7 บนแผงวงจรควบคุมของ POP-BOT A10.4 วางวัตถุเปาหมาย ในกิจกรรมนีเลื ้ อกวางไวทีตํ่ าแหนง 67.5 องศา และหางจากหุนยนต  15 ซม.


    134

/******************************************************************************* * POP-BOT V1.0 * Filename : SeekingObject.pde * Moves servo and seek object position to show the result on SCLD ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** #include <popbot.h> // Include Library for POP-BOT #include <gp2d120_lib.h> int posValue[] = {170,150,130,110,90,70,50,30,10}; // Servo position value int j,Minimum,MinPoint; int GP2[9]; int getPoint() { int i; int old=GP2[0]; int min_; for(i=0;i<9;i++) { if(GP2[i]<old) { old = GP2[i]; min_ = i; } } Minimum = old; return(min_); } void setup() { } void loop() { for(j=0;j<9;j++) { servo(7,posValue[j]); sleep(1000); GP2[j]=getdist(5); lcd(“Pos[%d]: %d “,j,GP2[j]); } MinPoint = getPoint(); servo(7,posValue[MinPoint]); lcd(“Selected: %d #nValue = %d “,MinPoint,Minimum); beep(); sleep(5000); lcd(“#c”); // Clear old display } /***************************************************************************/

โปรแกรมที่ A10-1 ไฟล SeekingObjectTest.pde โปรแกรมภาษา C ของ Arduino สําหรับคนหาวัตถุ โดยใชโมดูล GP2D120 ทํางานรวมกับเซอรโวมอเตอรของหุนยนต  POP-BOT


     135

A10.5 เปดสวิตชจายไฟใหหุนยนต  POP-BOT แลวสังเกตการทํางาน POP-BOT ขับเซอรโวมอเตอรเพื่อหมุนโมดูล GP2D120 ไปยังตําแหนง 0 (0 องศา) แลวอานคาจาก GP2D120 มาแสดงยังโมดูล SLCD Position 0 := 0

(คานีสามารถเปลี ้ ยนแปลงได ่ ตามสภาพแวดลอม)

+

Position 1:= 7==

    Position 2:= 67=

+

+

Position 8:= 0==

RAWoData=i307rRDistance=P8robCM

Position 7:= 0==

Position 4:= 75=



   

    

RAWoData=i307rRDistance=P8robCM

Position 3:= 215

RAWoData=i307rRDistance=P8robCM



 

RAWoData=i307rRDistance=P8robCM

+

+

Position 0:= 0==

RAWoData=i307rRDistance=P8robCM

RAWoData=i307rRDistance=P8robCM

Position 6:= 0==

+

+

RAWoData=i307rRDistance=P8robCM

+

RAWoData=i307rRDistance=P8robCM



+

     



 

จากนัน้ POP-BOT จะขับแกนหมุนของเซอรโวมอเตอรมายังตําแหนง 1 (มุมประมาณ 22.5 องศา) แลว แสดงคาทีโมดู ่ ล SLCD ทําเชนนี้จนถึงตําแหนง 8

RAWoData=i307rRDistance=P8robCM

Position 5:= 10=

หลังจากอานคาครบทุกตําแหนง สวนควบคุมจะเลือกแสดงคาตําแหนงทีมี่ คาสูงสุด ซึงน ่ าจะเปนตําแหนง หรือทิศทางทีมี่ วัตถุวางอยูดั งนี้ Selected : 3 Value = 215

นันคื ่ อ POP-BOT ตรวจสอบพบวา นาจะมีวัตถุอยูในตํ  าแหนง 3 มีมุมประมาณ 67.5 องศา และอานคาระยะหางจากโมดูล GP2D120 ไดเทากับ 215


    136

    ในกิจกรรมนีเป ้ นการตอยอดจากกิจกรรมที่ 10 หลังจากทีสามารถตรวจสอบแนวโน ่ มทิศทางและตําแหนง ของวัตถุเปาหมายไดแลว ในกิจกกรมนีจะเพิ ้ ่มเติมโปรแกรมเขาไปเพื่อควบคุมใหหุนยนต  POP-BOT เคลื่อนที่เขา หาวัตถุเปาหมาย โดยในทีนี่ เลื ้ อกใชลูกบอลพลาสติกแบบที่ใชหองบอลของสวนสนุกในรม หรือใชลูกเทนนิสก็ได เมื่อหุนยนต  POP-BOT ตรวจพบตําแหนงของลูกบอล จะเคลื่อนทีเข ่ าหาและเมื่อถึงระยะใกลเพียงพอก็จะขับเสียง เพื่อแจงการตรวจพบลูกบอลหรือวัตถุ A11.1 ยังคงใชหุนยนต  POP-BOTที่ติดตั้ง GP2D120 และเซอรโวมอเตอรจากกิจกรรมที่ 10 ในการทดสอบ เปด โปรแกรม Arduino IDE เขียนโปรแกรมภาษา C ตามโปรแกรมที่ A11-1 A11.2 จากนันทํ ้ าการคอมไพล แลวอัปโหลดไปยังหุนยนต  POP-BOT จากนันป ้ ดสวิตช ปลดสายดาวนโหลดออก A11.3 วางลูกบอลไวบนพื้น ใหหางจากหุนยนต  POP-BOT 15 ซม. A11.4 เปดสวิตชจายไฟเลียงให ้ หุนยนต  POP-BOT สังเกตการทํางาน POP-BOT จะเริมต ่ นการทํางานดวยการตรวจสอบตําแหนงและทิศทางของลูกบอลเหมือนกับกิจกรตรมที่ 10 แตคราวนีไจะไม ้ มีการแสดงคาทีโมดู ่ ล SLCD แลว เมื่ออานคาครบทุกตําแหนงแลว ก็จะประมวลผลเพื่อเลือก ทิศทางทีมี่ คาตําแหนงสูงสุด แลวขับมอเตอรใหหุนยนต  เคลื่อนที่ไปยังทิศทางนัน้

  

+

3



1   2



+

RAWoData=i307rRDistance=P8robCM

แตถาหากคาทีอ่ านไดจาก GP2D120 มากกวา 32 แสดงวา ไมมีวัตถุเปาหมายอยูในบริ  เวณหรือ รัศมีการตรวจจับ POP-BOT จะหมุนตัวกลับเพื่อเปลี่ยนทิศทางการคนหาตอไป เมือ่ POP-BOT อานคาไดตํากว ่ า 8 นั่นแสดงวา ขณะนี้ POP-BOT พบลูกบอลหรือวัตถุเปาหมายแลว ก็จะขับเสียง “ติ้ด” แจงการคนหาสําเร็จ


     137

/******************************************************************************* * POP-BOT V1.0 * Filename : BallSeekerRobot.pde * Seek ball and move to it. ********************************************************************************/ // *** in this example SLCD connected to pin 16 *** #include <popbot.h> // Include Library for POP-BOT #include <gp2d120_lib.h> #define POW 60 int posValue[] = {170,150,130,110,90,70,50,30,10}; // Servo position value int j,Minimum,MinPoint; int GP2[9]; void forward(unsigned int time) { motor(1,POW); motor(2,POW); sleep(time); } void turn_left(unsigned int time) { motor(1,-POW); motor(2,POW); sleep(time); } void turn_right(unsigned int time) { motor(1,POW); motor(2,-POW); sleep(time); } int getPoint() { int i; int old=GP2[0]; // Set start element int min_; for(i=0;i<9;i++) { if(GP2[i]<old) { old = GP2[i]; min_ = i; } } Minimum = old; return(min_); } void setup() { beep(); sleep(2000); }

โปรแกรมที่ A11-1 ไฟล BallSeekerRobot.pde โปรแกรมภาษา C ของ Arduino สําหรับตามหาลูกบอลของ หุนยนต  POP-BOT (มีตอ)


    138

void loop() { motor_stop(ALL); servo(7,posValue[0]); for(j=0;j<9;j++) { servo(7,posValue[j]); GP2[j]=getdist(5); sleep(100); } MinPoint = getPoint(); if(Minimum>32) { turn_right(150); sleep(600); } else if(Minimum<8) { servo(7,posValue[getPoint()]); beep(); while(1); } else { switch(MinPoint) { case 0: turn_right(320); forward(400-Minimum); break; case 1: turn_right(240); forward(400-Minimum); break; case 2: turn_right(160); forward(400-Minimum); break; case 3: turn_right(80); forward(400-Minimum); break; case 4: turn_right(0); forward(400-Minimum); break; case 5: turn_left(80); forward(400-Minimum); break; case 6: turn_left(160); forward(400-Minimum); break; case 7: turn_left(240); forward(400-Minimum); break; case 8: turn_left(320); forward(400-Minimum); break; } } }

โปรแกรมที่ A11-1 ไฟล BallSeekerRobot.pde โปรแกรมภาษา C ของ Arduino สําหรับ ตามหาลูกบอลของหุนยนต  POP-BOT (จบ)


     139


    140


POP-BOT110923