« 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励磁では?

コメントを書く

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

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/510034/63244582

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

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

当ブログ内検索

  • カスタム検索

スポンサード リンク

ブログ村

無料ブログはココログ