ステッピングモーター SPG20-1332 を DRV8835 で回してみる
以前、ステッピングモーター 28BYJ-48 の制御レポートについて書きましたが、実はモーター SPG20-1332 も購入していました。
モーターにタイヤを装着して、移動の制御も考えていたのですが、28BYJ-48 は仕様に「2相励磁で無負荷の最高回転数は4秒で1回転」と書かれていました。遅すぎる。。。
そんな訳で、SPG20-1332 を追加購入していたので、こちらのモーターの制御も試してみます。
SPG20-1332 について
SPG20-1332 は、28BYJ と同じく「ユニポーラステッピングモーター」です。
各コイルの真ん中に接続される端子 (φ1C と φ2C) が独立しているので、モーターには全部で6本の端子があります。
SPG20 も「バイポーラステッピングモーター」として使用したいため、黒 (φ1c) と青 (φ2C) の2本は使用しないようにしました。
SPG20 と DRV8835 の接続
モーターとドライバ間の接続も、28BYJ と同じにしました。
DRV8835 | SPG20-1332 |
AOUT1 (2) | φ1 白 |
AOUT2 (3) | /φ1 黄 |
BOUT1 (4) | φ2 赤 |
BOUT2 (5) | /φ2 緑 |
1相励磁でモータを回してみる
使用するソースは、28BYJ の時に使用したものを流用です。
ただし、SPG20 は軸1回転が 480 ステップなので、for ループの回数だけ 120 (=480÷4) に変更しました。
# インターバルを 5ミリ秒とする。 intval = 0.005 for i in range(0, 120): # 以下の4ステップを 120回 (= 480÷4) まわす。 : (あとは同じ)
1周回すのに、約 3.2 秒かかりました。
もっと速く回せないかとインターバル値を小さくしてみましたが、限界は 4ms で 2.8秒。
インターバル値をそれ以上小さくすると、今度は脱調してモーターが回らなくなりました。
2相励磁でモータを回してみる
今度は 2相励磁で回してみます。
1周回すのに、約 3.2 秒かかりました。
インターバル値を小さくしてみると、今度は 2ミリ秒まで脱調せずに回りました。
トルクがかかるとどうなるか分かりませんが、インターバル値 2ms で 約1.6秒で1周回すことができました。
1-2相励磁でモータを回してみる
最後に 1-2相励磁で回してみます。
1周回すのに、約 5.9 秒かかりました。
インターバル値を小さくしていくと、限界は 2ms で1周2.9 秒でした。
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (5)
pigpio を使ってみた。
今回、GPIO の制御に pigpio を使ってみます。
下準備
さて、まずは pigpio ライブラリをダウンロード&インストールしておきます。
$ sudo apt install pigpio
次に、pigpiod デーモンを動かしておきます。
$ sudo pigpiod
以上で下準備はOKです。
初期化処理
- pigpio を使うように初期設定しておきます。
- ラズパイ 17番ピンを MODE 設定用として使います。また、27、22、23、24番ピンをモータ制御用に使うように宣言しておきます。
- MODE = 0 を設定します。
import pigpio from time import sleep pi = pigpio.pi() # 使用するピン番号に名前を付けておきました。 MODE = 17 # IN/IN(0) まはた Phase/Enable(1) モードの切り替え用 AIN1 = 27 # GPIO27 - A IN 1 の制御用 AIN2 = 22 # GPIO22 - A IN 2 の制御用 BIN1 = 23 # GPIO23 - B IN 1 の制御用 BIN2 = 24 # GPIO24 - B IN 2 の制御用 # 各GPIOピンを、出力用として使用することを指定しておきます。 pi.set_mode(MODE, pigpio.OUTPUT) pi.set_mode(AIN1, pigpio.OUTPUT) pi.set_mode(AIN2, pigpio.OUTPUT) pi.set_mode(BIN1, pigpio.OUTPUT) pi.set_mode(BIN2, pigpio.OUTPUT) # MODE = 0 で使用します。 pi.write(MODE, 0)
1相励磁でモータを回してみる
最初は1相励磁で回してみました。
A → B → /A → /B の順番に 1 を送ってみます。
sleep 間隔は、脱調しないか様子を見ながら、適当に調整です。
このモータは出力軸1周が2048ステップだから、for ループを 2048÷4=512 回せば、出力軸1周するはずです。
# インターバルを 5ミリ秒とする。 intval = 0.005 for i in range(1, 512): # 以下の4ステップを 512回 (= 2048÷4) まわす。 # A を 5ms ON にする。 pi.write(AIN1,1) sleep(intval) pi.write(AIN1,0) # B を 5ms ON にする。 pi.write(BIN1,1) sleep(intval) pi.write(BIN1,0) # /A を 5ms ON にする。 pi.write(AIN2,1) sleep(intval) pi.write(AIN2,0) # /B を 5ms ON にする。 pi.write(BIN2,1) sleep(intval) pi.write(BIN2,0)
想定通り、1周回りました。
計算上は 0.005秒×2048 = 10.24秒かかるはずですが、実測では約14.3秒かかりました。
2相励磁でモータを回してみる
今度は2相励磁で制御してみます。
各出力を2個ペアにして、「A+B → B+/A → /A+/B → /B+A」の順番に1を送ってみます。
出力軸1周のステップ数は一相励磁と同じはずなので、for ループを 2048÷4=512回まわしてみます。
# インターバルを 5ミリ秒とする。 intval = 0.005 # 都合上、最初に A だけ ON にしておく。 pi.write(AIN1,1) for i in range(1, 512): # A と B だけ ON にする。 既にA はON済なので、B を ON にする。 pi.write(BIN2,0) pi.write(BIN1,1) sleep(intval) # B と /A だけ ON にする。既にB はON済なので、/A を ON にする。 pi.write(AIN1,0) pi.write(AIN2,1) sleep(intval) # /A と /B だけ ON にする。既に/A はON済なので、/B を ON にする。 pi.write(BIN1,0) pi.write(BIN2,1) sleep(intval) # /B と A だけ ON にする。既に/B はON済なので、A を ON にする。 pi.write(AIN2,0) pi.write(AIN1,1) sleep(intval)
二相励磁も、期待通りに回りました。
こちらも、1周回るのに 約14.2秒かかっています。
1-2相励磁でモータを回してみる
最後に、1-2相励磁で制御してみます。
2相励磁のパターンに、1相の処理を入れていきます。
まぁ、先の2相励磁も、瞬間的には1-2相励磁になってはいるのですが。
# インターバルを 5ミリ秒とする。 intval = 0.005 # 都合上、最初に /B だけ ON にしておく。 pi.write(BIN2, 1) for i in range(1, 512): # A を ON にする。 -> これで /B と A が ON になる。 pi.write(AIN1,1) sleep(intval) # /B を OFF にする。 -> これで、A だけが ON になる。 pi.write(BIN2,0) sleep(intval) # B を ON にする。 -> これで A と B が ON になる。 pi.write(BIN1,1) sleep(intval) # A を OFF にする。 -> これで、B だけが ON になる。 pi.write(AIN1,0) sleep(intval) # /A を ON にする。 -> これで、B と /A が ON になる。 pi.write(AIN2,1) sleep(intval) # B を OFF にする。 -> これで、/A だけが ON になる。 pi.write(BIN1,0) sleep(intval) # /B を ON にする。 -> これで、/A と /B が ON になる。 pi.write(BIN2,1) sleep(intval) # /A を OFF にする。 -> これで、/B だけが ON になる。 pi.write(AIN2,0) sleep(intval)
1-2相励磁も、期待通りに回りました。
こちらは、1周回るのに 約25.3 秒かかっています。
とりあえず、ここまでで無事にモータを回すことができました!
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (4)
配線してみます
では、28BYJ-48 をバイポーラ型ステッピングモータと見立てて、DRV8835 と繋いでみます。
まだ不慣れなため、一つずつ整理しながら進めていきます。
まずは、ドライバ制御用の5V電源から。
DRV8835 の印を上に向けると、左上から反時計回りに1番~12番ピンとなっています。
各ピンの意味は以下の表のとおりです。
まずは 12番 VCC に DRV8835 を動作させるためのロジック電源 5V を入力します。
これはラズパイの2番ピンからもらってきました。
モード設定は両方を試してみた。
次に 11番の MODE ですが、「IN/INモード」で動かすときは L (0)、「Phase/Enable モード」で動かすときは H (1) を入力します。
さて、どっちのモードが正解でしょう?
2つのモードの違いは「IN/INモードには Coast (空転)」があることですが、ステッピングモータにおける使いみちが分かりません。
他の方の使用例を見ると、VCC と同じ 5V を入力して「Phase/Enable モード」にしたり、何も接続せずに「IN/INモード」にしたりといった接続図を見ます。
今回、私の試験では両モードを試してみたいため、ラズパイ11番 (GPIO17) をつなげて SW からモード切替ができるようにしておきました。
AIN1, AIN2, BIN1, BIN2
これは MODE によって意味が異なってきます。
しかし、4本のGPIOピンを使って制御する、ということは変わりませんので、ラズパイの13,15,16,18番 (GPIO27, 22, 23, 24) をそれぞれ接続しました。
DRV8835 | ラズパイpin | GPIO | MODE=0 | MODE=1 |
AIN1 (10) | 13 | GPIO 27 | A IN 1 | A Phase |
AIN2 (9) | 15 | GPIO 22 | A IN 2 | A Enable |
BIN1 (8) | 16 | GPIO 23 | B IN 1 | B Phase |
BIN2 (7) | 18 | GPIO 24 | B IN 2 | B Enable |
モータ電源
1番のモータ電源は、過電流でラズパイが壊れないように、ラズパイとは別の電源から5Vを取っておきました。
28BYJ-48
DRV8835 の 2, 3, 4, 5番に、モータを接続します。
28BYJ がバイポーラ型ステッピングモータとして使えるという前提で、下図のように接続します。
DRV8835 | 28BYJ-48 |
AOUT1 (2) | ピンク 2 |
AOUT2 (3) | 橙 4 |
BOUT1 (4) | 黄 5 |
BOUT2 (5) | 青 1 |
赤3は何も接続しません。
GND
このDRV8835 には、ロジック電源とモータ電源の2つが +5V として接続されています。
こういう場合って、GND は下図のような接続でいいのかな?
(こういう基本的なところが、まだしっかりと理解できていません。。。)
さて、これで配線は全部終わりました。
次回、いよいよラズパイからモータを動かしてみます。
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (3)
ユニポーラステッピングモーターについて、きちんと勉強する
ステッピングモーターをどうやって制御したらいいのか? 知識不足のまま買ってしまったので、あらためてきちんと勉強することにしました。
以下、いろいろなサイトや書籍を見て、自分なりの解釈をまとめてみました。
※ ご注意 ... 以下、自分なりに考えた「推測」の部分にも「~である」と断定形で書いてしまっているところがあります。もし間違っている箇所がありましたら、後追いになりますが訂正していきます。。
28BYJ の概略図
まずは 28BYJ の配線図です。
多くのサイトで調べて、このモーターは「コイルはバイファイラ巻き」の「ユニポーラステッピングモータ」であることは分かります。
しかし、実際にモーターの中でどのような構造になっているかが想像つかないため、モータードライバとどのような接続・制御にすればよいかを理解することができませんでした。
バイファイラ巻き
いろいろと調べて、「パイファイラ巻き」の「ユニポーラステッピングモータ」とはこういうことなんだなぁと解釈しました。
まず、芯の周りを1本のコイルで巻いています。
ここに真ん中の端子から電流を流すと、芯の下側はS極になります。 (下図)
芯の周りに、今度は電流の流れが逆向きになるように巻きます。
真ん中の端子から電流を流すと、こんどは芯はN極になります。 (下図)
この赤線と青線をまとめて芯に巻けば、バイファイラ巻きだと。
真ん中の端子から電流を流し、赤線を流れるようにすればN極になり、青線を流れるようにすればS極になります。
もちろん、赤線と青線の両方に同時に流すような制御をしてはいけません。
28BYJ の製品仕様を見てみる
では、28BYJ は実際にはどうなっているのでしょう?
28BYJ で検索をかけていると、アルモテクノス社さんのモータカタログを見つけました。
ここが 28BYJ を扱っているメーカーさんのサイトなんでしょうかね?
http://www.almotechnos.co.jp/motor1711.pdf
なるほど~。 28BYJ-48-5 というのは、「外寸 28mm、PM型、48ステップ、5V」という意味なんですね。
ん? PM 型?
PM型って?
PM とは "permanent magnet" の略でした。
永久磁石を使っているモータのことらしいです。
このうち、28BYJ は「クローポール型PMステッピングモータ」です。
コイルの部分が三角形の爪の形をしていて、永久磁石と引き合いながら回転します。
バイポーラ型として使えるのかな?
ここからは疑問で、まだ答えにたどり着けていません。
「ユニファイラ巻き」の「バイポーラ型ステッピングモータ」は、1本のコイルに対して、電気を流す向きを変えることでN極/S極を切り替えています。
「バイファイラ巻き」の「ユニポーラ型テッピングモータ」も、真ん中の端子を無視してしまえば、構造は「ユニファイラ巻き」の「バイポーラ型ステッピングモータ」と構造は同じになります。
では、28BYJ も同じように「バイポーラ型ステッピングモータ」として使えるのでしょうか???
(これは分かり次第、更新します)
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (2) - 失敗談
DRV8835 と 28BYJ をどうやってつなぐの?
今回は、シロートがやらかしかけた失敗なので、参考にはされないように。
ラズパイと DRV8835 間の接続はそれほど難しくありませんが、DRV8835 と 28BYJ 間の接続がまったく分からない。。
シロートは最初、こんな風に考えてしまいました。
まずは "赤3"。ここには 外部電源から取ってきた +5V を繋げばいいんだろーなー。
で、残り4本あって、 "2と4" がコイルA側の配線。"1と5" がコイルB側の配線ということか???
次に、DRV8835 の端子を見てみた。
AOUT1, AOUT2, BOUT1, BOUT2 という名前の端子があるなー。
これをそれぞれモーターにつなげばいいのかなー???
赤3から入ってきた +5V 電流が、2,4,5,1のどこかから出ていくことで、モーターの回転を制御するのかな?と想像しました。
いや、でもおかしい。。。
DRV8835 のブロックダイアグラムというのを見ると、とてもそんな風な仕組みとは思えない。
もしバイポーラステッピングモーターの場合は、コイルAの両端を AOUT1 と AOUT2 につなぐみたい。
ユニポーラステッピングモータを、「4個のDCモーター」と見立てれば、下のような配線で動かせるのかな???
でも、これだと DRV8835 が2個必要だし、そもそもちゃんと動くのか分からない。
ステッピングモーターについて勉強
本番一発勝負で壊しては困るので、「DRV8835 は将来 DC モーターを制御するときまで置いておくか」と諦めました。
次に出張で秋葉に行く機会までに、ユニポーラ用のドライバは何を買えばよいか、ちゃんと勉強しておこうと。
結果、DRV8835 でも 28BYJ は動かせたのですが、調査結果は次回に。
ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (1)
モータードライバ DRV8835 と悪戦苦闘
秋月電子に行ったときに、パーツまとめ買いでステッピングモーター 28BYJ-48 を購入。
- モーターを動かす時には、ラズパイの GPIO ピンから直接電気を取ると、許容範囲の電流を超えるのでラズパイが壊れる。
- モーターを動かすには、モータードライバを使ったほうがいい。
という俄か知識で買ったのが、モータードライバ DRV8835 でした。
買って帰った後に、28BYJ-48 は「2相ユニポーラのステッピングモーター」、DRV8835 は「2個のDCモーターか、または1個の2相バイポーラステッピングモーター」を制御するドライバと知り、ここから悪戦苦闘するハメに。。。
次回、超シロートがやらかしそうになった失敗談について書きます。
センサーまとめ買い
センサーとパーツのまとめ買い
電子パーツを買える機会が滅多にないため、秋葉に行けるときにはまとめ買いです。
- いつ使うか分からないけど、抵抗、トランジスタ、コンデンサは各種。
- 匂いセンサ、加速度・ジャイロセンサ、距離センサ、温度湿度気圧センサ、光センサ
- 赤外線送信、受信
- モータドライバ、サーボ、ステッピングモータ
- アンプ、スピーカ
- 2行LCD
などなど、節操なくいろいろと買いためました。
しかも、パーツを買うこと自体が目的になってしまい、新品手つかずのままの大量パーツが、道具箱に満載です。
正直、回路を組むのを失敗して、ラズパイを壊してしまうかも、、、という怖さもあって手つかずになっているところもあるのですが、そろそろ次回は組み立てに挑戦したいと思います。
(回路図見て、購入品のリストを作って、秋葉に買いに行くまでが結構楽しかったりする)