อบรมหุ่นยนต์ POP-BOT XT นักเรียน ม.1

          หลังจากได้ดูตัวอย่างภาพยนตร์เกี่ยวกับหุ่นยนต์แล้ว นักเรียนก็มาเขียนขั้นตอนการต้มบะหมี่กึ่งสำเร็จรูปจากนั้นก็มาเล่นเกมส์การแก้ปัญหา
20130425_100459
20130425_100356
20130425_100416
20130425_100531
ตั้งใจกันทุกคน
5661e-20130425_105623 db39d-20130425_105652
4b934-20130425_105549
วางแผน Light Bot
d8288-20130426_114911 a735a-20130426_132128
1ad18-20130426_132142 3a775-20130426_132147
b16fb-20130426_132152 87167-20130426_132224
เขียนโปรแกรมควบคุมหุ่นยนต์ POP-BOT XT

หุ่นยนต์เคลื่อนที่ไปตามเส้นดำ

หุ่นยนต์และมนุษย์มีหลักการทำงานที่เหมือนกัน คือ หน่วยรับข้อมูลเข้า (Input Unit) หน่วยประมวลผล (Process Unit) และหน่วยแสดงผล (Output Unit) ดังนั้นการที่หุ่นยนต์จะเคลื่อนที่ไปให้ตรงเป้าหมาย หุ่นยนต์จะต้องมีอุปกรณ์ที่จะตรวจสอบตำแหน่งและส่งข้อมูลที่ได้ไปยังหน่วยประมวลผล เพื่อให้มอเตอร์ทำการแสดงผลโดยการไปยังเป้าหมายต่อไป อุปกรณ์พื้นฐานที่ใช้ในการตรวจสอบตำแหน่งนั้น คือ เซนเซอร์แสง (Light Sensor)

หุ่นยนต์ใช้เซนเซอร์แสงเปรียบเสมือนตาของมนุษย์ โดยมีเส้นสีดำเป็นทางเดินไปหาเป้าหมาย หุ่นยนต์จะต้องตรวจสอบว่าขณะที่เคลื่อนที่หุ่นยนต์ยังอยู่บนเส้นดำหรือไม่ เราสามารถนำเซนเซอร์แสงมาใช้กับการเดินของหุ่นยนต์

การเดินตามเส้นของหุ่นยนต์ โดยใช้เซนเซอร์ 1 ตัวมีวิธีการว่า เราจะต้องให้หุ่นยนต์ตรวจสอบเส้นดำเป็นช่วงๆ เพื่อไม่ให้หลุดจากเส้นดำที่กำหนด การตรวจสอบเส้นดำเป็นช่วงๆ มีวิธีการดังภาพ

linefollower001

ภาพแสดงรูปแบบการเคลื่อนที่ของหุ่นยนต์เมื่อใช้ 1

เซนเซอร์วิธีการทำงานมีขั้นตอนดังนี้
1. เมื่อเซ็นเซอร์แสงวัดค่าแสงได้สีดำ หุ่นยนต์จะเลี้ยวออกออกจากเส้นดำ
2. เมื่อเซ็นเซอร์แสงวัดค่าแสงได้สีขาว (ไม่ใช่สีดำ) หุ่นยนต์เคลื่อนที่กลับไปหาเส้นดำ

linefollower002

ภาพแสดงการแบ่งค่าแสงของเซนเซอร์ออกเป็น 2 ส่วนสัมพันธ์กับการเคลื่อนที่ของหุ่นยนต์

linefollower003

ตัวอย่างโปรแกรม

linefollower004

เมื่อนำโปรแกรมไปใช้จริงจะต้องปรับแต่งอีกครั้งดังนี้
1. ค่าแสงที่จะนำมาใช้เปรียบเทียบ (ค่าของตัวแปร Light) ซึ่งจะต้องหาค่าใหม่อีกครั้งตามสภาพแวดล้อมที่เปลี่ยนไป
2. อัตราส่วนความเร็วของมอเตอร์ B และมอเตอร์ A มีผลทำให้การเคลื่อนที่ของหุ่นยนต์ส่ายไปมา จนอาจจะทำให้หุ่นยนต์หลุดจากเส้นได้

linefollower005

ภาพแสดงการเลี้ยวของหุ่นยนต์ที่สัมพันธ์กับความเร็ว A มาก, B ปานกลางและ C น้อย

การเคลื่อนที่ไปตามเส้นของหุ่นยนต์ที่กล่าวมาข้างต้นประสิทธิภาพยังไม่ดีนัก หุ่นยนต์สามารถเคลื่อนที่ไปบนเส้นตรงได้ดี แต่อาจจะส่ายไปมาหรืออาจจะทำให้หุ่นยนต์หลุดจากเส้นได้ในกรณีที่มีเส้นโค้ง เพราะเซนเซอร์แสงจะตรวจสอบได้เฉพาะสีขาวและสีดำเท่านั้น ดังนั้นเพื่อให้การเคลื่อนที่ไปบนเส้นตรงได้ดีและมีประสิทธิภาพ ไม่ว่าจะเป็นเส้นตรงหรือเส้นโค้ง จึงแบ่งค่าการอ่านค่าแสงออกเพิ่มขึ้นเป็น 3 ส่วน ได้แก่ สีขาว สีเทาและสีดำ ดังภาพ

linefollower006

ภาพแสดงการแบ่งค่าแสงของเซนเซอร์ออกเป็น 3 ส่วนสัมพันธ์กับการเคลื่อนที่ของหุ่นยนต์


วิธีการทำงานมีขั้นตอนดังนี้
1. เมื่อเซ็นเซอร์แสงวัดค่าแสงได้สีดำ หุ่นยนต์จะเลี้ยวออกออกจากเส้นดำ
2. เมื่อเซ็นเซอร์แสงวัดค่าแสงได้สีเทา หุ่นยนต์เคลื่อนที่ไปข้างหน้า
3. เมื่อเซ็นเซอร์แสงวัดค่าแสงได้สีขาว หุ่นยนต์เคลื่อนที่กลับไปหาเส้นดำ

การเคลื่อนที่ของหุ่นยนต์ที่ได้จากการจากการแบ่งค่าแสงออกเป็น 3 ส่วน คือ จะทำให้หุ่นยนต์เคลื่อนที่ได้นุ่มนวล ส่ายไปมาน้อยลง เกาะติดเส้นไปตลอดการเคลื่อนที่

linefollower007

ตัวอย่างโปรแกรม

linefollower008

linefollower009

เมื่อนำโปรแกรมไปใช้จริงจะต้องปรับแต่งอีกครั้งดังนี้
1. ค่าแสงที่จะนำมาใช้เปรียบเทียบทั้ง 2 ค่า จะต้องหาค่าใหม่อีกครั้งตามสภาพแวดล้อมที่เปลี่ยนไป หรือช่วงความห่างของค่าทั้ง 2 ค่า หากมีช่วงห่างกันมากก็จะทำให้การตรวจพบเส้นดำช้า อาจเป็นสาเหตุให้เกิดการหลุดจากเส้นดำได้
2. อัตราส่วนความเร็วของมอเตอร์ B และมอเตอร์ A ในการเลี้ยวขวาและเลี้ยวซ้าย ซึ่งพบว่า ถ้ามีอัตราส่วนต่างกันมากก็จะมีผลทำให้การเคลื่อนที่ของหุ่นยนต์ส่ายไปมาน้อยลง เคลื่อนที่ได้เรียบและนุ่มนวลมากขึ้น

การแบ่งช่วงของค่าแสงออกเป็นช่วงๆ ยิ่งมีช่วงมาก ก็จะทำให้การควบคุมหุ่นยนต์ให้เคลื่อนที่ไปตามเส้นดำที่กำหนดจนถึงเป้าหมาย นอกจากวิธีการแบ่งช่วงค่าแสงแล้วการเพิ่มจำนวนของเซนเซอร์แสงก็เป็นอีกวิธีหนึ่งที่ทำให้ควบคุมหุ่นยนต์เคลื่อนที่ให้เกิดประสิทธิภาพมากยิ่งขึ้น

ข้อเสนอแนะจากประสบการณ์
หุ่นยนต์เคลื่อนที่ไปตามเส้นดำ คือ ให้หุ่นยนต์เคลื่อนที่เกาะติดเส้นดำไปทุกแห่งไม่ว่าเส้นดำจะตรงไป เลี้ยวซ้ายหรือเลี้ยวขวา
หุ่นยนต์ คือ การออกแบบโลกแห่งความจริง ผู้เล่นจะสามารถเริ่มต้นตั้งแต่ขั้นตอนการออกแบบ ซึ่งทำให้โลกจินตนาการกลายเป็นความจริง ต้องแก้ไขและปรับปรุงข้อผิดพลาด วางแผนและแก้ปัญหาจนสำเร็จ ในบางสถานการณ์ที่ใช้โปรแกรมเหมือนกันแต่ทำไมผลลัพธ์ที่ได้จึงออกมาไม่เหมือนกัน ดังนั้นผู้เล่นจึงต้องเป็นคนที่ปรับแต่งโปรแกรมให้เหมาะกับสถานการณ์
สิ่งที่เกิดขึ้นในห้องเรียนหุ่นยนต์ของข้าพเจ้า คือ นักเรียนได้เรียนรู้ชุดคำสั่งให้หุ่นยนต์วิ่งตามเส้นดำพื้นฐานแล้ว และนักเรียนคือผู้ที่จะต้องแก้ไขและปรับปรุงข้อผิดพลาด วางแผนและแก้ปัญหาจนกระทั่งหุ่นยนต์ของตนเองสามารถเคลื่อนที่ไปอย่างสมบูรณ์
จากโปรแกรมหุ่นยนต์วิ่งตามเส้นดำพื้นฐาน

linefollower011
หรือ

linefollower010

 

 

เอกสารอ้างอิง
Jim Sluka. (2009). A PID Controller For Lego Mindstorms Robots. ค้นเมื่อวันที่ 30 พฤศจิกายน 2555. จาก http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robots.html
Martha N. Cyr. (2002). LEGO MindStorms for School Using ROBOLAB. Massachusetts: [n.p.].

รูปแบบการเลี้ยวของหุ่นยนต์

มอเตอร์ เป็นอุปกรณ์ที่เปรียบเสมือนกล้ามเนื้อของมนุษย์ กล่าวคือเมื่อร่างกายของมนุษย์รับข้อมูลจากตาหรือหูแล้ว สมองจะทำการตัดสินใจจะส่งสัญญาณผ่านระบบประสาทไปยังกล้ามเนื้อ โดยกล้ามเนื้อจะทำหน้าที่ควบคุมให้อวัยวะแขน ขา ทำงาน ในหุ่นยนต์ก็เช่นเดียวกัน มอเตอร์จะทำหน้าที่รับสัญญาณไฟฟ้าจากภาคควบคุม (Controller) โดยมอเตอร์จะควบคุมการทำงานของระบบแมคคานิคให้ทำงานตามที่สั่งการ

motor001

ภาพแสดง Servo motor

การควบคุมให้หุ่นยนต์เคลื่อนที่เดินหน้าและถอยหลัง สามารถกำหนดได้ 2 วิธี คือ
วิธีที่ 1 การควบคุมการเคลื่อนที่ด้วยเวลา ดังนี้

motor019

จากโปรแกรมมีฟังก์ชันที่เกี่ยวข้องกับการเขียนโปรแกรม คือ

OnFwd(Outputs Port, Power) คือ ฟังก์ชันที่ใช้ควบคุมให้มอเตอร์เดินหน้า (Outputs Port พอร์ตที่ติดต่อกับมอเตอร์, Power ค่าตั้งแต่ 0 ถึง 100 สามารถใส่เป็นค่าลบหากต้องการทิศตรงข้าม)
OnRev(Outputs Port, Power) คือ ฟังก์ชันที่ใช้ควบคุมให้มอเตอร์ถอยหลัง (Outputs Port พอร์ตที่ติดต่อกับมอเตอร์, Power ค่าตั้งแต่ 0 ถึง 100 สามารถใส่เป็นค่าลบหากต้องการทิศตรงข้าม)
Wait(milliseconds) คือ ฟังก์ชันที่ใช้สำหรับกำหนดเวลาในการทำงาน (Milliseconds เวลาเป็นมิลลิวินาที (วินาที x 1000))
Off(Outputs Port) คือ ฟังก์ชันที่ใช้ปิดการทำงานมอเตอร์ พร้อมกับหยุด (Outputs Port พอร์ตที่ติดต่อกับมอเตอร์)

วิธีที่ 2 การควบคุมการเคลื่อนที่ด้วยองศาการหมุนของมอเตอร์

motor004

มอเตอร์ของชุดหุ่นยนต์จะเป็น Servo motor ซึ่งมีเซนเซอร์อยู่ภายในแล้ว โดยเซนเซอร์จะใช้การวัดเป็นองศา 1 รอบการหมุนจะเท่ากับ 360 องศา

motor016

เราสามารถดูค่าของเซนเซอร์ได้ที่เมนู View

motor016

1. เลือกไอคอน Motor degree
2. เลือกพอร์ตที่เชื่อมต่อกับเซนเซอร์
3. ลองดันมอเตอร์ไปกับพื้น
4. ดูค่าที่ได้รับที่หน้าจอ จะเป็นค่าของจำนวนองศาที่ล้อหมุน

สามารถเขียนโปรแกรมได้ดังนี้

motor017

จากโปรแกรมมีฟังก์ชันที่เกี่ยวข้องกับการเขียนโปรแกรม คือ

RotateMotor(Outputs Port,Power,Angle) (Outputs Port พอร์ตที่ติดต่อกับมอเตอร์ื, Power ค่าตั้งแต่ 0 ถึง 100 สามารถใส่เป็นค่าลบหากต้องการทิศตรงข้าม , Angle สามารถใส่เป็นค่าลบหากต้องการทิศทางตรงกันข้าม)

นอกจากการควบคุมให้หุ่นยนต์เดินหน้าและถอยหลังแล้ว หุ่นยนต์จะมีการเคลื่อนที่ด้วยการเลี้ยว ซึ่งสามารถจำแนกลักษณะการเลี้ยวตามการควบคุมของมอเตอร์ได้ 5 รูปแบบ ดังนี้

แบบที่ 1 มอเตอร์ด้านเดียวหมุนไปข้างหน้า

motor009

ภาพแสดงการเลี้ยวแบบที่ 1 มอเตอร์ด้านเดียวหมุนไปข้างหน้า

แบบที่ 2 มอเตอร์ด้านเดียวหมุนถอยหลัง

motor012

ภาพแสดงการเลี้ยวแบบที่ 2 มอเตอร์ด้านเดียวหมุนถอยหลัง

แบบที่ 3 มอเตอร์ทั้งสองด้านหมุนพร้อมกันในทิศตรงกันข้าม

motor013

ภาพแสดงการเลี้ยวแบบที่ 3 มอเตอร์ด้านเดียวหมุนพร้อมกันในทิศตรงกันข้าม

แบบที่ 4 มอเตอร์ทั้งสองด้านหมุนพร้อมกันไปหน้าในทิศเดียวกันแต่กำลังต่างกัน

motor014

ภาพแสดงการเลี้ยวแบบที่ 4 มอเตอร์ด้านเดียวหมุนพร้อมกันไปหน้าในทิศเดียวกันแต่กำลังต่างกัน

แบบที่ 5 มอเตอร์ทั้งสองด้านหมุนพร้อมกันถอยหลังในทิศเดียวกันแต่กำลังต่างกัน

motor015

ภาพแสดงการเลี้ยวแบบที่ 5 มอเตอร์ด้านเดียวหมุนพร้อมกันถอยหลังในทิศเดียวกันแต่กำลังต่างกัน

สิ่งที่สำคัญที่สุดในการเคลื่อนที่ไปทางซ้ายหรือขวาของหุ่นยนต์ คือ การควบคุมการจ่ายพลังงานของมอเตอร์ มอเตอร์ไฟฟ้าที่ใช้ในการสร้างหุ่นยนต์ส่วนใหญ่จะเป็นแบบมอเตอร์ไฟฟ้ากระแสตรง เนื่องจากสามารถควบคุมความเร็วในการหมุนและทิศทางของการหมุนได้ง่าย โดยใช้แหล่งจ่ายที่เป็นแบตเตอรี่ที่สามารถหาได้ไม่ยาก และต้องเลือกขนาดของความเร็วรอบและแรงบิดให้เหมาะสมกับงาน

ข้อเสนอแนะจากประสบการณ์
รูปแบบการเลี้ยว 5 แบบที่ได้กล่าวมาข้างต้น จะทำงานได้มีประสิทธิภาพ เกิดจากการนำไปใช้ให้เหมาะสมกับสถานการณ์ เช่น เมื่อต้องการเลี้ยวในพื้นที่แคบ ควรเลือกใช้การเลี้ยวแบบที่ 3 มอเตอร์ทั้งสองด้านหมุนพร้อมกันในทิศตรงกันข้าม เพราะการเลี้ยวแบบนี้มอเตอร์ทั้งสองด้านจะทำงานพร้อมกันทำให้เกิดรัศมีการเลี้ยวที่สั้นที่สุด สามารถเลี้ยวได้รวดเร็วใช้เวลาสั้น ถ้ามีพื้นที่ค่อนข้างกว้าง อาจจะเลือกใช้แบบที่ 4 หรือแบบที่ 5 เพราะทั้งสองแบบมีรูปแบบการเลี้ยวที่คล้ายกับการเข้าโค้ง

turn003

ภาพแสดงการเปรียบเทียบรูปแบบการเลี้ยวในแบบที่ 1 และ 4

 

 

เอกสารอ้างอิง
ทีมงานสมาร์ทเลิร์นนิ่ง. (2549). เรียนรู้การสร้างหุ่นยนต์ Step by Step. กรุงเทพฯ: บริษัท ด่านสุทธาการพิมพ์ จำกัด.
Daniele Benedettelli. (2007). Programming LEGO NXT Robots using NXC. [n.p.]: [n.p.].
John C. Hansen. (2009). LEGO NXT power programming : robotics in C. 2nd ed. United States: Variant Press.
The LEGO Group. (2006). Quick Start Guide : Using The NXT with Robolab 2.9. [n.p.]: [n.p.].

การเก็บค่าแสงของโปรแกรม Robolab ในหุ่นยนต์ Lego Mindstorms

การใช้เซนเซอร์แสงตรวจสอบเส้นดำจะต้องมีค่าแสงที่ไว้ใช้ในการเปรียบเทียบ ซึ่งค่าแสงดังกล่าวมีวิธีได้มาดังนี้ (1) นำเซนเซอร์แสงที่ติดตั้งกับหุ่นยนต์ไปวัดค่าแสงพื้นผิวที่เป็นสีขาว (2) นำเซนเซอร์แสงตัวเดียวกันไปวัดค่าแสงพื้นผิวที่เป็นสีดำและ (3) นำค่าแสงที่เซนเซอร์วัดได้พื้นผิวที่เป็นสีขาวและสีดำมารวมกันแล้วหารด้วยสอง

work002

ภาพแสดงการวัดแสงเพื่อหาค่าแสงนำไปใช้เปรียบเทียบ

ทุกครั้งที่สภาพแวดล้อมหรือสภาพแสงเปลี่ยนไป ค่าแสงที่นำไปใช้ในการเปรียบเทียบก็เปลี่ยนไปด้วย ดังนั้นจึงมีความจำเป็นที่จะต้องทำการหาค่าแสงทุกๆ ครั้ง ซึ่งบางครั้งอาจจะทำให้เกิดความผิดพลาด เพื่อป้องกันความผิดพลาดนั้นจึงต้องเขียนโปรแกรมให้หุ่นยนต์เก็บค่าของแสงอัตโนมัติและหาค่าเพื่อไปใช้เปรียบเทียบ
ขั้นตอนการทำงานของโปรแกรมให้หุ่นยนต์เก็บค่าของแสงอัตโนมัติ

work003

ภาพแสดงขั้นตอนการวัดแสงเพื่อหาค่าแสงนำไปใช้เปรียบเทียบ

และสามารถเขียนเป็นโปรแกรมได้ดังนี้

work004

ภาพแสดงโปรแกรมให้หุ่นยนต์เคลื่อนที่ไปหยุดที่เส้นดำ โดยเก็บค่าของแสงอัตโนมัติ

ความหมายของโปรแกรมมีดังนี้

icon010
1) เริ่มต้นโปรแกรม
2) ให้ค่าแสงที่พอร์ตครั้งแรกเป็น 0
3) แสดงตัวหนังสือ “Check White”ตรงกลางหน้าจอ LCD บรรทัดที่ 0
4) คอยจนกว่าจะมีการกดเซนเซอร์สัมผัสที่พอร์ต 3
5) มีเสียงเตือน
6) กล่องบรรจุสีแดงรับค่าแสงจากเซนเซอร์แสงที่พอร์ต 1
7) ให้ค่าแสงจากกล่องบรรจุสีแดงเซนเซอร์แสงที่พอร์ต 1 มีชื่อว่า w1
8) แสดงค่าชอง w1 ตรงกลางหน้าจอ LCD บรรทัดที่ 3

icon011
9) แสดงตัวหนังสือ “Check Black”ตรงกลางหน้าจอ LCD บรรทัดที่ 0
10) คอยจนกว่าจะมีการกดเซนเซอร์สัมผัสที่พอร์ต 3
11) มีเสียงเตือน
12) กล่องบรรจุสีแดงรับค่าแสงจากเซนเซอร์แสงที่พอร์ต 1
13) ให้ค่าแสงจากกล่องบรรจุสีแดงเซนเซอร์แสงที่พอร์ต 1 มีชื่อว่า b1
14) แสดงค่าชอง b1 ตรงกลางหน้าจอ LCD บรรทัดที่ 4
15) แสดงตัวหนังสือ “Light Reference”ตรงกลางหน้าจอ LCD บรรทัดที่ 6
16) นำค่าของ w1 และ b1 มาคำนวณหาค่าแสงเพื่อจะนำไปใช้เปรียบเทียบ สมการ (w1+b1)/2 แล้วเก็บค่าไว้ในกล่องบรรจุสีแดง
17) แสดงการคำนวณที่ได้ตรงกลางหน้าจอ LCD บรรทัดที่ 6 เก็บค่าไว้ในกล่องบรรจุสีแดง

icon012
18) คอยจนกว่าจะมีการกดเซนเซอร์สัมผัสที่พอร์ต 3
19) หุ่นยนต์เคลื่อนที่ไปข้างหน้า
20) หุ่นยนต์เคลื่อนที่ไปข้างหน้า
21) คอยจนกว่าค่าแสงที่เซนเซอร์แสงที่พอร์ต 1 มีค่าน้อยกว่าค่าแสงที่เก็บในกล่องบรรจุสีแดง
22) หุ่นยนต์หยุดเคลื่อนที่
23) จบโปรแกรม

เครื่องมือไอคอนที่จะต้องใช้ในการเขียนโปรแกรมมีดังนี้

 begin Begin เริ่มต้นโปรแกรม
 icon001 Zero Light Sensor ให้ค่าแสงเป็น 0
 icon004 Wait for Push คอยจนกว่าจะมีการกด
 icon002 Write Text แสดงตัวหนังสือที่หน้าจอ LCD
 icon013 Formatted Text แสดงค่าของตัวแปรที่หน้าจอ LCD
 icon005 Fill Container กล่องบรรจุรับค่าที่ใส่เข้าไป
 icon006 Light Container กล่องบรรจุรับค่าแสง
 icon007 Formula Container กล่องบรรจุรับค่าที่คำนวณ
 motorB Motor B มอเตอร์ B เคลื่อนที่ไปข้างหน้า
 motorC Motor C มอเตอร์ C เคลื่อนที่ไปข้างหน้า
 icon008 Wait for Dark รอจนกระทั่งเซนเซอร์ที่พอร์ต 1 อ่านค่าแสงได้มืดกว่าค่าที่ตั้งไว้ ในที่นี้คือ ค่าจากกล่องบรรจุสีแดงที่รับค่ามาจากการคำนวณอัตโนมัติ
 2556-04-09 21_33_36-Data Logging and Motors Stop All Output หยุดการทำงานของทุกอุปกรณ์ Output เช่น มอเตอร์ หลอดไฟ
 end End จบโปรแกรม

การเขียนโปรแกรมเพื่อให้หุ่นยนต์เก็บค่าแสงอัตโนมัติ สามารถช่วยลดความคลาดเคลื่อนจากสภาพแสงที่เปลี่ยนแปลงไปในแต่ละสภาพแวดล้อม แต่ก็ไม่ได้หมายถึงให้ผู้ควบคุมหุ่นยนต์ละเลยการตรวจสอบค่าแสงเลย ผู้ควบคุมหุ่นยนต์จะต้องเข้าใจและตระหนักถึงหลักการพื้นฐานของการวัดแสงและต้องตรวจสอบทิศทางของแสงแต่ละสภาพแวดล้อมก่อนที่จะให้หุ่นยนต์เก็บค่าแสงอัตโนมัติได้ค่าแสงที่ถูกต้องและแม่นยำแท้จริง

ข้อเสนอแนะจากประสบการณ์
นักเรียนที่เข้าแข่งขันหุ่นยนต์อัตโนมัติ ในงานศิลปะหัตกรรมนักเรียนฯ มักจะประสบกับปัญหาเรื่องพื้นที่จัดการแข่งขันมีสภาพแวดล้อมแบบเปิด แสงสว่างจากภายนอกสามารถเข้ามาในสนามแข่งขันได้ ทำให้ค่าแสงเปลี่ยนแปลงตลอดเวลาไม่มีความแน่นอน
แต่ถ้านักเรียนได้ศึกษาและเข้าใจเรื่องการเก็บค่าแสงอัตโนมัติจะทำให้นักเรียนสามารถแก้ปัญหาดังกล่าวที่จะเกิดขึ้นที่สนามแข่งขัน
และเมื่อตรวจสอบโปรแกรมเก็บค่าแสงอัตโนมัติ ในภาพตัวอย่างด้านล่าง

autolight001

มีสัญลักษณ์เกี่ยวกับการเก็บค่า ซึ่งสัญลักษณ์ที่นำมาใช้นั้นนักเรียนควรศึกษาความรู้เกี่ยวกับเรื่องตัวแปรเพิ่มเติมก็จะสามารถทำความเข้าใจโปรแกรมได้อย่างสมบูรณ์

เอกสารอ้างอิง
Martha N. Cyr. (2002). LEGO MindStorms for School Using ROBOLAB. Massachusetts: [n.p.].

การใช้เซนเซอร์แสงตรวจสอบเส้นดำ

เซนเซอร์แสงเป็นอุปกรณ์ที่ทำหน้าที่เปลี่ยนค่าแสงให้กลายเป็นสัญญาณไฟฟ้า ทำหน้าที่เป็นเสมือนตาของหุ่นยนต์ เซนเซอร์ตรวจจับแสงจะช่วยให้หุ่นยนต์แยกแยะระหว่างแสงสว่างและความมืด สามารถอ่านความเข้มแสงในห้องและวัดความเข้มของแสงสีของพื้นผิว

light001

เซนเซอร์แสง

การรับรู้ของตามนุษย์ต่อสีเมื่อเปรียบเทียบกับเซนเซอร์แสง

light007
การแสดงค่าแสงของเซนเซอร์แสง สามารถทำได้โดยเปิด NXT Controller ไปที่เมนู View

light008

หากเลือก Reflected Light จะทำให้เซนเซอร์แสงฉายแสงสีแดงไปกระทบวัตถุและวัดแสงที่สะท้อนกลับมาเราสามารถใช้ในการตรวจสอบค่าของแสงที่สะท้อนจากวัตถุได้

light009

แต่ถ้าเลือกวิธีการวัดค่าแสงแบบ Ambient Light จะไม่มีการฉายแสงสีแดงออกมาจากเซนเซอร์แสง โดยเซนเซอร์แสงจะวัดแสงที่เกิดจากการสะท้อนแสงจากวัตถุโดยรอบเท่านั้น
ค่าของแสงที่ได้จากการวัดของเซนเซอร์แสงจะเริ่มต้นตั้งแต่ 0% ซึ่งหมายถึงดำสนิทหรือมืด ถึง 100% ซึ่งหมายถึงสว่างมากหรือขาว โดยสามารถแสดงค่าของแสงได้ดังภาพ

light010

การเปรียบเทียบระหว่างค่าเซนเซอร์แสงและเซนเซอร์สี

วิธีการนำค่าแสงที่วัดได้ไปใช้ในการเขียนโปรแกรมให้หุ่นยนต์ตรวจสอบเส้นสีดำ มีดังนี้
ขั้นที่ 1 นำเซนเซอร์แสงที่ติดตั้งกับหุ่นยนต์ไปวัดค่าแสงพื้นผิวที่เป็นสีขาว
ขั้นที่ 2 นำเซนเซอร์แสงตัวเดียวกันไปวัดค่าแสงพื้นผิวที่เป็นสีดำ
ขั้นที่ 3 นำค่าแสงที่เซนเซอร์วัดได้พื้นผิวที่เป็นสีขาวและสีดำมารวมกันแล้วหารด้วยสอง จะได้ค่าที่จะนำไปใช้เป็นเกณฑ์ในการใช้เปรียบเทียบสำหรับเขียนโปรแกรมต่อไป

light011

วิํํธีการหาค่าแสงเืพื่อนำไปใช้เปรียบเทียบ

ตัวอย่างการให้หุ่นยนต์ตรวจสอบเส้นดำ

checkBlack001

ขั้นตอนการทำงาน

2556-04-10 17_21_48-การใช้เซนเซอร์แสงตรวจสอบเส้น
สามารถเขียนโปรแกรมได้ดังนี้

Bricx Command Center_2013-04-11_09-58-23

สำหรับโปรแกรม Bricx Command Center

lightsensor001

สำหรับโปรแกรม Robolab

ชื่อและการทำงานของไอคอน

begin Begin เริ่มต้นในการเขียนโปรแกรม
end End เมื่อต้องการจบโปรแกรม
motorB Motor  B มอเตอร์ B เคลื่อนที่ไปข้างหน้า
motorC Motor C มอเตอร์ C เคลื่อนที่ไปข้างหน้า
2556-04-09 21_34_51-ROBOLAB Untitled 2 Wait for Dark รอจนกระทั่งเซนเซอร์ที่พอร์ต 1 อ่านค่าแสงได้มืดกว่าค่าที่ตั้งไว้ ในที่นี้คือ 45
2556-04-09 21_33_36-Data Logging and Motors Stop All Output หยุดการทำงานของทุกอุปกรณ์ Output เช่น มอเตอร์ หลอดไฟ

เมื่อหุ่นยนต์สามารถตรวจสอบเส้นดำได้แล้วหนึ่งเส้น ต่อไปก็สามารถประยุกต์ให้หุ่นยนต์สามารถตรวจสอบและนับจำนวนเส้นที่ตรวจพบที่มากกว่าหนึ่งเส้น

checkBlack002

ผังงานขั้นตอนการตรวจสอบเส้นดำมากกว่าหนึ่งเส้นและสามารถนับจำนวนเส้นได้มีขั้นตอนดังนี้

checkBlack013

ตัวอย่างโปรแกรม
checkBlack003

ชื่อและการทำงานของไอคอน

 checkBlack005 Zero Light Sensor ตั้งค่าของเซนเซอร์แสงให้เป็นศูนย์
 checkBlack007 Empty Container ตั้งค่าของกล่องบรรจุให้เป็นศูนย์
 checkBlack011 Loop Forever เริ่มต้นการวนซ้ำตลอดไป
 checkBlack010 End of Forever Loop สิ้นสุดการวนซ้ำตลอดไป
 checkBlack006 Light Sensor Fork ทางแยกของเซนเซอร์
 checkBlack009 Fork Merge ตัวประสานเซนเซอร์
 checkBlack004 Add to Container เพิ่มค่าใส่ในกล่องบรรจุ
 checkBlack008 Formatted Text แสดงค่าของตัวแปรที่หน้าจอ LCD

การตรวจสอบเส้นดำที่มีมากกว่าหนึ่งเส้นจากโปรแกรมที่นำเสนอไปข้างต้น อาจจะมีข้อผิดพลาดได้ หากขนาดของเส้นดำกว้างหรือหุ่นยนต์เคลื่อนที่ช้า ดังนั้นจะต้องตรวจสอบอีกครั้ง หากต้องปรับเปลี่ยนก็จะเพิ่มเติมการเดินหน้าเมื่อหุ่นยนต์พบเส้นดำดังรูป

checkBlack012

จะเห็นได้ว่าการใช้เซนเซอร์แสงให้หุ่นยนต์เคลื่อนที่นั้นมีความสำคัญ เพราะหากมีการจัดการตัวแปรได้ดีแล้วหุ่นยนต์ก็จะเคลื่อนที่ได้ดีเช่นกัน และนอกจากนั้นการใช้เซนเซอร์แสงในการตรวจสอบเส้นดำยังเป็นพื้นฐานในการควบคุมหุ่นยนต์ให้เคลื่อนที่ไปตามเส้นดำได้อย่างมีประสิทธิภาพอีกด้วย

ข้อเสนอแนะจากประสบการณ์
การใช้เซนเซอร์แสงตรวจสอบเส้นดำ สิ่งที่ต้องคำนึงมากที่สุด คือ การวัดค่าแสง เพราะถ้าค่าแสงที่วัดมาได้คลาดเคลื่อน จะทำให้หุ่นยนต์ไม่สามารถตรวจสอบพบเส้นดำ ดังนั้นเมื่อต้องการนำหุ่นยนต์ไปปฏิบัติภารกิจในพื้นที่ใด จะต้องไปวัดค่าแสงที่พื้นที่นั้นและขณะกำลังวัดแสงต้องสังเกตว่ามีเงาของตนเองบังแสงหรือไม่
ความผิดพลาดอีกประการที่จะพบเสมอๆ คือ สถานการณ์ที่ให้หุ่นยนต์นับเส้นดำ ซึ่งเขียนโปรแกรมได้ดังภาพ

checkBlack015

หรือ

checkBlack018

แต่หน้าสถานการณ์เป็นดังภาพ คือ เส้นหมายเลข 1 มีความหนามากกว่าเส้นอื่นๆ (เส้นที่ 2, 3)

checkBlack014

โปรแกรมจะต้องปรับเปลี่ยนไป คือ ค่า Wait(……..); ในบรรทัดที่ 17 ไม่เช่นนั้นหุ่นยนต์จะนับเส้นจำนวนผิด โดยนับมากกว่า 1 เส้น จนกว่าจะหลุดพ้นจากเส้นที่ 1 ดังรูปตัวอย่าง

checkBlack016

 

หรือที่หมายเลข 1

checkBlack017

 

 

เอกสารอ้างอิง
ทีมงานสมาร์ทเลิร์นนิ่ง. (2549). เรียนรู้การสร้างหุ่นยนต์ Step by Step. กรุงเทพฯ: บริษัท ด่านสุทธาการพิมพ์ จำกัด.
Martha N. Cyr. (2002). LEGO MindStorms for School Using ROBOLAB. Massachusetts: [n.p.].
The LEGO Group. (2006). NXT User Guide. [n.p.]: [n.p.].

การใช้งาน LEGO Mindstorms NXT Controller

คอนโทรลเลอร์ ( Controller ) เปรียบเสมือนสมองที่ทำหน้าที่ตัดสินใจ โดยนำข้อมูลหรือสัญญาณที่ได้จากเซนเซอร์ ซึ่งเสมือน หู ตาของหุ่นยนต์มาประมวลผลแล้งส่งสัญญาณไปยังมอเตอร์ ในหุ่นยนต์แต่ละประเภทก็จะมีคอนโทรลเลอร์ที่ใช้ในการควบคุมต่างๆ กันไปตามรุ่นที่ผู้ผลิตได้นำมาใช้ในหุ่นยนต์

image001

ภาพแสดงคอนโทรลเลอร์ Lego Mindstorms NXT


รายละเอียดเกี่ยวกับ NXT Brick

NXT Brick เป็นสมองของ LEGO Mindstorms NXT ที่คอยควบคุมการทำงานของหุ่นยนต์

image003

ภาพแสดงการเชื่อมต่อ NXT Brick กับเซนเซอร์

image005

ภาพแสดงการเชื่อมต่อ NXT Brick กับมอเตอร์และหลอดไฟ


คอนโทรลเลอร์ NXT Brick มีคุณสมบัติดังนี้

1. 32-bit ARM7 microprocessor
2. 256 Kbytes FLASH, 64 Kbytes RAM
3. 8-bit microprocessor
4. 4 Kbytes FLASH, 512 Kbyte RAM
5. Bluetooth wireless communication, Bluetooth class II V.2.0 compliant
6. USB 2.0 port
7. Four input ports, six-wire digital platform
8. Three output ports, six-wire digital platform
9. Dot matrix display, 60 x 100 pixels
10. Loudspeaker, 8 KHz sound quality
11. Power source : Rechargeable lithium battery or six AA Battery
12. Plug for power adapter

image007

ภาพแสดงรายละเอียดเครื่องมือและอุปกรณ์ใน NXT Brick

image009

ภาพแสดงรายละเอียดเครื่องมือและอุปกรณ์ใน NXT Brick


รายการเครื่องมือใน NXT Brick

image011

- Settings ใช้สำหรับตั้งค่าต่างๆ เกี่ยวกับหุ่นยนต์ เช่น การปรับความดังของลำโพง Loudspeaker, หรือตั้งเวลาปิด NXT เพื่อประหยัดแบตเตอรี่ และมีเมนูให้ลบโปรแกรมทั้งหมดที่เราเคยดาวน์โหลดใส่หุ่นยนต์ NXT
- Try Me โปรแกรมพื้นฐานต่างๆ ที่มีอยู่ในหุ่น NXT ไว้สำหรับให้เราทดลองเบื้องต้น
- My Files ใช้สำหรับเก็บโปรแกรมทั้งหมด
- NXT Program ใช้สำหรับเขียนโปรแกรมง่ายๆ บน NXT โดยไม่จำเป็นต้องใช้คอมพิวเตอร์
- View ใช้สำหรับตรวจสอบค่าและทดสอบเซ็นเซอร์ต่างๆ บน NXT
- Bluetooth ใช้สำหรับตั้งค่าของ Bluetooth และเชื่อมต่อกับอุปกรณ์อื่นๆ เช่นโทรศัพท์มือถือ คอมพิวเตอร์ หรือหุ่นยนต์ NXT ตัวอื่นๆ

การเชื่อมต่อกับอุปกรณ์อื่น
NXT Brick สามารถเชื่อมต่อกับอุปกรณ์อื่นได้ โดยจะมีช่องการเชื่อมต่อหรือพอร์ต (port) ทั้งหมด 7 พอร์ต แบ่งเป็นพอร์ตสำหรับการส่งข้อมูลออก (Output Port) 3 พอร์ต มีชื่อเรียกว่า พอร์ต A, พอร์ต B และ พอร์ต C สำหรับใช้กับมอเตอร์และหลอดไฟ

image013

และพอร์ตสำหรับการนำข้อมูลเข้า (Input Port) 4 พอร์ต มีชื่อเรียกว่า พอร์ต 1, พอร์ต 2 , พอร์ต 3 และ พอร์ต 4 สำหรับใช้กับเซนเซอร์

image015


แบตเตอรี่

แบตเตอรี่ที่ใช้กับ NXT Brick สามารถใช้ได้ 2 แบบ คือ แบตเตอรี่แบบชาร์ตได้ที่มาพร้อมกับหุ่นยนต์กับแบตเตอรี่ขนาด AA/LR6 ที่มีทั่วไป

image017

วิธีการใส่แบตเตอรี่แบบชาร์ตได้ที่มากับหุ่นยนต์มีขั้นตอนดังนี้

image019

ขั้นที่ 1 แกะฝาปิดพลาสติกออก
ขั้นที่ 2 นำเอาแบตเตอรี่แบบชาร์ตได้ที่มากับหุ่นยนต์ ใสเข้าไปแทนที่

image021

สำหรับแบตเตอรี่ขนาด AA/LR6 ที่มีทั่วไป ต้องใช้ 6 ก้อน โดยการใส่แบตเตอรี่จะต้องดูขั้วไฟฟ้าให้ถูกต้อง จากนั้นจึงปิดฝาครอบแบตเตอรี่

การใส่แบตเตอรี่ขนาด AA/LR6 ควรใส่แบตเตอรี่ที่เป็นชนิดเดียวกัน เมื่อไม่ได้ใช้งานควรจะนำแบตเตอรี่ออก
แบตเตอรี่เมื่อใช้ไปสักระยะจะมีข้อความเตือน ดังรูปแสดงว่าแบตเตอรี่จะหมด

image023


การแสดงผลทางจอภาพ

NXT Brick มีจอภาพแบบ Dot matrix ขนาด 60 x 100 pixels สามารถแสดงผลได้ 8 บรรทัด แต่ละบรรทัดแสดงผลได้ 16 ตัวอักษร

DCP_5124
ฟังก์ชั่นที่ใช้ในการแสดงผลทางจอภาพ คือ

TextOut (int x,int y,string str,unsigned long=options DRAW_OPT_NORMAL )

พารามิเตอร์
x ตำแหน่งที่จะแสดงผลบนแกน X
y ตำแหน่งที่จะแสดงผลบนแกน Y
str ข้อความที่จะให้แสดงผล
options ตัวเลือกในการการวาดภาพ

นำมาเขียนโปรแกรมได้ดังนี้

image025

หรือ

image027

NumOut (int x,int y,variant value,unsigned long=options DRAW_OPT_NORMAL )

พารามิเตอร์
x ตำแหน่งที่จะแสดงผลบนแกน X
y ตำแหน่งที่จะแสดงผลบนแกน Y
value ตัวเลขที่จะให้แสดงผล
options ตัวเลือกในการการวาดภาพ

นำมาเขียนโปรแกรมได้ดังนี้

image029

หรือ

image031

ข้อเสนอแนะจากประสบการณ์
ข้าพเจ้ามีแนวคิดในการจัดการเรียนการสอนด้านคอมพิวเตอร์ในสถานศึกษา เราสามารถแบ่งออกเป็น 3 กลุ่มด้วยกัน คือ
กลุ่มที่ 1 คอมพิวเตอร์เพื่อชีวิตประจำวัน โดยเน้นให้ผู้เรียนมีความรู้และทักษะการใช้คอมพิวเตอร์และสามารถนำความรู้ด้านคอมพิวเตอร์ไปใช้ประโยชน์ในชีวิตประจำวันและเป็นพื้นฐานในการศึกษาขั้นสูงต่อไป เช่น ความรู้เบื้องต้นเกี่ยวกับคอมพิวเตอร์ การทำงานของคอมพิวเตอร์ การเปิด/ปิดเครื่องคอมพิวเตอร์ การดูแลรักษาเครื่องคอมพิวเตอร์ ส่วนทางด้านซอฟต์แวร์ เน้นให้ผู้เรียนสามารถใช้โปรแกรมในการชีวิตประจำวันได้ เช่น โปรแกรมฝึกพิมพ์ตัวอักษร โปรแกรมวาดภาพ โปรแกรมพิมพ์เอกสาร โปรแกรมนำเสนอและโปรแกรมตารางการทำงาน เป็นต้น
กลุ่มที่ 2 คอมพิวเตอร์เพื่อสนับสนุนการประกอบอาชีพ เน้นให้ผู้เรียนมีความรู้และทักษะเกี่ยวกับโปรแกรมสำเร็จรูปที่สามารถนำไปใช้ในการประกอบอาชีพได้ เช่น การซ่อมบำรุงเครื่องคอมพิวเตอร์ โปรแกรมสำเร็จรูปต่าง ๆ ได้แก่ โปรแกรมสร้างเว็บเพจ โปรแกรมตกแต่งรูปภาพ โปรแกรมตัดต่อวิดีทัศน์และโปรแกรมออกแบบผลิตภัณฑ์ เป็นต้น
กลุ่มที่ 3 คอมพิวเตอร์เพื่อการเป็นโปรแกรมเมอร์ เน้นให้ผู้เรียนมีความรู้ มีการคิดวิเคราะห์ การสร้างสรรค์ชิ้นงานและทักษะเกี่ยวกับการเขียนโปรแกรมเบื้องต้นจนถึงระดับสูง ซึ่งมีโปรแกรมให้นักเรียนได้ศึกษาและเรียนรู้ที่หลากหลาย เช่น ระดับประถมศึกษามีโปรแกรม MicroWorlds, โปรแกรม Scratch สำหรับสร้างภาพเคลื่อนไหวหรือหุ่นยนต์ เป็นต้น นักเรียนสามารถเรียนรู้พื้นฐานและความคิดรวบยอดในการเขียนโปรแกรม ซึ่งโรงเรียนระดับมัธยมศึกษาก็เช่นเดียวกัน
เพื่อเป็นแรงจูงใจให้นักเรียนอยากเรียนอยากรู้เกี่ยวกับการเขียนโปรแกรมมากขึ้น ข้าพเจ้าจึงได้นำหุ่นยนต์มาใช้ในการจัดการเรียนการสอน ทำให้นักเรียนมีความสนใจ มีความสนุกสนานและได้เรียนรู้ทักษะการทำงานร่วมกับผู้อื่น เกิดการบูรณาการของการเรียนการสอนวิชาวิทยาศาสตร์และคณิตศาสตร์ เพื่อนำไปสู่การคิดแก้ปัญหาและการสร้างสรรค์นวัตกรรมใหม่ในชีวิตประจำวันและการทำงาน ตามการจัดการเรียนการสอนแบบ STEM (The Science Technology Engineering and Mathematics Education)
ปัญหาที่ข้าพเจ้าได้พบหลังจากที่จัดการเรียนการสอนหุ่นยนต์ คือ ข้อมูลและเอกสารความรู้ต่างๆ ในด้านหุ่นยนต์สำหรับนักเรียนที่เป็นภาษาไทยค่อนข้างมีน้อย ซึ่งข้าพเจ้าได้แก้ปัญหาดังกล่าวด้วยการค้นคว้าข้อมูลต่างๆ จากเครือข่ายอินเทอร์เน็ตซึ่งเป็นภาษาอังกฤษ ถามผู้รู้ที่ได้ศึกษาทางด้านหุ่นยนต์มาก่อนและประสบการณ์ที่ได้ลงมือปฏิบัติเองจากการสอนนักเรียนและพานักเรียนเข้ากิจกรรมการแข่งขันหุ่นยนต์ตามหน่วยงานต่างได้จัดขึ้น
นอกจากนั้นสิ่งได้ค้นพบกับตัวนักเรียน คือ นักเรียนมีความคิดรวบยอดในการเขียนโปรแกรมสามารถสร้างสรรค์การเขียนโปรแกรม เกิดการเรียนรู้ การแก้ปัญหาเฉพาะหน้าได้ดี สามารถแบ่งหน้าที่กันทำงาน รู้แพ้ รู้ชนะ รู้อภัยและที่สำคัญที่สุด คือ การได้ค้นพบตัวเอง แล้วเข้าสู่มหาวิทยาลัยตามที่ตนเองได้ฝันไว้

เอกสารอ้างอิง
Daniele Benedettelli. (2007). Programming LEGO NXT Robots using NXC. [n.p.]: [n.p.].
John C. Hansen. (2009). LEGO NXT power programming : robotics in C. 2nd ed. United States: Variant Press.
The LEGO Group. (2006). NXT User Guide. [n.p.]: [n.p.].