Raspberry Pi Pico Wを使用してステッピングモータ2個を同時に動作させる実験をしました。プログラミングツールとしてはArduino IDEを使用し、ステッピングモータの駆動にArduino言語のStepperライブラリを使用しています。
前回、Raspberry Pi Pico Wで1個のステッピングモータを動作させる記事を掲載しました。(前回の記事はこちら)
2個のステッピングモータを同時動作させるには、Stepperライブラリを使用するとモータを駆動するstep()関数は指定したステップ数モータが回転するまで抜け出てこないので、それぞれのモータを駆動するステップ数を少なくして交互にstep()関数を実行する工夫が必要となります。
本記事ではstep()関数を使用して2個のステッピングモータを交互に動作するプログラムと同時動作するプログラムを作成した実験の様子を示します。
使用ステッピングモータ
ステッピングモータは28BYJ-48とそのドライバーボードのセットを使用しました。このステッピングモータは種々のネット通販から購入出来ます。
このステッピングモータの主な仕様は表1の通りです。このモータは1/64のギアで減速されていて、1-2相励磁の場合にステップ角は5.625°/64なので4096ステップでモータ軸が1回転します。最大自起動周波数が500ppsなので、500パルス/sec以下で起動する必要があります。起動後は徐々に加速を行った場合に、最大で1000パルス/secまでは仕様上は可能です。
項目 | 仕様 |
相数 | 4相 |
励磁方式 | 1-2相励磁方式 |
ステップ角 | 5.625°/64 (減速比1/64) |
電圧 | 5VDC |
相抵抗 | 22Ω ± 7% 25°C |
最大応答周波数 | 1000pps |
最大自起動周波数 | 500pps |
引き込みトルク | 800gf.cm / 5VDC 400pps |
励磁方式
今回使用したステッピングモータ28BYJ-48は1-2相励磁の場合、1回転4096ステップとなります。ただStepperライブラリのstep()関数は、Stepperライブラリーのソースコードを見る限りでは2相励磁方式です。2相励磁の場合1回転2048ステップとなります。
Stepper(step2, pin1, pin2, pin3, pin4)
関数でI/Oピンを割り振った場合の励磁順序はStepperライブラリーのソースコードを見る限りでは表2の様になっています。
引数 | 1ステップ | 2ステップ | 3ステップ | 4ステップ |
pin1 | HIGH | LOW | LOW | HIGH |
pin2 | LOW | HIGH | HIGH | LOW |
pin3 | HIGH | HIGH | LOW | LOW |
pin4 | LOW | LOW | HIGH | HIGH |
また、ステッピングモータ28BYJ-48の仕様書では1-2相励磁方式の励磁順序の表が載っていますが、それから推測した2相励磁の場合の励磁順序は表3の通りです。(時計方向回り時)
ドライバボード入力 | モータリード線 | 1ステップ | 2ステップ | 3ステップ | 4ステップ |
+ (5V) | リード線色 赤 | 5Vに接続 | 5Vに接続 | 5Vに接続 | 5Vに接続 |
IN1 | リード線色 青 | HIGH | LOW | LOW | HIGH |
IN2 | リード線色 桃 | HIGH | HIGH | LOW | LOW |
IN3 | リード線色 黄 | LOW | HIGH | HIGH | LOW |
IN4 | リード線色 橙 | LOW | LOW | HIGH | HIGH |
以上から次の様にステッピングモータを配線する必要があります。
pin1: リード線色 青 (ドライバボード入力 IN1)
pin2: リード線色 桃 (ドライバボード入力 IN3)
pin3: リード線色 黄 (ドライバボード入力 IN2)
pin4: リード線色 橙 (ドライバボード入力 IN4)
ドライバボード入力にIN2とIN3がひっくり返っていることに注意が必要です。
実験装置
28BYJ-48ステッピングモータのドライバーボードはテキサスインスツルメンツのULN2003ANと言うダーリントントランジスタアレイが使用されています。ドライバーボード自体の資料が無かったので、テスタと基板のパターンを見て回路を調べました。
ステッピングモータNo.1のドライバーボードの入力信号IN1~IN4をRaspberry Pi Pico WのGP0~GP3に接続しました。
ステッピングモータNo.2のドライバーボードの入力信号IN1~IN4をRaspberry Pi Pico WのGP4~GP7に接続しました。
スタート用のスイッチをRaspberry Pi Pico WのGP15に接続しました。
図2に実験装置の回路図を示します。図3は実験装置の写真です。
プログラム
Raspberry Pi Pico Wのプログラム開発ツールとしては、Arduino IDEを使用しました。ステッピングモータの駆動にArduino言語のStepperライブラリーを使用しました。
表1にStepperライブラリの概略を示します。
関数 | 説明 |
Stepper(steps, pin1, pin2, pin3, pin4) | steps: 1回転あたりのステップ数(int) pin1,pin2: モータに接続されているピンの番号 pin3,pin4: 4ピンのモータの場合のピン番号 戻り値: 作成されたインスタンス |
Stepper:setSpeed(rpms) | rpms:モータの回転速度。1分間あたり何回転するかを正の数で設定。(long) step()をコールしたときのスピードをセットする。 |
Stepper:step(steps) | steps:モータが回転する量(ステップ数)。逆回転させる場合は負の値を設定。(int) 回転が終了するまで関数を抜け出ない。 |
プログラムNo.1
最初に2個のステッピングモータを512ステップ(90°)づつ交互に動かすプログラムを示します。
モータNo.1回転のstep()関数の次にモータNo.2回転のstep()関数を実行した場合に、step()関数は指定したステップ数回転終了するまで抜け出ないので、モータNo.1の回転が終了した後にモータNo.2が回転します。
//-----ステッピングモータ2個交互回転テストソフト-----
#include <Stepper.h>
Stepper stepper_1(2048, 0, 2, 1, 3); //モータNo.1設定(1回転2048ステップ)
Stepper stepper_2(2048, 4, 6, 5, 7); //モータNo.2設定(1回転2048ステップ)
void setup() {
pinMode(15, INPUT_PULLUP); //GP15を入力端子に設定(スイッチ接続)
stepper_1.setSpeed(14); //モータNo1回転スピードを14RPMへ
stepper_2.setSpeed(14); //モータNo2回転転スピードを14RPMへ
}
void loop() {
while (true){
//スイッチ読込(LOW判断)
if (digitalRead(15) == LOW){
break;
}
}
stepper_1.step(512); //モータNo1回転 (1/4回転)
stepper_2.step(512); //モータNo2回転 (1/4回転)
}
プログラムNo.2
プログラムNo.1の場合step()関数が回転終了するまで抜け出ないので、2個のモータを同時には動作出来なかったので、移動量1~2ステップ程度のstep()関数を2個のモータに交互に実行して、2個のモータが同時に動いているように見えるプログラムを作成してみました。
2個のモータが同時に45°回転するプログラムを下記に示します。step()関数の移動量を変えることによって、2個のモータの回転量を変えることが出来ます。動画ではモータNo.2のstep()関数のステップを2にした時と4にした時の動作も撮影しました。
このプログラムの場合のモータの回転速度はsetSpeed()関数では決まりません。delayMicroseconds()関数で次のステップへ移行するまでの待ち時間によって決まります。setSpeed()関数は、step()関数が早く抜け出るように大きめに設定する必要があります。
それぞれのモータに対するstep()関数の実行数を変えたり、微小移動ステップ数を変えることによって、2個のモータを別々の速度で動作させることも可能です。
//-----ステッピングモータ2個同時駆動テストソフト-----
#include <Stepper.h>
Stepper stepper_1(2048, 0, 2, 1, 3); //モータNo1設定(1回転2048ステップ)
Stepper stepper_2(2048, 4, 6, 5, 7); //モータNo2設定(1回転2048ステップ)
void setup() {
pinMode(15, INPUT); //GP15を入力端子に設定(スイッチ接続)
stepper_1.setSpeed(14); //モータNo1回転スピードを14RPMへ
stepper_2.setSpeed(14); //モータNo2回転スピードを14RPMへ
}
void loop() {
while (true){
//スイッチ読込(LOW判断)
if (digitalRead(15) == LOW){
break;
}
}
//512ステップ回転
for(int i = 0; i < 512; i++){
stepper_1.step(1); //モータNo1回転(1ステップ)
stepper_2.step(1); //モータNo2回転(1ステップ)
delayMicroseconds(2000); //2msec待ち
}
}
動作状態動画
動作状態の動画です。2個のモータの交互起動と2個のモータの同時起動でそれぞれの移動量の異なる場合を撮影しました。
最後に
Raspberry Pi Pico Wに2個のステッピングモータを接続して、プログラムにStepperライブラリーを使用して、2個のモータを同時動作することが出来ました。
2個のモータを同時に動かすためにはstep(steps)のstepsを小刻みにして、交互に小刻みに動かす工夫が必要です。
今後は2個のステッピングモータを使用した直線補間や円弧補間に関してプログラムを組み、実験したいと思います。