ULN2003 + 28BYJ-48 只可以順時針細步轉
剛買了一套入門套件學習 Arduino, 當中有一塊 ULN2003 驅動板 配 28BYJ-48 步進馬達.按說明接上 5V 及 GND 供電, 把 IN1-4 連上 Pin8-11, 再插上步進.
執行 Examples -> Stepper -> stepper_oneRevolution 的 sketch (原碼在最後).
結果只有在 clockwise 時才會順時針轉, 每次只轉45度左右.當 counterclockwise 時就停了.即對 step 輸入負數不會轉動.
再三檢查接線, 完全無有問題.當試反過來用 IN1-4 對 Pin11-8 連接, 結果一樣是只會順時針轉.
另外, 我還發現 A 燈一直都沒有發亮....不知是否有地方出了問題.
請問是否 ULN2003模塊 或 28BYJ-48 出了問題?有無有其他方法可作簡單測試?
-------------------------------------------------------
#include <Stepper.h>
const int stepsPerRevolution = 200;// change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
}
void loop() {
// step one revolutionin one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
// step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
}
那是四相电机,接成两相试试。 先謝謝幫忙.
但小弟只是初學玩, 基本上都是看圖跟著做, 很多東西不太懂.
請問轉成兩相是如何接線, 程式上要如何改變配合? 用 stepper.step(1) 一步步去行, 再加入 delay(2000) 細看每一步的變化, 發現訊號好像有問題.
根據說明, 每組應該有 8 個 step 而且次序如下.
但我的結果只有 4 組, 次序亦很怪.
1 2 3 4
4 - -
3 - -
2 - -
1 - -
變成只有四拍.而且, 如果 四條線的方向沒錯, 轉動真的有點問題.細看之下, 馬達只有在 4 -> 1 時會走, 即是每 4 步走一步.
之前發現 A 燈一直沒亮, 原來是產品焊接的問題, 把 LED 的兩腳接上了, 這個模塊品質太差.分開後就正常亮燈了, 亦給我看到四個訊號的問題.
另外, 步距角是 5.625/64, 設定 64 steps 是否正確?但現在每步都非常細, 走一圈要幾百步.
可能是因為訊號出錯, 原本 8 拍變成 4 拍, 而每 4 步只走 1 步.而且磁場方向不正確, 走的一步也不太正常.
不知是那裡出錯, 我嘗試過拿出 ULN2003APG 直接插在 麵包板上接線, 結果也是一樣.
請問有沒有方法可以糾正呢?
根據燈號, 改變線路的 配對, 可以用四個方向控制了.
在 sketch 中,
Stepper myStepper(stepsPerRevolution, 8,9,10,11);
改成
Stepper myStepper(stepsPerRevolution, 8,11,9,10);
就可以逆時針轉了.
但腳步還是很細, 不知是那裡出錯了.
那个是带1/64减速的步进电机,转一圈要64×64步,速度估计不能到60 rpm。要按8拍运行,要修改库文件。
原文件,stepper.cpp的部分代码:
if (this->pin_count == 4) {
switch (thisStep) {
case 0: // 1010
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 0110
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 2: //0101
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
case 3: //1001
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
要改成需要的。
只用2-4,1-3,可接成两相电机。
本帖最后由 Super169 于 2014-3-6 23:40 编辑
非常感謝你的資料, 不來可以自行修改 stepper.cpp.
當我嘗試修改後, 發現更奇怪的時, 原來要電機轉動, 只需兩拍....
我把 stepper.cpp 改成只有兩拍:
stepMotor(this->step_number % 2);
順時針時, 只需兩個設定:
case 0: // 0110
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 1001
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
要逆時針時, 只需改變設定為:
case 0: // 1010
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 0110
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
break;
(雖然整體是逆向, 有點不順暢, 當中有時會突意正向走半步再改回逆向)
但就有問題了, 正向跟反向不是倒過來就可以, 因此輸入 負數的步數時, 自然不可能改變方向了.
不知是那裡出了問題, 還在推測 pin_1, pin_2, pin_3, pin_4 跟電機內的設定會是什麼關係, 為向只有兩拍就可以轉動?而正向跟反向亦不是反過來輸入 (steppper.cpp 原意是把 0,1,2,3 的輸出反轉次序就是逆向的) .真的想不通.
要再嘗試作不同的輸出, 看看是否可以找出當中原理.
變成自問自答.....
終於想改好了, 可以正向及反向, 而且反順暢.
之前測試過, 當中兩個輸出可以正向, 而令外兩個可以反向, 可以互相起了緩衝的作用.
做了一個大膽的嘗試, 把兩段程式混合起來, 合出 4 拍, 先改回 4 拍, 再合耕各步的輸出 ......結果就成功了.
switch (thisStep) {
case 0: // 1100 (逆向 - 1)
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 0110 (正向 - 1)
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 2: //0011 (逆向 - 1)
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
break;
case 3: //1001 (正向 - 2)
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
}
雖然改好了, 但....我是不知肯後的原因的.
有人可以解釋給我知嗎? 能运行很好!不知能否达到电机设计的性能。按照上面电机的设计图,已给出了电机8拍运行。需要把程序改成8拍,stepMotor(this->step_number % 8 ); 再按图给出的相序写case 0 至case 7.看你的4拍就是把相序中的一相通电的那4拍去掉了,整体方向没错所以也能运行! chensg 发表于 2014-3-7 20:28 static/image/common/back.gif
能运行很好!不知能否达到电机设计的性能。按照上面电机的设计图,已给出了电机8拍运行。需要把程序改成8拍 ...
這裡真是完全想不通.
單是用 2 拍控制轉動, 已經超出我的理解了.
如果用 4 拍, 1-2-3-4 是正向的話, 4-3-2-1 就會是逆向.
但 2 拍控制轉動, 1-3 跟 3-1 是完全沒有分別.
為何 1-3 是正向, 4-2 就變成反向.結果 1-2-3-4 / 4-3-2-1 可以順暢地 正向/逆向轉動.
當初以為是我買的一套當中出錯了, 已買了 另一套新的 ULN2003 + 28BYJ-48 的組合, 結果又是一樣.
真是奇怪, 如果 ULN2003 + 28BYJ-48 的結果就是這樣, 預設的 library 不能用, 在網上竟然找不到類似的報告.
難道大家都不喜歡這個組合?入門套件都是跟這個的. 注意图中接电机的线序:蓝黄粉橙红。
注意:对比买来的电机线序,需要将2、3线对调。我一开始没成功,就是这个原因!!!
至于为什么要对调,现在还没弄明白,只是这么接线是正确的!
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=13231&highlight=28BYJ
页:
[1]