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

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

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.].

การใช้งานโปรแกรม Brixc Command Center

โปรแกรมที่ใช้สำหรับควบคุมหุ่นยนต์มีหลากหลายในภาษาที่ใช้ในการเขียนควบคุม ซึ่งผู้ใช้สามารถเลือกใช้ตามความถนัดในแต่ละโปรแกรมภาษา สำหรับในชั้นเรียนนี้จะใช้ภาษา NXC ซึ่งมีรูปแบบการใช้งานคล้ายกับภาษาซี โดยใช้โปรแกรม Editor ชื่อว่า Bricx Command Center

เริ่มต้นใช้งาน Bricx Command Center

bcc001

1. Tools Bar
2. Code Explorer
3. พื้นที่เขียนโปรแกรม

การเขียนโปรแกรม
1. เสียบสาย USB เพื่อเชื่อมต่อ NXT Brick กับเครื่องคอมพิวเตอร์ และเปิด NXT Brick

bcc002

2. เปิดโปรแกรม Bricx Command Center จะมีหน้าต่างค้นหา NXT Brick

bcc003

ให้เลือกพอร์ตเป็น USB และ Brick Type เป็น NXT จากนั้นกดปุ่ม OK

3. ลงมือเขียนโปรแกรม

bcc004

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

bcc005

5. โปรแกรมที่ Compile เสร็จสมบูรณ์แล้วจะดาวน์โหลดลงใน NXT Brick จะต้องมีสัญลักษณ์พร้อมดาวน์โหลดขึ้นมาแสดง bcc007 ถ้าไม่มีสัญลักษณ์ ดาวน์โหลดโปรแกรม จะต้องไปที่เมนู Tools > Find Brick

bcc008

แล้วจะมีหน้าต่างค้นหา NXT Brick

bcc003

ให้เลือกพอร์ตเป็น USB และ Brick Type เป็น NXT จากนั้นกดปุ่ม OK

6. เมื่อมีสัญลักษณ์ bcc007 ก็พร้อมที่จะดาวน์โหลดโปรแกรมลงเข้าไปในหุ่นยนต์ โดยกดที่สัญลักษณ์ bcc007 หรือกดที่แป้น F6

เอกสารอ้างอิง
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.

กลัวหาย NXC (1)

/*
A simple line following program.
You will need 2 light sensors attached to inputs 1 and 3.
Place the bot on the test pad, with the wheels
on the start line facing forward.
Then start the program.

author: Jan-Klaas Kollhof
last changed by: $LastChangedBy$
last changed date: $Date$
revision: $Revision$
*/

#define LightThreshold 50
#define Fast 75
#define Slow 20

task main(){
SetSensorLight(IN_3);
SetSensorLight(IN_1);

//lets turn 90 deg left
RotateMotorEx(OUT_BC, Fast, 180,-100, true, false);

//now follow the line
OnFwd(OUT_BC, Fast);

while(1){
if(SENSOR_3 < LightThreshold){
//sensor 3 just detected a black line
//so lets go a bit slower on it's side
OnFwd(OUT_B, Fast);
OnFwd(OUT_C, Slow);
}else if (SENSOR_1 < LightThreshold){
//sensor 1 just detected a black line
//so lets go a bit slower on it's side
OnFwd(OUT_B, Slow);
OnFwd(OUT_C, Fast);
}else{
//either it is all black or all light
//lets just go forward
OnFwd(OUT_BC, Fast);
}
}
}

———————————————
/*
A simple line following program.
It works with the standard NXT bot.
Place the bot on the test pad, with the wheels
on the start line facing forward.
Then start the program.

author: Jan-Klaas Kollhof
last changed by: $LastChangedBy$
last changed date: $Date$
revision: $Revision$
*/

#define LightThreshold 50
#define Fast 75
#define Slow 30

task main(){
SetSensorLight(IN_3);

//lets turn 90 deg left
RotateMotorEx(OUT_BC, Fast, 180,-100, true, false);

//now follow the line
OnFwd(OUT_BC, Fast);
while(1){
if(Sensor(IN_3) > LightThreshold){
//we just went off of the black line
//so lets slow down on the right
OnFwd(OUT_B, Slow);
}else{
OnFwd(OUT_B, Fast);
}
}
}

———————————————
/*
A simple programm for avoiding
obstacles using the sonic sensor.
It works with the standard NXT bot.

author: Jan-Klaas Kollhof
last changed by: $LastChangedBy$
last changed date: $Date$
revision: $Revision$
*/

#define VeryClose 20
#define Close 40
#define Slow 30
#define Fast 70

task main(){
SetSensorLowspeed(IN_4);

while(1){
TextOut(0, LCD_LINE1, “sonic”, true);
NumOut(70, LCD_LINE1, SensorUS(IN_4));

int dist = SensorUS(IN_4);

if(dist < VeryClose){
//lets spin 45 deg in a random direction
if(Random(2) == 0){
RotateMotorEx(OUT_BC, Fast, 180, -100, true, false);
}else{
RotateMotorEx(OUT_BC, Fast, 180, 100, true, false);
}

}else{
OnFwd(OUT_BC, Fast);
}
Wait(100);
}
}

อ้างถึง

http://jan.kollhof.net