การควบคุมสเต็ปปิ้งมอเตอร์

สเต็ปปิ้งมอเตอร์

สเต็ปปิ้งมอเตอร์ (Stepping Motor) หรือ สเต็ปมอเตอร์ (Step Motor) หรือ สเต็ปเปอร์มอเตอร์ (Stepper Motor) คือมอเตอร์ไฟตรงประเภทหนึ่งที่การหมุนแบ่งออกเป็นสเต็ปหรือขั้นย่อย ๆ ที่เท่ากัน โดยเราสามารถควบคุมให้มอเตอร์นี้หมุนได้ตามจำนวนสเต็ปที่ต้องการและยังสามารถทำให้มอเตอร์คงตำแหน่งนั้นไว้ด้วยการจ่ายกระแสไฟฟ้า ในการควบคุมตำแหน่งของมอเตอร์ประเภทนี้ มีข้อดีคือ เราไม่จำเป็นต้องใช้เซนเซอร์ตรวจจับตำแหน่งสำหรับการป้อนกลับ แต่มอเตอร์ประเภทนี้มีข้อเสียเมื่อเทียบกับมอเตอร์ไฟตรงคือ มีแรงบิดค่อนข้างต่ำ และกินกระแสสูงแม้ในขณะที่มอเตอร์ไม่หมุน

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

หลักการทำงานของสเต็ปปิ้งมอเตอร์คือ เราจะจ่ายไฟให้แก่ขดลวดที่ติดตั้งอยู่บนสเตเตอร์ (stator) เพื่อให้ส่งสนามแม่เหล็กออกมา และส่วนที่เป็นตัวหมุนหรือโรเตอร์ (rotor) จะมีแกนเป็นแม่เหล็กถาวร การจ่ายกระแสเข้าไปที่ขดลวดทำให้เกิดแรงดึงดูดจากสนามแม่เหล็ก ทำให้โรเตอร์หมุน โดยเมื่อเราทำการจ่ายกระแสให้กับขดลวดแต่ละขดอย่างต่อเนื่องจะทำให้มอเตอร์หมุนอย่างต่อเนื่อง และหากเราต้องการให้มอเตอร์หมุนไปตามจำนวนสเต็ปที่กำหนดก็สามารถทำได้โดยการจ่ายพัลส์กระแสผ่านขดลวดตามจำนวนสเต็ปที่ต้องการ รูปที่ 1 (ก) แสดงการทำงานของสเต็ปปิ้งมอเตอร์ โดยเมื่อจ่ายไฟให้แก่ขดลวดชุด A-ก็จะทำให้แกนหมุนถูกล็อคอยู่ที่ตำแหน่งนั้น ไม่เคลื่อนที่ไปไหนแม้มีแรงกระทำจากภายนอก ในรูปที่ 1 (ข) คือเมื่อมีการป้อนกระแสไปยังขดลวดชุด B-B’ ด้วยก็จะทำให้แกนหมุนหมุนไปตามทิศทางของสนามแม่เหล็กที่เหนี่ยวนำ โดยการหมุนในทิศตามเข็มนาฬิกาจะเกิดขึ้นเมื่อมีการป้อนกระแสให้เกิดสนามแม่เหล็กหมุนวนตามลำดับ A-B-C-D และหากต้องการให้หมุนในทิศทวนเข็มนาฬิกา ก็สามารถทำได้เช่นกัน โดยการกลับลำดับการป้อนกระแสให้แก่ขดลวดบนมอเตอร์

 

image description

 

รูปที่ 1 การทำงานของสเต็ปปิ้งมอเตอร์ (ก) ขณะล็อคให้หยุดนิ่ง
และ (ข) ขณะกำลังหมุนไปครึ่งสเต็ป

 

รูปที่ 2 แสดงตัวอย่างภาพถ่ายลักษณะภายนอกและภายในของสเต็ปปิ้งมอเตอร์เบอร์ 28BYJ-48 ซึ่งเป็นสเต็ปปิ้งมอเตอร์ไฟตรงขนาดเล็ก (5 V) ที่มีใช้กันอย่างแพร่หลาย โดยภายในตัวมอเตอร์จะมีเฟืองทดอยู่ด้วย (รูปที่ 2 ()) ทำให้สามารถส่งแรงบิดได้มากขึ้น โดยมอเตอร์ชนิดนี้เป็นแบบสี่เฟสแบบขั้วเดียว (unipolar) ที่มีการเชื่อมต่อหรือแท็ป (tap) ตรงกลางของขดลวดแต่ละชุด ทำให้มอเตอร์นี้มีสี่เฟส และทำให้เราสามารถควบคุมมอเตอร์ได้อย่างง่ายดายยิ่งขึ้นและมีโอกาสที่จะต่อสายไฟผิดพลาดได้น้อยลง

 

image description

 

รูปที่ 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 สาย

 

image description

 

รูปที่ 3 (ก) ภาพลักษณะการวางสาย สี และ (ข) ภาพลักษณะการพันขดลวดของสเต็ปปิ้งมอเตอร์ 28BYJ-48 ชนิดสี่เฟสแบบขั้วเดียวที่มีแท็ปตรงกลางของขดลวดและเชื่อมต่อกัน

 

 

image description

 

รูปที่ 4 บอร์ดขับสเต็ปปิ้งมอเตอร์ที่ใช้ไอซีเบอร์ ULN2003A แบบ () DIP และ (ข) SMD

 

 

การเชื่อมต่อของสเต็ปปิ้งมอเตอร์ที่ใช้ไอซีเบอร์ ULN2003A และสเต็ปปิ้งมอเตอร์เบอร์ 28BYJ-48 ทำได้โดยง่ายและมีลักษณะวงจรดังรูปที่ 5 โดยเนื่องจากลักษณะของสัญญาณขาออกจากไอซีเป็นแบบกลับขั้ว ดังนั้นจึงมีการจ่ายไฟ VCC ให้แก่ขดลวดของมอเตอร์นี้เพื่อที่จะทำให้ เมื่อวงจรได้รับสัญญาณขาเข้าที่เป็นลอจิก HIGH แล้ว จะเกิดกระแสไหลผ่านขดลวดภายในมอเตอร์ (จาก VCC ไปยังกราวด์ ผ่านไอซี) และมอเตอร์จะทำงาน

 

image description

 

รูปที่ 5 ภาพลักษณะวงจรขับสเต็ปปิ้งมอเตอร์โดยไอซีเบอร์ ULN2003A และสเต็ปปิ้งมอเตอร์เบอร์ 28BYJ-48

 

สำหรับสัญญาณที่ใช้ในการควบคุมการหมุนของมอเตอร์ 4 เฟส (ให้ชื่อเป็น A, B, C, และ D) นั้น จะมีลักษณะดังรูปที่ 6 นั่นคือ เราจะสั่งการให้จ่ายกระแสไปยังขดลวดทีละขดตามลำดับ เพื่อให้มอเตอร์หมุนตามที่ต้องการ โดยสำหรับรูปที่ 6(ก) คือการสั่งการให้มอเตอร์หมุนตามเข็มนาฬิกา โดยจะมีการกลับโลจิกจาก HIGH เป็น LOW ที่ไอซี ULN2003A เพื่อให้กระแสไหลในขดลวดที่ต่ออยู่ และรูปที่ 6(ข) คือการสั่งการให้มอเตอร์หมุนทวนเข็มนาฬิกา ซึ่งเป็นเพียงการกลับลำดับการสั่งการ สำหรับการสั่งการให้มอเตอร์หมุนเร็วหรือช้านั้น เราสามารถทำได้โดยการควบคุมความกว้างของพัลส์สัญญาณที่ป้อนให้แก่บอร์ดขับ (ค่า T ในรูปที่ 6(ก)) โดยค่านี้จะต้องมีค่าไม่น้อยเกินไป เพราะมอเตอร์ซึ่งเป็นอุปกรณ์ทางกลอาจตอบสนองไม่ทันกับสัญญาณไฟฟ้าที่ป้อนให้แก่ขดลวด สำหรับความเร็วในการตอบสนองสูงสุดของสเต็ปปิ้งมอเตอร์ทั่วไปนั้นจะอยู่ในระดับ 1-10 มิลลิวินาที ต่อการป้อนกระแสแต่ละเฟส ซึ่งทำให้เราจะต้องใช้คำสั่งหน่วงเวลาในโปรแกรมเพื่อให้สามารถควบคุมมอเตอร์ได้ตามที่ต้องการ

 

image description

 

รูปที่ 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 ไม่เพียงพอ ก็ขอให้ใช้อะแด็ปเตอร์ร่วมในการจ่ายไฟไปยังบอร์ดขับมอเตอร์

 

image description

 

รูปที่ 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 และเขียนโค้ดโปรแกรมที่ทำให้ ผู้ใช้สามารถควบคุมสเต็ปปิ้งมอเตอร์ให้หมุนตามทิศที่กำหนดได้เมื่อมีการกดปุ่มกด

 

image description

 

รูปที่ 8 การเชื่อมต่อ NodeMCU v.3 กับบอร์ดขับสเต็ปปิ้งมอเตอร์ สเต็ปปิ้งมอเตอร์ และปุ่มกดสองปุ่มเพื่อควบคุมการทำงานของมอเตอร์ด้วยปุ่มกด