Arduino筆記(8):控制步進馬達

繼下午的Keypad與喇叭實作之後,晚上再拿出步進馬達來練習,當時買的套件之一就有附一個步進馬達及一個小模版,看了線路後,就將ULN2003APG這個 IC拆下來裝在麵包版上,看起來比較簡單些。我試著利用ULN2003這個 IC來推動步進馬達,並使用 Arduino 來控制步進馬達轉的角度,以下就試著連接線路,透過程式來進行控制。



[步進馬達]

有關步進馬達相關的知識,請參考:RASPBERRY PI 筆記(十二):控制步進馬達

[ULN2003]

ULN2003A,是一種高壓大電流的共發射極達林頓電晶體陣列 (Darlington Array )積體電路,內含 7組達林頓對管,每組對管的電流容量是500mA,輸出的電壓最高50V。該積體電路還整合了 7隻共陰極形式連接的續流二極體,用於電感性負載的開關動作的電流續流。[維基百科]

ULN2003 是一個反向器。所謂的反向器就是輸入是高電位時,輸出會是低電位,反之輸入低電位時,輸出會是高電位。

ULN2003A DIP封裝引腳圖 (來源:維基百科)

• 1B~7B:第一至第七組對管的基極    
• 1C~7C:第一至第七組對管的集電極
• E:公共發射極(一般接地)             
• COM:續流二極體共用陰極              

ULN2003在電子電路里的主要特點是大電流容量和高電壓輸出。常作爲驅動器使用,每組達林頓對管可並聯使用以達成更大的電流容量,甚至可以幾顆積體電路晶片堆疊並聯使用。步進馬達一般需要驅動器件有大電流輸出的能力,而微控制器等小電流的積體電路是不能直接驅動馬達的,因此可用作步進馬達的驅動器。

ULN2003內部的7組達林頓對管可以獨立操作,因爲它們的電路連接上除了發射極是一併接地共用E/GND引腳、續流二極體是共陰極接法共用一個COM引腳以外,集電極1C~7C以及基極1B~7B的引腳都是獨立對應的7組。若作爲步進馬達驅動器,則COM一端需要與步進馬達的公共供電端連接,爲馬達的反電動勢提供電流續流能力。

[Stepper Library]

Arduino IDE內有一個 Stepper Library,就是專門用來控制步進馬達的函式庫,以下是常用的函式:

Stepper(int steps, pin1, pin2, pin3, pin4):建立一個步進馬達的物件。
其中 step是指轉一圈所需的步數,假使馬達定義每步的角度,用360去除,就會得到步數。例如:Stepper myStepper = Stepper(100, 5, 6, 7, 8);  表示每一步為3.6度,轉一圈總共100步。

Stepper: setSpeed(long rpms):設定步進馬達每分鐘轉速 (RPMs) ,需為正數。
這個函式並不會讓馬達轉動,只是設定好轉速,當呼叫Step()函式時才會開始轉動。

Stepper: step(int steps):啟動馬達行進steps步數。setSpeed()定義速度,正的表示一個方向, 負數表示反方向。

步進馬達的型號是28BYJ-48, 5V DC,規格如下:

• 工作電壓: 5~12V DC
• 轉一圈步數:512 (搭配 1/64減速齒輪)
• 每分鐘圈數:80 RPM(Revolution per minute)
• 重量:37 公克


[材料]

• 麵包板 x 1
• Arduino Uno x 1
• 步進馬達(型號28BYJ-48, 5V DC) x1
• ULN2003APG x 1
•連接線 x N條

[接線]

步進馬達共有五條線,第一至第四條依序連接ULN2003APG的右側1-4接腳(即16~13接腳),第五條線則接上5V,Arduino的Pin11~Pin8依序接上ULN2003APG左側的1-4接腳(即1-4接腳),第8隻接腳連接GND。


[程式]

#include <Stepper.h>
#define STEPS 200  //定義步進馬達每圈的步數

//steps:代表馬達轉完一圈需要多少步數。如果馬達上有標示每步的度數,
//將360除以這個角度,就可以得到所需要的步數(例如:360/3.6=100)。(int)

Stepper stepper(STEPS, 11, 10, 9, 8);

void setup()
{
stepper.setSpeed(140);     // 將馬達的速度設定成140RPM 最大  150~160
}

void loop()
{
stepper.step(100);//正半圈
delay(1000);
stepper.step(-100);//反半圈
delay(1000);
stepper.step(200);//正1圈
delay(1000);
stepper.step(-200);//反1圈
delay(1000);
stepper.step(300);//正1圈半
delay(1000);
stepper.step(-300);//反1圈半
delay(1000);
stepper.step(1600);//正8圈
delay(1000);
stepper.step(-1600);//反8圈
delay(1000);
}

[參考資料]

• Arduino.cc: Stepper Library
• 維基百科:ULN2003A

[2013/04/06]
[2017/03/11] 更新

62 留言

  1. 我買了跟你一樣的步進馬達加模組,把你的程式也照寫燒入,但我只聽到馬達有些許跳動,軸心沒有動作,是不是要外加電壓?

    回覆刪除
  2. 不需要外加電壓,檢查一下步進馬達的線有沒有接對,不然就要檢查步進馬達有沒有問題。

    回覆刪除
  3. 您好 請問你使用的步進馬達 能提供產品編號或馬達名稱嗎?
    我也想買一顆和您一樣的步進馬達
    謝謝^^

    回覆刪除
    回覆
    1. 當時是購買整個套件, 內含這個步進馬達, 型號是28BYJ-48, 5V DC, 您可以到附近電子材料行問看看!!

      刪除
  4. 請問一下我買同一顆馬達,steps 我由200改成100才有辦法轉動
    但是只會正轉無法反轉是何原因???

    回覆刪除
    回覆
    1. 您好, 結果會這樣我也覺得很奇怪!! IC的編號是同一個嗎? 有沒有可能是IC接錯腳了, 請您再檢查一下看看!!

      刪除
    2. LUN2003APG與LUN2003AN有差別嗎???

      刪除
    3. 我查了一下兩個IC (ULN2003AN 和 ULN2003APG)規格是一樣的, 都是2.7 kΩ TTL, 5 V CMOS, 接腳也一樣. 如果接腳沒有錯, 我也實在想不出來問題會是在哪裡?!

      刪除
    4. pin 2 & pin 3 要反接 不然不會正反轉...

      刪除
    5. 是的,pin2/3要對調就可以正反轉,但是我設STEPS=200並不會200就轉一圈,不知為什麼?

      刪除
    6. 我的也是要pin2&pin3反接才會正反轉,STEPS設200的話,假使要轉一圈需要寫入2048才可以,也不知道原因....
      ps. IC和馬達是ULN2003A G4和28BYJ-48, 5V DC....

      刪除
    7. 我的也是要pin2&pin3反接才會正反轉,
      STEPS 200 、speed 140rpm
      轉一圈大約也是2048,
      還在想辦法找工具測量轉的倒底有沒有一圈
      ps. IC和馬達是ULN2003APG和28BYJ-48, 5V DC....

      刪除
  5. 為啥我的步進馬達大概只跑了程式的3分之一呢?(3圈跑不到1圈半)
    那我再用更大型的步進馬達怎完全部會動,只有看到她在抖動
    我電源是接8顆1.5v得電池

    回覆刪除
    回覆
    1. 三圈跑不到一圈,有可能是你使用的馬達每圈的步數跟上述的範例程式不同, 查一下步進馬達每步的角度, 試著更改程式中STEP 200的指令, 試試看!! 改用大型的步進馬達, 電壓看起來是沒問題了, 不知馬達接IC的腳對嗎? 可以再檢查看看, 有可能是馬達對IC的接線錯了, 因為沒看到圖, 只能猜測一下!!

      刪除
  6. 請問我的馬達是ST-30 燒入成功但是沒有動作 是捨麼原因 接腳對

    回覆刪除
    回覆
    1. 我查一下馬達 ST-30 電壓是12V, 沒看到實際接線, 不知會不會是電壓問題, 請你再檢查看看!!

      刪除
  7. 請教您可一塊版可驅動兩顆馬達嗎????

    回覆刪除
    回覆
    1. 您好, 我原本認為ULN2003APG只能控制一個步進馬達, 可是又覺得應該可以接兩個, 找了一下網路上文章,真的可以接兩個馬達,您可參考:http://blog.sina.com.cn/s/blog_8a72121f01015ikq.html,看看他的接法,您可以試看看。

      刪除
  8. 請問一下 買錯步進馬達買到 T13596AA型號 一樣 四線二相 5V 我去查 沒這規格 只有拍賣 搞了整天 它就是不動>< 傷腦筋 想請大大您幫小弟解答 我照上面步驟 也無法動作~><

    回覆刪除
    回覆
    1. 我在網路上找不到您買的這個型號的步進馬達資料,但是找了四線二相的相關資料參考,還不知道如何設定連接,我再研究看看,如果知道了再回覆您!!

      刪除
    2. 因該是四線兩相,ULN2003比較難接,還要搭配一些其他零件。
      試試L298晶片,接法稍微不同。

      刪除
  9. 您好
    我買的是arduino Mega 2560
    完全照您的方式接好
    程式複製貼上upload之後
    馬達卻只有發熱、微微震動
    您是否知道可能是什麼原因呢?
    就我的認知來說板子是否使用同一個版本應該沒有差?
    (已在Tools>Board設定好)
    感謝撥冗回應

    回覆刪除
    回覆
    1. 您好, 使用Mega 2560跟Uno是一樣的, 我覺得有可能是馬達的步數跟我使用的不同, 您可以找一下馬達型號, 看一下規格, 換算成360度的步數是多少, 修改程式應該就可以了... 我猜可能是這個問題, 畢竟沒看到實體接線跟馬達型號, 只能靠先前實驗時的可能狀況推想!!

      刪除
  10. 請問一下 steps的問題
    我的馬達規格寫
    "步進角度:5.625/64"
    請問我的steps要怎麼設定比較好?
    還有就是5.625/64是代表甚麼意思呢?
    麻煩你了~ 感謝~

    回覆刪除
    回覆
    1. 您好, 我用的這個馬達跟您規格一樣是:5.625/64,指的是這個步進馬達每一步最大角度5.625度,最少步數64步。一般步進馬達最小可達1.8度(本實驗 STEPS那一行訂為200,就是每步1.8度),您可修改程式看看將這行數字改小,再試試看是否可以正常轉動?

      刪除
    2. 我了解了 謝謝你
      但我發現新的問題了 囧rz
      為何我把steps數值從200調到150再調到100
      都可以轉動 但是轉速卻變慢了
      我其他數值都沒有變動
      轉速不是由setSpeed()控制嗎?
      有可能是哪裡出了問題呢?
      不好意思 又要麻煩你解惑了~ >"<

      刪除
  11. 不好意思我是生手問個小問題
    stepper.step(100);//正半圈
    delay(1000);
    stepper.step(-100);//反半圈
    delay(1000);
    要執行這個指令是輸入100或是-100嗎?

    回覆刪除
    回覆
    1. 應該是因為steps設定200
      所以100就是正半圈 -100就是反半圈
      用電腦將程式上傳到arduino的板子裡
      就會執行這個指令了 不用再輸入

      刪除
    2. 作者已經移除這則留言。

      刪除
  12. 您好,
    我用一樣的方式接在這顆馬達上(42HB34F08AB) 什麼事都沒發生0.0
    請問是什麼問題呢?
    請問電源為什麼不接在COM的部份呢?
    謝謝!!

    回覆刪除
  13. 請問一下Ic只要用一下就會有過熱的情形
    請問有什麼方法可以解決嗎
    我要做自走車

    回覆刪除
  14. 您好~ 我是用驅動版+跟您一樣的馬達,但是無法反轉! 只能保持一個固定方向!

    回覆刪除
  15. 您好
    我想請問一下您的開發模組是去哪買的呢
    最近對這有興趣, 也想買一塊來學習

    回覆刪除
    回覆
    1. 我在露天拍賣網站上買的,您可依照關鍵字,找找比較便宜的商家。

      刪除
  16. 大大你好,你有是過步進馬達和超音波來控制馬達嗎? 碰一下超音波而馬達會轉動 沒有碰就不會轉動

    回覆刪除
  17. 您好!我想要一次使用5台28BYJ-48步進馬達,程式流程每次只會驅動(轉動)一台,其他四台處待機狀態,但是遇到的問題是前三台是可以正常運行+待機,但第四台開啟後Arduino Maga2560及馬達就會熄火,並無法繼續正常運行...我使用了9V 1A的外接供應電源變壓器(PS:使用9V 3A也無法運行),請問可能是甚麼問題呢...是否可以給我一些建議? > < 謝謝您!

    回覆刪除
  18. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 請問這顆馬達28BYJ-48 5V最大轉速僅能到160RPM嗎?

      刪除
  19. 不好意思,我買了一顆六線式的步進馬達,現也都照著這張圖來接,可是馬達只會震動曲軸不會轉,我的STEPS也改了很多數值,可是依然不會轉動

    回覆刪除
  20. 28BYJ-48 這顆步進馬達,接法比較特殊,網路找到的資料,有詳細的說明原因,以下2網址,看完就懂了
    https://www.facebook.com/openhome.cc/posts/10152840580613869
    https://www.ptt.cc/bbs/Electronics/M.1428755015.A.E43.html

    回覆刪除
  21. 請問....您的步進馬達是如何插入麵包板的?
    因為我看到我的步進馬達接頭與麵包板都是母的....
    以上,謝謝~

    回覆刪除
    回覆
    1. 到材料行買這個, 掰五根針下來用就可以了 ^^"

      ----
      http://goo.gl/C8q2zc

      刪除
  22. 請問我的六線步進馬達 兩相激磁(型號:42KZM22138A-01)
    請問型號和你不同一樣能成功嗎?
    我的 電壓是5V,阻抗4歐姆,電流1.5A,精度1.8DEG

    回覆刪除
  23. 你好! 我是個新手XD,想跟您請教一下。
    我參考了您寫的,但是我實際操作卻出現了錯誤: stray '\' in program
    可以幫我看一下是我哪裡用錯了嗎? 麻煩了謝謝!

    #include
    #define STEPS 64

    Stepper stepper(STEPS, 11, 10, 9, 8);

    void setup() {
    stepper.setSpeed(140);
    }

    void loop() {
    stepper.step(100);//正半圈
    delay(1000);
    stepper.step(-100);//反半圈
    delay(1000);
    }

    回覆刪除
  24. 你好~ 我是新手
    下面是我寫的程式
    沒有錯 但為什麼上船板子就發生問題呢
    可以幫我看一下嗎

    #include
    #define STEPS 200
    // 定義步進馬達每圈的步數



    Stepper stepper(100, 4, 3, 2, 1);
    // here 360/100 =3.6度一次
    // here pin 1 2 3 4

    void setup() {
    // put your setup code here, to run once:
    stepper.setSpeed(140);
    // set RPM(runs per minute) here一分鐘140次
    // 這個函式不會讓馬達轉 要呼叫Step()函式才會
    }

    void loop() {
    // put your main code here, to run repeatedly:
    stepper.step(100);//正半圈
    delay(1000);
    stepper.step(-100);//反半圈
    delay(1000);
    stepper.step(200);//正1圈
    delay(1000);
    stepper.step(-200);//反1圈
    delay(1000);
    stepper.step(300);//正1圈半
    delay(1000);
    stepper.step(-300);//反1圈半
    delay(1000);
    stepper.step(1600);//正8圈
    delay(1000);
    stepper.step(-1600);//反8圈
    delay(1000);
    }

    回覆刪除
  25. 你好~ 我是新手
    下面是我寫的程式
    沒有錯 但為什麼上船板子就發生問題呢
    可以幫我看一下嗎

    #include
    #define STEPS 200
    // 定義步進馬達每圈的步數



    Stepper stepper(100, 4, 3, 2, 1);
    // here 360/100 =3.6度一次
    // here pin 1 2 3 4

    void setup() {
    // put your setup code here, to run once:
    stepper.setSpeed(140);
    // set RPM(runs per minute) here一分鐘140次
    // 這個函式不會讓馬達轉 要呼叫Step()函式才會
    }

    void loop() {
    // put your main code here, to run repeatedly:
    stepper.step(100);//正半圈
    delay(1000);
    stepper.step(-100);//反半圈
    delay(1000);
    stepper.step(200);//正1圈
    delay(1000);
    stepper.step(-200);//反1圈
    delay(1000);
    stepper.step(300);//正1圈半
    delay(1000);
    stepper.step(-300);//反1圈半
    delay(1000);
    stepper.step(1600);//正8圈
    delay(1000);
    stepper.step(-1600);//反8圈
    delay(1000);
    }

    回覆刪除
  26. https://www.facebook.com/groups/Arduino.Taiwan/permalink/471493489666779/
    問題解答

    回覆刪除
  27. 你好~想請問一下這顆步進馬達定義一圈200步跟100步有沒有什麼差別呢?
    我們照著你的寫法成功的讓步進馬達轉動了,但是已經定義最高轉速160RPMs還是速度過慢,想請問程式有沒有辦法調整或是我們必須換馬達?

    回覆刪除
  28. 請問我要做溫度感測及藍壓遠端開關
    這樣子 在寫程式的時候 是寫在一起就可以嗎?

    回覆刪除
  29. ULN2003 步進馬達驅動板+步進馬達(28BYJ-48 5VDC)

    步進馬達 28BYJ-48 IN 1,2,3,4接Arduino PIN 8,9,10,11


    #include <Stepper.h>
    #define STEPS 2048 //定義步進馬達每圈的步數

    Stepper stepper(STEPS,8,10,9,11); //注意pin 9 10數字互換

    void setup()
    {
    stepper.setSpeed(6); // 設定馬達速度
    }

    void loop()
    {
    stepper.step(2048);//正1圈
    delay(1000);
    stepper.step(-2048);//反1圈
    delay(1000);
    }

    回覆刪除
  30. 您好 如果我是要讓他轉一圈後停止不動 該怎麼打呢? 抱歉我是新手

    回覆刪除
    回覆
    1. 你好, 有兩個方法:一是將執行旋轉的指令寫在setup()那段程式內,二是利用一個無限迴圈,讓迴圈不會離開.
      方法一:
      void setup()
      {
      stepper.setSpeed(140); // 將馬達的速度設定成140RPM 最大 150~160
      stepper.step(200); //正轉1圈
      }
      void loop() {
      }

      方法二:
      void loop() {
      stepper.step(200); //正1圈
      for (;;); //永遠迴圈
      }

      你再試看看。

      刪除
  31. 我照著ˇ做只會正轉不會反轉樓上那些我也試過了求解阿~~~

    回覆刪除
  32. 17HS8401S的步進馬達不能用這個程式作動嗎

    回覆刪除
  33. 請問哪位大大可以寫一個程式是只讓馬達轉一圈就停的?小弟急需

    回覆刪除
  34. 我的馬達只會震動不會轉怎麼辦

    回覆刪除
    回覆
    1. 應該是 Arduino 的電壓無法推動讓馬達運轉,可以外接電源給馬達,電源的地端要跟 Arduino 連接。

      刪除

張貼留言

較新的 較舊