Publish : 4 September 2020
Update 1 : 7 September 2021 - แก้ไขโค้ดตัวอย่างให้ถูกต้องตามคำอธิบาย
หัวข้อในบทความนี้
- สเต็ปมอเตอร์ (Stepper Motor) คืออะไร - ส่วนประกอบของสเต็ปมอเตอร์ - การทำงานของสเต็ปมอเตอร์ - ชนิดของสเต็ปมอเตอร์ - โหมดการทำงาน - Full Step Mode - Half Step Mode - Micro Step Mode - วิธีใช้ Stepper Motor อย่างง่ายด้วย Stepper Library - การคำนวณค่าต่าง ๆ ที่เกี่ยวกับสเต็ปมอเตอร์ ในครั้งก่อนเราพูดกันถึงมอเตอร์แบบธรรมดากันไปแล้ว แต่มอเตอร์ธรรมดานั้นมีข้อจำกัดที่มันจะหมุนอย่างต่อเนื่องไปเรื่อย ๆ จึงเหมาะกับงานที่ต้องหมุนต่อเนื่อง ไม่ต้องการความละเอียดมากนัก เช่น การหมุนล้อ การดึงสายพาน แต่งานบางอย่างเราต้องการความละเอียดในการทำงาน เช่น การเคลื่อนที่ของหัวพิมพ์เครื่องปริ้นเตอร์ เวลาเราพิมพ์เอกสารออกมาตัวหนังสือจิ๋วเดียว มอเตอร์ก็ต้องเคลื่อนหัวพิมพ์ไประดับมิลลิเมตร หรือ 0.X mm. ลองคิดว่าหากเราใช้มอเตอร์ธรรมดาเราสามารถบังคับให้คลื่อนที่น้อยที่สุดก็ครึ่งรอบ(ทำจริงยากมาก ๆ) ซึ่งครึ่งรอบนี้ก็ลองคิดดูนะครับว่ามันเคลื่อนที่ไปเท่าไร เยอะมากนะครับ หากเราใช้เฟืองหรือรอกเส้นผ่านศูนย์กลาง 1 cm. มีเส้นรอบวง 3.14 cm. ครึ่งรอบเท่ากับเคลื่อนที่ 1.57 cm. เข้าไปแล้ว มันจึงมีสิ่งประดิษฐ์เข้ามาแก้ปัญหาตรงนี้ เราเรียกว่า สเต็ปมอเตอร์ Stepper Motor
สเต็ปมอเตอร์ (Stepper Motor) คืออะไร สเต็ปมอเตอร์ (Stepper Motor) หากจะพูดให้เข้าใจง่าย ๆ ก็คือเป็นมอเตอร์กระแสตรงเหมือนในบทที่ผ่านมาแหละครับ แต่สเต็ปมอเตอร์จะมีขดลวดและแม่เหล็กจำนวนมากกว่า และขดลวดจะติดอยู่กับส่วน Stator และส่วน Rotor เป็นขั้วแม่เหล็ก โดยจำนวนของขดลวดและแกนแม่เหล็กนี้จะขึ้นอยู่กับชนิดของสเต็ปมอเตอร์ และการออกแบบความละเอียดของการหมุน เช่น มอเตอร์ NEMA17 สเต็ปมอเตอร์ยอดนิยมสำหรับนัก DIY ที่นำมาทำ CNC และ 3D Printer จะมีขดลวด Stator 8 ขด และมีแม่เหล็กที่ Rotor ถึง 100 ขั้วส่วนประกอบของสเต็ปมอเตอร์ ตามที่อธิบายไปแล้วครับว่าส่วนประกอบนั้นก็คล้าย ๆ กับมอเตอร์กระแสตรงธรรมดา ตามรูปด้านล่าง
Stator เป็นส่วนที่ติดกับตัวถังของมอเตอร์ จะเป็นขั้วแม่เหล็กที่มีปลายเป็นฟันซี่เล็ก ๆ พันด้วยขดลวดเพื่อเหนี่ยวนำให้สนามแแม่เหล็เปลี่ยนแปลง Rotor เป็นก้อนแม่เหล็กถาวร มีลักษณะคล้ายเฟือง มีฟันเป็นซี่ ๆ เพื่อดูดเข้าไปตรงกันกับซี่ฟันของ Stator โดย Rotor นี้ก็จะติดอยู่กับแกนหมุนเพื่อนำไปใช้งานตามต้องการนั่นเอง ด้วยสเต็ปมอเตอร์นี้มีซี่ฟันจำนวนมาก ทำให้มันสามารถขยับเป็น Step เล็ก ๆ ได้
การทำงานของสเต็ปมอเตอร์ การทำงานก็จะมีหลักการเหมือนกับมอเตอร์กระแสตรง คือการจ่ายไฟฟ้าเข้าไปในขดลวดเพื่อเปลี่ยนเป็นสนามแม่เหล็ก จากนั้นแม่เหล็กที่แกน Rotor ก็จะดูดเข้ากับขดลวด เท่ากับมอเตอร์เคลื่อน 1 Step นั่นเอง ตัวอย่างตามภาพด้านล่าง โดยยกตัวอย่างมอเตอร์ที่มี 8 Stator Coils และ 6 Rotor Poles จะได้มองกันชัด ๆ หน่อยนะครับ
ชนิดของสเต็ปมอเตอร์ สเต็ปมอเตอร์สามารถแบ่งชนิดได้หลายแบบ ดังนี้ แบ่งตามโครงสร้าง Variable reluctance stepper motor โครงสร้างจะประกอบด้วย Rotor ที่เป็นเหล็ก จะถูกดูดเข้าหา Stator เมื่อ Stator ได้รับไฟฟ้าเกิดเป็นสนามแม่เหล็ก (แม่เหล็กชั่วคราวที่เกิดจากขดลวดดูดแกนเหล็กนั่นเอง) Permanent magnet stepper motor โครงสร้างจะมี Rotor ที่เป็นแม่เหล็กถาวร ซึ่งจะดูดหรือผลักกับ Stator ตาม Pulse ที่จ่ายเข้าไป Hybrid synchronous stepper motor โครงสร้างจะเป็นแบบ Variable และ Permanent ผสมกัน แบ่งตามชนิดของ Stator Bipolar Stepper Motor (หรือเรียกแบบ 2-Phase) มอเตอร์ชนิดนี้ขดลวดที่พันอยู่กับ Stator จะไม่มี Common Wire ทำให้การออกแบบวงจรขับค่อนข้างซับซ้อน ต้องมี MCU เข้ามาช่วย และสามารถใช้วงจร H-Bridge มาขับได้ Unipolar Stepper Motor (หรือเรียกแบบ 4-Phase) ขดลวด Stator ของมอเตอร์ชนิดนี้จะมี Common Wire สำหรับใช้เป็น Common Ground หรือ Common Power มอเตอร์ขนิดนี้สามารถสร้างวงจรขับได้ง่าย ใช้งานได้ง่าย โดยจะต้องจ่ายไฟฟ้า(หรือต่อกับ GND)เข้ากับ Common ตลอดเวลา และจ่ายไฟเข้าไปที่ขดลวดต่าง ๆ เพื่อให้ครบวงจร สเต็ปมอเตอร์แบบ Unipolar นี้ก็จะแยกออกเป็นหลายแบบ คือแบบ 5-Wire มีสายไฟ 5 เส้น คือ Common ของขดลวดทั้งสองชุดเต่อเข้าด้วยกันเป็นเส้นเดียว แบบ 6-Wire มีสายไฟ 6 เส้น Common ของแต่ละชุดแยกกัน (ดังรูปตัวอย่างด้านล่าง) และ 8-Wire คือขดลวดแต่ละขดใช้ Common ของตัวเองแยกกัน
โหมดการทำงาน เนื่องจาก Stator ของ Stepper Motor ประกอบด้วยขดลวดหลายขด การจ่ายไฟฟ้าเข้าไปกระตุ้นที่คู่ขดลวดต่าง ๆ ย่อมทำให้เกิดการทำงานที่แตกต่างกัน สามารถแยกได้ดังนี้ Full Step Mode ในโหมดนี้เมื่อเราจ่าย Pulse เข้าไป 1 ลูก มอเตอร์จะขยับ 1 Step เต็ม ๆ เช่น มอเตอร์ NEMA 17 มีสเปคคือ 200 Step/Revolution ฉะนั้นหากเราต้องการให้มอเตอร์หมุนครบรอบ ต้องจ่ายเป็นจำนวน 200 Pulse ซึ่งจะแยกย่อยเป็น 2 แบบคือ 1-Phase on Stepping คือการจ่าย Pulse เข้าไปที่ขดลวดแต่ละขด ทำให้ Rotor หมุนไปตามทิศต่าง ๆ ดังรูป
2-Phase on Stepping จะคล้าย ๆ กับแบบ 1-Phase เพิ่มเติมเพียงเราจะจ่าย Pulse เข้าไปในขดลวดทั้งสองชุด ชุดละขด พร้อมกัน เท่ากับเราต้องจ่ายไฟให้ขดลวด 2 ขด เมื่อมีสนามแม่เหล็กจากขดลวด 2 ขดมาดูด Rotor พร้อมกัน ทำให้มีแรงมากขึ้น วิธีนี้จึงทำให้มอเตอร์มีแรงบิดเพิ่มขึ้น 30-40% แต่แลกกับการใช้ไฟมากขึ้นเป็นสองเท่าจากที่ต้องจ่ายเพิ่มอีกขดนั่นเอง
หากเขียนเป็นตารางการจ่าย Pulse เข้าไปในแต่ละ Step ก็จะได้ดังนี้
1-Phase on Stepping |
Step |
Wire 1 |
Wire 2 |
Wire 3 |
Wire 4 |
1 |
1 |
0 |
0 |
0 |
2 |
0 |
1 |
0 |
0 |
3 |
0 |
0 |
1 |
0 |
4 |
0 |
0 |
0 |
1 |
2-Phase on Stepping |
Step |
Wire 1 |
Wire 2 |
Wire 3 |
Wire 4 |
1 |
1 |
1 |
0 |
0 |
2 |
0 |
1 |
1 |
0 |
3 |
0 |
0 |
1 |
1 |
4 |
1 |
0 |
0 |
1 |
Half Step Mode การทำงานแบบ Half Step Mode นี้ก็จะเหมือนกับการทำงานแบบ 1-Phase on Stepping และ 2-Phase on Stepping รวมกัน ทำให้เราได้ความละเอียดเพิ่มขึ้นมาอีก โดยการจ่าย Pulse แต่ละครั้ง Rotor จะหมุนครั้งละครึ่งสเต็ปนั่นเอง เช่น NEMA 17 ตัวเดิม หากใช้ Full Step จะหมุนครั้งละ 1.8 องศา แต่หากใช้ Half Step จะหมุนเพียง 0.9 องศาเท่านั้น และแน่นอนว่าหากต้องการให้หมุนครบรอบ 360 องศา ก็ต้องจ่าย Pulse เพิ่มขึ้นจาก 200 เป็น 400 ครั้งนั่นเอง
Step |
Wire 1 |
Wire 2 |
Wire 3 |
Wire 4 |
1 |
1 |
0 |
0 |
0 |
2 |
1 |
1 |
0 |
0 |
3 |
0 |
1 |
0 |
0 |
4 |
0 |
1 |
1 |
0 |
5 |
0 |
0 |
1 |
1 |
6 |
0 |
0 |
0 |
1 |
7 |
1 |
0 |
0 |
1 |
8 |
1 |
0 |
0 |
0 |
Micro Step Mode เป็นโหมดที่มีความซับซ้อนที่สุด แต่ก็ให้ผลการหมุนของแกนที่ละเอียด ให้แรงบิดสูง และหมุนได้นุ่มนวลที่สุด โดยวิธีนี้ขดลวดจะถูกกระตุ้นด้วยคลื่นไซน์ (sin wave) จำนวนสองลูกต่างเฟสกัน 90° ด้วยวิธีนี้ทำให้เราควบคุม Pulse ที่เข้าไปได้ทั้งทิศทางและขนาด ทำให้สามารถควบคุมการหมุนของแกนมอเตอร์ได้อย่างละเอียดมาก ๆ (ทำได้ถึง 0.007°/Step) ซึ่งเป็นที่นิยมนำมาใช้งานเป็นอย่างมากในเครื่องมือต่าง ๆ เช่น เครื่อง 3D Printer, เครื่อง CNC

จากกราฟก็จะเห็นชัดว่าเราจ่ายไฟฟ้าเข้าที่ขดลวดแดง และขดลวดน้ำเงินด้วย Sine Wave ที่ต่างเฟสกัน 90 องศา การที่ขดลวดได้ไฟฟ้ามากน้อยก็ทำให้เกิดการเหนี่ยวนำมากน้อยตามไปด้วยเช่นกัน ขดแดงมาก ขนน้ำเงินน้อย แกน Rotor ก็จะถูกดูดไปทางแดงมาก เป็นต้น จึงทำให้สเต็ปมอเตอร์สามารถเคลื่อนที่ได้นุ่มนวลและละเอียดนั่นเองวิธีใช้ Stepper Motor อย่างง่ายด้วย Stepper Library ในการใช้งานอย่างง่ายในบทนี้ จะขอยกตัวอย่างการใช้งาน 28BYJ-48 ที่เป็นชุดมากับบอร์ดขับมอเตอร์ด้วยไอซีเบอร์ ULN2003 (ดูสินค้าคลิกที่นี่) ซึ่งเป็นมอเตอร์ขนาดเล็ก ใช้งานสะดวก และบอร์ดขับก็เป็นแค่การขยายสัญญาณเพื่อจ่ายไฟเข้าไปธรรมดา (เนื่องจากกระแสไฟจาก Arduino ไม่มากพอจะขับมอเตอร์ได้นั่นเอง) ในบทนี้จะอธิบาย Stepper Library ที่มีอยู่ใน ArduinoIDE อยู่แล้วสามารถเรียกขึ้นมาใช้งานได้ทันที ส่วนการใช้งานเกี่ยวกับตัวมอเตอร์หรือไอซีจะยังไม่ลงลึกในบทนี้ ไว้จะอธิบายอีกทีใน EP ถัด ๆ ไปนะครับ ส่วนบทนี้เราไปเริ่มกันกับคำสั่งต่าง ๆ ใน Stepper Library กัน ซึ่งก็มีคำสั่งให้เราใช้เพียงไม่กี่คำสั่งเท่านั้นครับ ตามนี้เลย
Stepper(steps, pin1, pin2) หรือ Stepper(steps, pin1, pin2, pin3, pin4) |
เป็นฟังก์ชั่นสร้าง Object สเต็ปมอเตอร์ตัวใหม่ขึ้นมา โดย Parameter ที่กำหนดจะขึ้นอยู่กับมอเตอร์ที่ใช้ ซึ่งสามารถใช้ได้ทั้งมอเตอร์ที่มีสาย 2 เส้น และมอเตอร์ที่มีสาย 4 เส้น โดยค่าที่เราต้องกำหนดมีดังนี้ steps คือ จำนวน Step ต่อรอบของมอเตอร์ เช่น หากใช้มอเตอร์ NEMA 17 มี 200 Step/Revolution ก็ใส่เลข 200 ลงไป หากใช้ 28BYJ-48 ก็จะได้ 2048 เป็นต้น (28BYJ-48 มีการทดเกียร์ภายในทำให้มีค่านี้เยอะ ไว้จะอธิบายในตอนที่พูดถึงเรื่องนี้ต่อไปครับ) pin สายไฟของอมเตอร์ต่อกับขาใดของ Arduino ก็ใส่ลงไปได้เลยครับ มอเตอร์มีสองสายก็ใส่ pin1, pin2 หากมี 4 สายก็เพิ่ม pin3, pin4 ไปเลย ตัวอย่างเช่น Stepper = myStepper(200, 8, 9, 10, 11) หมายความว่า ให้ Object ของมอเตอร์ตัวนี้ชื่อ myStepper มอเตอร์ที่ใช้หมุน 200 step/รอบ และมี 4 สาย ต่อกับขา 8, 9, 10 และ 11
เป็นคำสั่งสำหรับตั้งค่าความเร็วในการหมุนของมอเตอร์เป็นรอบต่อนาที (RPMs) ถ้าใส่ 1 ก็จะหมุน 1 รอบต่อนาที ถ้าใส่ 2 ก็ 2 รอบต่อนาทีเท่ากับรอบละครึ่งนาที นั่นหมายความว่าหากค่านี้ยิ่งมากเท่าไรมอเตอร์ก็จะยิ่งหมุนเร็วขึ้นเท่านั้นนั่นเอง แค่คำสั่งนี้เป็นแค่การกำหนดความเร็วว่าจะให้หมุนเร็วเท่าไร ไม่ได้สั่งให้มอเตอร์หมุน จึงต้องใช้คู่กับคำสั่ง step() โดยค่าที่เราต้องกำหนดลงไปคือ rpms คือจำนวนรอบต่อนาทีที่เราต้องการให้มอเตอร์หมุน ช้าเร็วขึ้นอยู่กับเลขที่ใส่ตามที่อธิบายไปแล้วครับ
เป็นคำสั่งให้มอเตอร์หมุนไปเป็นจำนวนตาม Step ที่เรากำหนด โดยจะหมุนด้วยความเร็วที่ตั้งค่าไว้ด้วยคำสั่ง setSpeed() นั่นเอง หากต้องการให้มอเตอร์หมุนกลับมาอีกด้านก็เพียงใส่ค่าที่เป็นลบลงไปเท่านั้นเอง และสิ่งสำคัญคือคำสั่งนี้จะบล็อกโปรแกรมของเราไว้จนกว่ามอเตอร์จะหมุนเสร็จตามคำสั่ง โปรแกรมจึงจะไปทำงานที่บรรทัดถัดไปที่เราเขียน (เสมือนว่าใส่คำสั่ง delay ไว้จนกว่ามอเตอร์จะหมุนเสร็จนั่นเอง) ค่าที่เราต้องใส่ลงไปคือ steps คือจำนวน step ที่เราต้องการให้มอเตอร์หมุน ตัวอย่าง ใช้คำสั่ง step(100) ด้วยการ setSpeed(1) กับมอเตอร์ NEMA 17 มอเตอร์ก็จะหมุนไปครึ่งรอบโดยใช้เวลาครึ่งนาที เพราะเราตั้งค่าให้ 1 รอบต่อนาที และจำได้มั๊ยว่า NEMA 17 มี 200 step/รอบ ฉะนั้นเราสั่งหมุน 100 Steps ก็คือครึ่งรอบ รวมกับ 1 รอบใช้เวลา 1 นาที ครึ่งรอบก็ 30 วินาทีนั่นเอง (ยิ่งอธิบายจะยิ่งงงมั๊ยนี่ 555+) มาดูตัวอย่างโปรแกรมกันเลยครับ

ง่ายมาก ๆ ใช่มั๊ยครับ การใช้ Stepper Motor มันก็มีแค่นี้จริง ๆ ใครจะนำไปประยุกต์ใช้ให้กดปุ่มแล้วหมุน หรือเงื่อนไขอื่น ๆ ก็แค่เติมเงื่อนไขลงไป การสั่งให้มอเตอร์หมุนก็มีเพียง setSpeed() และ step() แค่นี้แหละครับ
Tips : เนื่องจากมอเตอร์ 28BYJ-48 นั้นมีการทดเกียร์ไว้ด้านใน ซึ่งค่า 2038 Steps/Rev. ที่เราใช้นี้เป็นค่าที่คิดจากอัตราทดปกติที่ 64:1 แต่อาจมีมอเตอร์บางรุ่นที่ผู้ผลิตทำออกมาพิเศษ ไม่ได้ใช้ค่านี้ เช่นที่ผู้เขียนเคยเจอนั้นหากใช้ 2038 มอเตอร์จะหมุนถึง 4 รอบ เนื่องจากมอเตอร์ตัวนั้นมันเป็นรุ่น 512 Steps/Rev. ก็ใช้ค่านี้ใส่ลงไปในโปรแกรมแทนครับ |
การคำนวณค่าต่าง ๆ ที่เกี่ยวกับสเต็ปมอเตอร์ การใช้สเต็ปมอเตอร์นั้นจะใช้ในการเคลื่อนที่ที่ต้องการความแม่นยำ เราจึงต้องรู้ค่าบางอย่างเพื่อใช้ในการคำนวณและออกแบบระบบเพื่อใช้งาน ซึ่งสมการหลัก ๆ ที่เกี่ยวกับการคำนวณของสเต็ปมอเตอร์ก็คือ
Steps per Revolution = 360/Step Angle |
Steps per Revolution คือ จำนวน Step เพื่อหมุนครบ 1 รอบ มอเตอร์แต่ละเบอร์จะมีค่าต่างกันตั้งแต่ 4 - 400 Steps/Rev. แต่โดยทั่วไปนั้นส่วนมากจะมีค่าเป็น 24, 48 และ 200 Steps/Rev.
Step Angle คือมุมที่เปลี่ยนไปต่อการหมุน 1 Step
วิธีการคือเราจะคิดกลับไปกลับมาระหว่างองศากับ Steps/Rev. เพราะเราต้องเอาค่า Steps/Rev. นี้ไปใส่ในโปรแกรมนั่นเอง แต่ Datasheet ส่วนมากดันบอกค่าเป็นองศาซะ อย่าง NEMA 17 ก็บอกมาว่า 1.8 องศา
ลองคำนวณกันเล่น ๆ ครับ อย่างหา Step/Rev. ก็เอา 1.8 Degree/Step ไปแทน ส่วน 360 ก็รู้กันอยู่แล้วว่าวงกลมวงนึงมี 360 องศานั่นเอง
Steps/Rev. = 360/Step Angle = 360/1.8 = 200 Steps/Rev. |
ในมอเตอร์บางตัวจะมีการทดเกียร์เพื่อเพิ่มแรงบิด เช่น 28BYJ-48 ใน Datasheet บอกไว้ว่า 5.625 Degree/Step ที่ 8-Step Sequence นี่คือข้อมูลบอกว่าใน Half Step Mode นั้นการหมุน 1 Step จะเท่ากับ 5.625 องศา เราจะใช้ Full Step Mode ก็ต้อง x2 เข้าไป ครึ่ง+ครึ่งเป็นเต็มนั่นเอง จะได้เป็น 11.25 Degree/Step เราก็เอามาแทนเลยครับ
Steps/Rev. = 360/Step Angle = 360/11.25 = 32 Steps/Rev. |
แต่มอเตอร์ 28BYJ-48 นี้มีการทดเกียร์ข้างในประมาณ 64:1 (ค่าจริงที่คำนวณได้คือ 63.68395:1) หมายความว่าเราจะต้องให้มอเตอร์ด้านในหมุน 64 Step เพื่อให้แกนด้านนอกที่เราเห็นหมุน 1 Step ฉะนั้นหากเราต้องการให้แกนด้านนอกหมุนครบทั้ง 32 Step เพื่อให้ครบรอบ ก็ต้องเอาอัตราทดคูณเข้าไปได้ 32*64 = 2048 หรือต้องการความแม่นก็เอาค่าจริงเข้าไปคูณได้ 32*63.68395 = 2037.8864 ประมาณเป็น int ได้ 2038 ตามที่ใส่ไว้ในโปรแกรมนั่นเอง สุดท้ายนี้ หากใครยังไม่เข้าในการคำนวณ 28BYJ-48 ในตอนท้ายก็ไม่เป็นไรครับ เดี๋ยวจะมีอีกบทอธิบายอีกที ขอไปเรียบเรียงคำก่อน เข้าใจว่ามันค่อนข้างซับซ้อนพอสมควร ในบทนี้เน้นเข้าใจคอนเซ็ปของสเต็ปมอเตอร์ วิธีใช้เบื้องต้น ถ้าถามว่าจะใช้งานแบบไม่ต้องอาศัย Library ได้มั๊ย ตอบเลยว่าได้ครับ ใช้ digitalWrite() ธรรมดานี่ก็ได้ เอาไว้บทของ 28BYJ-48 จะมาอธิบายกัน วันนี้ยาวมากแล้วครับ อัดแน่นด้วยเรื่องมึน ผู้เขียนเองก็พยายามเรียบเรียงให้เข้าใจง่ายแล้ว(มั๊ง) เอาว่าไว้รออ่านบทอธิบายอีกรอบแล้วลองทำตามอาจเข้าใจมากขึ้น สำหรับวันนี้ลาไปก่อน สวัสดีครับ