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

LineFollowing (กลัวหาย)

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 นำเซนเซอร์แสงที่ติดตั้งกับหุ่นยนต์…

ตราประจำโรงเรียนสิรินธร จังหวัดสุรินทร์ แบบโรงเรียนมาตรฐานสากล

ทำเสร็จนานแล้วครับ นำไปใช้ได้เลย @อนุญาต