แกะกล่องหุ่นยนต์ POP-BOT XT โดย Thawatchai Srilardlao
Tip & Trick | POP-X2 | IPST-SE | micro:bit | POP-7 | ATX2 | Application Module | Sensor
หน้าเว็บ
วันอาทิตย์ที่ 21 ตุลาคม พ.ศ. 2555
การควบคุมหุ่นยนต์ POP-BOT XT ด้วยสวิตช์ 6 ตัว
วิธีการง่ายๆ ในการใช้ ZX-SWITCH มาเชื่อมต่อสายโดยตรงเข้ากับตัวหุ่นยนต์กัน สำหรับคนที่ไม่ต้องการเขียนโปรแกรมที่ซับซ้อน แต่ควบคุมหุ่นยนต์ได้อย่างง่ายๆ
1. นำสวิตช์ ZX-SWITCH มายึดติดเข้ากับแผ่นไม้หรือแผ่นกริด ดังแสดงในรูป โดยสวิตช์ที่ใช้จะมี 6 ตัว
สำหรับเดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา คีบกระป๋อง และปล่อยวางกระป๋อง
2. นำสายไฟแบบ JST ขนาด 24 นิ้ว จำนวนสองเส้นต่อเข้าด้วยกันเพื่อให้ได้ความยาว 48 นิ้ว
3. นำสายไฟเสียบเข้ากับสวิตช์ทั้ง 6 ตัว ส่วนปลายอีกด้านเสียบเข้ากับ POP-BOT XT ในตำแหน่งดังนี้
สวิตช์เดินหน้า ---> ช่อง 18
สวิตช์ถอยหลัง ---> ช่อง 19
สวิตช์เลี้ยวซ้าย ---> ช่อง 20
สวิตช์เลี้ยวขวา ---> ช่อง 21
สวิตช์วางกระป๋อง ---> ช่อง 22
สวิตช์คีบกระป๋อง ---> ช่อง 23
4. ทำการมัดสายให้เรียบร้อย
5 จากนั้นเขียนโปรแกรมทดสอบดังนี้
1. นำสวิตช์ ZX-SWITCH มายึดติดเข้ากับแผ่นไม้หรือแผ่นกริด ดังแสดงในรูป โดยสวิตช์ที่ใช้จะมี 6 ตัว
สำหรับเดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา คีบกระป๋อง และปล่อยวางกระป๋อง
2. นำสายไฟแบบ JST ขนาด 24 นิ้ว จำนวนสองเส้นต่อเข้าด้วยกันเพื่อให้ได้ความยาว 48 นิ้ว
3. นำสายไฟเสียบเข้ากับสวิตช์ทั้ง 6 ตัว ส่วนปลายอีกด้านเสียบเข้ากับ POP-BOT XT ในตำแหน่งดังนี้
สวิตช์เดินหน้า ---> ช่อง 18
สวิตช์ถอยหลัง ---> ช่อง 19
สวิตช์เลี้ยวซ้าย ---> ช่อง 20
สวิตช์เลี้ยวขวา ---> ช่อง 21
สวิตช์วางกระป๋อง ---> ช่อง 22
สวิตช์คีบกระป๋อง ---> ช่อง 23
4. ทำการมัดสายให้เรียบร้อย
5 จากนั้นเขียนโปรแกรมทดสอบดังนี้
#include <popxt.h> void servo_open(){ servo(2,80);sleep(400);servo(1,140);sleep(400); servo(1,-1);servo(2,-1); } void servo_close(){ servo(1,0);sleep(1000); servo(2,0);sleep(1000); servo(1,-1);servo(2,-1); } void setup(){ glcdMode(1); setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcdClear(); } void loop(){ if(in(18)==0){ fd(50);glcd(1,1,"Forward "); } else if(in(19)==0){ bk(50);glcd(1,1,"Backward "); } else if(in(20)==0){ sl(50);glcd(1,1,"Spin Left "); } else if(in(21)==0){ sr(50);glcd(1,1,"Spin Right"); } else if(in(22)==0){ servo_open();glcd(1,1,"Servo Open "); } else if(in(23)==0){ servo_close();glcd(1,1,"Servo Close"); } else { ao();glcd(1,1,"Motor Stop"); } }
ผลลัพธ์การทำงาน เป็นดังนี้
POP-BOT XT ควบคุมด้วยรีโมตคอนโทรล RC
สำหรับเครื่องบินบังคับวิทยุ หรือรถบังคับวิทยุจะใช้รีโมตแบบคลื่อนวิทยุในการควบคุมเอาต์พุตที่ได้จากตัวมันก็จะมีภาครับหรือ รีซีฟเวอร์เป็นตัวจัดการ ปัจจุบันราคาของอุปกรณ์เหล่านี้มีราคาถูกลงมาก (แต่บางตัวฟังก์ชั่นเยอะๆ ก็แพงเหมือนกัน)
ภาครีซีฟเวอร์เมื่อรับสัญญาณมาแล้วก็เปลี่ยนสัญญาณเหล่านั้นไปควบคุมเซอร์โวมอเตอร์
ดังนั้นถ้าเราจับสัญญาณเซอร์โวที่มาจากรีซีฟเวอร์ได้ ก็นำรีโมตของรถบังคับไปใช้งานได้
รูปแบบการใช้งานคำสั่ง
pulseIn(pin, value ,timeout)
โดย pin คือขาดิจิตอลอินพุตที่ต้องการอ่านค่า
value คือลอจิกที่จะอ่านค่าความกว้างพัลส์ออกมา
timeout คือช่วงเวลาที่เรากำหนดว่าถ้าไม่เกิดพัลส์ขึ้นมาในช่วงเวลากี่ไมโครวินาที ให้ไปทำงานคำสั่งถัดไป
การเชื่อมต่อ
ขั้นตอนในส่วนนี้แนะนำให้ไปประยุกต์หาอุปกรณ์ตามที่มีอยู่ใหล้ๆตัวนะครับ เพื่อเชื่อมต่อสายสัญญาณ
สายสัญญาณของเซอร์โวมอเตอร์ที่ใช้กับชุดรีซีฟเวอร์จะแตกต่างกับสายสัญญาณ JST ที่ใช้งานกับหุ่นยนต์ POP-BOT XT จึงจำเป็นต้องมีการตัดต่อสายเล็กน้อย (หรือถ้าไม่มีการใช้งานช่องเซอร์โวมอเตอร์ สามารถเชื่อมต่อสายเข้ากับช่องของเซอร์โวมอเตอร์ก็ได้) ตามขั้นตอนดังนี้
1. นำสายเซอร์โวมอเตอร์ มาตัดปลายออกด้านหนึ่ง ปอกปลายสายเล็กน้อย ให้ทั้งสามสายเหลื่อมกันดังรูป เมื่อบัดกรีแล้วจะได้ไม่ชอร์ตกัน
2. ทำแบบเดียวกันกับสาย JST ปอกปลายสายเช่นเดียวกัน
3. นำสายทั้งสองมาเชื่อมกัน อาจใช้เทปพันสายไฟหรือท่อหดพันไว้เพื่อป้องกันการชอร์ต
4. เสียบสายด้านเซอร์โวมอเตอร์เข้าที่ช่องที่ 1 2 และ 3 ครับ สังเกตทิศทางของสาย สีดำคือไฟลบหรือกราวด์ต้องจำไว้เสมอ
5. เชื่อมต่อสายอีกด้านเข้ากับบอร์ด POP-BOT XT ในที่นี้เลือกต่อตามนี้ครับ
CH1 ==== 21
CH2 ==== 22
CH3 ==== 23
ที่เหลือก็คือการเขียนโปรแกรมทดสอบละครับ เริ่มจากนำค่าที่อ่านได้มาโชว์ที่หน้าจอ GLCD กันก่อน
#include <popxt.h> int ch1,ch2,ch3; void servo_open(){ servo(2,80);sleep(400); servo(1,140);sleep(400); servo(1,-1);servo(2,-1); } void servo_close(){ servo(1,0);sleep(1000); servo(2,0);sleep(1000); servo(1,-1);servo(2,-1); } void setup() { pinMode(21, INPUT); pinMode(22, INPUT); pinMode(23, INPUT); glcdMode(1); setTextSize(2); glcd(1,1,"Press OK"); sw_ok_press(); glcdClear(); } void loop() { ch1 = pulseIn(21, HIGH, 25000); if (ch1>1200&&ch1<1500){ ao(); } else if (ch1<1200){ fd(70); } else if (ch1>1500) { bk(70); } ch2 = pulseIn(22, HIGH, 25000); if (ch2>1200&&ch2<1500){ ao(); } else if (ch2<1200){ sl(60); } else if (ch2>1500){ sr(60); } ch3 = pulseIn(23, HIGH, 25000); if (ch3>1500) { servo_close(); } else if (ch3<1200){ servo_open(); } }
สมัครสมาชิก:
บทความ (Atom)