Bipolar Stepper Motor Library
ก่อนหน้านี้ ผมได้แนะนำไลบรารีสำหรับการควบคุม Unipolar Stepper Motors ซึ่งช่วยให้สามารถควบคุมความเร็ว ทิศทาง จำนวนรอบการหมุน และมุมการหมุนได้อย่างแม่นยำ อย่างไรก็ตาม ข้อจำกัดของไลบรารีนั้นคือมันถูกออกแบบมาสำหรับ Unipolar Stepper Motors โดยเฉพาะ ในทางวิศวกรรมและการใช้งานจริง Bipolar Stepper Motors ก็ได้รับความนิยมไม่แพ้กัน เนื่องจากให้ Torque ที่สูงกว่าในขนาดที่เท่ากัน เพื่อแก้ไขปัญหานี้ ผมจึงได้พัฒนาไลบรารีใหม่ขึ้นมาเพื่อรองรับ Bipolar Stepper Motors โดยเฉพาะ
ดังนั้น ผมจึงขอแนะนำไลบรารี bi_polar_Stepper สำหรับ Arduino ที่ออกแบบมาเพื่อรองรับ Bipolar Stepper Motors ทุกรุ่น ไลบรารีนี้ประกอบด้วย 9 ฟังก์ชันหลักที่ช่วยให้การควบคุมมอเตอร์เป็นเรื่องง่ายและยืดหยุ่น ตรงตามความต้องการของระบบ Industrial Motion Control คุณสมบัติเด่นของไลบรารีนี้ได้แก่:
- รองรับ Bipolar Stepper Motor ทุกรุ่น
- ควบคุมทิศทางการหมุนได้อย่างอิสระ (Clockwise / Counter-Clockwise)
- ควบคุมจำนวนรอบการหมุนได้อย่างแม่นยำ เช่น 1, 2, 3 รอบ หรือมากกว่านั้น
- ควบคุมความเร็วในการหมุนด้วยหน่วย RPM (Revolutions Per Minute) ได้อย่างแม่นยำถึง 95%
- ควบคุมการหมุนไปยังมุมที่ต้องการ (0 – 360 degrees) ด้วยความแม่นยำ 80-100% ขึ้นอยู่กับ Resolution ของมอเตอร์
- รองรับ Arduino board ทุกรุ่น ไม่ว่าจะเป็น Uno, Nano, และ Mega

ในบทความนี้ ผมจะอธิบายรายละเอียดของฟังก์ชันต่างๆ ในไลบรารี พร้อมกับตัวอย่างการประยุกต์ใช้งานจริง วิดีโอสาธิต และคำแนะนำในการเชื่อมต่อวงจร โดยใช้อุปกรณ์ยอดนิยมอย่าง L293D IC ซึ่งเป็น Dual H-bridge Driver ที่สามารถขับกระแสไฟฟ้าให้กับ Coil ของ Bipolar Stepper Motor ได้อย่างมีประสิทธิภาพ
สำหรับการติดตั้ง ให้ดาวน์โหลดโฟลเดอร์ bi_polar_Stepper แล้วนำไปวางไว้ในไดเรกทอรีไลบรารีของ Arduino (เช่น C:\arduino-1.x.x\libraries) เพื่อให้สามารถนำไปใช้งานใน Sketch ของคุณได้ทันที
รายละเอียดฟังก์ชันในไลบรารี (API Description)
เพื่อให้เข้าใจการทำงานเชิงลึก นี่คือคำอธิบายของแต่ละฟังก์ชันที่ออกแบบมาเพื่อการควบคุมที่แม่นยำ:
bi_polar_Stepper(int pin1, int pin2, int pin3, int pin4): นี่คือ Constructor สำหรับสร้าง Motor Instance คุณต้องระบุ 4 Arduino Digital Pins ที่เชื่อมต่อกับ Motor Driver เพื่อส่ง Pulse Signals ไปยังแต่ละ Coil Phaseset_step_per_rev(int steps): ฟังก์ชันนี้สำคัญสำหรับการกำหนดจำนวน Steps ต่อรอบของมอเตอร์ (เช่น มอเตอร์ที่มี Step Angle 1.8 degrees จะมี 200 Steps/Rev) ข้อมูลนี้จะถูกนำไปใช้ในการคำนวณที่เกี่ยวข้องกับเวลาเพื่อกำหนดความเร็วและมุมที่แม่นยำset_RPM(int rpm): ใช้สำหรับตั้งค่าความเร็วในการหมุน ไลบรารีจะคำนวณ Delay ระหว่าง Steps โดยอัตโนมัติ เพื่อให้ได้ RPM ที่ต้องการอย่างแม่นยำที่สุดrotate_CW(): สั่งให้มอเตอร์หมุนต่อเนื่องแบบ Clockwise หากต้องการให้หมุนต่อเนื่อง ควรเรียกใช้ฟังก์ชันนี้ภายในloop()rotate_CCW(): สั่งให้มอเตอร์หมุนต่อเนื่องแบบ Counter Clockwiserotate(int dir): ฟังก์ชันควบคุมทิศทางโดยใช้ Parameter หากค่าเป็น 1 มอเตอร์จะหมุน Clockwise หากเป็นค่าอื่นจะหมุน Counter-Clockwiserotate_one_rev(int dir): สั่งให้มอเตอร์หมุนครบหนึ่งรอบตามทิศทางที่กำหนด (1 สำหรับ CW, 0 สำหรับ CCW)rotate_n_rev(int dir, int num): สั่งให้มอเตอร์หมุนตามจำนวนรอบ (num) ที่ระบุในทิศทางที่ต้องการrotate_x_deg(int deg): ฟังก์ชันขั้นสูงที่คำนวณการหมุนตามมุม (0-360 degrees) ไลบรารีจะแปลงค่ามุมให้เป็นจำนวน Steps ที่ต้องใช้เพื่อให้ถึงตำแหน่งที่ถูกต้อง
ตัวอย่างโค้ด
1) การหมุนต่อเนื่องในทิศทางเดียวที่ 60 RPM
ตัวอย่างนี้แสดงการใช้งานพื้นฐาน โดยตั้งค่าให้มอเตอร์หมุน Clockwise อย่างต่อเนื่องด้วยความเร็วคงที่
/* Continuous Bipolar Stepper Motor rotation program
* Step Angle 1.8 degrees (200 steps/rev) at 60 RPM
*/
#include <bi_polar_Stepper.h>
#define steps 200 // Adjust according to your motor's specifications
bi_polar_Stepper my_step_motor(8, 9, 10, 11);
int rpm = 60;
void setup() {
Serial.begin(9600);
Serial.println("Bipolar stepper motor library test program");
my_step_motor.set_step_per_rev(steps); // Set motor resolution
my_step_motor.set_RPM(rpm); // Set speed
Serial.println("Motor rotates clockwise");
}
void loop() {
my_step_motor.rotate_CW(); // Rotate clockwise continuously
}
2) สลับทิศทางการหมุน ทีละรอบ
ตัวอย่างนี้ใช้ฟังก์ชัน rotate_one_rev เพื่อควบคุมมอเตอร์ให้หมุนครบหนึ่งรอบ จากนั้นหยุดพักและเปลี่ยนทิศทาง
/* Program to rotate motor 1 revolution clockwise and 1 revolution counter-clockwise
* at 30 RPM, alternating continuously
*/
#include <bi_polar_Stepper.h>
#define steps 200
bi_polar_Stepper my_step_motor(8, 9, 10, 11);
int rpm = 30;
void setup() {
Serial.begin(9600);
my_step_motor.set_step_per_rev(steps);
my_step_motor.set_RPM(rpm);
}
void loop() {
Serial.println("Motor rotates clockwise");
my_step_motor.rotate_one_rev(1); // Rotate 1 revolution (CW)
delay(1000);
Serial.println("Motor rotates anti-clockwise");
my_step_motor.rotate_one_rev(0); // Rotate 1 revolution (CCW)
delay(1000);
}
3) การควบคุมความเร็วที่แตกต่างกันในแต่ละทิศทาง
ในการใช้งานทางอุตสาหกรรม บางครั้งอาจต้องการความเร็วที่แตกต่างกันสำหรับการเคลื่อนที่ไปข้างหน้าและย้อนกลับ ตัวอย่างนี้แสดงวิธีเปลี่ยนค่า RPM แบบ Real-time
#include <bi_polar_Stepper.h>
#define steps 200
bi_polar_Stepper my_step_motor(2, 3, 4, 5);
int i;
void setup() {
Serial.begin(9600);
my_step_motor.set_step_per_rev(steps);
}
void loop() {
my_step_motor.set_RPM(100); // Set high speed at 100 RPM
for(i=0; i<100; i++) my_step_motor.rotate(1); // Rotate clockwise 100 steps
delay(2000);
my_step_motor.set_RPM(50); // Reduce speed to 50 RPM
for(i=0; i<100; i++) my_step_motor.rotate(0); // Rotate counter-clockwise 100 steps
delay(2000);
}
4) การกำหนดจำนวนรอบการหมุนที่เจาะจง (N Revolutions)
หากคุณต้องการให้มอเตอร์หมุนหลายรอบ เช่น ในเครื่อง Wire-winding machine ฟังก์ชัน rotate_n_rev จะช่วยให้โค้ดของคุณสั้นลงและอ่านง่ายขึ้น
#include <bi_polar_Stepper.h>
#define steps 200
bi_polar_Stepper my_step_motor(2, 3, 4, 5);
void setup() {
Serial.begin(9600);
my_step_motor.set_step_per_rev(steps);
}
void loop() {
my_step_motor.set_RPM(20);
my_step_motor.rotate_n_rev(1, 4); // Rotate 4 revolutions clockwise
delay(2000);
my_step_motor.set_RPM(10);
my_step_motor.rotate_n_rev(0, 2); // Rotate 2 revolutions counter-clockwise
delay(2000);
}
5) การควบคุมตำแหน่งด้วยองศา (Degree Control)
ตัวอย่างนี้แสดงการกำหนดตำแหน่งเชิงมุม (Angular Positioning) ซึ่งเหมาะสำหรับการใช้งานเช่น Robot Arms หรือฐานกล้องที่ต้องการมุมที่แม่นยำ
/* Rot