ข้ามไปที่เนื้อหาหลัก

### Basic

Note that this is a very (very) crude algorithm, with three parameter that affect the behaviour:
• The initial speed of the m3pi
• How far off the centre the m3pi is before corrective action is taken
• How aggressive the corrective action is
#include "mbed.h"
#include "m3pi.h"

m3pi m3pi;

int main() {

// Parameters that affect the performance
float speed = 0.2;
float correction = 0.1;
float threshold = 0.5;

m3pi.locate(0,1);
m3pi.printf("Line Flw");

wait(2.0);

m3pi.sensor_auto_calibrate();

while (1) {

// -1.0 is far left, 1.0 is far right, 0.0 in the middle
float position_of_line = m3pi.line_position();

// Line is more than the threshold to the right, slow the left motor
if (position_of_line > threshold) {
m3pi.right_motor(speed);
m3pi.left_motor(speed-correction);
}

// Line is more than 50% to the left, slow the right motor
else if (position_of_line < -threshold) {
m3pi.left_motor(speed);
m3pi.right_motor(speed-correction);
}

// Line is in the middle
else {
m3pi.forward(speed);
}
}
}

### PID

#include "mbed.h"
#include "m3pi.h"

m3pi m3pi;

// Minimum and maximum motor speeds
#define MAX 1.0
#define MIN 0

// PID terms
#define P_TERM 1
#define I_TERM 0
#define D_TERM 20

int main() {

m3pi.locate(0,1);
m3pi.printf("Line PID");

wait(2.0);

m3pi.sensor_auto_calibrate();

float right;
float left;
float current_pos_of_line = 0.0;
float previous_pos_of_line = 0.0;
float derivative,proportional,integral = 0;
float power;
float speed = MAX;

while (1) {

// Get the position of the line.
current_pos_of_line = m3pi.line_position();
proportional = current_pos_of_line;

// Compute the derivative
derivative = current_pos_of_line - previous_pos_of_line;

// Compute the integral
integral += proportional;

// Remember the last position.
previous_pos_of_line = current_pos_of_line;

// Compute the power
power = (proportional * (P_TERM) ) + (integral*(I_TERM)) + (derivative*(D_TERM)) ;

// Compute new speeds
right = speed+power;
left  = speed-power;

// limit checks
if (right < MIN)
right = MIN;
else if (right > MAX)
right = MAX;

if (left < MIN)
left = MIN;
else if (left > MAX)
left = MAX;

// set speed
m3pi.left_motor(left);
m3pi.right_motor(right);

}
}

Ref.
http://mbed.org/cookbook/m3pi-LineFollowing

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

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

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

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

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

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

เมื่อนำโปรแกรมไปใช้จริงจะต้อ…

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

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

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

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

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

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

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

วิธีการนำค่าแสงที่วัดได้ไปใช้ในการเขียนโปรแกรมให้หุ่นยนต์ตรวจสอบเส้นสีดำ มีดังนี้
ขั้นที่ 1 นำเซนเซอร์แสงที่ติดตั้งกับหุ่นยนต์…