2013年5月10日 星期五

Arduino範例10:用Arduino+ULN2003驅動步進馬達

上一篇用了最土炮的方法推動步進馬達,這次就直接改用Arduino的板子來給訊號。不過Arduino的板子本身只有用USB接電腦,不夠我們去驅動步進馬達。所以上網看了一下,發現有一種超好用的晶片ULN2003,可以用來協助我們推動馬達。

ULN2003是個有7個達靈頓電晶體的包裝陳列(Darlington Array),有7個NPN達林頓管組成,並且加上反向器,使引腳1~7輸入高電壓時,引腳16~10變成低電位,讓外面的電流流入。有這個就方便多了,不用再自己搭達靈頓電路,而且集極/射極的電壓達50V很夠用。



再來是要說明接線方式,方法很簡單,把Arduino要輸出控制的pin接到ULN2003上,再把對應的腳位接到步進馬達上面。記得電源的負極也要接上ULN2003的pin 8以及Arduino的GND。

Video


Code
Arduino練習到這裡,code開始有很多種不同的層級了。一個是單純要求輸出,另一種會用到Stepper Library(類似Labview的子VI)。先說第一種:

//單純定義pin輸出,以及輸出的速度
int motorPin_A = 8;
int motorPin_AP = 9;
int motorPin_B = 10;
int motorPin_BP = 11;
int delayTime = 20;

void setup() {
  pinMode(motorPin_A, OUTPUT);
  pinMode(motorPin_AP, OUTPUT);
  pinMode(motorPin_B, OUTPUT);
  pinMode(motorPin_BP, OUTPUT);
}

void loop() {
  digitalWrite(motorPin_A, LOW);
  digitalWrite(motorPin_AP,HIGH);
  digitalWrite(motorPin_B, HIGH);
  digitalWrite(motorPin_BP,LOW);
  delay(delayTime);
  digitalWrite(motorPin_A, LOW);
  digitalWrite(motorPin_AP,HIGH);
  digitalWrite(motorPin_B, LOW);
  digitalWrite(motorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(motorPin_A, HIGH);
  digitalWrite(motorPin_AP,LOW);
  digitalWrite(motorPin_B, LOW);
  digitalWrite(motorPin_BP,HIGH);
  delay(delayTime);
  digitalWrite(motorPin_A, HIGH);
  digitalWrite(motorPin_AP,LOW);
  digitalWrite(motorPin_B, HIGH);
  digitalWrite(motorPin_BP,LOW);
  delay(delayTime);
}

----------------------------------------------------------------------------------------------------------

另一種層次,就是叫Library進來,以下是會用的函式:
Stepper(int steps, pin1, pin2, pin3, pin4):定義轉一圈所需的步數,以及輸出的腳位。
Stepper: setSpeed(long rpms):設定步進馬達每分鐘轉速 (RPMs) ,需為正數。
這個函式並不會讓馬達轉動,只是設定好轉速,當呼叫step()函式時才會開始轉動。
Stepper: step(int steps):啟動馬達行進steps步數,正的表示一個方向, 負數表示反方向。

//#include <Stepper.h>
Stepper stepper(48, 11, 10, 9, 8);
//我手上的馬達轉一圈為48步 (360/7.5 deg),定義11, 10, 9, 8為輸出腳位
void setup()
{
stepper.setSpeed(20); // 將馬達的速度設定成20RPM (太大趕不上)
}
void loop()
{
stepper.step(24);//正半圈
delay(1000);
stepper.step(-24);//反半圈
delay(1000);
stepper.step(48);//正1圈
delay(1000);
stepper.step(-48);//反1圈
delay(1000);
}

86 則留言:

  1. 請問使用時您的ULN2003會過燙嗎??

    回覆刪除
  2. 之前使用的時候溫度有上升,但還不到燙手。
    Spec寫的規格是2.5 A, 建議你可以量一下通過電流check一下!

    回覆刪除
  3. 你好!
    想請問如果我用比較大顆的六線步進馬達,需要24V/1.2A的供電
    一樣可以用這個方法嗎?
    感謝!

    回覆刪除
    回覆
    1. 可以,依它的spec你可以看到Vo輸出可以到50V
      http://www.doyoung.net/video/DATASHEET/PDF/ULN2003.pdf

      刪除
    2. 請問灌12v進去 ARDIUNO會燒壞嗎

      刪除
    3. 我沒試過也,不過應該很危險。我只有試過灌到9V,目前還活著。

      刪除
    4. 為什麼用arduino控制步進馬達要用到達靈頓電路

      刪除
  4. 請問ARDIUNO驅動步進馬達,且步進馬達連接一個四連桿機構,讓四連桿機構作動 且運動軌跡是無限大的符號(倒8) 那麼有可以ULN2003,還是需要額外購買其他的驅動器呢? 因為ARDIUNO輸出的電流很小,所以必須要連接一個電流放大器 感謝版主的回答

    回覆刪除
  5. 我的建議是
    1. 你可以先算一下你的4-bar linkage對驅動端來說,需要多少扭力 (詳見機構學課本)
    2. 依上述扭力挑選一顆扭力足夠的步進馬達
    3. 看該馬達需要多少電壓電流
    4. 回頭再看ULN2003的spec,看它供應的電流電壓是否足夠你使用。(50V,0.5A)
    以上可以練習做一次。

    不過也許你手上剛好有一顆不知道需要多少電流的步進馬達
    ULN2003可以供到50V應該夠你用的了,只是它只能供應0.5A,小顆的應該夠用。
    但如果很不幸的你的馬達太大顆,那你可以找其它可供應更多電流的達靈頓電晶體。

    回覆刪除
  6. 請問ULN2003這顆IC 只是適用於步進馬達嗎? 那DC直流馬達適用嗎? 如果要買的話 哪邊有賣呢 還是必須跟公司訂購 謝謝版主的回答

    回覆刪除
    回覆
    1. ULN2003屬於一種達靈頓電路,你想用在直流馬達也是ok的。光華商場的電子材料行就有在賣了,問IC櫃台的小姐就知道了。

      刪除
  7. 想請問一下我照你介紹的實作,但馬達只會正轉不會反轉
    大概是何原因???

    回覆刪除
    回覆
    1. 因為我沒有看到您的實際接的圖,只能用猜測的。
      最有可能的是A A' B B'的線沒有接正確,以至只能往一個方向推。

      不過我建議你先把pin腳接LED燈出來檢查,看燈亮的順序是不是你要的。
      說不定可以看出一些端倪。

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

      刪除
    3. 我參考以下網址
      可以正反轉
      http://4tronix.co.uk/arduino/Stepper-Motors.php
      馬達:28BYJ-48, 5V
      馬達驅動器:ULN2003

      刪除
  8. 想請問一下 我買了一顆L298N馬達驅動IC,與一顆24V的直流馬達和ARDUINO UNO先連接,而我的問題是單純一顆L298N馬達驅動IC,而不需要其他的電子元件,就可以達到H橋式電路的效果了嗎?並且驅動馬達運作,還是需要其他電子元件呢?(當然前題是接線要接對)感謝您的回答.

    回覆刪除
    回覆
    1. 對,直流的H橋用L298N,或L293B之類都可以達到
      可參考 http://coopermaa2nd.blogspot.tw/2012/09/l298n.html

      刪除
    2. 不好意思 我現在只有一顆L298N馬達驅動IC,並沒有整個L298N模組,如果沒有其他電子元件,就可以達到H橋式電路的效果了嗎?並且驅動馬達運作,另外直流馬達上面擁有encoder,所以如果買此類型的馬達驅動模組,擁有encoder的接槽嗎?感謝版主再次回答.

      刪除
    3. 可以啊,看一下L298N型錄,裡面應該有配線的說明,不用買模組也可以用。
      至於你馬達原有帶encoder,那有附IR interrupter嗎?有的話,參考以下網址,找一下線來接 http://ming-shian.blogspot.tw/2013/05/get-frequency-from-optical-encoder-by.html
      接完把訊號拉裡arduino的板子裡就可以看到轉速了。

      刪除
  9. 你好 想問一下你在這個實驗中用的是什麼型號的步進馬達?

    回覆刪除
    回覆
    1. 回收筒裡隨便拿的,你可以拿一個步進馬達,然後參閱
      http://ming-shian.blogspot.tw/2013/05/blog-post_8.html
      分辨是那一種步進馬達之後,就自己寫屬於它的脈波

      刪除
    2. 我現在遇到的問題是,我的步進馬達是28byj48 看起來和link的圖中pm一模一樣,它的速度真的轉速好慢 調到上線150還是很慢,它的steps我計算出來是64 想說換一個和你影片中一樣可以轉很快的馬達><

      刪除
    3. 朋友,我也是用這個,這個馬達是很有問題的.他本身好像有一個gearbox,你試試 把step 設為64
      stepper.step(2048),應該會正轉一圈.
      不過我就是不明白為何是2048而不是4096?

      刪除
    4. 我剛剛瞄了一下28byj48,這一顆的軸心的確有偏位,而且spec裡有寫ratio 64倍了,所以各位所需step就是64x64。不過我原本的是2相,這一顆是4相,所以還要再除2。

      刪除
    5. 你好, "不過我原本的是2相,這一顆是4相,所以還要再除2"
      請問為什麼四相還要再除 2?

      刪除
  10. 原來是這樣。。。我今天去光華有看到很像你用的那個馬達,幾乎一模一樣,是12v,請問如果我買步進馬達驅動晶片可以直接去用嗎(驅動晶片上有uln2003)。 另外就是如果我用那個12v步進馬達接uno,可是其他sensor都是5v, 是不是所有sensor都要加電阻?才可以用外接12v變壓器電源?

    回覆刪除
    回覆
    1. uln2003可以耐到50v,應該夠你用了。至於Sensor的部分,你可以依型號上網找spec,工業用的sensor很多都是可以用5~12V的,如果是的話,你就不用另外電阻了,如果不是,你用降壓的晶片7805降下來就可以用了,另外加電阻不是很方便!

      刪除
  11. 你好~ 我想問我買了一個步進馬達 他是4V電壓 0.95的電流 那ULN2003會有問題嗎?? 因為好像ULN2003只提供0.5的電流 謝謝!

    回覆刪除
  12. 可能會有問題,不然你就並聯兩個Pin腳試試看能不能這樣用。就是一個arduino的pin腳控制兩個ULN2003的腳位看看!

    回覆刪除
    回覆
    1. 好的~ 但不好意思咧....因為我是新手 我想問並聯的話應該怎樣做呢??

      謝謝回覆!!

      刪除
    2. 把ULN2003的4跟5接在一起當作輸入,12和13接在一起輸出。不過我不太確定這樣可以,你可以試試看!

      刪除
  13. 請問一下
    如果是5相5線步進馬達
    也可以用類似的方法控制嗎?
    還是一定要使用驅動器來控制

    回覆刪除
    回覆
    1. 您可以找到激磁順序的圖來看,就以用類似的方法進行驅動。
      http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_251669.gif

      刪除
  14. 你好!請問一下
    我使用六線步進馬達 兩相激磁
    步進角1.8 (DEG) 電壓5(V) 電流1.5(A)
    可否使用ULN2003元件驅動?
    用Stepper寫(步數=200),試過很多次接線,四條(A B A/ B/)接上ULN2003的16.15.14.13,只有震動
    反而 A A/ 接上ULN2003的16.15會轉,但正反轉不會照程式走..
    煩請解答 感謝><

    回覆刪除
  15. 我想問這張圖的接法
    12V會不會讓Arduino燒掉?
    我程式都寫好也能用藍芽控是信號了
    就剩放大電路
    希望能幫解惑,謝謝
    http://4.bp.blogspot.com/-LGTEyQKFWy8/UYjOyJUPI4I/AAAAAAAADPg/Pb21EzBS8fY/s1600/%E6%93%B7%E5%8F%96.PNG

    回覆刪除
    回覆
    1. 是用arduino來控制12V能不能過ULN2003,12V沒有進去arduino

      刪除
  16. 請問這馬達能否用ULN2003控制?
    http://shop.cpu.com.tw/html/949/190-0208.html
    p=iv
    i=0.416 感覺電流有點危險耶?
    還是會建議我直接買 驅動馬達模組?
    最重要的是這馬達能用pwm控制嗎?
    我是剛接觸電子科的新手 很多東西不太熟悉...(努力學習中!

    回覆刪除
    回覆
    1. 十分危險,建議您用其它電流放大電路,就自己湊達靈頓電路吧!

      刪除
    2. 那請問 那顆馬達能使用pwm控制嗎?

      刪除
    3. 不好意思喔,PWM是針對直流馬達在用的,步進馬達要調速是改pulse的頻率的,不同於PWM

      刪除
    4. 如果那顆馬達寫著" 直流"減速馬達的話是否可以使用pwm?

      刪除
    5. 我怕你用的是無刷直流,那就是另一件事了,不能用PWM,有照片嗎?看照片比較準!
      my email: b92502011@gmail.com

      刪除
  17. 不好意思請問一下,我接了步進馬達燒了程式進去之後,馬達只會震動但是不會轉,請問是什麼原因 ?
    mail : paste.ren@gmail.com
    謝謝 :)

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

      刪除
    2. 接法
      STEP MOTOR 28BYJ-48(5V DC)<<-ULN2003<<-Arduino->>USB->>Macbook

      刪除
    3. 兩種主要原因:
      1. 頻率不對,起動頻率太高
      2. 相位不對,因為每種馬達的啟動相位順序不太一樣,要你查一下你這種馬達的相位順序對不對!

      刪除
  18. 您好 不好意思想請問一下一開始的code
    高低電位那個 跑出來是順時針轉 那請問逆時針的順序是?
    感謝~

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

    回覆刪除
  20. 請問下面影片的廣告裝置
    https://www.youtube.com/watch?v=z4otUEgV7Ak
    用這種步進馬達;左右各一顆、用齒輪帶中間的圓柱去捲動中間的海報,然後現場用電腦控制速度、正反轉、執行上有困難嗎? 謝謝你

    回覆刪除
  21. 您好! 我用了您的code ,但是step似乎有誤, 會在delay(8ms)左右時不旋轉且扭力極小,改了code順序之後才正常運作且恢復應有的扭力, 麻煩您檢查一下您的code是否有誤~

    回覆刪除
    回覆
    1. OK, 感謝您的建議,稍晚我會檢查一下!

      刪除
    2. 您好! 我最近仔細研究了一下arduino的官網reference, 您的code應該是用於unipolar mode的範例, 但是要用unipolar mode的話uln2003要多用兩個腳位和四個電阻才行, 所以直接接會有問題, 我覺得如果不太強調操作的彈性的話,unipolar mode反而比較好 因為只需要用掉arduino兩個腳位,比起用掉四個腳位好太多了! 現在我正在找有沒有直接接成unipolar情形的uln2003電路板~~

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

      刪除
    4. 我發現uln2003電路板上面有預留沒用到的三個輸出接腳的小孔...不過實在不好焊...

      刪除
    5. 這個接線圖~用兩條線能達到您的code相同的功能, 咦? 不對啊, 那您的code應該沒有錯? 頂多順序和接腳要檢查一下,有可能是我接錯? (之前那個留言貼錯網址, 所以刪掉了~)
      http://www.arduino.cc/en/Reference/StepperUnipolarCircuit

      刪除
    6. 歐歐歐! 我誤會那些洞了...那些洞是接背板的跳線...

      刪除
  22. 你好我用你下面這個函式就是叫Library進來,但驗證時有錯誤


    回覆刪除
  23. 您好! 請問如果一次插上5台28BYJ-48步進馬達(每次只會驅動一台,但其他四台處待機狀態),需要外接甚麼規格的外接供應電源呢? 我使用的是INPUT: 100-240V ~0.5A, 50-60Hz OUTPUT: +12V 2.00A 的外接電源,但這樣一次最多只能啟動待機3台馬達...

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

      刪除
    2. 文中的做法就是外接電源了,只是你的電源夠不夠力的問題。你的電源看來只有24W,其實很小,買個 50W 應該就夠你用了。

      刪除
  24. 不好意思,我想寫一個程式是
    (當按下按鈕後,馬達自動上升下降,指示燈跟著馬達一起運作)
    目前就差在指示燈不知道該如何寫,其他部分都OK,想請各位幫個忙
    以下是我的程式
    ............................
    ‪#‎include‬
    ‪#‎define‬ STEPS 500
    const int PB = A0;
    const int TM = 13;
    Stepper stepper(STEPS, 12, 10, 8, 7);
    void setup() {
    pinMode(TM, OUTPUT);
    pinMode(PB, INPUT);
    stepper.setSpeed(160);
    }
    void UP() {
    stepper.step(-10000);
    stepper.step(-10000);
    }
    void DOWN() {
    stepper.step(10000);
    stepper.step(10000);
    }
    void loop() {
    boolean val = digitalRead(PB);
    if (val == LOW) {
    UP();
    delay(1000);
    DOWN();
    }else{
    }
    }

    回覆刪除
    回覆
    1. 如果是這樣的話,我會把stepper.step ( -10000) 裡的 -10000指定為變數 val
      void DOWN () 把val定為10000,void UP () 的時候定為-10000
      然後loop裡就看val的狀況來指定LED是否要亮。

      刪除
  25. 請問12v5w200rpm的直流減速馬達可以做到嗎??

    回覆刪除
    回覆
    1. 原理不同,您可以參考
      http://ming-shian.blogspot.tw/2013/05/arduniopwm.html
      使用PWM來控直流馬達的速度比較恰當

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

    回覆刪除
    回覆
    1. int i = 0:
      i = i +1:
      if (i <144) {
      stepper.step(0):
      }

      刪除
  27. 請問2014.4.12的留言中,有人提到說他的馬達轉速很慢,我的馬達也是28byj48,希望跟你影片中的馬達一樣快要怎麼做呢?

    回覆刪除
    回覆
    1. 轉速比較慢,我能猜想到的原因有:
      (1) delay time的時間要再縮短
      (2) 您的線沒有接對,沒有依照您的馬達說明書上的接線「順序」接對。

      您再查一下線路是否正確。

      刪除
  28. 請問一下這個程式不管多大的轉速再馬達許可下都可以達到嗎?

    回覆刪除
    回覆
    1. 單晶片發出訊號的速度不一定有這麼快,這是硬體的問題。
      甚至馬達也不一定可以跑這麼快,步進馬達有一個極限的速度,過了不是扭力不足,不然就是失步。

      刪除
  29. 請問一下是不是只有這種方法可以控制步進馬達的轉速

    回覆刪除
    回覆
    1. 當然不是囉,有太多方法可以了,工業專門的方法超多!

      刪除
  30. 請教
    我的57步進馬達(標力矩達3N)馬達上有標示电流4.2A,(要大電流)那我要選那種驅。動器或lc來驅動呢?
    謝謝

    回覆刪除
    回覆
    1. Sorry, 57的馬達,我都直接找工業用的驅動器了,我沒有試過自己焊晶片來用。因為4.2真的太大了。買一顆工業用的比較快。
      例如:http://www.extion.com.tw/c/product03.htm

      刪除
  31. 太多顆了請問要怎麼選擇呢?

    回覆刪除
  32. 太多顆了請問要怎麼選擇呢?

    回覆刪除
  33. 找來找去,找不到明確想明步進馬達怎麼配驅動的說明。問賣家也問不出的答案,只好再來麻煩你。
    我的步進57BYG HS(57步进电机 57BYG HS步进电机驱动器 加长112mm 力矩3N.m 4线 軸8)http://b.mashort.cn/S.ZfLmY4?sm=4fbfc0
    機身標
    57HS 11242A4
    1.8 4.2A
    SUMTOR
    他說4.2A是相電流,那這是2相的我是不是要用到8.4A的驅動,還是驅動器的配置有什麼規則可以計算呢?看賣家選那個結果給個TB6560峰值電流標3A(這是相電流還是輸出總電流呢?)只是比較貴,這可以用嗎?
    謝謝

    回覆刪除
  34. 找來找去,找不到明確想明步進馬達怎麼配驅動的說明。問賣家也問不出的答案,只好再來麻煩你。
    我的步進57BYG HS(57步进电机 57BYG HS步进电机驱动器 加长112mm 力矩3N.m 4线 軸8)http://b.mashort.cn/S.ZfLmY4?sm=4fbfc0
    機身標
    57HS 11242A4
    1.8 4.2A
    SUMTOR
    他說4.2A是相電流,那這是2相的我是不是要用到8.4A的驅動,還是驅動器的配置有什麼規則可以計算呢?看賣家選那個結果給個TB6560峰值電流標3A(這是相電流還是輸出總電流呢?)只是比較貴,這可以用嗎?
    謝謝

    回覆刪除
  35. 請問如果是4線步進馬達 那個12V要接在哪裡

    回覆刪除
  36. 您好請問 Arduino 可以控制這種步進馬達驅動器嗎?
    http://tw.taobao.com/item/10122157818.htm?fromSite=main&spm=a1z10.5-c.w4002-2933553768.12.zUMnQq

    若可以的話,要如何控制呢??

    回覆刪除
  37. 您好請問一下步進馬達可以透過讀取一個訊號來驅動嗎?

    回覆刪除