ステッピングモーター制御ライブラリを作りたい(その4)「28BYJ-48とDVDのモーターをArduinoで回す。」

その1はこちらです。

 ライブラリがどうにか形になりました。ライブラリのテスト用に注文した28BYJ-48と、DVDのレーザー移動用ステッピングモーターを使います。ということで、ライブラリの説明より前にステッピングモーターをコントロールする回路の説明から入ります。今回は複雑にしないためにも制作中のライブラリは使わないで行います。
 ここでは細かい説明はしないので114.ステッピングモータを動かすこちらのページが参考になると思うので、ぜひ読んでみてください。

28BYJ-48を回す

 28BYJ-48のモジュールのIN1 IN2 IN3 IN4をそれぞれ9 10 11 12に割り当てました。このモーターは5端子のユニポーラ型なので、モジュールと言ってもただのトランジスタの集合です。ユニポーラは回路が単純なので扱いやすいですね!

ソース

gist.github.com  このソースですが、私はArduinoIDEではなくplatformIOにてC言語で開発しているため、先頭にincludeがありますが不要な場合は除いてください。
 今回は1-2相励磁で回しているので、1-2相励磁で刻むように上に配列を定義しています。回転はstep関数で行っています。stepの引数には方向を示すint dを与えます。1-1です。
 stepごとに挟んでいるdelayMicrosecondsですが、ここでは900にしています。このモーターは900位が限界っぽいです。

動画

www.youtube.com

DVD用ステッピングモーターを回す

 DVD用ステッピングモーターはバイポーラ型なので、28BYJ-48に比べて回路が面倒です。今回ステッピングモーター用のICを持っていなかったので困りました。ただ、Hブリッジが二つあれば良いので探していたら家にありました。TA7291Pです。正転反転できるタイプのモータードライバでPWMで速度も変えられます。が、今回はこれをただのHブリッジとして使います。 f:id:takumus:20160913185640j:plain f:id:takumus:20160913182917p:plain  こんな感じの回路になりました。多分TA7291Pを二つも使ってステッピングモーターを回すという、もったいないことをしたのは僕くらいだと思います!
 回路を裏から見た図です。少し灰色の線は表側を通しているという意味です。また、TA7291Pの向きですが、左上が少し欠けているのでそれが目印です。
 そこそこ適当な回路ですが動作確認は取れました。図の左側が入力、右側が出力です。左側の+1 +2 -ですが、モーターを外部電力で回す場合は+1には外部を入れ、+2にはArduinoを入れます。GNDはどちらも-へつなぎます。入力のA1 A2 B1 B2ですが、ArduinoへはA1 B1 A2 B2の順番で9 10 11 12へ繋ぎました。
 今回のような小さなモーター(大きさで判断するのは良くない)は大したことなさそうだったので、+1 +2を一緒にして両方ともArduinoに繋ぎましたが問題なく動作しました。

ソース

 28BYJ-48と同様ですがこっちのモーターは低速回転なので、delayMicromecondsが900だと完全に脱調しました。最低でも2000が安定するようです。

動画

www.youtube.com

次回

次回は制作中のライブラリを実際に使ってみます。

その5はこちらです。

ステッピングモーター制御ライブラリを作りたい(その3)「最大速度」

その1はこちらです。

 前回の記事で、S字と台形を使って滑らかな加減速を行う手法を説明しました。S字も台形も、加速に30ステップ、減速に30ステップを使っています。つまり、今の仕様のままだと最低でも合計60ステップ最低でも必要になるのです。
 例えば、前回と同じ仕様のモーター(1ステップ1.8度)だと、90度動かすのに50ステップですが、加速減速合わせて60ステップ使うのでおかしなことになります。では実際に見てみましょう。

台形型

f:id:takumus:20160911200033g:plain  90度は50ステップですので、最大速度に達する(30ステップ)事が出来ても、減速分のステップ(30ステップ)が足りないので、おかしなグラフになっています。今の仕様のままでは最低でも60ステップ分の移動がないと回転できない事になります。

S字型

f:id:takumus:20160911200034g:plain  S字も同じです。台形をベースに作っているので、同じく減速分が足りていません。

ステップが足りない場合はどうすれば良いか!

 足りないステップを無理やり足らせる方法もあります。傾斜を急にすれば良いのです。しかし、傾斜が急になればなるほど脱調の可能性は上がってしまうので、だめです。
 もう一つの方法は最大速度を下げる方法です。そもそも無理して最大速度に達しなくて良いのです。傾斜はそのままで、加減速分のステップに足りる分の、可能な限りの最大速度を計算します。今回はこの方法で行きたいと思います。

最大速度を下げる

最大速度を下げるように改良したバージョンを作りました。

台形型

f:id:takumus:20160911200035g:plain

S字型

f:id:takumus:20160911200036g:plain  アニメーションの通り、最初180度で回したときは最大速度に達して回りますが、90度で回したときは、最大速度を下げて回ります。こうすることで、加減速の傾斜を変えることなく、どのような角度に対しても緩やかに移行できます。
 どれだけ下げるべきかは、一次関数による簡単な式で導く事が出来ます。本当はもう少し細かい計算をしているのですが、後日ソースコードを公開するつもりです。  まだステッピングモーター現物を扱ったことがないのに色々と書いてしまいましたが、明日届くはずなので試したいです。これらのアニメーションはflashで作っています。アニメーションというか疑似ステッピングモーターを実際に制御するプログラムは書いているので、これをArduino(C++)へ移植してちゃんと動いてくれれば嬉しいです。

その4はこちらです。

ステッピングモーター制御ライブラリを作りたい(その2)「脱調を防ぐ方法」

その1はこちらです。

 前日、ステッピングモーターと、脱調について簡単な説明をしました。前日の説明と被りますが、

主な脱調の原因は

  1. 完全停止状態からの急発進。
  2. 高速回転中の急停止。
  3. 電気信号を送る間隔を短くしすぎる。
  4. とても重い物を動かす。

と言われています。
 cについては、電気信号を送る(以降ステップと呼びます)間隔を短くしすぎなければ良いですし、dは重い物を動かすことが出来るモーターを選べばよい話です。a bは、簡単に解決できる問題ではないので、今回から考えていきます。

急発進・急停止をしない工夫

 急発進・急停止はしないようにする方法はいくつか方法があります。その説明のために、前日のと同じく1ステップ1.8度のモーターを例に挙げます。

180度を急発進・急停止

f:id:takumus:20160911135302g:plain  これはflashでシミュレーションしたステッピングモーターなので脱調は起こりませんが、急加速、急停止をしていることが分かります。実際にこれを行うと、脱調してしまうかもしれません。

180度を徐々に発進・徐々に停止(台形型)

f:id:takumus:20160911140028g:plain  次は、徐々に加速し、徐々に減速するようにしました。これはステッピングモーター制御で良く行われる方法のひとつです。今回は、30ステップ分を加速と減速のために使っています。合計60ステップです。こうすることで、急な加速と停止は少なくなりました。しかし、台形の上辺の頂点に当たる部分で加速の大きな変化があります。これもまだ脱調の心配があるのです。それも無くしたいです。

180度を徐々に発進・徐々に停止(S字型)

f:id:takumus:20160911141255g:plain  台形での加速の変化をさらに少なくした物がこれです。今回はcos波を使って再現したのでカーブがやや急ですが、その辺は検証しながら調整したいと思います。(未だ実物を持っていないので笑)台形と同じく、30ステップ分を加速と減速に使っています。台形に比べて角が取れています。つまり急な速度変化が無くなったので脱調の可能性はグンと下がりました。

今回はここまで

 です。
 脱調が起きる原因と、それを防ぐいくつかの方法を紹介しました。このままではまだ問題があるので、次回その問題の解決を考えていきます。

その3はこちらです。