ขั้นตอนการสร้าง IPST-BOT SE รายการอุปกรณ์สำ�หรับการสร้าง IPST-BOT SE IPST-SE.png
บอร์ดควบคุม IPST-SE x 1
กะบะถ่าน3.jpg กะบะถ่านขนาด AA 6 ก้อน x 1 เสารองโลหะยาว 50 มม. x 4 สกรูมือหมุน 3 มม. x 4 สกรู 3x15 มม. x 5 สกรู 3x10 มม. x 12 สกรู 3x6 มม. x 10 สกรูเกลียวปล่อย 2 มม. x 2 นอต 3 มม. x 12 เสารองพลาสติก 3 มม. x 4
Stick.jpg แท่งต่อ 3 รู x 2 , แท่งต่อ 5 รู x 2
แผ่นฐาน01.jpg
แผ่นฐาน02.jpg
แผ่นฐานกลมมีล้อประคอง x 1
แผ่นฐานกลมไม่มีล้อประคอง x 1
GearBOX48x1.jpg
ล้อพร้อมยาง.jpg
ชุดเฟืองขับมอเตอร์ BO2 48:1 x 2
ล้อพลาสติกพร้อมยาง x 2
ZX01ISO.jpg สกรูและนอต.jpg
ZX-SWITCH x 2
ZX-03 x2.jpg ZX-03 x 2
ชิ้นต่อมุมฉาก แดง.jpg ชิ้นต่อมุมป้านเหลือง MINI.jpg ชิ้นต่อมุมฉาก x 2
ชิ้นต่อมุมป้าน x 2
ZX-Speaker.jpg ZX-SPEAKER x 1
การสร้าง
Step001.jpg
Step00.jpg
1. นำ�ชุดเฟืองขับมอเตอร์ยึดเข้ากับล้อพลาสติกและยาง จากนั้นนำ�สกรูเกลียวปล่อยขนาด 2 มม.ขันยึด (ทำ�เหมือนกัน 2 ชุด)
Step04.jpg Step04.jpg
Step05.jpg
สกรู 3x6 มม.
2. นำ�ชุดเฟืองขับมอเตอร์ประกบยึดเข้ากับแผ่นฐาน โดยใช้แผ่นฐานที่มีล้อประคอง ให้ลวดยึดล้อประคองอยู่ด้านล่างดังรูป จากนั้นใช้สกรูขนาด 3 x 6 มม.ขันยึดชุดเฟืองขับมอเตอร์เข้ากับแผ่นฐานให้แน่น 3. นำ�เสารองโลหะขนาด 50 มม. ยึดเข้าที่มุมทั้ง 4 ด้านของแผ่นฐานเพื่อเตรียมสำ�หรับการยึดแผ่นฐานอีกชุดต่อไป Step07New.jpg
Step08.jpg
Step06New.jpg นอต 3 มม. สกรู 3x6 มม.
เสารอง 3 มม. สกรู 3x10 มม.
Step09.jpg
4. นำ�ถาดรองกะบะถ่านยึดเข้ากับแผ่นฐานที่ไม่มีล้อประคองบริเวณกึ่งกลางของแผ่นฐานตำ�แหน่งดังรูป แล้วใช้สกรูขนาด 3x6 มม.ขันยึดด้วย นอต 3 มม. 5. นำ�บอร์ด IPST-SE (ร้อยด้วยสกรู 3x10 มม. จากนั้นรองด้วยเสารองพลาสติก 3 มม. ดังรูป เพื่อเตรียมนำ�ไปประกบเข้ากับแผ่นฐาน
Step08New.jpg
Step09New.jpg
6. นำ�แผ่นฐานที่ยึดกะบะถ่านเรียบร้อยแล้วประกบเข้ากับบอร์ด IPST-SE จากนั้นใช้นอต 3 มม.ขันยึดให้แน่น 7. ปลายสายของกะบะถ่านเป็นขั้วต่ออแดปเตอร์ให้นำ�มาเสียบบนจุดต่ออแดปเตอร์บนบอร์ด IPST-SE 8. พลิกแผ่นฐานด้านล่างขึ้นมา ใส่ถ่านขนาด AA จำ�นวน 6 ก้อนเข้าไป 10. นำ�แผ่นฐานที่ยึดมอเตอร์แล้วกับแผ่นฐานที่ยึดบอร์ดเรียบร้อย มาประกบเข้าด้วยกัน จากนั้นใช้สกรูมือหมุนขันยึดทั้งสี่ด้าน ด้านหน้า
Step11New.jpg
ขวา Step12New.jpg
สกรูมือหมุน ซ้าย เสียบสายมอเตอร์ 11. เสียบสายมอเตอร์เข้าที่จุดต่อมอเตอร์ โดยมอเตอร์ซ้ายเสียบเข้าช่อง (1) และมอเตอร์ขวาเสียบเข้าช่อง (2) สำ�หรับทิศทางของสายให้ทดลอง หมุนล้อ ถ้าหมุนล้อให้เคลื่อนที่ไปด้านหน้า ไฟที่ขั้วต่อมอเตอร์จะต้องติดเป็นสีเขียว หมุนถอยหลังไฟที่ขั้วต่อมอเตอร์จะต้องติดเป็นสีแดง ถ้าเป็น ในทางตรงกันข้ามให้กลับขั้วมอเตอร์ให้ถูกต้อง
การติดตั้งแผงวงจรสวิตช์เพื่อตรวจจับด้านหน้า Step15New.jpg Step20.jpg Step13New.jpg
1. นำ�แผงวงจรสวิตช์ยึดเข้ากับชิ้นต่อมุมฉากโดยใช้สกรูขนาด 3x15 มม. และนอต 3 มม.ขันยึด จากนั้นนำ�ชิ้นต่อมุมป้านเสียบเข้าปลายของ ชิ้นต่อมุมฉาก ทำ�เหมือนกัน 2 ชุด 2. นำ�แท่งต่อ 3 รู ยึดเข้ากับแผ่นฐานด้านบนของหุ่นยนต์ IPST-BOT SE โดยใช้สกรูขนาด 3x10 มม.และนอต 3 มม.ขันยึดทั้งสองข้าง ของแผ่นฐาน
Step17New.jpg
ซ้าย Step16New.jpg
16/ขวา
ขวา
17/ซ้าย
3. นำ�แผงวงจรสวิตช์เสียบเข้าที่แท่งต่อในลักษณะดังรูป 4. เสียบสายจากแผงวงจรสวิตช์ด้านซ้ายเข้าที่ขา 17 และด้านขวาเข้าที่ขา 16 Step20New.jpg Step19New.jpg Step18New.jpg ซ้าย
ZX-03-Connect.jpg
Step21New.jpg
ขวา
การติดตั้งแผงวงจรตรวจจับการสะท้อนแสงอินฟราเรด
1. นำ�แผงวงจรตรวจจับการสะท้อนแสงอินฟราเรดยึดเข้ากับแท่งต่อ 5 รู โดยใช้สกรู 3x15 มม.และนอต 3 มม.ขันยึดให้แน่น ในลักษณะดัง รูป ทำ�เหมือนกัน 2 ชุด 2. นำ�แผงวงจรตรวจจับการสะท้อนแสงอินฟราเรดยึดเข้ากับแผ่นฐานด้านล่างของหุ่นยนต์ โดยใช้สกรู 3x10 มม. ขันยึด 3. เสียบสายจากแผงวงจรตรวจจับการสะท้อนด้านซ้ายเข้าที่ขุดต่อ A0 ด้านขวาเข้าที่จุดต่อ A1
Step24New.jpg
Step23New.jpg เสียบสายช่อง 18
ติดตั้งลำ�โพงเปียโซ
เพื่อให้หุ่นยนต์เคลื่อนที่และสามารถใช้เสียงแสดงสถานะการทำ�งานต่างๆ ของหุ่นยนต์ ได้ โดยทำ�จะติดตั้งด้านข้างของตัวหุ่นยนต์ดังรูป โดยใช้ สกรูขนาด 3x15 มม. และนอต 3 มม.ขันยึด จากนั้นเสียบสายเซนเซอร์เข้าที่ขา 18
Step25New.jpg
ซอฟต์แวร์และไดรเวอร์
ซอฟต์แวร์ที่ใช้ในการพัฒนากับ IPST-SE มี 2 คือ Arduino ปัจจุบันเป็นเวอร์ชั่น 1.05 สามารถเลือกติดตั้งได้ทั้ง windows และ Mac Wirring ปัจจุบันเป็นเวอร์ชั่น 1.0 สามารถเลือกติดตั้งได้ทั้ง windows และ Mac ซอฟต์แวร์ทั้งสองตัวทำ�งานแทบจะเหมือนกันทุกประการ สำ�หรับ iBOT จะเลือกใช้ซอฟต์แวร์ Arduino โดยชุดซอฟต์แวร์ Arduino เวอร์ชั่น สำ�หรับบอร์ด IPST-SE และ iBOT เพิ่มเติมไลบรารี่และไดรเวอร์เพื่อรองรับการใช้งานกับบอร์ด IPST-SE ไว้แล้ว โดยขั้นตอนการติดตั้งเป็น ดังนี้ 1. นำ�แผ่นซีดีรอมที่จัดมาพร้อมกับชุด IPST-SE ใส่ลงในไดรฟซีดีรอม เปิดโฟลเดอร์ IPST-SE IPST++\Software\Windows
IPST-SE000.jpg IPST-SE001.jpg
หมายเหตุ ถ้าต้องการอัพเดตซอฟต์แวร์เวอร์ชั่นใหมสามารถดูเพิ่มเติมได้จากเวปไซต์ www.ipst-microbox.com 2. ดับเบิ้ลคลิกที่ไฟล์ ArduinoIPST_1.0.5_SetupXXXXXX (โดย XXXXXX เป็นวันเดือนปีที่อัพเดตซอฟต์แวร์ล่าสุด) เพื่อติดตั้ง
IPST-SE002.jpg
IPST-SE003.jpg
IPST-SE004.jpg
3. ที่หน้าต่างต้อนรับ ให้คลิก Next เพื่อเข้าสู่หน้าต่างต่อไป 4. โปรแกรมสอบถามตำ�แหน่งติดตั้งซอฟต์แวร์ โดยค่าตั้งต้นอยู่ที่ c:\ArduinoIPST ถ้าไม่ต้องการแก้ไขให้กด Next เข้าสู่ขั้นตอนต่อไป 5. โปรแกรมสอบชื่อของ Start Menu ถ้าไม่เปลี่ยนแปลงก็กด Next ต่อไป
IPST-SE006.jpg
IPST-SE007.jpg
IPST-SE008.jpg
6. โปรแกรมติดตั้งจะสรุปรายละเอียดมาให้ดูอีกครั้ง ให้กด Install เพื่อเริ่มขั้นตอนการติดตั้ง 7. หลังจากติดตั้งซอฟต์แวร์เสร็จแล้วจะปรากฎหน้าต่างสำ�หรับติดตั้งไดรเวอร์ขึ้นมาอีกครั้ง ให้กด Install เพื่อติดตั้งไดรเวอร์ จนขึ้นปุ่ม Finish เป็นอันสิ้นสุดการติดตั้งโปรแกรม
การขับเคลื่อนหุ่นยนต์ iBOT ชุดคำ�สั่งสำ�หรับขับเคลื่อนหุ่นยนต์ ฟังก์ชั่น
motor(ch,speed)
เป็นฟังก์ชั่นสำ�หรับสั่งงานมอเตอร์ให้ทำ�งาน โดย ch หมายถึงช่องของมอเตอร์เป็นได้ 3 ค่าคือ 1 ,2 และ ALL หมายถึงการสั่งงานให้มอเตอร์ 2 ตัวทำ�งานพร้อมกัน speed คือค่าความเร็วของมอเตอร์มีค่าระหว่าง -100 ถึง 100 โดย ถ้าค่าเป็นบวก ทิศทางมอเตอร์ ไปหน้า ถ้าค่าเป็นลบ ทิศทางมอเตอร์ถอยหลัง ตัวอย่างการใช้งาน
motor(1,60); motor(2,-40);
motor(ALL,100);
ให้มอเตอร์ 1 ไปด้านหน้าด้วยความเร็ว 60 เปอร์เซ็นต์ ให้มอเตอร์ 2 ถอยหลังด้วยความเร็ว 40 เปอร์เซ็นต์ ให้มอเตอร์ทั้งสองตัวเคลื่อนที่ไปด้านหน้าด้วยความเร็ว 100 เปอร์เซ็นต์
ฟังก์ชั่น motor_stop(ch) และ ao()
โดย
ch
หมายถึงช่องของมอเตอร์เป็นได้ 3 ค่าคือ 1 ,2 และ ALL หมายถึงการสั่งงานให้มอเตอร์ 2 ตัวทำ�งานพร้อมกัน
ตัวอย่างการใช้งาน
motor_stop(1); ให้มอเตอร์ 1 หยุดทำ�งาน motor_stop(ALL); ให้มอเตอร์ทั้งสองตัวหยุดทำ�งาน ( สามารถเรียกชื่อโดยใช้คำ�สั่ง ao() แทนได้ ) ao(); ให้มอเตอร์ทั้งสองตัวหยุดทำ�งาน จากฟังก์ชั่นทั้งสองนี้สามารถควบคุมให้หุ่นยนต์เคลื่อนที่ เดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา ได้แล้ว เพื่อเพิ่มความสะดวกมากขึ้นจะมี ฟังก์ชั่นเพิ่มเพื่อให้เรียกใช้งานได้ง่ายและสะดวก ดังนี้
ฟังก์ชั่น fd(speed)
เพื่อสั่งให้หุ่นยนต์เดินหน้า ซึ่งมาจาก void fd(int speed){ motor(ALL,speed); }
I-BOT-FD.jpg
ฟังก์ชั่น bk(speed)
เพื่อสั่งให้หุ่นยนต์ถอยหลัง ซึ่งมาจาก void bk(int speed){ motor(ALL,-speed); }
i-BOT-BK.jpg
ฟังก์ชั่น sl(speed)
เพื่อสั่งให้หุ่นยนต์หมุนตัวทางซ้าย ซึ่งมาจาก void sl(int speed){ motor(1,-speed); motor(2,speed); }
จุดหมุน i-BOT-SL.jpg
ฟังก์ชั่น sr(speed)
เพื่อสั่งให้หุ่นยนต์หมุนตัวทางขวา ซึ่งมาจาก จุดหมุน
void sr(int speed){ motor(1,speed); motor(2,-speed);
i-BOT-SR.jpg
}
ฟังก์ชั่น tl(speed)
เพื่อสั่งให้หุ่นยนต์เลี้ยวซ้าย (เลี้ยวล้อเดียว) ซึ่งมาจาก void tl(int speed){ motor(1,0); motor(2,speed); }
จุดหมุน i-BOT-TL.jpg
ฟังก์ชั่น tr(speed)
เพื่อสั่งให้หุ่นยนต์เลี้ยวขวา (เลี้ยวล้อเดียว) ซึ่งมาจาก void tr(int speed){ motor(1,speed); motor(2,0); }
ฟังก์ชั่น fd2(speed1,speed2)
จุดหมุน i-BOT-TR.jpg
เพื่อสั่งให้หุ่นยนต์เคลื่อนที่ไปข้างหน้าโดยปรับความเร็วมอเตอร์ 1 และมอเตอร์ 2 ต่างกัน ซึ่งมาจาก void fd2(int speed1, int speed2){ motor(1,speed1); motor(2,speed2); }
ฟังก์ชั่น bk2(speed1,speed2)
เพื่อสั่งให้หุ่นยนต์เคลื่อนที่ถอยหลังโดยปรับความเร็วมอเตอร์ 1 และมอเตอร์ 2 ต่างกัน ซึ่งมาจาก void bk2(int speed1, int speed2){ motor(1,-speed1); motor(2,-speed2); }
หมายเหตุ นอกจากฟังก์ชั่นสำ�หรับขับเคลื่อนหุ่นยนต์แล้วมีฟังก์ชั่น OK() ที่เมื่อดาวน์ โหลดโปรแกรมไปยังหุ่นยนต์แล้วจะต้องกดปุ่ม OK บน ตัวหุ่นยนต์ก่อนที่จะทำ�งานคำ�สั่งถัดไป ช่วยให้ขณะที่กำ�ลังดาวน์ โหลดโปรแกรมอยู่ หุ่นยนต์ ไม่วิ่งตกพื้น
ฟังก์ชั่น OK()
รอการกดปุ่ม OK ก่อนที่จะทำ�งานคำ�สั่งถัดไป พร้อมแสดงข้อความที่หน้าจอ โดยก่อนการกดปุ่ม OK หน้าจอ GLCD แสดงข้อความ > Push OK เมื่อกดปุ่ม OK แล้วหน้าจอจะแสดงข้อความ > Running ..
GLCD-Push-OK.jpg
ฟังก์ชั่น sw_OK_press()
รอการกดสวิตช์ OK ก่อนที่จะทำ�งานคำ�สั่งถัดไป (ไม่แสดงผลหน้าจอ)
IPST-SE_1.jpg
ตำ�แหน่งสวิตช์ OK
GLCD-Running.jpg
เป้าหมาย
ปฏิบัติการที่ 1 ขับเคลื่อนหุ่นยนต์ iBOT
ทดลองใช้คำ�สั่งในการขับเคลื่อนหุ่นยนต์รูปแบบต่างๆ
การทำ�งานของโปรแกรม #include <ipst.h> void setup(){ OK(); } void loop(){ glcd(0,0,”FORWARD 50% “); fd(50); sw_OK_press(); glcd(0,0,”BACKWORD 50% “); bk(50); sw_OK_press(); glcd(0,0,”SPIN LEFT 50% “); sl(50); sw_OK_press(); glcd(0,0,”SPIN RIGHT 50%”); sr(50); sw_OK_press(); glcd(0,0,”TURN LEFT 50% “); tl(50); sw_OK_press(); glcd(0,0,”TURN RIGHT 50%”); tr(50); sw_OK_press(); glcd(0,0,”ALL MOTOR OFF “); ao(); sw_OK_press(); }
// รอกดสวิตช์กอ ่ นเริม ่ ท�ำงาน
// หุน ่ ยนต์เคลือ ่ นทีไ่ ปข ้างหน ้า // หุน ่ ยนต์เคลือ ่ นทีถ ่ อยหลัง // หุน ่ ยนต์หมุนตัวด ้านซ ้าย // หุน ่ ยนต์หมุนตัวด ้านขวา // หุน ่ ยนต์เลีย ้ งซ ้าย // หุน ่ ยนต์เลีย ้ วขวา // หุน ่ ยนตหยุด
โปรแกรมที่ 1 SimpleMoving.ino ทดสอบการเคลื่อนที่ของหุ่นยนต์เบื้องต้น โปรแกรมจะรอรับการกดสวิตช์ OK จากนั้นจะเรียกฟังก์ชั่นการเคลื่อนที่หุ่นยนต์ทีละฟังก์ชั่นพร้อมทั้งแสดงการทำ�งานที่หน้าจอ GLCD ด้วย
การทดลอง
เปิดโปรแกรม ArduinoIPST แล้วเขียนโปรแกรมตามโปรแกรมที่ 1 จากนั้นบันทึกในชื่อ SimpleMoving.ino เชื่อมต่อสาย Mini USB จากคอมพิวเตอร์เข้าที่บอร์ด IPST-SE แล้วทำ�การอัปโหลดโปรแกรมไปยังหุ่นยนต์ จากนั้นถอดสาย Mini USB ออก สังเกตดูการเคลื่อนที่ของหุ่นยนต์เมื่อกดสวิตช์ OK ในแต่ละครั้ง ตรงกับข้อความที่แสดงที่หน้าจอ GLCD หรือไม่ หมายเหตุ ถ้าการเคลื่อนที่ของมอเตอร์ ไม่ตรงตามข้อความที่แสดงที่หน้าจอ GLCD ให้ตรวจสอบการต่อสายมอเตอร์ว่ากลับทิศทางกันหรือไม่
ปฏิบัติการที่ 2 ระยะทางมาจากความเร็วหารด้วยเวลา
เป้าหมาย
เขียนโปรแกรมเพื่อทดสอบหาระยะทางการเคลื่อนที่ โดยดูจากความเร็วของคำ�สั่งควบคุมมอเตอร์และเวลาที่ให้มอเตอร์ทำ�งาน กรณีแรก (มอเตอร์ทำ�งานด้วยความเร็ว 100 % / เวลาที่ใช้ 1 วินาที ) แสดงในโปรแกรมที่ 2-1
#include <ipst.h> void setup(){ OK(); fd(100); delay(1000); ao(); } void loop(){}
โปรแกรมที่ 2-1 Speed_and_Time ทดสอบเวลาและความเร็วการทำ�งานของหุ่นยนต์ กรณีที่สอง มอเตอร์ทำ�งานด้วยความเร็ว 50 % / เวลาที่ใช้ 2 วินาที แสดงในโปรแกรมที่ 2-2 #include <ipst.h> void setup(){ OK(); fd(50); delay(2000); ao(); } void loop(){}
โปรแกรมที่ 2-2 Speed_and_Time2 ทดสอบเวลาและความเร็วการทำ�งานของหุ่นยนต์
การทดลอง
โหลดโปรแกรมที่ 2-1 ไปยังหุุ่นยนต์ iBOT จากนั้นกดสวิตช์ OK วัดระยะทางที่หุ่นยนต์วิ่งไปได้ โหลดโปรแกรมที่ 2-2 ไปยังหุ่นยนต์ iBOT จากนั้นกดสวิตช์ OK วัดระยะทางเทียบกับโปรแกรมแรก โดยปกติระยะทางที่ได้ น่าจะใกล้เคียงกัน ความคลาดเคลื่อนจะมาจาก เมื่อป้อนความเร็วหุ่นยนต์ 100% ล้อจะเกิดการฟรีขณะออกตัว และขณะ ที่สั่งให้หุ่นยนต์หยุดจะมีแรงเฉื่อยเกิดขึ้น i-BOTSpeed and time.jpg fd(100); delay(1000);
fd(50); delay(2000);
i-BOTSpeed and time.jpg
ปฏิบัติการที่ 3 ปรับแต่งหุ่นยนต์ ให้เคลื่อนที่ตรง เป้าหมาย เพื่อให้หุ่นยนต์ทำ�ภารกิจทางตรงได้แม่นยำ� โดยการปรับความเร็วมอเตอร์ซ้ายและขวาให้ทำ�งานด้วยค่าที่ต่างกัน เป็นที่ว่าคำ�สั่งให้หุ่นยนต์เดินหน้าจะใช้คำ�สั่ง fd(speed) และถอยหลังใช้คำ�สั่ง bk(speed) แต่ ในกรณีที่ต้องการปรับค่าความเร็วมอเตอร์ 1 และ มอเตอร์ 2 ให้ต่างกัน จะต้องใช้คำ�สั่ง fd2(speed1,speed2) และ bk2(speed1,speed2) เพื่อทดสอบหุ่นยนต์ว่าเคลื่อนที่ได้ตรงหรือไม่ โดยเขียน โปรแกรมทดสอบดังโปรแกรมที่ 3-1 #include <ipst.h> void setup(){} void loop(){ OK(); fd2(30,30); delay(2000); ao(); }
โปรแกรมที่ 3-1 ทดสอบการเคลื่อนที่ตรงของหุ่นยนต์
การทดลอง
เขียนโปรแกรมตามโปรแกรมที่ 3-1 จากนั้นอัปโหลดไปยังหุ่นยนต์ iBOT กดปุ่ม OK เพืื่อทดสอบการเคลื่อนที่ เป็นเวลา 2 วินาทีแล้วหยุด สังเกตว่าหุ่นยนต์เอียงไปทางด้านซ้ายหรือขวาหรือไม่ ถ้าหุ่นยนต์เอียงไปทางซ้ายแสดงว่ามอเตอร์ด้านซ้ายหมุนช้ากว่ามอเตอร์ด้านขวา การปรับแก้ ให้เพิ่มค่าความเร็วมอเตอร์ด้านซ้ายขึ้นอีกทีละ 1 จนหุ่นยนต์เคลื่อนที่ตรง
fd2(30+1,30);
ถ้าหุ่นยนต์เอียงไปทางขวาแสดงว่ามอเตอร์ด้านขวาหมุนช้ากว่ามอเตอร์ทางด้านขวา การปรับแก้ ให้เพิ่มค่าความเร็วมอเตอร์ด้านขวาขึ้นอีกทีละ 1 จนหุ่นยนต์เคลื่อนที่ตรง fd2(30,30+1);
i-BOTSpeed and time.jpg
ปฏิบัติการที่ 4 หุ่นยนต์เดินเป็นรูปสี่เหลี่ยม เป้าหมาย ทดสอบการกำ�หนดค่าเวลาการเคลื่อนที่ของหุ่นยนต์ให้หุ่นยนต์เดินและเลี้ยวตามเวลาได้แม่นยำ� ในกรณีต้องการให้หุ่นยนต์เดินวนเป็นรูปสี่เหลี่ยม โปรแกรมจะถูกเก็บใน void loop() โดยจะเกิดการเดินตรง และเลี้ยวขวาสลับกันไป เรื่อยๆ ดังโปรแกรมที่ 4-1 #include <ipst.h> void setup(){ OK(); } void loop(){ fd(30); delay(1000); tr(30); delay(550); }
โปรแกรมที่ 4-1 ทดสอบการเคลื่อนที่เป็นรูปสี่เหลี่ยม
การทดลอง
1. เขียนโปรแกรมตามโปรแกรมที่ 4-1 จากนั้นอัปโหลดไปยังหุ่นยนต์ 2. ทดสอบปล่อยหุ่นยนต์ให้เคลื่อนที่สังเกตมุมการเลี้ยวของหุ่นยนต์ว่ามากหรือน้อยกว่า 90 องศา 3. ถ้ามุมการเลี้ยวมากกว่า 90 องศาแสดงว่าเวลาการเลี้ยวน้อยเกินไป ให้เพิ่มเวลาของฟังก์ชั่น delay() หลังคำ�สั่ง tr(30); 4. ถ้ามุมการเลี้ยวน้อยกว่า 90 องศาแสดงว่าเวลาในการเลี้ยวมากเกินไป ให้ลดเวลาของฟังก์ชั่น delay() หลังคำ�สั่ง tr(30); 5. ทดสอบจนการเคลื่อนที่ของหุ่นยนต์เป็นรูปสี่เหลี่ยม
i-BOTSpeed and time.jpg
ปฏิบัติการที่ 5 หุ่นยนต์เคลืี่อนที่เป็นวงกลม เป้าหมาย ดูลักษณะการทำ�งานของการปรับความเร็วมอเตอร์ทั้งสองที่ไม่เท่ากัน จะมีผลอย่างไรกับหุ่นยนต์ เพื่อให้การสามารถปรับความเร็วการเคลื่อนที่ของมอเตอร์ ได้ จากผู้ใช้งาน ตัวอย่างโปรแกรมจะอ่านค่าจากฟังก์ชั่น knob(x) ซึ่งจะนำ�ค่า จากตัวต้านทานปรับค่าได้บนบอร์ด IPST-SE มาเป็นค่าความเร็วมอเตอร์ ให้กับมอเตอร์ 1 ส่วนมอเตอร์ 2 จะรักษาความเร็วคงที่ไว้ที่ 50% ตาม โปรแกรมที่ 5-1 #include <ipst.h> int x; void setup(){ OK(); } void loop(){ x=knob(100); glcd(0,0,”MOTOR1=%d glcd(1,0,”MOTOR2=%d fd2(x,50); }
“,x); “,50);
โปรแกรมที่ 5-1 โปรแกรมสั่งงานให้หุ่นยนต์เคลื่อนที่เป็นวงกลม
การทดลอง
1. เขียนโปรแกรมตามโปรแกรมที่ 5-1 จากนั้นอัปโหลดโปรแกรมไปยังตัวหุ่นยนต์ 2. กดปุ่ม OK เพื่อเริ่มต้นทำ�งาน หุ่นยนต์จะเริ่มต้นทำ�งาน พร้อมทั้งแสดงค่าตัวเลขความเร็วที่หน้าจอ โดย Motor2 ความเร็วคงที่ 50% 3. ทำ�การปรับค่า knob เพื่อปรับความเร็วของ Motor1 ถ้าความเร็ว Motor1 น้อยกว่าค่า 50 หุ่นยนต์ iBOT จะเคลื่อนที่เป็นวงกลมทางซ้าย แต่ถ้าค่าของ Motor1 มากกว่า 50 หุ่นยนต์ iBOT จะเคลื่อนที่เป็นวงกลมทางขวา
i-BOTSpeed and time.jpg
ปฏิบัติการที่ 6 หุ่นยนต์รถบังคับจากสวิตช์ 2 ตัว เป้าหมาย เพื่อเรียนรู้การควบคุมหุ่นยนต์ ด้วยการเขียนโปรแกรมแบบมีเงื่อนไข โปรแกรมที่ 6-1 ใช้สวิตช์ 2 ตัวทำ�ให้สามารถเขียนเงื่อนไขเหตุการณ์ที่ไม่ซ้ำ�กันได้ 4 เหตุการณ์คือ 1. เมื่อกดสวิตช์ 2 ตัวพร้อมกัน จะสั่งให้หุ่นยนต์เคลื่อนที่ตรงไปด้านหน้า 2. เมื่อกดสวิตช์ด้านซ้ายเพียงตัวเดียว จะให้หุ่นยนต์เลี้ยวซ้าย 3. เมื่อกดสวิตช์ด้านขวาเพียงตัวเดียว จะให้หุ่นยนต์เลี้ยวขวา 4. ถ้าไม่กดสวิตช์ให้หุ่นยนต์หยุดการเคลื่อนที่ สำ�หรับ ZX-SWITCH ซึ่งต่อกับขา 16 และขา 17 นั้นจะให้เงื่อนไขเป็นเท็จ หรือ “0” เมื่อกดสวิตช์ เมื่อต้องเขียนตรวจสอบกรณีที่กด สวิตช์หรือเป็น “0” จะใช้เครื่องหมาย “!” (NOT) ซึ่งจะให้ค่าสถานะตรงข้าม จากเท็จจะกลายเป็นจริงแทน สำ�หรับกรณีที่ต้องตรวจสอบเงื่อนไขสองเงื่อนไขให้เป็นจริงทั้งคู่ คือ เงื่อนไขแรกเป็นจริง “และ” เงื่อนไขที่สองเป็นจริง ในชุดการตรวจสอบ เดียวกัน จะต้องคั่นด้วยคำ�สั่ง “&&” แทนการ AND ทางลอจิก #include <ipst.h> int x; void setup(){ setTextSize(2); glcdMode(1); setTextColor(GLCD_YELLOW); } void loop(){ if(!in(16)&&!in(17)){ glcd(0,0,”FORWARD “); fd(30); } else if(!in(16)&&in(17)){ glcd(0,0,”Turn Left “); tl(30); } else if(in(16)&&!in(17)){ glcd(0,0,”Turn Right”); tr(30); } else { glcd(0,0,”Press SW “); ao(); } }
โปรแกรมที่ 6-1 หุ่นยนต์รถบังคับจากสวิตช์สองตัว
การทดลอง
1. เขียนโปรแกรมตามโปรแกรมที่ 6-1 จากนั้นอัปโหลดไปยังหุ่นยนต์ iBOT 2. สังเกตถ้ายังไม่ได้กดสวิตช์หน้าจอจะแสดงข้อความ Press SW และหุ่นยนต์ยังไม่เคลื่อนที่ 3. ทดลองกดสวิตช์ทั้งสองตัวพร้อมกัน หุ่นยนต์จะต้องเคลื่อนที่ไปด้านหน้า พร้อมทั้งแสดงข้อความ FORWARD
4. ทดลองกดสวิตช์ที่ต่อกับหมายเลข 16 หุ่นยนต์จะต้องเลี้ยวซ้ายพร้อมทั้งแสดงข้อความ Turn Left 5. ทดลองกดสวิตช์ที่ต่อกับหมายเลข 17 หุ่นยนต์จะต้องเลี้ยวขวาพร้อมทั้งแสดงข้อความ Turn Right
Remote Control Car.jpg
ปฏิบัติการที่ 7 หลบหลีกสิ่งกีดขวางด้วยการชน เป้าหมาย เพื่อให้หุ่นยนต์สามารถเคลื่อนที่ไปในตำ�แหน่งต่างๆ พร้อมทั้งหลบหลีกสิ่งกีดขวางด้านหน้าได้ด้วยการตรวจจับจากสวิตช์ กิจกรรมนี้จะปล่อยให้หุ่นยนต์เคลื่อนที่ไปอย่างต่อเนื่อง แต่เมื่อสวิตช์ที่ติดตั้งด้านหน้าเกิดการชนเข้ากับสิ่งกีดขวาง โปรแกรมที่ 7-1 จะสั่งให้ หุ่นยนต์ถอยหลังแล้วเปลี่ยนเส้นทางเดินไปทิศทางอื่นเพื่อหลบหลีกสิ่งกีดขวาง #include <ipst.h> int x; void setup(){ OK(); } void loop(){ fd(30); if(!in(16)){ glcdFillRect(130,98,30,30,GLCD_RED); bk(30); delay(300); sr(30); delay(500); glcdFillRect(130,98,30,30,GLCD_BLACK); } if(!in(17)){ glcdFillRect(0,98,30,30,GLCD_RED); bk(30); delay(200); sl(30); delay(200); glcdFillRect(0,98,30,30,GLCD_BLACK); } }
Step25New.jpg
โปรแกรมที่ 7-1 โปรแกรมควบคุมหุ่นยนต์เคลื่อนที่หลบสิ่งกีดขวาง
การทดลอง
1. ให้ย้าย ZX-SWITCH ทั้งสองตัวจากปฏิบัติการที่ 6 มาติดตั้งด้านหน้าเหมือนเดิม 2. เขียนโปรแกรมตามโปรแกรมที่ 7-1 จากนั้นอัปโหลดไปยังหุ่นยนต์ 3. กดสวิตช์ OK ให้หุ่นยนต์เคลื่อนที่ สังเกตเมื่อสวิตช์ชนเข้ากับสิ่งกีดขวาง หุ่นยนต์จะเคลื่อนที่อย่างไร
ชนกำ�แพงด้านขวา.jpg
เมื่อหุ่นยนต์ชนจากทางด้านซ้าย หุ่นยนต์จะถอยหลังแล้วเลี้ยวไปทางด้านขวา และเคลื่อนที่ต่อไป
ชนกำ�แพงด้านซ้าย.jpg
เมื่อหุ่นยนต์ชนจากทางด้านขวา หุ่นยนต์จะถอยหลังแล้วเลี้ยวไปทางด้านซ้าย และเคลื่อนที่ต่อไป
ปฏิบัติการที่ 8 หุ่นยนต์เคลื่อนที่ ในเขาวงกตด้วยสวิตช์
ชนกำ�แพงด้านซ้าย.jpg
เป้าหมาย เพื่อเรียนรู้การตรวจสอบการทำ�งานจากสวิตช์ที่มีความซับซ้อนมากยิ่งขึ้น เคล็ดลับการเคลื่อนที่ในเขาวงกตคือ หุ่นยนต์จะต้องเคลื่อนที่ตรง และเลี้ยวได้ 90 องศาพอดี ซึ่งทดลองไปแล้วในปฏิบัติการหุ่นยนต์เคลื่อนที่ เป็นรูปสี่เหลี่ยม ในรูปที่ 8-1 แสดงในเห็นลักษณะของเขาวงกตอย่างง่ายที่มีรูปแบบการเลี้ยวด้านขวาหรือด้านซ้ายเพียงอย่างเดียว
สนามแบบที่ 1
IN OUT
MAZE03.jpg
MAZE03-3D.jpg
รูปที่ 8-1 การสร้างสนามเขาวงกตอย่างง่ายรูปแบบที่ 1
การสร้างสนาม
สำ�หรับผู้ใช้งานถ้าต้องการสร้างสนามรูปแบบนี้สามารถ หาก้อนอิฐบล็อกมาใช้ได้ โดยอาจจะห่อหุ้มด้วยกระดาษเพื่อป้องกันเศษปูนหลุดล่อน ออกมา
#include <ipst.h> void setup(OK();){} void loop(){ if(!in(16)&&!in(17)){ bk(20);delay(500); tr(30);delay(550); } else if(!in(16)&&in(17)){ while(in(17)); bk(20);delay(500); tr(30);delay(600); } else if(!in(16)&&in(17)){ while(in(16)); bk(20);delay(500); tr(30);delay(600); } else { fd(30); } }
โปรแกรมที่ 8-1 เดินในเขาวงกต เลี้ยวขวาเพียงอย่างเดียว
การทำ�งานของโปรแกรม
การตรวจสอบสวิตช์ว่าชนกำ�แพง เพียงอย่างเดียวนั้น ถ้านำ�มาใช้กับการเคลื่อนที่ในเขาวงกต รูปแบบการเลี้ยวของหุ่นยนต์อาจจะไม่เท่ากัน ในทุกครั้ง ดังนั้นถ้า กำ�หนดให้การชนจากสวิตช์จะต้องรอจนเกิดการชนสวิตช์ทั้งสองตัวก่อนจึงค่อยถือเป็นการชนกำ�แพง โดยขั้นตอนของโปร แกรมทำ�ดังนี้ 1. ถ้าตรวจสอบว่าสวิตช์ทั้งสองตัวชนกำ�แพงพร้อมกัน จะสั่งให้หุ่นยนต์ถอยหลังแล้วเลี้ยวขวา 2. ถ้าตรวจสอบว่าสวิตช์ด้านซ้ายถูกชน ให้รอจนกระทั่งสวิตช์ด้านขวาถูกชนด้วย จึงค่อยสั่งหุ่นยนต์ถอยหลังแล้วเลี้ยวขวา 3. ถ้าตรวจสอบว่าสวิตช์ด้านขวาถูกชน ให้รอจนกระทั่งสวิตช์ด้านซ้ายถูกชนด้วย จึงค่อยสั่งหุ่นยนต์ถอยหลังแล้วเลี้ยวขวา 4. ถ้าสวิตช์ ไม่ถูกชน ให้หุ่นยนต์เคลื่อนที่ตรงไป
IN
OUT
MAZE02.jpg
MAZE02-3D.jpg
รูปที่ 8-2 สนามสำ�หรับเคลื่อนที่ ในเขาวงกตแบบที่ 2
สนามแบบที่ 2
สนามแบบที่ 2 ดังแสดงในรูป 8-2 จะต้องมีการเลี้ยวทั้งด้านซ้ายและด้านขวา โดยรูปแบบคือ เจอกำ�แพงครั้งที่ 1 เลี้ยวซ้าย เจอกำ�แพงครั้งที่ 2 เลี้ยวขวา เจอกำ�แพงครั้งที่ 3 เลี้ยวขวา เจอกำ�แพงครั้งทีี่ 4 เลี้ยวซ้าย
การทำ�งานของโปรแกรมที่ 8-2
1. เนื่องจากสนามรูปแบบที่ 2 จะต้องมีการทั้งเลี้ยวซ้ายและขวา จึงจำ�เป็นที่ต้องสร้างตัวแปรสำ�หรับนับการเลี้ยว โดยกำ�หนดรูปแบบว่า ทุกครั้งที่ เจอกำ�แพงหลังจากเลี้ยวแล้วให้นับค่าขึ้น 1 ค่า โดยในที่นี้กำ�หนดตัวแปรชื่อ x 2. เมื่อตรวจพบว่าเป็นกำ�แพงแล้ว ก่อนจะตัดสินใจเลี้ยวด้านซ้ายหรือด้านขวา จะต้องตรวจสอบตัวแปรที่ใช้เก็บค่าการนับว่าขณะนั้นมีค่าเท่าใด และและต้องเลี้ยวไปในทิศทางใด 3. นำ�รายละเอียดจากข้อ 1 และ 2 เขียนเป็นฟังก์ชั่น โดยใช้ชื่อว่า Turn() และเรียกใช้งานจากโปรแกรมหลัก โดยทั้งหมดแสดงได้ตามโปรแกรมที่ 8-2
#include <ipst.h> int x=0; void Turn(){ bk(20);delay(500); if(x==0||x==3){ // ตรวจสอบค่า x ตรงกับ 0 หรือ 3 หรือไม่ tl(30); // สัง่ หุน ่ ยนต์เลีย ้ วซ ้าย } else if(x==1||x==2){ // ตรวจสอบค่า x ตรงกับ 1 หรือ 2 หรือไม่ tr(30); // สัง่ หุน ่ ยนต์เลีย ้ วขวา } else{ ao(); // สัง่ หุน ่ ยนต์หยุด while(1); // ค ้างอยูท ่ บ ี่ รรทัดนี้ } glcd(0,0,”X=%d “,x); x++; // เพิม ่ ค่าการนับแยก delay(500); } void setup(){ OK(); } void loop(){ if(!in(16)&&!in(17)){ Turn(); } else if(!in(16)&&in(17)){ while(in(17)); Turn(); } else if(!in(16)&&in(17)){ while(in(16)); Turn(); } else { fd(30); } }
โปรแกรมที่ 8-2 โปรแกรมสั่งงานให้หุ่นยนต์เคลื่อนที่ ในเขาวงกตแบบที่ 2
ปฏิบัติการที่ 10 อ่านค่าแสงจาก ZX-03 เป้าหมาย เพื่อตรวจสอบการทำ�งานของเซนเซอร์ที่ใช้สำ�หรับให้หุ่นยนต์เคลื่อนที่ตามเส้น ให้ทำ�งานได้อย่างมีประสิทธิภาพ
ZX-03 Layout.jpg
ZX-03 reflect.jpg รูปที่ 10-1 รูปร่างหน้าตาของ ZX-03 และการทำ�งานของโมดูล TCRT5000
ZX-03 Circuit.jpg
รูปที่ 10-2 วงจรเชื่อมต่อของ ZX-03
รู้จักกับ ZX-03
แผงวงจรตรวจจับแสงสะท้อนแสงอินฟราเรด ZX-03 มีลักษณะดังรูปที่ 10-1 หัวใจของมันคือโมดูล TCRT5000 ภายในประกอบด้วย LED อินฟราเรดและโฟโต้ทรานซิสเตอร์ โดย LED อินฟราเรดส่งแสงออกไปกระทบพื้น ส่วนโฟโต้ทรานซิสเตอร์รับแสงอินฟราเรดที่สะท้อน กลับมา ซึ่งจะมีค่ามากหรือน้อยขึ้นอยู่กับพื้นผิวที่ตกกระทบ การนำ�โมดูล TCRT5000 ไปต่อใช้งานจะต้องต่อวงจรดังรูป 10-2 เพื่อนำ�ค่าที่ได้ ต่อเข้ากับขาอะนาลอกของ IPST-SE โดยให้ผลลัพธ์คือ ค่ามากเมื่อสะท้อนพื้นผิวสีขาวหรือสีอ่อน ค่าน้อยเมื่อสะท้อนพื้นผิวสีดำ�หรือสีเข้ม
Step19New.jpg
5-10 มม.
ติดตั้ง ZX-03.jpg รูปที่ 10-3 ระยะห่างการติดตั้ง ZX-03 กับพื้น
การติดตั้งเซนเซอร์ ZX-03 เข้ากับตัวหุ่นยนต์
ระยะการติดตั้งที่เหมาะสมคือ 5-10 มม.จากพื้น ถ้าห่างจากพื้นมากค่าที่อ่านได้จะลดลง ส่งผลถึงความแม่นยำ�ลดลงด้วย รูปแบบการติดตั้ง แสดงในรูปที่ 10-3
#include <ipst.h> void setup(){ setTextSize(3); glcdMode(3); } void loop(){ glcd(0,0,”L=%d glcd(1,0,”R=%d }
“,analog(0)); “,analog(1));
GLCD-Sensor-Read.jpg
โปรแกรมที่ 10-1 โปรแกรมอ่านค่าจากเซนเซอร์ ZX-03 แสดงผลที่หน้าจอ GLCD หมายเหตุ ด้านหลังของ %d ควรเคาะ Space Bar ประมาณ 2 ครั้งเพื่อใช้ลบค่าตัวเลขที่อาจจะแสดงค่าเกินที่จอภาพ ยกตัวอย่างเช่น ค่าเดิม แสดงค่า 100 ต่อไปจะแสดงค่า 99 ถ้าไม่เว้น Space Bar ค่าตัวเลขจะแสดงเป็น 990 แทน
ทดสอบอ่านค่าแสดงผลที่ GLCD
โปรแกรมที่ 10-1 จะทดสอบอ่านค่า ZX-03 ด้านซ้ายซึ่งต่อกับช่อง A0 และด้านขวาซึ่งต่อกับช่อง A1 มาแสดงที่หน้าจอ โดยให้ทดสอบวาง หุ่นยนต์ ไว้ที่พื้นผิวสีดำ�และพื้นผิวสีขาว บันทึกค่าเก็บไว้ 1. สมมติว่า ZX-03 ด้านซ้าย (A0) อ่านสีดำ�ได้ 100 อ่านสีขาวได้ 900 ค่ากลางสำ�หรับแบ่งแยกสีขาวและดำ�มีค่าเท่ากับ (100+900) /2 เท่ากับ 500 ซึ่งจะนำ�ค่านี้เป็นค่ากลางสำ�หรับอ้างอิงในการตรวจสอบโปรแกรมด้านซ้าย ถ้า ZX-03 อ่านค่าได้มากกว่าค่ากลาง (500) ให้ตีความว่าอ่านได้เป็นสีขาว ถ้า ZX-03 อ่านค่าได้น้อยกว่าค่ากลาง (500) ให้ตีความว่าอ่านได้เป็นสีดำ� 2. สมมติว่า ZX-03 ด้านขวา (A1) อ่านสีดำ�ได้ 80 อ่านสีขาวได้ 880 ค่ากลางสำ�หรับแบ่งแยกสีขาวและดำ�มีค่าเท่ากับ (80+880) /2 เท่ากับ 450 ซึ่งจะนำ�ค่านี้เป็นค่ากลางสำ�หรับอ้างอิงในการตรวจสอบโปรแกรมขวา ถ้า ZX-03 อ่านค่าได้มากกว่าค่ากลาง (450) ให้ตีความว่าอ่านได้เป็นสีขาว ถ้า ZX-03 อ่านค่าได้น้อยกว่าค่ากลาง (450) ให้ตีความว่าอ่านได้เป็นสีดำ� การหาค่าอ้างอิงหรือค่ากลางได้แม่นยำ� ส่งผลให้หุ่นยนต์เคลื่อนที่ตามเส้นแม่นยำ�ด้วย
อ่านค่าบนพื้นสีขาว
อ่านค่าบนพื้นสีดำ�
i-BOT with ZX-03 On White.jpg
i-BOT with ZX-03 On Black.jpg
GLCD on White.jpg
CL = (LWHITE+LBLACK)/2 CL = (900+100)/2 = 500
GLCD on Black.jpg
CR = (RWHITE+RBLACK)/2 CR = (880+80)/2 = 450
รูปที่ 10-4 การหาค่ากลางของเซนเซอร์ที่ติดตั้งด้านซ้ายและด้านขวาของหุ่นยนต์
ปฏิบัติการที่ 11 หุ่นยนต์หยุดที่เส้นตัดสีดำ� เป้าหมาย เพื่อทดสอบผลการอ่านค่าอ้างอิงจากปฏิบัติการที่ 10 ว่าสามารถนำ�มาใช้กับการตรวจจับเส้นของหุ่นยนต์ ได้จริงหรือไม่
Tape 3M.jpg
รูปที่ 11-1 คาดเทปพันสายไฟ 3M เพื่อทำ�เส้นตัดสนาม
เตรียมสนาม
จุดประสงค์คือสร้างเส้นตัดสีดำ�ขึ้นที่พื้นสีขาว เมื่อหุ่นยนต์เคลื่อนที่มาที่ตำ�แหน่งนี้ให้หุ่นยนต์หยุด ดำ�เนินการตามขั้นตอนดังนี้ 1. จัดหาแผ่นวัสดุสีขาวหรือสีอ่อนสำ�หรับทำ�สนามหุ่นยนต์ แนะนำ�ให้ใช้แผ่นพลาสติกลูกฟูก (ฟิวเจอร์บอร์ด) สีขาว 2. จัดหาเทปพันสายไฟสีดำ� แนะนำ�ยี่ห้อ 3M เนื่องจากมีความยืดหยุ่นสูงและเกิดคราบกาวน้อย 3. ติดเส้นเทปพันสายไฟลงบนพลาสติกลูกฟูกเป็นเส้นตรงดังรูปที่ 11-1
#include <ipst.h> int CL=500,CR=450; void setup(){ } void loop(){ OK(); fd(40); while(analog(0)>CL&&analog(1)>CR); ao(); }
โปรแกรมที่ 11-1 หุ่นยนต์หยุดที่เส้นสีดำ�
การทำ�งานของโปรแกรม
2014-10-16 11.04.30.jpg
โปรแกรมที่ 11-1 กำ�หนดค่าตัวแปร CL (Center Left) และ CR (Center Right) สำ�หรับเก็บค่ากลางของ ZX-03 ทั้งด้านซ้ายและด้าน ขวาเอาไว้ จากนั้นเมื่อกดสวิตช์ OK หุ่นยนต์จะเคลื่อนที่ไปด้านหน้า และตรวจสอบว่า ZX-03 ด้านซ้ายและ ZX-03 ด้านขวายังอ่านเจอสีขาว หรือไม่ ถ้าไม่ใช่ก็สั่งให้หุ่นยนต์หยุด เมื่อเอาฟังก์ชั่น OK ใส่ไว้ใน void loop ผู้ใช้งานสามารถหยิบหุ่นยนต์ มากดสวิตช์แล้วเริ่มต้นขั้นตอนการทดสอบใหม่ได้โดยไม่ต้อง กดปุ่ม Reset หรือเปิดปิดสวิตช์ใหม่อีกครั้ง หมายเหตุ ในการตรวจสอบเงื่อนไขสองเงื่อนไข ถ้าต้องการให้เงื่อนไขทั้งสองเป็นจริงทั้งคู่ ภาษา C จะใช้เครื่องหมาย && ซึ่งหมายถึงการ AND กันทางลอจิก
ปฏิบัติการที่ 12 หุ่นยนต์เคลื่อนที่ ไม่ตกโต๊ะ เป้าหมาย เพื่อเอาค่าจากแผงวงจร ZX-03 มาควบคุมให้หุ่นยนต์เคลื่อนที่อยู่ในขอบเขตที่กำ�หนดได้
เตรียมสนาม
หาโต๊ะหรือแผ่นไม้ สีอ่อนหรือสีขาว โดยให้อยู่สูงขึ้นจากพื้นตั้งแต่ 3 เซนติเมตรขึ้นไป
2014-10-16 11.04.30.jpg
รูปที่ 12-1 การปรับตำ�แหน่งของแผงวงจร ZX-03 เพื่อให้ตรวจจับการตกโต๊ะได้ดีขึ้น
ปรับแต่งหุ่นยนต์
เพื่อให้การตรวจจับเกิดขึ้นได้เร็วขึ้น ZX-03 ควรจะเจอขอบโต๊ะก่อนที่ล้อหน้าจะตก ดังนั้นให้หมุนแผงวงจร ZX-03 และกางแผงวงจร ZX-03 ออกดังรูปที่ 12-1
#include <ipst.h> int L,R,CL=200,CR=150; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else{ bk(40);delay(300); if(L<CL){ sr(40);delay(400); } else{ sl(40);delay(600); } } }
โปรแกรมที่ 12-1 โปรแกรมควบคุมหุ่นยนต์เคลื่อนที่ไม่ตกโต๊ะ
การทำ�งานของโปรแกรม
โปรแกรมที่ 12-1 สร้างตัวแปร L และ R เพื่อเก็บค่าที่อ่านได้จาก ZX-03 ด้านซ้ายและด้านขวา สำ�หรับค่ากลาง เนื่องจากการที่หุ่นยนต์ ออกนอกโต๊ะ ค่าการสะท้อนจะมีน้อยมาก ดังนั้นจึงสามารถปรับค่า CL หรือ CR ลงต่ำ�มากๆ ได้ ในที่นี้ใช้ค่า CL=200 และค่า CR=150 สำ�หรับการตรวจสอบของโปรแกรมทำ�ดังนี้ 1. ถ้าตรวจพบว่าค่าที่อ่านได้จาก ZX-03 ทั้งด้านซ้ายและด้านขวามีค่ามากกว่าค่ากลางทั้งคู่ให้หุ่นยนต์เคลื่อนที่ตรงไป 2. ถ้าไม่ตรงกับเงื่อนไขแรก ให้หุ่นยนต์ถอยหลัง 3. ตรวจสอบว่าค่า ZX-03 ด้านซ้ายมีค่าน้อยกว่าค่ากลางหรือไม่ ถ้าใช่ ให้หุ่นยนต์เลี้ยวขวา 0.4 วินาที 4. ถ้าไม่ตรงกับเงื่อนไขข้อ 3. ให้หุ่นยนต์เลี้ยวขวา 0.6 วินาที
Table_Check.jpg
ปฏิบัติการที่ 13 หุ่นยนต์เคลื่อนที่ตามเส้นอย่างง่าย เป้าหมาย เพื่อเรียนรู้หลักการเคลื่อนที่ตามเส้น โดยใช้แผงวงจร ZX-03 เพียง 2 ตัว
สนามทดสอบหุ่นยนต์เบื้องต้น.jpg
รูปที่ 13-1 รูปแบบเตรียมสนามโดยการคาดเทปพันสายไฟ ลงบนแผ่นพลาสติกลูกฟูกสีขาว
เตรียมสนาม
จุดประสงค์คือสร้างเส้นทางเดินของหุ่นยนต์ เป็นเส้นโค้งลักษณะดังรูปที่ 13-1 1. จัดหาแผ่นวัสดุสีขาวหรือสีอ่อนสำ�หรับทำ�สนามหุ่นยนต์ แนะนำ�ให้ใช้แผ่นพลาสติกลูกฟูก (ฟิวเจอร์บอร์ด) สีขาว 2. จัดหาเทปพันสายไฟสีดำ� แนะนำ�ยี่ห้อ 3M เนื่องจากมีความยืดหยุ่นสูงและเกิดคราบกาวน้อย 3. ติดเส้นเทปพันสายไฟลงบนพลาสติกลูกฟูกเป็นเส้นโค้ง ลักษณะดังรูปที่ 13-1
การตั้งเซนเซอร์สำ�หรับหุ่นยนต์เคลื่อนที่ตามเส้น.jpg
รูปที่ 13-2 รูปแบบการติดตั้ง ZX-03 สำ�หรับให้หุ่นยนต์เคลื่อนที่ตามเส้น
เตรียมหุ่นยนต์
ให้ทำ�การปรับตำ�แหน่งแผงวงจร ZX-03 ให้มีลักษณะดังรูปที่ 13-2 เพื่อให้ ZX-03 อยู่ ใกล้กับล้อขับเคลื่อนมากขึ้น
แนวคิดการเคลื่อนที่ตามเส้นสำ�หรับแผงวงจร ZX-03 2 ตัว
แผงวงจร ZX-03 2 ตัวทำ�ให้เกิดเหตุการณ์ที่ไม่ซ้ำ�กันได้ 4 เหตุการณ์ เพื่อให้เกิดการเคลื่อนที่ 4 รูปแบบดังนี้ รูปแบบที่ 1 แผงวงจร ZX-03 ทั้งสองตัวคร่อมอยู่บนเส้น (ด้านซ้ายและด้านขวาเจอสีขาว) สั่งให้หุ่นยนต์เคลื่อนที่ตรงไป
30 A6 27 A3
28 A4 25 A1
OK
18
19
29 A5 26 A2
24 A0
KNOB
SW1
16
17
if(L>CL&&R>CR){ fd(30); }
20 D
USB 8 SCL 9 SDA
+5
2 RxD1 3 TxD1
UART1
RESET LOW
1 2 DC MOTOR
SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
15 SV0 14 SV1 13 SV2 12 SV3
รูปแบบที่ 2 แผงวงจร ZX-03 ด้านซ้ายเจอสีดำ� สั่งให้หุ่นยนต์หมุนตัวด้านซ้าย
A0
A1 25
A3
26
A4
27
A5
28
29
UART1
2 RxD 1
A6
RES ET
30
20
A2
24
OK
SW1
18
19
KNOB
16
17
D
USB
1
8 SC L 9 SDA
LOW
3 TxD 1
+5
if(L<CL&&R>CR){ sl(30); }
2
VO
G 6V 12 G 6V 13 G 6V 14 G 6V 15
SER
DC MO TOR
15 SV0
14 SV1
13 SV2
ON
12 SV3
รูปแบบที่ 3 แผงวงจร ZX-03 ด้านขวาเจอสีดำ� สั่งให้หุ่นยนต์หมุนตัวทางขวา
A2
A1
26
25
A5
30
A4
29
A0
OK
28
A6
27
A3
24
KNOB
SW1
D
USB
19
18
20
SDA L 9 8 SC
17
16 T
UART
RESE
if(L>CL&&R<CR){ sr(30); }
1 +5
D1 2 Rx
LOW
1
3 TxD
1 G 6V 12 G 6V 13 G 6V 14 G 6V 15
2
TOR MO
SERV O
15 SV
0 14
SV1
13 SV
2 12
ON
DC
SV3
รูปแบบที่ 4 แผงวงจ ZX-03 ทั้งสองตัวเจอเส้นตัด (ทั้งด้านซ้ายและด้านขวาเจอสีดำ�) ให้หุ่นยนต์เคลื่อนที่ตรงข้ามทางแยก หรือเคลื่อนที่ไปใน ทิศทางอื่นๆ ตามต้องการ
30 A6 27 A3
28 A4 25 A1
OK
18
19
29 A5 26 A2
24 A0
KNOB
16
17
SW1
20 D
8 SCL 9 SDA
LOW
1 2 SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
15 SV0 14 SV1 13 SV2 12 SV3
USB
+5
2 RxD1 3 TxD1
UART1
RESET
DC MOTOR
if(L<CL&&R<CR){ fd(30);delay(200); }
#include <ipst.h> int L,R,CL=500,CR=450; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } }
โปรแกรมที่ 13-1 หุ่นยนต์เคลื่อนที่ตามเส้นอย่างง่าย การทำ�งานของโปรแกรม จากรูปแบบ สามารถนำ�มาเขียนเป็นโปรแกรมที่ 13-1 เนื่องจากสนามรูปแบบนี้ไม่มีเส้นตัด จึงเขียนแค่ 3 เงื่อนไขก็เพียงพอ โดยขั้นตอนคือ 1. อ่านค่า ZX-03 ทั้งซ้ายและขวามาเก็บไว้ในตัวแปร L และ R 2. ตรวจสอบถ้าซ้ายและขวาเจอสีขาวให้หุ่นยนต์เคลื่อนที่ตรงไป 3. ถ้าด้านซ้ายเจอสีดำ�แต่ด้านขวาเจอสีขาว ให้หุ่นยนต์เลี้ยวซ้าย 4. ถ้าด้านขวาเจอสีดำ�แต่ด้านซ้ายเจอสีขาว ให้หุ่นยนต์เลี้ยวขวา
Simple Line Track.jpg
ปฏิบัติการที่ 14 หุ่นยนต์เดินตรงเมื่อเจอเส้นตัด เป้าหมาย เพื่อเพิ่มการตรวจสอบเงื่อนไขให้สามารถตรวจสอบเส้นตัดทางแยกได้ โดยส่งเสียงเมื่อเจอเส้นตัดแล้วเคลื่อนที่ตรงต่อไป
สนามหุ่นยนต์มีเส้นตัด.jpg
รูปที่ 14-1 สนามหุ่นยนต์สำ�หรับตรวจสอบการเคลื่อนที่เมื่อเจอเส้นตัด
เตรียมสนาม
เพิ่มเส้นตัดขึ้นที่สนามในลักษณะดังรูปที่ 14-1
#include <ipst.h> int L,R,CL=500,CR=450; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); } }
โปรแกรมที่ 14-1 หุ่นยนต์เคลื่อนที่ตามเส้น เดินตรงเมื่อเจอเส้นตัดพร้อมส่งเสียงเตือน
รูปแบบการเขียนโปรแกรม
เพิ่มเติมเงื่อนไขจากการปฏิบัติการที่ 13 โดยเมื่อเจอเส้นตัดให้เคลื่อนที่ตรง โดยปกติ สามารถใช้การหน่วงเวลาประมาณ 200 มิลลิวินาทีได้ แต่เพื่อให้เห็นสถานะการทำ�งานของหุ่นยนต์ด้วย จึงใช้การสร้างเสียงเป็นเวลา 200 มิลลิวินาทีแทน ดังโปรแกรมที่ 14-1
LineTrack02.jpg
หมายเหตุ สำ�หรับหุ่นยนต์เคลื่อนที่ตามเส้น ไม่แนะนำ�ให้แทรกคำ�สั่งแสดงผล GLCD เข้าไปเนื่องจากคำ�สั่ง GLCD กินเวลาในการทำ�งานมาก ทำ�ให้การอ่านค่าจากเซนเซอร์ทำ�ได้ช้าลงและหุ่นยนต์ทำ�งานผิดพลาด
ปฏิบัติการที่ 15 หุ่นยนต์เลี้ยวซ้าย/ขวาเมื่อเจอเส้นตัด เป้าหมาย เมื่อเจอทางแยกให้สามารถเลี้ยวซ้ายหรือขวาได้ และเคลื่อนที่ต่อไป
รูปแบบการเคลื่อนที่
สำ�หรับการเลี้ยวซ้ายหรือขวา เมื่อหุ่นยนต์เจอเส้นตัดไม่สามารถสั่งให้เลี้ยวทันทีได้ ต้องสั่งให้หุ่นยนต์เคลื่อนที่ตรงต่อไปก่อนแล้วค่อยเลี้ยว โดยในเบื้องต้นใช้การคาดคะเนเวลา เพื่อให้หุ่นยนต์เลี้ยวได้ 90 องศาพอดี โดยขั้นตอนการเคลื่อนที่ทำ�ดังนี้
24 A0
28 A4 25 A1
29 A5 26 A2
18
19
30 A6 27 A3
KNOB
16
17
OK
SW1
20 USB
D
8 SCL 9 SDA
+5 LOW
2 RxD1 3 TxD1
UART1
RESET
1 2 DC MOTOR
SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
15 SV0 14 SV1 13 SV2 12 SV3
1 เมื่อหุ่นยนต์เจอเส้นตัดให้หุ่นยนต์เคลื่อนที่ตรงไปประมาณ 5 เซนติเมตร
28 A4 25 A1
30 A6 27 A3
18
19
29 A5 26 A2
24 A0
KNOB
16
17
OK
SW1
20 D
USB 8 SCL 9 SDA
+5 LOW
2 RxD1 3 TxD1
UART1
RESET
1 2 DC MOTOR
SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
15 SV0 14 SV1 13 SV2 12 SV3
2 สั่งให้หุ่นยนต์เลี้ยวซ้าย จนหุ่นยนต์มาคร่อมเส้นด้านซ้าย
8 SCL 9 SDA
30 A6 27 A3
USB
24 A0
D
29 A5 26 A2 28 A4 25 A1 OK
UART1
16
18
17
19
+5
20
RESET
LOW
2 RxD1 3 TxD1
1
2
DC MOTOR
SW1
G 6V 12 G 6V 13 G 6V 14 G 6V 15
15 SV0 14 SV1 13 SV2 12 SV3
ON
KNOB
SERVO
2 เมื่อหุ่นยนต์มาคร่อมเส้นด้านซ้ายแล้ว ให้หุ่นยนต์ ทำ�ภารกิจเคลื่อนที่ตามเส้นต่อไป
การทำ�งานของโปรแกรม
โปรแกรมที่ 15-1 จะเพิ่มการทำ�งานของปฏิบัติการที่ 14 โดยคำ�สั่งให้หุ่นยนต์เคลื่อนที่ตรงเมื่อเจอทางแยกยังคงเดิม แต่หลังจากนั้นให้หมุน ตัวทางซ้าย แล้วหน่วงเวลา 400 มิลลิวินาที สำ�หรับค่าเวลา ต้องทดลองปรับเพื่อหาค่าที่เหมาะสมสำ�หรับหุ่นยนต์แต่ละตัว สำ�หรับโปรแกรมที่ 15-2 ก็จะปรับเปลี่ยนเป็นหุ่นยนต์เลี้ยวขวาเมื่อเจอทางแยกด้วยหลักการเดียวกัน
#include <ipst.h> int L,R,CL=500,CR=450; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); sl(30); // เลีย ้ วซ ้ายเมือ ่ เจอทางแยก delay(400); } }
โปรแกรมที่ 15-1 หุ่นยนต์เลี้ยวซ้ายเมื่อเจอเส้นตัดทางแยก #include <ipst.h> int L,R,CL=500,CR=450; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); sr(30); // เลีย ้ วขวาเมือ ่ เจอทางแยก delay(400); } }
โปรแกรมที่ 15-2 หุ่นยนต์เลี้ยวขวาเมื่อเจอเส้นตัดทางแยก
ปฏิบัติการที่ 16 หุ่นยนต์เลี้ยวเมื่อเจอเส้นตัดแบบแม่นยำ� เป้าหมาย เพื่อให้หุ่นยนต์เลี้ยวเมื่อเจอเส้นตัดได้แม่นยำ�ขึ้น โดยใช้เซนเซอร์เป็นตัวตรวจสอบการเลี้ยว
แนวคิดการเลี้ยวแบบแม่นยำ�
หุ่นยนต์ iBOT มี ZX-03 ติดตั้งที่ด้านหน้าหุ่นยนต์อยู่แล้ว ดังนั้นถ้าใช้ ZX-03 คอยอ่านค่าตรวจสอบขณะเลี้ยว จะช่วยให้การเลี้ยวแม่นยำ�ขึ้น โดยไม่ต้องคาดคะเนเวลาในการเลี้ยว โดยมีขั้นตอนดังนี้
3
4 A3
A5 28
26 A4
A2 25
24 A0
A1
1
1
2
DC
2
SER
24 A0
SERVO
VO
G 6V 12 G 6V 13 G 6V 14 G 6V 15
KNOB
SV3
12
16
18
17
19
UART1 +5
20
RESET
1
LOW
2
2 RxD1 3 TxD1
G 6V 12 G 6V 13 G 6V 14 G 6V 15 SERVO
ON
16
17
OK
SW1
18
19
28 A4 25 A1
SV2
LO W
3 TxD
DC MOTOR
1
13
1
2 RxD
SV1
RT
+5
RES ET
MO TOR
LOW
20
SW1
14
UA
19
G 6V 12 G 6V 13 G 6V 14 G 6V 15 SV0
8 SCL 9 SDA
+5
2 RxD1 3 TxD1
UART1
RESET
18
15
D
USB
20
OK
ON
16 17
KNOB
15 SV0 14 SV1 13 SV2 12 SV3
30 A6 27 A3
27
A6 29
29 A5 26 A2
30
28 A4 25 A1
9 SD A
8 SC L
19
18
ON
OK SW 1
1
29 A5 26 A2
24 A0
D
OB
DC MOTOR
30 A6 27 A3
USB
28 A4 25 A1
A0
US B
D
29 A5 26 A2
24
KNOB
17
16
SW1
OK
KN
30 A6 27 A3
2
8 SCL 9 SDA
1
SV3 15 SV0 14 SV1 13 SV2 12
20 D
USB 8 SCL 9 SDA
+5 LOW
2 RxD1 3 TxD1
UART1
RESET
1 2 DC MOTOR
SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
15 SV0 14 SV1 13 SV2 12 SV3
ในกรณีเลี้ยวซ้าย
1. เคลื่อนที่ตรงไปจนถึงตำ�แหน่งกึ่งกลางของตัวหุ่นยนต์ 2. ตรวจสอบว่า ZX-03 ด้านซ้ายตรวจพบสีขาวอยู่หรือไม่ ถ้าใช่ให้เลี้ยวซ้ายไปจนเจอสีดำ� 3. เมื่อเจอสีดำ�แล้วตรวจสอบว่า ZX-03 ด้านซ้ายยังคงเจอสีดำ�หรือไม่ ถ้าใช่ให้เลี้ยวซ้ายไปจนกระทั่งเจอสีขาวอีกครั้ง 4. การเลี้ยวซ้าย 90 องศาก็จะจบสมบูรณ์ สั่งให้หุ่นยนต์เคลื่อนที่ตามเส้นต่อไป
1
2
3
4
17 SE
T
RT
1
D1 2 Rx
24 A0 D1 3 Tx
+5 W LO
1 24
ON
SE
2 G 6V 12
B US D
G 6V 13
G 6V 14 3
RV
G 6V 15
O
ON
24 A0
D
USB
+5 LOW
2 RxD1 3 TxD1
UART1
RESET
8 SCL 9 SDA
29 A5 26 A2 30 A6 27 A3
24 A0
RE
UA
SV
D
20
OK OB
12
20 1 2 SERVO
G 6V 12 G 6V 13 G 6V 14 G 6V 15 ON
1. เคลื่อนที่ตรงไปจนถึงตำ�แหน่งกึ่งกลางของตัวหุ่นยนต์ 2. ตรวจสอบว่า ZX-03 ด้านขวาตรวจพบสีขาวอยู่หรือไม่ ถ้าใช่ให้เลี้ยวขวาไปจนเจอสีดำ� 3. เมื่อเจอสีดำ�แล้วตรวจสอบว่า ZX-03 ด้านขวายังคงเจอสีดำ�หรือไม่ ถ้าใช่ให้เลี้ยวขวาไปจนกระทั่งเจอสีขาวอีกครั้ง 4. การเลี้ยวขวา 90 องศาก็จะจบสมบูรณ์ สั่งให้หุ่นยนต์เคลื่อนที่ตามเส้นต่อไป
8 SCL 9 SDA
USB
19 18
1 SW KN
A0
G 6V 12 G 6V 13 G 6V 14 G 6V 15
28 A4 25 A1
KNOB
2
29 A5 26 A2
OK
16
SERVO
1
30 A6 27 A3
LOW
2
8 SCL 9 SDA
+5
SV
28 A4 25 A1
2 RxD1 3 TxD1
UART1
13
ON
29 A5 26 A2
RESET
1
28 A4 25 A1
A3
G 6V 12 G 6V 13 G 6V 14 G 6V 15
SERVO
30 A6 27 A3
20
SV
2
18
19
ในกรณีเลี้ยวขวา
18
14
A2 27
A 9 SD
DC MOTOR
15 SV0 14 SV1 13 SV2 12 SV3
19
0
1
KNOB
16
17
OK
SW1
15 SV0 14 SV1 13 SV2 12 SV3
16
SV
A1 26 A6
17
15
R TO MO
LOW
L 8 SC
25 A5 30
SW1
DC
+5
2 RxD1 3 TxD1
UART1
USB
D
RESET
15 SV0 14 SV1 13 SV2 12 SV3
20 DC MOTOR
A4 29
DC MOTOR
18
OK
19
KNOB
16
SW1
17
28
การทำ�งานของโปรแกรม #include <ipst.h> int L,R,CL=400,CR=400; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); while(analog(0)>CR){ sl(30); } while(analog(0)<CR){ sl(30); } } }
// A0 เจอพืน ้ สีขาวให ้เลีย ้ วซ ้ายต่อไป // A0 เจอเส ้นสีด�ำให ้เลีย ้ วขวาต่อไป
โปรแกรมที่ 16-1 หุ่นยนต์เลี้ยวซ้ายเมื่อเจอเส้นตัดทางแยก แบบแม่นยำ� โปรแกรมที่ 16-1 จะปรับรูปแบบการเคลื่อนที่ตามเส้นปฏิบัติการที่ 15-1 เป็นการเลี้ยวซ้ายเมื่อเจอทางแยกโดยใช้เงื่อนไข while มาช่วย ตรวจสอบ โดยถ้าเงื่อนไขของ while ยังเป็นจริงอยู่ โปรแกรมจะทำ�งาน ด้านหลังวงเล็บปีกกาของ while จนกว่าจะเป็นเท็จ จึงค่อยทำ�คำ�สั่งถัด ไป สำ�หรับการตรวจสอบเงื่อนไข จะอ่านค่าจากช่อง analog0 ซึ่งเป็นแผงวงจร ZX-03 ด้านซ้ายโดยตรง ไม่ผ่านตัวแปร L เนื่องจากขณะตรวจ สอบจะต้องใช้ค่าปัจจุบัน ณ เวลานั้นถึงจะให้ผลที่ถูกต้อง โปรแกรมที่ 16-2 ก็เป็นเช่นเดียวกับโปรแกรมที่ 16-1 แต่เปลี่ยนการตรวจสอบแผงวงจร ZX-03 เป็นด้านขวา
#include <ipst.h> int L,R,CL=400,CR=400; void setup(){ OK(); } void loop(){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ tl(40); } else if(L>CL&&R<CR){ tr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); while(analog(1)>CR){ sr(30); } while(analog(1)<CR){ sr(30); } } }
//A1 เจอพืน ้ สีขาวให ้เลีย ้ วขวาต่อไป //A1 เจอเส ้นสีด�ำให ้เลีย ้ วขวาต่อไป
โปรแกรมที่ 16-2 หุ่นยนต์เลี้ยวขวาเมื่อเจอเส้นตัดทางแยก แบบแม่นยำ�
ปฏิบัติการที่ 17 การสร้างฟังก์ชั่น รวบรวมรูปแบบการ เคลื่อนที่ของหุ่นยนต์ การสร้างฟังก์ชั่น สำ�หรับเลี้ยวซ้าย 90 องศา โปรแกรมที่ 16-1 เป็นโปรแกรมเลี้ยวซ้าย 90 องศาเมื่อเจอทางแยก ถ้ายุบรวมชุดคำ�สั่งทั้งหมด ให้กลายเป็นฟังก์ชั่นตัวเดียว
โดยใช้ชื่อว่า LLL() จะได้รูปแบบดังโปรแกรมที่ 17-1 void LLL(){ int L,R,CL=550,CR=550; while(1){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ sl(40); } else if(L>CL&&R<CR){ sr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); while(analog(0)>CL){ sl(30); } while(analog(0)<CL){ sl(30); } break; } } }
//A0 เจอพืน ้ สีขาวให ้เลีย ้ วซ ้ายต่อไป //A0 เจอเส ้นสีด�ำให ้เลีย ้ วซ ้ายต่อไป
โปรแกรมที่ 17-1 สร้างฟังก์ชั่นสำ�หรับการเลี้ยวซ้ายเมื่อเจอทางแยก
การทำ�งานของฟังก์ชั่นนี้จะวนลูปเคลื่อนที่ตามเส้นไปเรื่อยๆ ด้วยชุดคำ�สั่ง while(1) ซึ่งเป็นจริงตลอดเวลา แต่เมื่อเจอเส้น ตัดจะสั่งให้หุ่นยนต์เลี้ยวซ้ายจนครบ 90 องศา แล้วหลุดออกจากลูป while(1) ด้วยคำ�สั่ง break และจะเป็นการจบการเรียกใช้ งานฟังก์ชั่น LLL() ไปด้วย
การสร้างฟังก์ชั่นสำ�หรับเลี้ยวขวา 90 องศา โปรแกรมที่ 16-2 เป็นโปรแกรมเลี้ยวขวา 90 องศาเมื่อเจอทางแยก สามารถยุบรวมคำ�สั่งทั้งหมดให้เป็นฟังก์ชั่น RRR() ดัง โปรแกรมที่ 17-2 ทำ�งานเหมือนกับฟังก์ชั่น LLL() แต่เลี้ยวขวาเมื่อเจอทางแยก void RRR(){ int L,R,CL=550,CR=550; while(1){ L=analog(0); R=analog(1); if(L>CL&&R>CR){ fd(40); } else if(L<CL&&R>CR){ sl(40); } else if(L>CL&&R<CR){ sr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); while(analog(1)>CR){ sr(30); } while(analog(1)<CR){ sr(30); } break; } } }
// A1 เจอพืน ้ สีขาวให ้เลีย ้ วขวาต่อไป // A1 เจอเส ้นสีด�ำให ้เลีย ้ วขวาต่อไป
โปรแกรมที่ 17-2 สร้างฟังก์ชั่นสำ�หรับการเลี้ยวขวาเมื่อเจอทางแยก
ปฏิบัติการที่ 18 หุ่นยนต์เคลื่อนที่ตามเส้นซับซ้อนแบบที่ 1 รูปแบบสนาม
รูปที่ 18-1 เป็นรูปแบบสนามพร้อมเส้นทางเดินของของหุ่นยนต์ โดยมองว่า ถ้าหุ่นยนต์เคลื่อนที่ตามเส้นทางนี้ จะเกิดเหตุการณ์ซ้ำ�ๆ คือ เลี้ยวขวาสองครั้งและเลี้ยวซ้ายสองครั้งต่อเนื่องกันไปเรื่อยๆ
5
7
8
2
6
4
3
1
โปรแกรมที่ 18-1 รูปแบบสนามและลักษณะเส้นทางการเคลื่อนที่
การเรียกใช้งานฟังก์ชั่น
การเรียกใช้งานฟังก์ชั่นในปฏิบัติการที่ 17 จากโปรแกรมหลัก ก็เหมือนกับการกำ�หนดแผนที่เส้นทางเคลื่อนที่ของหุ่นยนต์ ถ้ารูปแบบการ เคลื่อนที่เกิดขึ้นครั้งเดียว จะเรียกฟังก์ชั่นไว้ที่ void setup() แต่ถ้าเป็นการทำ�งานต่อเนื่องให้เรียกไว้ที่ void loop() ดังนั้นตามลักษณะสนาม ในรูปที่ 17-1 จึงเลือกสร้างไว้ที่ void loop() ดังโปรแกรมที่ 17-1
#include <ipst.h> void LLL(){ int L,R,CL=550,CR=550; while(1){ L=analog(0); R=analog(1); if(L>CL&&R>CR) { fd(40); } else if(L<CL&&R>CR) { sl(40); } else if(L>CL&&R<CR) { sr(40); } else if(L<CL&&R<CR) { fd(40);sound(18,2000,200); while(analog(0)>CL){ sl(30); } while(analog(0)<CL){ sl(30); } break; } } } void RRR(){ int L,R,CL=550,CR=550; while(1){ L=analog(0); R=analog(1); if(L>CL&&R>CR) { fd(40); } else if(L<CL&&R>CR) { sl(40); } else if(L>CL&&R<CR) { sr(40); } else if(L<CL&&R<CR){ fd(40); sound(18,2000,200); while(analog(1)>CR){ sr(30); } while(analog(1)<CR){ sr(30); } break; } } } void setup(){ OK(); } void loop(){ RRR(); RRR(); LLL(); LLL(); }
โปรแกรมที่ 18-1 โปรแกรมเคลื่อนที่ตามเส้นไปตามเส้นทางในรูปที่ 18-1
ปฏิบัติการที่ 19 การสร้างเมนูเรียกใช้งานโปรแกรม
เป้าหมาย เพื่อสามารถเรียกใช้งานโปรแกรมหลายๆ ตัวได้จากการโหลดโปรแกรมเพียงครั้งเดียว รูปแบบการสร้างเมนู
1. สร้างโปรแกรมหลายๆ ตัวที่ต้องการไว้เป็นฟังก์ชั่น โดยถ้ามีโปรแกรมที่ต้องการเลือกจากเมนู 4 โปรแกรม โดยอาจสร้างฟังก์ชั่นเป็น prog1() ใช้สร้างสี่เหลี่ยมสีเหลืองกลางจอภาพ รอกดสวิตช์ SW1 เพื่อออกจากฟังก์ชั่นกลับสู่โปรแกรมหลัก prog2() ใช้สร้างวงกลมสีเขียวกลางจอภาพ รอกดสวิตช์ SW1 เพื่อออกจากฟังก์ชั่นกลับสู่โปรแกรมหลัก prog3() ใช้ขีดเส้นกากบาทสีแดงกลางจอภาพ รอกดสวิตช์ SW1 เพื่อออกจากฟังก์ชั่นกลับสู่โปรแกรมหลัก prog4() ใช้อ่านค่าอะนาลอกจากช่อง A0 และ A1 มาแสดงที่หน้าจอ โดยทำ�งานต่อเนื่องจนกว่าจะกดสวิตช์ SW1 กลับโปรแกรมหลัก ซึ่งนำ�มาเขียนเป็นฟังก์ชั่นได้ดังโปรแกรมที่ 19-1
void prog1(){ glcdClear(); glcdMode(0); glcdFillRect(32,40,64,80,GLCD_YELLOW); while(!sw1()); } void prog2(){ glcdClear(); glcdMode(0); glcdFillCircle(64,80,32,GLCD_GREEN); while(!sw1()); } void prog3(){ glcdClear(); glcdMode(0); glcdLine(0,0,128,160,GLCD_RED); glcdLine(128,0,0,160,GLCD_RED); while(!sw1()); } void prog4(){ glcdClear(); glcdMode(1); while(!sw1()){ glcd(0,0,”L=%d glcd(1,0,”R=%d } }
“,analog(0)); “,analog(1));
โปรแกรมที่ 19-1 ตัวอย่างฟังก์ชั่นต่างๆ ที่จะถูกเรียกใช้งานผ่านเมนู 2. ใช้ knob ในการปรับเลือกโปรแกรม โดยใช้ฟังก์ชั่น knob(x) ซึ่ง x คือจำ�นวนโปรแกรมที่ต้องการเลือกจากเมนูลบด้วย 1 ถ้ามี 4 โปรแกรม จะเรียกใช้ฟังก์ชั่น knob(3) เนื่องจากค่าของ knob มีค่าอยู่ระหว่าง 0-3 3. ใช้หน้าจอ glcd แสดงค่าจากการเลื่อนเลือกโปรแกรม เพื่อให้ผู้ใช้งานรับรู้ว่าอยู่ที่โปรแกรมที่เท่าไหร่ 4. ใช้ปุ่ม OK เลือกโปรแกรมที่ต้องการ โดยดูค่าขณะที่หมุน knob แล้วกระโดดไปทำ�งานที่ฟังก์ชั่นที่เก็บโปรแกรมนั้น ๆ โดยทั้งหมดแสดงในโปรแกรมที่ 19-2
#include <ipst.h> int k; void setup(){ glcdClear(); setTextSize(2); } void loop(){ k=knob(3); glcdMode(1); glcd(0,0,”Select Menu”); glcd (2,0,”PROGRAM %d”,k+1); if(sw_OK()){ if (k==0){ prog1(); } else if(k==1){ prog2(); } else if(k==2){ prog3(); } else { prog4(); } glcdClear(); } } void prog1(){ glcdClear(); glcdMode(0); glcdFillRect(32,40,64,80,GLCD_YELLOW); while(!sw1()); } void prog2(){ glcdClear(); glcdMode(0); glcdFillCircle(64,80,32,GLCD_GREEN); while(!sw1()); } void prog3(){ glcdClear(); glcdMode(0); glcdLine(0,0,128,160,GLCD_RED); glcdLine(128,0,0,160,GLCD_RED); while(!sw1()); } void prog4(){ glcdClear(); glcdMode(1); while(!sw1()){ glcd(0,0,”L=%d “,analog(0)); glcd(1,0,”R=%d “,analog(1)); } }
โปรแกรมที่ 19-2 โปรแกรมทั้งหมดของการเรียกใช้งานผ่านเมนู
Select PROGRAM
Menu 2
GLCD MENU.ai