โปรเจกต์ การเชื่อมต่อ stepper motor เข้ากับ MKR MotorCarrier
นอกเหนือจากความเป็นไปได้ในการควบคุม DC motors และ servos แล้ว ยังสามารถขับ steppers ได้อีกด้วย
นอกเหนือจากความเป็นไปได้ในการควบคุม DC motors และ servos แล้ว ยังสามารถขับ steppers ได้อีกด้วย
คำอธิบายภาพรวมผลิตภัณฑ์ของ MKR MotorCarrier ระบุว่ารองรับ Stepper Motor แต่จริงๆ แล้วไม่ใช่ ดังนั้น บทความนี้จึงเป็นการสำรวจความเป็นไปได้ในการใช้ MKR MotorCarrier เป็น Booster สำหรับเชื่อมต่อกับ Stepper Motor ผมใช้ MKR 1010 WiFi เป็น Board สำหรับเขียนโปรแกรม แต่นั่นไม่ใช่เรื่องสำคัญ ขอเพียงแค่ Host Board ของคุณสามารถใช้งานร่วมกับ MKR ได้ก็พอ
ผมใช้ Stepper Motor รุ่นยอดนิยมอย่าง 28BYJ-48 ซึ่งหาซื้อได้ทั่วไปและมักจะมาพร้อมกับ Driver Board ที่ใช้ชิป ULN2003 แต่ในที่นี้เราจะไม่ใช้ Driver Board ตัวนั้น 28BYJ-48 เป็น Unipolar Motor แบบ 2 เฟส เฟสหนึ่งอยู่ระหว่างสายสีน้ำเงินและสีเหลือง ส่วนอีกเฟสอยู่ระหว่างสายสีม่วงและสีส้ม แต่ละเฟสจะมีจุดต่อร่วมตรงกลางหรือ Center Tap (สายสีแดง) ซึ่งจะแบ่งเฟสออกเป็นสองขดลวด (Coils)

ดูรายละเอียดที่ส่วนท้ายของโปรเจกต์นี้สำหรับการใช้งาน Stepper แบบ Bipolar
ลำดับการกระตุ้น (Activation Sequence) ที่ใช้ขับ Stepper ในที่นี้เรียกว่าโหมด Half-step:

ยังมีโหมดอื่นๆ เช่น Wave-drive และ Full-step-drive แต่จะไม่ได้กล่าวถึงในที่นี้ มีตัวอย่างมากมายให้ค้นหา แต่มันไม่จำเป็นสำหรับคำอธิบายนี้ ลำดับการกระตุ้นที่แสดงอยู่นี้ต้องตีความดังนี้: เมื่อเชื่อมต่อ Center Tap เข้ากับ +VM การกระตุ้นหมายถึงการส่งสัญญาณ LOW ไปยังขดลวดที่ต้องการทำงาน หรือถ้าเชื่อมต่อ Center Tap เข้ากับ GND การกระตุ้นจะต้องส่งสัญญาณ HIGH
การเชื่อมต่อ Center Tap เข้ากับ +VM นั้นไม่ใช่เรื่องง่าย แม้ว่าบน Board MKR MotorCarrier จะมีขั้วต่อแบบ Screw Terminals สำหรับ GND ทั้งสองฝั่ง แต่สำหรับ +VM กลับไม่มีจุดต่อแบบนั้น

เราสามารถดึงไฟ +VM ผ่านจุด Via (จุดเชื่อมต่อทางไฟฟ้าระหว่างเลเยอร์ของ Board) ตามที่แสดงในรูปได้ ซึ่งต้องอาศัยความแม่นยำในการบัดกรี ไม่แนะนำให้ต่อพ่วง +VM โดยตรงจาก Power Supply หรือจาก Battery เพราะเมื่อปิดสวิตช์ไฟแล้ว จะยังคงมีพลังงานค้างอยู่ที่ Output Stage ของ Driver
Power Supply ที่ใช้ต้องจ่ายไฟอย่างน้อย 6.5V ตามสเปกของ MKR MotorCarrier ขดลวดแต่ละเฟสมีความต้านทาน 20Ω และขดลวดสองชุดสามารถทำงานพร้อมกันได้ ดังนั้น Power Supply ต้องสามารถจ่ายกระแสได้ 0.65A
คำเตือน: Stepper Motor รุ่น 28BYJ-48 ออกแบบมาให้ทำงานที่ 5V แต่จากการที่ผมใช้แหล่งจ่ายไฟ 7V ก็ยังไม่เคยพบปัญหาใดๆ
มุมในโหมด Half step ของมอเตอร์คือ 5.625° และมีการทดเกียร์ลงด้วยอัตราส่วน 63.68395 ดังนั้นที่แกนหมุนจะได้มุม 0.088326807617932° ซึ่งหมายความว่าการหมุนครบหนึ่งรอบต้องใช้ 4075.7728 Steps เพื่อความแม่นยำ
บน MKR MotorCarrier มี 2 ทางเลือกในการขับมอเตอร์ หนึ่งคือใช้ Driver MC33926 (Output M3±/M4±) และสองคือใช้ Driver DRV8871 (Output M1±/M2±) ในทางทฤษฎีมีทางเลือกที่สามคือผ่าน Level Translator รุ่น LSF0108 อย่างไรก็ตาม อุปกรณ์นี้ไม่สามารถจ่ายกระแสได้เพียงพอ อย่างน้อยก็สำหรับ Stepper รุ่น 28BYJ-48
Driver ทั้งสองตัวมีโครงสร้าง Output แบบ H-bridge ซึ่งแสดงในรูปโดยมีเฟสหนึ่งของ Stepper Motor ต่ออยู่ระหว่าง Output OUT1 และ OUT2

อันดับแรกเรามาตรวจสอบความเป็นไปได้ของการกำหนดค่านี้กับ MC33926 (Cn± หมายถึงจุด Common Tap ที่ต่อกับ +VM หรือ GND) MC33926 สามารถควบคุมได้โดยตรงจาก Host ผ่าน Pins D2, D3, D4 และ D5 โดยไม่จำเป็นต้องใช้ SAMD11 บน Board MotorCarrier หรือ Library ใดๆ

ต้องหลีกเลี่ยงการให้ทั้งสองด้านของเฟส (1 และ 2) ทำงานพร้อมกันตามลำดับการกระตุ้นที่แสดงไว้ ดังนั้นหากใช้ Common+ ต้องหลีกเลี่ยงการให้ Inputs ทั้งหมดเป็น 0 และถ้าใช้ Common- ต้องหลีกเลี่ยง Inputs ทั้งหมดเป็น 1
ปัญหามีอยู่ว่า ในวินาทีที่ MKR 1010 WiFi กำลัง Boot หลังจากเปิดเครื่องหรือ Reset ค่า I/O จะยังไม่ถูกกำหนด (Undefined) ซึ่งรวมถึง Inputs ของ MC33926 ด้วย Inputs ที่ไม่ได้เชื่อมต่อของ MC33926 จะทำให้ Outputs เป็น High (ไม่ได้แสดงในที่นี้) ซึ่งในกรณีของ Cn- จะนำไปสู่สภาวะที่ไม่พึงประสงค์ ข้อบกพร่องของ CarrierBoard นี้สามารถแก้ไขได้โดยการต่อ Resistors แบบ Pull-down ขนาด 10kΩ เข้ากับ Pins D2, D3, D4, D5 ของ Host Header
หากไม่มีการต่อ Pull-down การเชื่อมต่อ Common Tap เข้ากับ +VM จะเป็นทางเลือกเดียวเท่าที่มีการระบุไว้ในการใช้งาน
นี่คือตาราง Truth Table สำหรับการติดตั้งกับ DRV8871 อีกครั้งที่ Cn± หมายถึง Common Tap ที่ต่อกับแรงดันมอเตอร์ +VM หรือ GND และ Z หมายถึงสภาวะ Output แบบ Tri-state

เมื่อใช้ Cn+ ต้องหลีกเลี่ยง Inputs IN1=1 และ IN2=1 หากสามารถรับประกันจุดนี้ได้ ทุกอย่างก็จะเรียบร้อย
ในการควบคุม DRV8871 เราจำเป็นต้องใช้ SAMD11 บน Board และ Library ที่เกี่ยวข้อง การจำลองค่า 0 และ 1 ที่ Input ทำได้โดยใช้การเรียกฟังก์ชัน setDuty() ของ Library โดยเฉพาะอย่างยิ่ง setDuty(0) , setDuty(100) และ setDuty(-100)
มีปัญหาบางอย่างเกี่ยวกับ Firmware เมื่อใช้ SAMD11 บน Board เนื่องจาก MotorCarrier ไม่ได้เชื่อมต่อกับจุด Manual Reset ร่วมที่มีอยู่บน MKR 1010 WiFi ผมพบปัญหา Software ค้างเป็นครั้งคราวเมื่อใช้ Manual Reset ผมสันนิษฐานว่าในขณะที่ MKR 1010 WiFi ถูก Reset และกำลัง Boot ตัว Firmware ของ SAMD11 โดยเฉพาะการสื่อสารแบบ I2C ยังคงทำงานอยู่ ผมจึงสรุปได้ว่าฟังก์ชันประเภท 'Setter' อย่าง setDuty() จะไม่ทำให้ระบบค้าง แต่ฟังก์ชันประเภท 'Getter' อย่าง getRaw() จะทำให้เกิดปัญหา
ตัวอย่าง Sketches ค่อนข้างตรงไปตรงมา ยกเว้นบางจุดที่จะขอกล่าวถึงในที่นี้ ค่า Sector Count SCTR สามารถเป็นค่าใดก็ได้จนถึง 65535 การหมุนครบหนึ่งรอบมีประมาณ 4047 Steps ความถี่ที่แนะนำคือ 100Hz ซึ่งหมายความว่ามี Lag Time LAG อยู่ที่ 10000μs÷8steps=1250μs โดยยังไม่คำนึงถึง Software Overhead จากการวัดค่า พบว่า Overhead มีค่าประมาณ 22μs เมื่อใช้ MC33926 และประมาณ 2038μs เมื่อใช้ Library (SAMD11/DRV8871) โดยการวัดทั้งสองแบบนี้รวมการเรียกใช้ micros() และ Serial Monitor (2E6 Baud) แล้ว ดังนั้นหากใช้ Stepper_on_M1_M2 ความเร็วสูงสุดจึงเป็นไปไม่ได้ และหากพูดกันตามตรง การหน่วงเวลาด้วย LAG ก็ไม่จำเป็น
ใน Sketches ทั้งสองแบบ คุณต้องระมัดระวังในการใส่/ถอด Comment ในคำสั่งที่ระบุไว้ ขึ้นอยู่กับการเลือกโหมด Common+ หรือ Common-
นอกเหนือจาก Sketch Stepper_on_M3_M4 ที่แสดงไว้ แน่นอนว่ายังสามารถใช้ Library Stepper ของ Arduino ได้ด้วย แต่เนื่องจากต้องผ่าน SAMD11 บน Board จึงไม่สามารถใช้วิธีนี้กับ DRV8871 หรือ Output M1±/M2± ได้
ด้วยความสามารถของ Output แบบ Tri-state และ H-bridge ของ DRV8871 ทำให้สามารถใช้งาน 28BYJ-48 เป็น Bipolar Stepper ได้เช่นกัน ในขณะที่โหมด Unipolar จะมีการจ่ายไฟเพียงส่วนเดียวของเฟส ณ เวลาหนึ่งๆ แต่ในโหมด Bipolar จะมีการใช้ทั้งเฟส โดยสลับ GND/+VM ที่ปลายทั้งสองด้าน ซึ่งการสลับนี้ทำได้ด้วย H-bridge แล้วจุด Common Center Tap ล่ะ? ในกรณีที่ทั้งสองเฟสทำงาน จุด Common จะมีแรงดันประมาณ ½VM ซึ่งยอมรับได้ และในกรณีที่มีเพียงเฟสเดียวทำงาน อีกเฟสสามารถรักษาให้อยู่ในสภาวะ Tri-state ได้จึงไม่มีอันตราย คุณสามารถขับ Stepper โดยไม่ต้องต่อ Center Tap ได้เช่นกันด้วย Sketch Stepper_on_M1_M2 โดยไม่เกี่ยงว่าจะเลือก common+ หรือ common- เป็นค่าที่ถูกเลือก
MC33926 ไม่มีสภาวะ Tri-state ดังนั้นจุด Central Taps จะต้องถูกตัดขาดจากกันเพื่อใช้งาน Driver ตัวนี้ โชคดีที่มี ตัวอย่าง วิธีการตัดการเชื่อมต่อระหว่าง Central Taps ทั้งสองจุด หลังจากนั้น 28BYJ-48 จะสามารถถูกขับในโหมด Bipolar โดย MC33926 ได้ และอีกครั้ง ไม่สำคัญว่าจะเลือก common+ หรือ common- ใน Sketch Stepper_on_M3_M4
เมื่อรัน Stepper ไม่ว่าจะเป็นแบบ Unipolar หรือ Bipolar ผ่าน Library (ซึ่งหมายถึงผ่าน SAMD11 บน Board) มอเตอร์จะทำงานได้ไม่ราบรื่นเท่ากับการไม่ใช้ Library (เช่น การควบคุม MC33926 โดยตรง) จากการวัดผลสรุปได้ว่าการเรียกใช้ฟังก์ชันอย่าง setDuty() ใช้เวลาประมาณ 9.8ms ซึ่งส่วนใหญ่เกิดจาก Latency ของ I2C-bus นั่นหมายความว่าการตั้งค่าภายในหนึ่ง Step ใช้เวลาพอๆ กับอัตราการทำงาน (100Hz) ของ Stepper ซึ่งไม่สามารถมองข้ามได้ Sketch Bipolar_on_M1_M2 จึงมีการปรับจูนเวลาที่ใช้ภายในแต่ละ Step ให้ดีขึ้นเล็กน้อย
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย