« IIJmio ファミリーシェアプランがSIM最大10枚まで対応 | トップページ | 自宅でおもちゃが自作できる!?3Dプリンター”ThingMaker 3D” »

2016年2月27日 (土)

Raspberry Piでステッピングモーター28BYJを使ってみた

Arduino入門用キットを買ったというのに、その部品をRaspberry Piばっかで使っております。まあ、こっちの方が慣れているのでしょうがないですが。

Img_1229

今回使ったのは、真ん中にあるステッピングモーター”28BYJ”。

とりあえず、使い方を学んでおこうかと取り出したのですが、Arduino互換ボード、Raspberry Piと並べて結局Raspberry Piで動かしてみることに。

参考にしたのはこちらのサイト。

Stepper Motor Control In Python

さて、ステッピングモーターとは一体何ができるのか?

マブチモーターのような普通のモーターだと連続回転が可能ですが、回転角を制御することは不可能。

一方、サーボモーターならば角度制御は可能ですが、こちらは連続回転ができません。

この両方の中間のような存在がこのステッピングモーター。パルス信号によって回転角度を制御でき、またモーターのように連続回転も可能です。

ただし通常のモーターのようにトルクはあまり無いようですが。おまけに制御が少々ややこしい。

Img_1230

先のリンク先を参考に、早速回路を組んでみました。

Img_1239

ピンは全部で6本。

”IN1”はRaspberry Piの11番ピン

”IN2”は15番ピン

”IN3”は16番ピン

”IN4”は18番ピン

そしてVCCには百均のスマホ充電専用ケーブルからつくったUSB電源ケーブルの+極を、GNDにはRaspberry Piの6番ピンおよび電源ケーブル-極を接続。

Img_1230_2

こんな感じの回路になります。

Pythonのコードは以下。

#!/usr/bin/python
# Import required libraries
import sys
import time
import RPi.GPIO as GPIO
 
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
 
# Define GPIO signals to use
# Physical pins 11,15,16,18
# GPIO17,GPIO22,GPIO23,GPIO24
StepPins = [17,22,23,24]
 
# Set all pins as output
for pin in StepPins:
 print "Setup pins"
 GPIO.setup(pin,GPIO.OUT)
 GPIO.output(pin, False)
# Define advanced sequence
# as shown in manufacturers datasheet
Seq = [[1,0,0,1],
 [1,0,0,0],
 [1,1,0,0],
 [0,1,0,0],
 [0,1,1,0],
 [0,0,1,0],
 [0,0,1,1],
 [0,0,0,1]]
 
StepCount = len(Seq)
StepDir = 1 # Set to 1 or 2 for clockwise
# Set to -1 or -2 for anti-clockwise
# Read wait time from command line
if len(sys.argv)>1:
 WaitTime = int(sys.argv[1])/float(1000)
else:
 WaitTime = 10/float(1000)
 
# Initialise variables
StepCounter = 0
 
# Start main loop
while True:
 
 print StepCounter,
 print Seq[StepCounter]
 
 for pin in range(0,4):
 xpin=StepPins[pin]# Get GPIO
 if Seq[StepCounter][pin]!=0:
 print " Enable GPIO %i" %(xpin)
 GPIO.output(xpin, True)
 else:
 GPIO.output(xpin, False)
 
 StepCounter += StepDir
 
 # If we reach the end of the sequence
 # start again
 if (StepCounter>=StepCount):
 StepCounter = 0
 if (StepCounter<0):
 StepCounter = StepCount+StepDir
 
 # Wait before moving on
 time.sleep(WaitTime)

ずいぶん長ったらしいコードですが、

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/stepper.py

と打てば入手できます。

で、早速実行。

sudo python stepper.py

Img_1231

実行すると、小さな基板上の4つのLEDが激しく点滅

・・・してるんですが、モーターが動きません。

いや、よーく見ると動いてます。じわーっと動く感じ。

音も静かなので、最初失敗したかと勘違いしたほど。

Img_1232

というわけで、動きがわかりやすいものを上に載っけてみました。

Img_1233

おお!

Img_1234

動いてる!動いてる!!

Img_1236

しかし少々重すぎたのか、すぐに倒れてしまいます・・・

わざわざ大和を載せなくてもよかったんですよね・・・

Img_1238

この後は上のクリップだけで回転を確認しました。

さて、せっかくステッピングモーターなので、角度を制御できないと意味がありません。

しかし、どうやって角度を制御するのか?

そこでステッピングモーターの基礎を以下のサイトでお勉強。

ステッピングモータ 28BYJ をarduinoで動かしてみる | 花夢電科雑多猫

まずステッピングモーターの動作ですが、IN1~IN4の4つの極にそれぞれ以下のような信号

IN1、IN2、IN3、IN4

1、0、0、0

0、1、0、0

0、0、1、0

0、0、0、1

が順にくると回ります(1がON、0がオフの意味)。

各電極ごとに1つしか付かないため、こういうパターンを”1-1相励磁”というんだそうです。

ただこれではトルクが足りないため、トルクがほしいときは

IN1、IN2、IN3、IN4

1、0、0、1

1、0、0、0

1、1、0、0

0、1、0、0

0、1、1、0

0、0、1、0

0、0、1、1

0、0、0、1

の8ステップの信号を与えてやります。

こちらのパターンの方が、2つの電極を同時にオンにするためトルクが上がるようです。

こういうのを”2-2相励磁”というんだそうです。

ちなみに今回のコードはこの2-2相励磁です。コードの23行目あたりに書かれた”seq=”のところを見ていただくとこんなパターンになってます。

トルクは上がるんですが、消費電力もアップするそうです。

さて、この28BYJというステッピングモーターは64ステップで5.625度回転する仕様だそうです。

2-2相励磁の場合は1パターン8ステップあるので、このパターンを8回繰り返してやる(8×8 = 64ステップ)と5.625度回転するようです。

ということは、180度回転しようとすると

180/5.625 = 32

 

32×64 = 2048

となるため、2048ステップ回してやると180度、つまり半回転するはず。

ためしに、上のコードの45行目にある”while True:”を”for i in range(0,2048):”とすると、ちょうど半回転して止まります。

”2048”のところを”4096”とすればちょうど一周します。

90度なら1024、45度なら512・・・という感じで、回転角を制御できそうです。

1パターンが8ステップあるので、8の倍数で繰り返し回数を決めてやるとちょうどよさそう。

さて、回転角は制御できますが、回転速度はどこで変えるのか?

上のコードの39行目にある”WaitTime = 10/float(1000)”で制御できます。

これは各ステップのウェイト時間で、この場合は10/1000秒、つまり0.01秒になってます。

これを小さくする(10を小さくする、あるいは分母の1000を大きくする)と回転が速くなります。

あるいはこのコードを実行時に

sudo python stepper.py 20

と入力すると、ウェイト時間が20/1000秒(=0.02秒)と変わるようになってます。

私が試した限りでは1/2000秒でほぼ頭打ち、それ以上小さな値にしてもpythonの実行速度が追いつかないのか、変わりません。

もっとも、あまりウェイト時間を小さくしても同調不能になり、回転しなくなるそうですが。

なお、このコードでは時計回りに動きますが、反時計回りにするには33行目の”StepDir = 1”の値を”-1”に変えます。

というわけで、なんとかステッピングモーターを制御できるようになりました。

何に使うかはまだ未定ですが、アイデア次第ではいろいろと使えそうですね、このモーター。

ぱっと思いついたのはRaspberry Piレーダーを360度回して全方位型にしてしまうというものですが、問題は赤外線測距センサーの電極がぐるぐる巻きになってしまうこと。それさえ解決できれば・・・まあそろそろレーダーネタ、やめますか。

SODIAL(R) 28BYJ-48 28BYJ48 DC 5V 4-フェーズ5線式ステッピングモータとULN2003ドライバボード

« IIJmio ファミリーシェアプランがSIM最大10枚まで対応 | トップページ | 自宅でおもちゃが自作できる!?3Dプリンター”ThingMaker 3D” »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

こんにちは、いつも楽しく拝見しています。
レーダーの回転軸配線についてですが、高価になりますが回転軸でも通電できるパーツがあります。
スリップリングやロータリーコネクタと言うようです。(後者はさらに高価)
探せば安いものがありそうです。

参考URL:
こちらは安めです↓
http://robot.tsukumo.co.jp/goods/2340103823365/
https://sites.google.com/site/igarashihirokisite/Home/slipring
海外ですが↓(こちらで何回か購入しました)
https://www.adafruit.com/products/775?q=Slip%20Ring&

こんにちは、もも吉さん。

情報ありがとうございます。記事が追いついてませんが、実は既に入手済みなんです、スリップリング。1つ目のツクモロボット館で買いました。

結局レーダーネタに走ったんですが…その辺りは明日公開予定。見た目も大きく変わってます。ご期待ください。

動画だけ、先行公開しておきます。

http://youtu.be/Hqkki-Jl4Y0

入手済みとのこと良かったです。

早速、動画拝見しました!
むちゃくちゃかっこいいじゃないですか!

記事Up楽しみにしてます!

こんにちは、もも吉さん。

ありがとうございます。製作記は今書いてます。明日にはなんとか投稿できそう。

ノイズ除去ができてないため、点のばらつきがやや気になるところ、コンデンサー使わないといけないところですが、一旦このまま公開します。

8ステップで指令を与える方法は2-2励磁ではなく、1-2励磁では?

お世話になります。
”Raspberry Piでステッピングモーター28BYJを使ってみた”を真似して 
MDP-35Aステッピングモーター
DRV8835ドライバーモジュールで動かしてみました。
試行錯誤しましたが正逆転、速度、何回転で止めるがうまく行きホッとしています。
この記事をネットに掲載していただき感謝しています。
これから製作するものの第一段階が終わりました。
ほんとうにありがとうございました。

こんにちは、ysさん。

まずはおめでとうございます。思い通り行くと楽しいですよね、電子工作って。

最近私はネタ切れで、なかなか製作できてませんが、いずれ何か作れたらと思ってます。

ステッピングモーターを動かしたくて、このサイトを参考にさせていただきました。
回っただけなのに動いたときは感動です。
ありがとうございます。

>マサーラさん

返事遅れましたが、ありがとうございます。お気持ちよく分かります。自在に動かせるって、感動しますよね。

お世話になります。
私もラズパイでステッピングモータを動かしたくてこのサイトに行きつきました。
(まだラズパイ購入して一週間くらいです。)
何とか同じように動く事が出来ました。
ソフトに関しては素人で最初はこのプログラムのままでは動きませんでした。
多分、pythonのバージョンの違いだと思います。
ラズパイ4はpython3になっており、printの指令の後はカッコ( )で括らないと動作しませんでした。
素人のため、最初は何で?となり、エラーメッセージにカッコで括った指令文では?
の英語メッセージが出ていたので、カッコで括ったら動作しました。

ここから先が聞きたい事になります。
1/2000秒で頭打ちになったと記載されていますが、私の場合、5/1000秒までは動くのですが、
それ以上早く動かそうとするとモータが脱調してきちんと動いていません。
ドライバーのLEDの点滅間隔もちぐはぐになっています。
ラズパイの限界なのでしょうか?5/1000秒なので200Hzです。
だとするとラズパイちょっとがっかりです。
何か他に設定が必要なのでしょうか?
(モータもドライバーもこのブログと同じものを使用しています。モータには負荷もつけていません。)

コメント頂けたらと思います。

> kitzさん

おっしゃる通り、この頃のRaspberry Piではまだ、Python2を使ってました。今は3に完全移行したため、print文も括弧付きでないと動かないですね。
で、回転速度のことですが、Raspberry Piの限界といえば、その通りかもしれません。が、Raspberry Piからすれば、マルチタスクでいろいろとやらされてるのに、その上で規則正しいパルスを出力しろと言われてるわけで、どうしても高周波では不安定になりがちなようです。
その辺りは、単機能なArduinoのほうが優れてますね。このため、最近はArduinoにこの手の処理をさせて、Raspberry Piとはシリアル接続でつなぐ、というパターンにしてます。といっても、ステッピングモーターはほとんど使っておりませんが。

早々の回答ありがとうございます。
それでArduinoで駆動しているサイトが多いのですね。
せっかくラズパイを買ったのでソフト色々勉強していこうと思っています。

ありがとうございました。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Piでステッピングモーター28BYJを使ってみた:

« IIJmio ファミリーシェアプランがSIM最大10枚まで対応 | トップページ | 自宅でおもちゃが自作できる!?3Dプリンター”ThingMaker 3D” »

無料ブログはココログ

スポンサード リンク

ブログ村