1
ArduinoPOP-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.1F
AN2
C2 0.1F
PD5
RST
C4 0.1F
+5V PB7 PB6 VCC GND
+5V
2 4 C6 0.1F
C3 0.1F
VCC GND PD4 PD3
5
16
R9 68
R10 150
1
IC2 MAX3232
3
C5 0.1F
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.1F
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 100F 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 10F 16V
SW2 RESET
IC1 KIA7031
C1 100F 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.01F 50V
C3 1000F 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
FA 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