2014年5月29日 星期四

五線四相 步進馬達 控制 ULN2003 研究 內部邏輯閘

這次要介紹的是arduino藉由ULN2003控制步進馬達的方法
首先先給大家看一下完成的運轉影片
大家可能會發現我的arduino uno怎麼會與眾不同,秘密就在我把這塊改成排針(公)啦~
這樣就可以穩穩地插在麵包版上,屹立不搖,不會從側邊看會有點曲線,因為UNO的間距跟麵包版不是很合。
這塊步進馬達驅動模組我也改過,他的排針原本是跟板子垂直立正的,不過個人非常講究方便實用,這次的實驗只會用到4個輸入腳,而這塊共有7個輸入腳,留下前四個,後面三個斷路,改接+-極,再彎成跟板子平行,以便插入麵包版,就這樣,新的產品誕生~(焊點很醜)




因為這塊驅動板註明使用五線四相的步進馬達,所以就買了一顆

因為步進馬達沒甚麼好改裝的,所以就不動它了,維持原貌~

再來開始連接囉~本範例中接在arduino的是 3,4,5,6
程式碼如下:(如果不懂那要麻煩自己去多看一些文章或在留言中提問)


int motorPin_4 = 6;     //定義pin對應名稱
int motorPin_3 = 5;
int motorPin_2 = 4;
int motorPin_1 = 3;
int delayTime = 6;    //設定速度(毫秒)

void setup() {
  pinMode(motorPin_4, OUTPUT);    //定義pin輸出
  pinMode(motorPin_3, OUTPUT);
  pinMode(motorPin_2, OUTPUT);
  pinMode(motorPin_1, OUTPUT);
}

void loop() {
  digitalWrite(motorPin_4, LOW);
  digitalWrite(motorPin_3,HIGH);
  digitalWrite(motorPin_2, HIGH);
  digitalWrite(motorPin_1,LOW);
  delay(delayTime);
  digitalWrite(motorPin_4, LOW);
  digitalWrite(motorPin_3,HIGH);
  digitalWrite(motorPin_2, LOW);
  digitalWrite(motorPin_1,HIGH);
  delay(delayTime);
  digitalWrite(motorPin_4, HIGH);
  digitalWrite(motorPin_3,LOW);
  digitalWrite(motorPin_2, LOW);
  digitalWrite(motorPin_1,HIGH);
  delay(delayTime);
  digitalWrite(motorPin_4, HIGH);
  digitalWrite(motorPin_3,LOW);
  digitalWrite(motorPin_2, HIGH);
  digitalWrite(motorPin_1,LOW);
  delay(delayTime);
}



如果你的零件和連接沒問題基本上就可以轉動

再來我們來看看ULN2003裡面到裡面藏了甚麼;這顆輸入是高電位時輸出低電位,輸入低電位時高阻抗,第9PIN要接高電位或者空接都可以,但第8PIN一定要接地。
我們的這次的程式碼流過晶片後,步進馬達接收到的訊號是這樣的:(Z表示高阻抗)

紅(1):持續5V
橙(2):Z00Z
黃(3):0ZZ0
紫(4):00ZZ
藍(5):ZZ00

其實控制步進馬達就是那麼簡單,共接點給VCC,其他PIN依序給低電位,內部的電給就會依序產生磁力帶動馬達轉動。
這個例子是一次給兩個低電位訊號,扭力較大,也可以用以下方式
0ZZZ
Z0ZZ
ZZ0Z
ZZZ0
這樣較省電,但扭力較差。
如果將以上方式整合在一起
0ZZZ
00ZZ
Z0ZZ
Z00Z
ZZ0Z
ZZ00
ZZZ0
0ZZ0
這樣每次轉動的角度是原本的1/2,更為精確。

Q1:為什麼要用ULN2003來驅動?
A:因為ULN2003內部為達靈頓電路,給予極小的電流就會導通(接地)

Q2:為什麼第9PIN可以空接或接VCC?
A:接VCC可以符合一般的反向器,在in=0時,out=1;但它輸出的高電位是"虛"高電位,電流很小不能驅動其他東西;所以在這篇的例子空接不會有影響。

Q3:第8PIN一定要接地?
A:使用達靈頓電路就是要讓它,在in=1時,out=0;而且那個0是趨近於直接接地的0,(電流可以很大),所以第8PIN是必要接地的。

沒有留言:

張貼留言