2016年7月8日 星期五

[Arduino] 用ULN2003 來控制4相步進馬達


前言

因為有控制自動餵食器(參考這篇)的需求,所以爬文了一下步進馬達。

Arduino直接驅動馬達可能會有供電不足的問題,透過驅動板模組方便許多。


材料

1.ULN2003馬達驅動版










































1、板子上使用ULN2003A電機驅動晶片
2、晶片所有管腳已經引出,方便連接使用
3、可支援5-12V供電
4、板子上有4路信號指示LED
4、板載XH-5P插座,可以直接連接28BYJ-48型號的步進電機。


2. 28BYJ-48 步進馬達
































  • Rated voltage : 5VDC
  • Number of Phase : 4
  • Speed Variation Ratio : 1/64
  • Stride Angle : 5.625° /64
  • Frequency : 100Hz
  • DC resistance : 50Ω±7%(25℃)
  • Idle In-traction Frequency : > 600Hz
  • Idle Out-traction Frequency : > 1000Hz
  • In-traction Torque  >34.3mN.m(120Hz)
  • Self-positioning Torque >34.3mN.m
  • Friction torque : 600-1200 gf.cm
  • Pull in torque : 300 gf.cm
  • Insulated resistance >10MΩ(500V)
  • Insulated electricity power :600VAC/1mA/1s
  • Insulation grade :A
  • Rise in Temperature  <40K(120Hz)
  • Noise  <35dB(120Hz,No load,10cm)
  • Model : 28BYJ-48


所以這顆馬達轉一圈需要64  步,也就是每一步為5.625度。

但馬達有內建滅速齒輪,滅速比為1/64,也就是馬達轉64圈,

透過滅速齒輪輸出後,其實只轉一圈 。

所以要讓馬達輸出轉一圈其實是4096 step。




電路圖




















資料來源:
http://www.ltc.com.tw/images/mtardul2003.rar

實際接線,馬達的插座有防呆,不會接錯






























為了避免供電不足,我用了一個外接電源12V1A,透過麵包板供電模組降成5V
























我找了幾個程式碼的範例,目前看到比較精準,而且動的起來的是以下這篇

http://42bots.com/tutorials/28byj-48-stepper-motor-with-uln2003-driver-and-arduino-uno/

接著我把程式碼腳位改成我目前使用的,程式碼如下,執行程式後它會正轉一圈後再倒

轉回原來的位置。


#include <AccelStepper.h>
#define HALFSTEP 8

// Motor pin definitions
#define motorPin1  11     // IN1 on the ULN2003 driver 1
#define motorPin2  10    // IN2 on the ULN2003 driver 1
#define motorPin3  9     // IN3 on the ULN2003 driver 1
#define motorPin4  8     // IN4 on the ULN2003 driver 1

// Initialize with pin sequence IN1-IN3-IN2-IN4 for using the AccelStepper with 28BYJ-48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);

void setup() {
  stepper1.setMaxSpeed(1000.0);
  stepper1.setAcceleration(100.0);
  stepper1.setSpeed(200);
  //stepper1.moveTo(20000);
  stepper1.moveTo(2000);

  

}//--(end setup )---

void loop() {

  //Change direction when the stepper reaches the target position
  if (stepper1.distanceToGo() == 0) {
    stepper1.moveTo(-stepper1.currentPosition());
  }
  stepper1.run();}

執行畫面:


1 則留言:

  1. 請問一下,為什麼motorPin3, motorPin2順序要相反? 謝謝

    回覆刪除