fum125’s diary

IT全般に関する技術メモなど

ステッピングモーター SPG20-1332 を DRV8835 で回してみる

以前、ステッピングモーター 28BYJ-48 の制御レポートについて書きましたが、実はモーター SPG20-1332 も購入していました。
モーターにタイヤを装着して、移動の制御も考えていたのですが、28BYJ-48 は仕様に「2相励磁で無負荷の最高回転数は4秒で1回転」と書かれていました。遅すぎる。。。

そんな訳で、SPG20-1332 を追加購入していたので、こちらのモーターの制御も試してみます。

SPG20-1332 について

SPG20-1332 は、28BYJ と同じく「ユニポーラステッピングモーター」です。
各コイルの真ん中に接続される端子 (φ1C と φ2C) が独立しているので、モーターには全部で6本の端子があります。

f:id:fum125:20180715204524p:plain

f:id:fum125:20180715204551p:plain

SPG20 も「バイポーラステッピングモーター」として使用したいため、黒 (φ1c) と青 (φ2C) の2本は使用しないようにしました。

SPG20 と DRV8835 の接続

モーターとドライバ間の接続も、28BYJ と同じにしました。

f:id:fum125:20180715205535p:plain

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番ピンとなっています。

f:id:fum125:20180624210941p:plain

各ピンの意味は以下の表のとおりです。

f:id:fum125:20180624211322p:plain

まずは 12番 VCC に DRV8835 を動作させるためのロジック電源 5V を入力します。
これはラズパイの2番ピンからもらってきました。

f:id:fum125:20180624212410p:plain

モード設定は両方を試してみた。

次に 11番の MODE ですが、「IN/INモード」で動かすときは L (0)、「Phase/Enable モード」で動かすときは H (1) を入力します。

さて、どっちのモードが正解でしょう?
2つのモードの違いは「IN/INモードには Coast (空転)」があることですが、ステッピングモータにおける使いみちが分かりません。
他の方の使用例を見ると、VCC と同じ 5V を入力して「Phase/Enable モード」にしたり、何も接続せずに「IN/INモード」にしたりといった接続図を見ます。
今回、私の試験では両モードを試してみたいため、ラズパイ11番 (GPIO17) をつなげて SW からモード切替ができるようにしておきました。

f:id:fum125:20180624212917p:plain
f:id:fum125:20180624214923p:plain

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

f:id:fum125:20180624221909p:plain

モータ電源

1番のモータ電源は、過電流でラズパイが壊れないように、ラズパイとは別の電源から5Vを取っておきました。

f:id:fum125:20180624222722p:plain

28BYJ-48

DRV8835 の 2, 3, 4, 5番に、モータを接続します。
28BYJ がバイポーラ型ステッピングモータとして使えるという前提で、下図のように接続します。

f:id:fum125:20180624223120p:plain

DRV8835 28BYJ-48
AOUT1 (2) ピンク 2
AOUT2 (3) 橙 4
BOUT1 (4) 黄 5
BOUT2 (5) 青 1

赤3は何も接続しません。

GND

このDRV8835 には、ロジック電源とモータ電源の2つが +5V として接続されています。
こういう場合って、GND は下図のような接続でいいのかな?
(こういう基本的なところが、まだしっかりと理解できていません。。。)

f:id:fum125:20180624224236p:plain

さて、これで配線は全部終わりました。
次回、いよいよラズパイからモータを動かしてみます。

ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (3)

ユニポーラステッピングモーターについて、きちんと勉強する

ステッピングモーターをどうやって制御したらいいのか? 知識不足のまま買ってしまったので、あらためてきちんと勉強することにしました。

以下、いろいろなサイトや書籍を見て、自分なりの解釈をまとめてみました。

※ ご注意 ... 以下、自分なりに考えた「推測」の部分にも「~である」と断定形で書いてしまっているところがあります。もし間違っている箇所がありましたら、後追いになりますが訂正していきます。。

28BYJ の概略図

まずは 28BYJ の配線図です。

f:id:fum125:20180620233851p:plain

多くのサイトで調べて、このモーターは「コイルはバイファイラ巻き」の「ユニポーラステッピングモータ」であることは分かります。
しかし、実際にモーターの中でどのような構造になっているかが想像つかないため、モータードライバとどのような接続・制御にすればよいかを理解することができませんでした。

バイファイラ巻き

いろいろと調べて、「パイファイラ巻き」の「ユニポーラステッピングモータ」とはこういうことなんだなぁと解釈しました。

まず、芯の周りを1本のコイルで巻いています。
ここに真ん中の端子から電流を流すと、芯の下側はS極になります。 (下図)

f:id:fum125:20180620234748p:plain

芯の周りに、今度は電流の流れが逆向きになるように巻きます。
真ん中の端子から電流を流すと、こんどは芯はN極になります。 (下図)

f:id:fum125:20180620235206p:plain

この赤線と青線をまとめて芯に巻けば、バイファイラ巻きだと。
真ん中の端子から電流を流し、赤線を流れるようにすればN極になり、青線を流れるようにすればS極になります。
もちろん、赤線と青線の両方に同時に流すような制御をしてはいけません。

f:id:fum125:20180620235821p:plain


28BYJ の製品仕様を見てみる

では、28BYJ は実際にはどうなっているのでしょう?

28BYJ で検索をかけていると、アルモテクノス社さんのモータカタログを見つけました。
ここが 28BYJ を扱っているメーカーさんのサイトなんでしょうかね?

http://www.almotechnos.co.jp/motor1711.pdf

f:id:fum125:20180623091623p:plain

なるほど~。 28BYJ-48-5 というのは、「外寸 28mm、PM型、48ステップ、5V」という意味なんですね。
ん? PM 型?

PM型って?

PM とは "permanent magnet" の略でした。
永久磁石を使っているモータのことらしいです。

このうち、28BYJ は「クローポール型PMステッピングモータ」です。
コイルの部分が三角形の爪の形をしていて、永久磁石と引き合いながら回転します。

バイポーラ型として使えるのかな?

ここからは疑問で、まだ答えにたどり着けていません。

「ユニファイラ巻き」の「バイポーラ型ステッピングモータ」は、1本のコイルに対して、電気を流す向きを変えることでN極/S極を切り替えています。

f:id:fum125:20180621000803p:plain

「バイファイラ巻き」の「ユニポーラ型テッピングモータ」も、真ん中の端子を無視してしまえば、構造は「ユニファイラ巻き」の「バイポーラ型ステッピングモータ」と構造は同じになります。

f:id:fum125:20180621002023p:plain

f:id:fum125:20180621043518p:plain

では、28BYJ も同じように「バイポーラ型ステッピングモータ」として使えるのでしょうか???
(これは分かり次第、更新します)

ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (2) - 失敗談

DRV8835 と 28BYJ をどうやってつなぐの?

今回は、シロートがやらかしかけた失敗なので、参考にはされないように。
ラズパイと DRV8835 間の接続はそれほど難しくありませんが、DRV8835 と 28BYJ 間の接続がまったく分からない。。

シロートは最初、こんな風に考えてしまいました。

まずは "赤3"。ここには 外部電源から取ってきた +5V を繋げばいいんだろーなー。
で、残り4本あって、 "2と4" がコイルA側の配線。"1と5" がコイルB側の配線ということか???

f:id:fum125:20180619221818p:plain

次に、DRV8835 の端子を見てみた。
AOUT1, AOUT2, BOUT1, BOUT2 という名前の端子があるなー。
これをそれぞれモーターにつなげばいいのかなー???

赤3から入ってきた +5V 電流が、2,4,5,1のどこかから出ていくことで、モーターの回転を制御するのかな?と想像しました。

f:id:fum125:20180620061117p:plain

いや、でもおかしい。。。
DRV8835 のブロックダイアグラムというのを見ると、とてもそんな風な仕組みとは思えない。

もしバイポーラステッピングモーターの場合は、コイルAの両端を AOUT1 と AOUT2 につなぐみたい。

f:id:fum125:20180619224303p:plain

ユニポーラステッピングモータを、「4個のDCモーター」と見立てれば、下のような配線で動かせるのかな???
でも、これだと DRV8835 が2個必要だし、そもそもちゃんと動くのか分からない。

f:id:fum125:20180620061730p:plain

ステッピングモーターについて勉強

本番一発勝負で壊しては困るので、「DRV8835 は将来 DC モーターを制御するときまで置いておくか」と諦めました。
次に出張で秋葉に行く機会までに、ユニポーラ用のドライバは何を買えばよいか、ちゃんと勉強しておこうと。

結果、DRV8835 でも 28BYJ は動かせたのですが、調査結果は次回に。

ステッピングモーター 28BYJ-48 を DRV8835 で回してみる (1)

モータードライバ DRV8835 と悪戦苦闘

秋月電子に行ったときに、パーツまとめ買いでステッピングモーター 28BYJ-48 を購入。

  • モーターを動かす時には、ラズパイの GPIO ピンから直接電気を取ると、許容範囲の電流を超えるのでラズパイが壊れる。
  • モーターを動かすには、モータードライバを使ったほうがいい。

という俄か知識で買ったのが、モータードライバ DRV8835 でした。

akizukidenshi.com

買って帰った後に、28BYJ-48 は「2相ユニポーラのステッピングモーター」、DRV8835 は「2個のDCモーターか、または1個の2相バイポーラステッピングモーター」を制御するドライバと知り、ここから悪戦苦闘するハメに。。。

次回、超シロートがやらかしそうになった失敗談について書きます。

センサーまとめ買い

センサーとパーツのまとめ買い

電子パーツを買える機会が滅多にないため、秋葉に行けるときにはまとめ買いです。

  • いつ使うか分からないけど、抵抗、トランジスタコンデンサは各種。
  • 匂いセンサ、加速度・ジャイロセンサ、距離センサ、温度湿度気圧センサ、光センサ
  • 赤外線送信、受信
  • モータドライバ、サーボ、ステッピングモータ
  • アンプ、スピーカ
  • 2行LCD

などなど、節操なくいろいろと買いためました。
しかも、パーツを買うこと自体が目的になってしまい、新品手つかずのままの大量パーツが、道具箱に満載です。

正直、回路を組むのを失敗して、ラズパイを壊してしまうかも、、、という怖さもあって手つかずになっているところもあるのですが、そろそろ次回は組み立てに挑戦したいと思います。

(回路図見て、購入品のリストを作って、秋葉に買いに行くまでが結構楽しかったりする)