การควบคุมสเต็ปปิ้งมอเตอร์
สเต็ปปิ้งมอเตอร์
สเต็ปปิ้งมอเตอร์
(Stepping
Motor) หรือ สเต็ปมอเตอร์ (Step Motor) หรือ
สเต็ปเปอร์มอเตอร์ (Stepper Motor)
คือมอเตอร์ไฟตรงประเภทหนึ่งที่การหมุนแบ่งออกเป็นสเต็ปหรือขั้นย่อย ๆ ที่เท่ากัน
โดยเราสามารถควบคุมให้มอเตอร์นี้หมุนได้ตามจำนวนสเต็ปที่ต้องการและยังสามารถทำให้มอเตอร์คงตำแหน่งนั้นไว้ด้วยการจ่ายกระแสไฟฟ้า
ในการควบคุมตำแหน่งของมอเตอร์ประเภทนี้ มีข้อดีคือ
เราไม่จำเป็นต้องใช้เซนเซอร์ตรวจจับตำแหน่งสำหรับการป้อนกลับ
แต่มอเตอร์ประเภทนี้มีข้อเสียเมื่อเทียบกับมอเตอร์ไฟตรงคือ มีแรงบิดค่อนข้างต่ำ
และกินกระแสสูงแม้ในขณะที่มอเตอร์ไม่หมุน
สำหรับเอกสารนี้เราจะกล่าวถึงสเต็ปปิ้งมอเตอร์ทั่วไปชนิดสองหรือสี่เฟสเท่านั้น
สำหรับสเต็ปปิ้งมอเตอร์ชนิดหลายเฟสจะมีข้อดีคือมีระดับการสั่นต่ำ
ประสิทธิภาพดีกว่า แต่ใช้งานได้ยากและมีราคาแพง
หลักการทำงานของสเต็ปปิ้งมอเตอร์คือ
เราจะจ่ายไฟให้แก่ขดลวดที่ติดตั้งอยู่บนสเตเตอร์ (stator)
เพื่อให้ส่งสนามแม่เหล็กออกมา และส่วนที่เป็นตัวหมุนหรือโรเตอร์ (rotor) จะมีแกนเป็นแม่เหล็กถาวร การจ่ายกระแสเข้าไปที่ขดลวดทำให้เกิดแรงดึงดูดจากสนามแม่เหล็ก
ทำให้โรเตอร์หมุน โดยเมื่อเราทำการจ่ายกระแสให้กับขดลวดแต่ละขดอย่างต่อเนื่องจะทำให้มอเตอร์หมุนอย่างต่อเนื่อง
และหากเราต้องการให้มอเตอร์หมุนไปตามจำนวนสเต็ปที่กำหนดก็สามารถทำได้โดยการจ่ายพัลส์กระแสผ่านขดลวดตามจำนวนสเต็ปที่ต้องการ
รูปที่ 1 (ก) แสดงการทำงานของสเต็ปปิ้งมอเตอร์ โดยเมื่อจ่ายไฟให้แก่ขดลวดชุด A-A ก็จะทำให้แกนหมุนถูกล็อคอยู่ที่ตำแหน่งนั้น
ไม่เคลื่อนที่ไปไหนแม้มีแรงกระทำจากภายนอก ในรูปที่ 1 (ข) คือเมื่อมีการป้อนกระแสไปยังขดลวดชุด
B-B ด้วยก็จะทำให้แกนหมุนหมุนไปตามทิศทางของสนามแม่เหล็กที่เหนี่ยวนำ
โดยการหมุนในทิศตามเข็มนาฬิกาจะเกิดขึ้นเมื่อมีการป้อนกระแสให้เกิดสนามแม่เหล็กหมุนวนตามลำดับ
A-B-C-D และหากต้องการให้หมุนในทิศทวนเข็มนาฬิกา
ก็สามารถทำได้เช่นกัน โดยการกลับลำดับการป้อนกระแสให้แก่ขดลวดบนมอเตอร์
รูปที่
1
การทำงานของสเต็ปปิ้งมอเตอร์ (ก) ขณะล็อคให้หยุดนิ่ง
และ (ข) ขณะกำลังหมุนไปครึ่งสเต็ป
รูปที่ 2 แสดงตัวอย่างภาพถ่ายลักษณะภายนอกและภายในของสเต็ปปิ้งมอเตอร์เบอร์
28BYJ-48 ซึ่งเป็นสเต็ปปิ้งมอเตอร์ไฟตรงขนาดเล็ก (5 V) ที่มีใช้กันอย่างแพร่หลาย
โดยภายในตัวมอเตอร์จะมีเฟืองทดอยู่ด้วย (รูปที่ 2 (ข)) ทำให้สามารถส่งแรงบิดได้มากขึ้น โดยมอเตอร์ชนิดนี้เป็นแบบสี่เฟสแบบขั้วเดียว
(unipolar) ที่มีการเชื่อมต่อหรือแท็ป (tap) ตรงกลางของขดลวดแต่ละชุด ทำให้มอเตอร์นี้มีสี่เฟส และทำให้เราสามารถควบคุมมอเตอร์ได้อย่างง่ายดายยิ่งขึ้นและมีโอกาสที่จะต่อสายไฟผิดพลาดได้น้อยลง
รูปที่
2
ภาพถ่าย (ก) ลักษณะภายนอก (ข) ภายในส่วนของเฟืองทด และ (ค) ภายในส่วนของสเตเตอร์และโรเตอร์ของสเต็ปปิ้งมอเตอร์ 28BYJ-48
การควบคุมสเต็ปปิ้งมอเตอร์
ในการใช้งานสเต็ปปิ้งมอเตอร์
เบื้องต้นเราจะต้องทราบลักษณะการพันขดลวดของมอเตอร์ที่เลือกใช้ ซึ่งเราสามารถทราบได้จากแผ่นข้อมูลของมอเตอร์นั้น
ๆ โดยส่วนมากสีของสายไฟของสเต็ปปิ้งมอเตอร์จะสัมพันธ์กับการพันขดลวดตามที่ผู้ผลิตกำหนด
รูปที่ 3
แสดงตัวอย่าง แสดงลักษณะการวางสายและสีของขดลวดภายในสเต็ปปิ้งมอเตอร์
28BYJ-48 และสำหรับการหมุนของมอเตอร์นี้ เราจะกำหนดให้หมุนได้ทั้งในทิศตามเข็มนาฬิกา
(clockwise, CW) และทวนเข็มนาฬิกา (counter
clockwise, CCW) ขึ้นกับลำดับการส่งกระแสเข้าสู่ขดลวด
สำหรับการควบคุมสเต็ปปิ้งมอเตอร์นั้น
เราจะทำได้ผ่านการสั่งการด้วยไมโครคอนโทรลเลอร์
โดยเนื่องจากไมโครคอนโทรลเลอร์ไม่สามารถให้ขับกระแสขดลวดภายในมอเตอร์ได้โดยตรง
เราจึงจำเป็นต้องมีบอร์ดขับ (driver) ที่ทำหน้าที่จ่ายกระแส โดย
ไอซีเบอร์ที่นิยมนำมาใช้ควบคุมสเต็ปปิ้งมอเตอร์ขนาดเล็ก คือ ไอซีเบอร์ ULN2003A
รูปที่ 4 แสดงตัวอย่างภาพถ่ายบอร์ดขับที่ใช้ไอซีเบอร์นี้โดยมีตัวถังแบบ
DIP (dual inline package) (รูปที่ 4(ก))
และแบบ SMD (surface mount device) (รูปที่ 4(ข)) โดยบอร์ดขับนี้ จ่ายกระแสสูงสุดได้ 0.5 A
และสามารถรองรับแรงดันได้ในช่วง 5 - 12 V
และวงจรบอร์ดขับที่แสดงนี้ ออกแบบสำหรับสเต็ปปิ้งมอเตอร์ 4 เฟส
5 สาย
รูปที่
3 (ก) ภาพลักษณะการวางสาย
สี และ (ข) ภาพลักษณะการพันขดลวดของสเต็ปปิ้งมอเตอร์ 28BYJ-48 ชนิดสี่เฟสแบบขั้วเดียวที่มีแท็ปตรงกลางของขดลวดและเชื่อมต่อกัน
รูปที่
4 บอร์ดขับสเต็ปปิ้งมอเตอร์ที่ใช้ไอซีเบอร์
ULN2003A แบบ (ก) DIP และ (ข)
SMD
การเชื่อมต่อของสเต็ปปิ้งมอเตอร์ที่ใช้ไอซีเบอร์ ULN2003A และสเต็ปปิ้งมอเตอร์เบอร์ 28BYJ-48
ทำได้โดยง่ายและมีลักษณะวงจรดังรูปที่ 5 โดยเนื่องจากลักษณะของสัญญาณขาออกจากไอซีเป็นแบบกลับขั้ว
ดังนั้นจึงมีการจ่ายไฟ VCC ให้แก่ขดลวดของมอเตอร์นี้เพื่อที่จะทำให้
เมื่อวงจรได้รับสัญญาณขาเข้าที่เป็นลอจิก HIGH แล้ว
จะเกิดกระแสไหลผ่านขดลวดภายในมอเตอร์ (จาก VCC ไปยังกราวด์
ผ่านไอซี) และมอเตอร์จะทำงาน
รูปที่
5 ภาพลักษณะวงจรขับสเต็ปปิ้งมอเตอร์โดยไอซีเบอร์ ULN2003A และสเต็ปปิ้งมอเตอร์เบอร์ 28BYJ-48
สำหรับสัญญาณที่ใช้ในการควบคุมการหมุนของมอเตอร์ 4 เฟส (ให้ชื่อเป็น A,
B, C, และ D) นั้น จะมีลักษณะดังรูปที่ 6
นั่นคือ เราจะสั่งการให้จ่ายกระแสไปยังขดลวดทีละขดตามลำดับ
เพื่อให้มอเตอร์หมุนตามที่ต้องการ โดยสำหรับรูปที่ 6(ก)
คือการสั่งการให้มอเตอร์หมุนตามเข็มนาฬิกา โดยจะมีการกลับโลจิกจาก
HIGH เป็น LOW ที่ไอซี ULN2003A
เพื่อให้กระแสไหลในขดลวดที่ต่ออยู่ และรูปที่ 6(ข) คือการสั่งการให้มอเตอร์หมุนทวนเข็มนาฬิกา
ซึ่งเป็นเพียงการกลับลำดับการสั่งการ สำหรับการสั่งการให้มอเตอร์หมุนเร็วหรือช้านั้น
เราสามารถทำได้โดยการควบคุมความกว้างของพัลส์สัญญาณที่ป้อนให้แก่บอร์ดขับ (ค่า T
ในรูปที่ 6(ก)) โดยค่านี้จะต้องมีค่าไม่น้อยเกินไป
เพราะมอเตอร์ซึ่งเป็นอุปกรณ์ทางกลอาจตอบสนองไม่ทันกับสัญญาณไฟฟ้าที่ป้อนให้แก่ขดลวด
สำหรับความเร็วในการตอบสนองสูงสุดของสเต็ปปิ้งมอเตอร์ทั่วไปนั้นจะอยู่ในระดับ
1-10 มิลลิวินาที ต่อการป้อนกระแสแต่ละเฟส
ซึ่งทำให้เราจะต้องใช้คำสั่งหน่วงเวลาในโปรแกรมเพื่อให้สามารถควบคุมมอเตอร์ได้ตามที่ต้องการ
รูปที่
6
ลักษณะสัญญาณที่ต้องป้อนให้แก่สเต็ปปิ้งมอเตอร์เพื่อให้มอเตอร์หมุน (ก)
ตามเข็มนาฬิกา และ (ข) ทวนเข็มนาฬิกา
การทดลองควบคุมสเต็ปปิ้งมอเตอร์
วัตถุประสงค์
1.
สามารถต่อบอร์ด Node
MCU v.3 กับบอร์ดขับสเต็ปปิ้งมอเตอร์และสเต็ปปิ้งมอเตอร์ได้
2.
สามารถเขียนโปรแกรมให้
NodeMCU
ควบคุมทิศทางการหมุนของสเต็ปปิ้งมอเตอร์ได้
3.
สามารถเขียนโปรแกรมให้
NodeMCU
ควบคุมการหมุนของสเต็ปปิ้งมอเตอร์ผ่านพอร์ตอนุกรมได้
อุปกรณ์ที่ใช้ในการทดลอง
1. เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ
Windows
(ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม Arduino IDE 1.8.8 IoT 1
เครื่อง
2. NodeMCU v.3 1
บอร์ด
3. NodeMCU Base
Ver 1.0 1
บอร์ด
4. บอร์ดขับมอเตอร์ที่ใช้ไอซีเบอร์
ULN2003A 1 บอร์ด
5. สเต็ปปิ้งมอเตอร์ 28BYJ-48 พร้อมสาย 1
ตัว
6. อะแด็ปเตอร์ 9 V 1
ตัว
7. สาย USB 1
เส้น
8. สายต่อวงจร (สายจัมพ์
เมีย-เมีย) 6
เส้น
วิธีการทดลอง
ตอนที่
1 การควบคุมทิศทางการหมุนของมอเตอร์
1.
ต่อวงจรดังรูปที่ 7
2.
เขียนโปรแกรมดังที่แสดงในโค้ดหน้าถัดไป จากนั้นจึงอัปโหลดลง NodeMCU v.3 แล้วสังเกตทิศทางการหมุนของสเต็ปปิ้งมอเตอร์ โดยหากมอเตอร์ไม่หมุน
เนื่องจากไฟเลี้ยงจาก USB ไม่เพียงพอ ก็ขอให้ใช้อะแด็ปเตอร์ร่วมในการจ่ายไฟไปยังบอร์ดขับมอเตอร์
รูปที่
7 การเชื่อมต่อ
NodeMCU
v.3 กับบอร์ดขับสเต็ปปิ้งมอเตอร์และสเต็ปปิ้งมอเตอร์ โดยในกรอบสี่เหลี่ยมสีเขียวคือการต่อสายในกรณีที่ไฟเลี้ยงจากพอร์ต
USB นั้นไม่เพียงพอ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
// Control 4-Phase Step Motor with
ULN2003A // // 5-V Step Motor is 28BYJ48 // Pin 1-4 = (Blue, Pink, Yellow, and
Orange) // Pin 5 = VCC (Red) int motorPin1 = D1; int motorPin2 = D2; int motorPin3 = D3; int motorPin4 = D4; int motorDelay
= 5; //variable
to set motor speed //Long delay = slow speed (8*motorDelay per 1 rev) void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT); } void loop() { // Rotate CW for(int
i=0; i < 100; i++)
{ motorCW(); // Rotate 1 rev. CW } delay(1000); // Rotate CCW for(int
i=0; i < 100; i++)
{ motorCCW(); // Rotate 1 rev. CCW } delay(1000); } void motorCW() { digitalWrite(motorPin1,
HIGH); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin4,
LOW); delay(motorDelay); digitalWrite(motorPin1,
HIGH); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin4,
LOW); delay(motorDelay); digitalWrite(motorPin1,
LOW); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin4,
LOW); delay(motorDelay); digitalWrite(motorPin1,
LOW); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin4, LOW); delay(motorDelay); digitalWrite(motorPin1,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin4,
LOW); delay(motorDelay); digitalWrite(motorPin1,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin4,
HIGH); delay(motorDelay); digitalWrite(motorPin1,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin4,
HIGH); delay(motorDelay); digitalWrite(motorPin1,
HIGH); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin4,
HIGH); delay(motorDelay); } void motorCCW() { digitalWrite(motorPin4,
HIGH); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin1,
LOW); delay(motorDelay); digitalWrite(motorPin4,
HIGH); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin1,
LOW); delay(motorDelay); digitalWrite(motorPin4,
LOW); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin1,
LOW); delay(motorDelay); digitalWrite(motorPin4,
LOW); digitalWrite(motorPin3,
HIGH); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin1,
LOW); delay(motorDelay); digitalWrite(motorPin4,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin1,
LOW); delay(motorDelay); digitalWrite(motorPin4,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin2,
HIGH); digitalWrite(motorPin1,
HIGH); delay(motorDelay); digitalWrite(motorPin4,
LOW); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin1,
HIGH); delay(motorDelay); digitalWrite(motorPin4,
HIGH); digitalWrite(motorPin3,
LOW); digitalWrite(motorPin2,
LOW); digitalWrite(motorPin1,
HIGH); delay(motorDelay); } |
3.
ตรวจสอบการหมุนของมอเตอร์ จากนั้นทดลองแก้ไขค่า motorDelay จาก
5 เป็น 10 จากนั้นจึงอัปโหลดโปรแกรมใหม่
แล้วสังเกตการหมุนของมอเตอร์
ตอนที่
2 การควบคุมการหมุนของมอเตอร์ผ่านพอร์ตอนุกรม
1.
ต่อวงจรดังรูปที่ 7
(เหมือนการทดลองตอนที่ 1)
2.
เขียนโปรแกรมโดยมีโค้ดดังที่แสดงในกรอบด้านล่าง โดยนำฟังก์ชัน motorCW() และ
motorCCW() จากการทดลองตอนที่ 1
มาใส่ลงในโปรแกรมนี้ด้วย จากนั้นจึงอัปโหลดลง NodeMCU v.3
3.
เปิด Serial Monitor (Ctrl+Shift+M)
และป้อนคำสั่ง 1 หรือ 2 แล้วสังเกตการหมุนของมอเตอร์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// Control 4-Phase Step Motor with
ULN2003A // by Serial Data // // 5-V Step Motor is 28BYJ48 // Pin 1-4 = (Blue, Pink, Yellow, and
Orange) // Pin 5 = VCC (Red) int motorPin1 = D1; int motorPin2 = D2; int motorPin3 = D3; int motorPin4 = D4; int motorDelay
= 5; //variable
to set motor speed // Long delay = slow speed(8*motorDelay per 1 rev) char inchar;
// Input control character void setup() {
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT); } void loop() { inchar
= Serial.read(); if(inchar == '1') { for(int
i=0; i < 20; i++)
{ motorCW(); } delay(100); } if(inchar == '2') { for(int
i=0; i < 20; i++)
{ motorCCW(); } delay(100); } } |
แบบฝึกหัดท้ายการทดลอง
จงต่อวงจรดังรูปที่ 8 และเขียนโค้ดโปรแกรมที่ทำให้
ผู้ใช้สามารถควบคุมสเต็ปปิ้งมอเตอร์ให้หมุนตามทิศที่กำหนดได้เมื่อมีการกดปุ่มกด
รูปที่
8 การเชื่อมต่อ
NodeMCU
v.3 กับบอร์ดขับสเต็ปปิ้งมอเตอร์ สเต็ปปิ้งมอเตอร์
และปุ่มกดสองปุ่มเพื่อควบคุมการทำงานของมอเตอร์ด้วยปุ่มกด