Posted in

โปรเจค Arduino หุ่นยนต์ 2 ล้อทรงตัวเอง (Self Balancing Robot)

โปรเจค Arduino หุ่นยนต์ 2 ล้อทรงตัวเอง (Self Balancing Robot)

โปรเจคนี้เป็นหุ่นยนต์ 2 ล้อที่สามารถ “ทรงตัวได้เอง” โดยใช้หลักการควบคุมสมดุลแบบอัตโนมัติ
ถือเป็นโปรเจคที่ดูน่าสนใจและมีความท้าทาย แต่ใช้จำนวนอุปกรณ์ไม่มาก เหมาะสำหรับนักเรียน นักศึกษา
หรือผู้ที่ต้องการฝึกด้านระบบควบคุม (Control System)


อุปกรณ์ที่ใช้ (Devices & Components)


หลักการทำงานของระบบ

Self Balancing Robot คือหุ่นยนต์ที่สามารถรักษาสมดุลไม่ให้ล้ม โดยใช้การควบคุมการหมุนของล้อ
ให้สัมพันธ์กับการเอียงของตัวหุ่นยนต์

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


อธิบายอุปกรณ์สำคัญ

  • MPU6050
    เป็นเซ็นเซอร์ Accelerometer + Gyroscope ใช้วัดการเอียงในแกน X, Y, Z
  • Arduino Uno
    ทำหน้าที่เป็นสมองของระบบ ประมวลผลข้อมูลจากเซ็นเซอร์
  • Motor Driver
    ใช้ควบคุมความเร็วและทิศทางของมอเตอร์
  • DC Motor + ล้อ
    ใช้เคลื่อนที่และปรับสมดุลของหุ่นยนต์
  • แบตเตอรี่
    จ่ายพลังงานให้กับระบบทั้งหมด

หลักการควบคุม (PID Control)

ระบบนี้ใช้การควบคุมแบบ PID (Proportional, Integral, Derivative)
เพื่อคำนวณการปรับความเร็วของล้อให้เหมาะสม

  • หากหุ่นยนต์เอียงไปด้านหน้า → ล้อหมุนไปข้างหน้า
  • หากเอียงไปด้านหลัง → ล้อหมุนย้อนกลับ
  • ระบบจะปรับสมดุลตลอดเวลา

การตั้งค่าและปรับจูนระบบ

1. ตั้งค่า Gyro Offset

ใช้แก้ค่าความคลาดเคลื่อนของเซ็นเซอร์ MPU6050 ซึ่งแต่ละตัวจะไม่เหมือนกัน

2. ตั้งค่า Setpoint

ตั้งค่ามุมตั้งตรงของหุ่นยนต์ โดยวัดจาก Serial Monitor
ค่าที่ได้จะนำมาใส่ในตัวแปร setpoint

3. ปรับค่า PID

  • Kp : ควบคุมความแรงของการตอบสนอง
  • Kd : ลดการแกว่ง (oscillation)
  • Ki : ช่วยให้ทรงตัวนิ่งเร็วขึ้น

แนวทางการปรับ:

  • Kp ต่ำเกินไป → หุ่นล้ม
  • Kp สูงเกินไป → สั่นแรง
  • Kd ช่วยลดการสั่น
  • Ki ช่วยให้หยุดนิ่งเร็ว

โค้ดโปรแกรม Arduino


#include "I2Cdev.h"
#include <PID_v1.h>
#include "MPU6050_6Axis_MotionApps20.h"

MPU6050 mpu;

double setpoint=182;
double Kp = 15;
double Kd = 0.9;
double Ki = 140;

double input, output;
PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);

void setup() {
  Serial.begin(115200);
  mpu.initialize();

  pid.SetMode(AUTOMATIC);
  pid.SetSampleTime(10);
  pid.SetOutputLimits(-255, 255);

  pinMode (6, OUTPUT);
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);
}

void loop() {
    pid.Compute();

    if (input>150 && input<200){ if (output>0) Forward();
        else if (output<0) Reverse();
    } else {
        Stop();
    }
}

void Forward(){
    analogWrite(6,output);
    analogWrite(10,output);
}

void Reverse(){
    analogWrite(9,output*-1);
    analogWrite(11,output*-1);
}

void Stop(){
    analogWrite(6,0);
    analogWrite(9,0);
    analogWrite(10,0);
    analogWrite(11,0);
}

สรุป

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

แม้การปรับค่าอาจใช้เวลา แต่เป็นโปรเจคที่สนุกและช่วยพัฒนาทักษะด้าน
Embedded System และ Control System ได้อย่างดี

โปรเจคนี้ไม่ใช่แค่ทำให้ “ยืนได้” แต่คือการเข้าใจการควบคุมระบบจริง