見出し画像

ステッピングモータ 28BYJ-48-W0をNJW4350で動かそうとして四苦八苦した話

はじめに

秋月電子通商で販売されているステッピングモータ 28BYJ-48-W0を現在企画中の製作物に使えないか試してみることになりました。制作物はArduinoで制御する予定ですが、Arduinoでステッピングモータを直接駆動することはできないので、ドライバICで制御します。

ドライバICは、同じく秋月電子通商で販売されている日清紡マイクロデバイス NJW4350です。日本語のデータシートがあるため、容易に制御できるだろうと思ってこのICを選びました。

ところが、制御できるようになるまで一苦労ありました。ターンオフ回路を省いたことが原因でした。本記事はその顛末をまとめたものです。

ユニポーラステッピングモータ 28BYJ-48-W0

ステッピングモータは、パルス信号で回転角度を正確に制御できるモータです。パルス信号の周期(周波数)で回転速度も制御できます。

ステッピングモータには、バイポーラ結線とユニポーラ結線の2種類があり、28BYJ-48-W0はユニポーラ結線です。ステッピングモータの動作原理や、バイポーラ結線とユニポーラ結線の違いは、インターネットで検索すると多くの記事が見つかるので、そちらを参照してください。

ここでは、内部の配線だけを示し、所定の信号を入れると所定の動作をするブラックボックスとして扱います。

28BYJ-48-W0 配線図

28BYJ-48-W0のデータシートによると、逆時計周りに回転させる制御は以下になります。データシートは中国語(簡体字)なので、日本語に合わせて紅→赤、藍→青に直してあります。

$$
\begin{array}{|c|c|c|c|c|c|c|c|c|c|} \hline
\text{ピン} & \text{色} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline
5 & \text{赤} & + & + & + & + & + & + & + & + \\ \hline
4 & \text{橙} & - & - &  &  &  &  &  & - \\ \hline
3 & \text{黄} & & - & - & - &  &  &  &  \\ \hline
2 & \text{桃} &  &  &  & - & - & - &  &  \\ \hline
1 & \text{青} &  &  &  &  &  & - & - & - \\ \hline
\end{array}
$$

わかる人にはこれでよいのですが、初心者にはいまいちわかりにくいので、モータ駆動電圧VMとGNDで書き直します。

$$
\begin{array}{|c|l|c|c|c|c|c|c|c|c|} \hline
\text{ピン} & \text{色} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline
5 & \text{赤}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM} \\ \hline
4 & \text{橙}&\text{GND}&\text{GND}&&&&&&\text{GND} \\ \hline
3 & \text{黄}&&\text{GND}&\text{GND}&\text{GND}&&&& \\ \hline
2 & \text{桃}&&&&\text{GND}&\text{GND}&\text{GND}&& \\ \hline
1 & \text{青}&&&&&&\text{GND}&\text{GND}&\text{GND} \\ \hline
\end{array}
$$

STEP1では橙がGNDなので、赤から橙に電流が流れます。STEP2では橙と黄がGNDなので、赤から橙と黄に電流が流れます。STEP3以降も同じように考えればOKです。橙と青、桃と黄をそれぞれ入れ替えると時計回りになりますが、そのような制御はドライバICに任せるので、ここでは考えません。

NJW4350の動作確認

最初に、ステッピングモータの代わりにLEDを接続して、NJW4350の動作を確認することにしました。

ステッピングモータを駆動する端子のPA1、PA2、PB3、PB4にLEDをつなぎます。これらの端子はオープンドレイン出力なので、LまたはHighインピーダンスのどちらかを取ります。電源がつながれていると、Lでは電流が流れ、Highインピーダンスでは電流が流れません。したがって、電源→LEDアノード→LEDカソード→NJW4350(PA1 or PA2 or PB3 or PB4)の順に接続すれば、Lのときに電流が流れ、LEDが光ります。

STEPはモータのステッピング用のパルス入力端子です。ここにはArduinoで生成したパルス信号を入力します。目視できる速さということで、0.5Hz(2秒で1パルス)にしました。RESETはPA1、PA2、PB3、PB4を初期化する端子です。これもArduinoで制御します。

28BYJ-48-W0のデータシートに記載されている制御は、いわゆるハーフステップモードなので、HSM端子はLにします。INH端子もLにします。これをHにすると、PA1、PA2、PB3、 PB4がすべてOFFになってしまいます。

回転方向を制御するDIR端子はオープンにしておきます。NJW4350はオープン状態をHレベルとして受け取るので、H相当の制御になります。今回は動作確認なので、H、Lのどちらでも構いません。

MO端子は、PA1、PA2、PB3、PB4の出力がイニシャル、すなわち制御シーケンスがちょうど1周(上記の制御の表で8ステップ)するとLになります。ミスステップの防止や機械原点位置の精度向上に役立ちます。今回は使いません。

これらを踏まえて作成した回路が以下になります。220Ωの抵抗はLEDの電流制限抵抗です。PA1、PA2、PB3、PB4端子がそれぞれLになったときにLEDが光ります。回路はブレッドボード上に組みました。電源はUSB充電器です。

NJW4350の動作確認回路
ブレッドボード上に組んだ動作確認回路

このときのArduinoのスケッチです。1秒おきにD2端子のH、Lを繰り返し、NJW4350へのパルスにしています。

int YbkStpSTP = 2;  // STEP
int YbkStpRST = 6;  // RESET

void setup() {
  pinMode(YbkStpSTP, OUTPUT);
  pinMode(YbkStpRST, OUTPUT);
  digitalWrite(YbkStpSTP, LOW);
  digitalWrite(YbkStpRST, LOW);
  delay(1000);
  digitalWrite(YbkStpRST, HIGH);
  delay(2000);
}

void loop() {
    digitalWrite(YbkStpSTP, HIGH);
    delay(1000);
    digitalWrite(YbkStpSTP, LOW);
    delay(1000);
}

各端子に接続されたLEDは以下の表のように動作します。

$$
\begin{array}{|c|c|c|c|c|c|c|c|c|} \hline
\text{端子} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \\ \hline
\text{PB1}&&&&\text{点灯}&\text{点灯}&\text{点灯}&& \\ \hline
\text{PB2}&\text{点灯}&\text{点灯}&&&&&&\text{点灯} \\ \hline
\text{PA1}&&\text{点灯}&\text{点灯}&\text{点灯}&&&& \\ \hline
\text{PA2} &&&&&&\text{点灯}&\text{点灯}&\text{点灯} \\ \hline
\end{array}
$$

点灯は各端子がL、すなわちGNDになったときなので、28BYJ-48-W0の制御表と突き合わせるとこうなります。

$$
\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|} \hline
\text{ピン}&\text{色}&\text{端子}&1&2&3&4&5&6&7&8 \\ \hline
5 & \text{赤}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM}&\text{VM} \\ \hline
4 & \text{橙}&\text{PB2}&\text{GND}&\text{GND}&&&&&&\text{GND} \\ \hline
3 & \text{黄}&\text{PA1}&\text{GND}&\text{GND}&\text{GND}&&&& \\ \hline
2 & \text{桃}&\text{PB1}&&&\text{GND}&\text{GND}&\text{GND}&& \\ \hline
1 & \text{青}&\text{PA2}&&&&&\text{GND}&\text{GND}&\text{GND} \\ \hline
\end{array}
$$

これで28BYJ-48-W0の各ピンをNJW4350のどの端子につなげばよいかわかりました。あとはLEDを28BYJ-48-W0につなぎ変えれば動くはず。このときはそう思っていました。

28BYJ-48-W0の駆動(失敗)

LEDを駆動したArduinoのスケッチは、原理的にはそのまま使えますが、パルスの周期が長すぎて、かなりゆっくりとした回転になってしまいます。

データシートに記載はないのですが、無負荷時の28BYJ-48-W0の回転速度は最大4rpmとのことなので、それよりも少し遅めに回るように、下記の記事をもとにパルスの周期を調整します。

出力軸が1回転するのに必要なステップ数は4,096なので、パルスの周期(=1ステップ)を4ミリ秒にすると、4×4,096=16,384ミリ秒=16.384秒で出力軸が1回転します。つまり3.66rpmです。というわけで、D2端子のH、Lを2ミリ秒毎に繰り返すようにソースコードを変更しました。

int YbkStpSTP = 2;  // STEP
int YbkStpRST = 6;  // RESET

void setup() {
  pinMode(YbkStpSTP, OUTPUT);
  pinMode(YbkStpRST, OUTPUT);
  digitalWrite(YbkStpSTP, LOW);
  digitalWrite(YbkStpRST, LOW);
  delay(1000);
  digitalWrite(YbkStpRST, HIGH);
  delay(2000);
}

void loop() {
    digitalWrite(YbkStpSTP, HIGH);
    delay(2);
    digitalWrite(YbkStpSTP, LOW);
    delay(2);
}

LEDを28BYJ-48-W0に差し替えます。

NJW4350による28BYJ-48-W0の駆動回路(失敗)
ブレッドボード上に組んだ回路(失敗)
左上のLEDは未接続(LEDによる動作確認の名残)

USB充電器を接続してみます。ところが、28BYJ-48-W0の出力軸が回転しません。カタカタ音をさせながら振動はするものの、まったく回る気配がありません。パルスが速すぎるのかと思い、パルスの周期を20ミリ秒にしましたが、状況は変わりません。さて困った。

28BYJ-48-W0の駆動(成功)

NJW4350のデータシートを読み直してみると、基本アプリケーションの図にターンオフ回路としてダイオードが入っています。そこで、同じようにダイオードを入れてみました。

NJW4350による28BYJ-48-W0の駆動回路(成功)
ブレッドボード上に組んだ回路(成功)
左上のLEDは未接続(LEDによる動作確認の名残)

あらためてUSB充電器を接続すると、出力軸が回転しました。ストップウォッチで測ると、およそ16秒で1回転しています。設計通りです。めでたしめでたし。

と、ここで終わるわけにはいきません。ターンオフ回路がない最初の回路ではなぜ動かなかったのか考えなくてはなりません。

あくまで推定ですが、原因は、各端子がOFFになった瞬間に発生する逆起電力だと思われます。この逆起電力によって、28BYJ-48-W0内部の電圧がNJW4350内部のMOSFETのブレークダウン電圧を超えてしまい、すべての端子が電流だだ洩れになっていたのではないかという気がします。測定したわけでないので確証はありませんが。

逆起電力防止のダイオードなんて気休めだと思っていたのですが、きちんと入れるべきだということを痛感しました。

おわりに

28BYJ-48シリーズの駆動回路を検索すると、ULN2003を使ったドライバーボードの作例が多くでてきます。ドライバーボードであれば、このような逆起電力への対策等を気にせずに、Arduinoと28BYJ-48-W0の間に挟めば簡単に動かすことができるはずです。最初からそっちを使えばいいじゃないかという話ですよね。

それはさておき、28BYJ-48-W0は現在企画中の製作物に使えそうなことはわかりました。企画を進めていきたいと思います。

最後までお読みいただき、ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?