Raspberry Piでステッピングモーター28BYJを使ってみた
Arduino入門用キットを買ったというのに、その部品をRaspberry Piばっかで使っております。まあ、こっちの方が慣れているのでしょうがないですが。
今回使ったのは、真ん中にあるステッピングモーター”28BYJ”。
とりあえず、使い方を学んでおこうかと取り出したのですが、Arduino互換ボード、Raspberry Piと並べて結局Raspberry Piで動かしてみることに。
参考にしたのはこちらのサイト。
Stepper Motor Control In Python
さて、ステッピングモーターとは一体何ができるのか?
マブチモーターのような普通のモーターだと連続回転が可能ですが、回転角を制御することは不可能。
一方、サーボモーターならば角度制御は可能ですが、こちらは連続回転ができません。
この両方の中間のような存在がこのステッピングモーター。パルス信号によって回転角度を制御でき、またモーターのように連続回転も可能です。
ただし通常のモーターのようにトルクはあまり無いようですが。おまけに制御が少々ややこしい。
先のリンク先を参考に、早速回路を組んでみました。
ピンは全部で6本。
”IN1”はRaspberry Piの11番ピン
”IN2”は15番ピン
”IN3”は16番ピン
”IN4”は18番ピン
そしてVCCには百均のスマホ充電専用ケーブルからつくったUSB電源ケーブルの+極を、GNDにはRaspberry Piの6番ピンおよび電源ケーブル-極を接続。
こんな感じの回路になります。
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
実行すると、小さな基板上の4つのLEDが激しく点滅
・・・してるんですが、モーターが動きません。
いや、よーく見ると動いてます。じわーっと動く感じ。
音も静かなので、最初失敗したかと勘違いしたほど。
というわけで、動きがわかりやすいものを上に載っけてみました。
おお!
動いてる!動いてる!!
しかし少々重すぎたのか、すぐに倒れてしまいます・・・
わざわざ大和を載せなくてもよかったんですよね・・・
この後は上のクリップだけで回転を確認しました。
さて、せっかくステッピングモーターなので、角度を制御できないと意味がありません。
しかし、どうやって角度を制御するのか?
そこでステッピングモーターの基礎を以下のサイトでお勉強。
ステッピングモータ 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・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« IIJmio ファミリーシェアプランがSIM最大10枚まで対応 | トップページ | 自宅でおもちゃが自作できる!?3Dプリンター”ThingMaker 3D” »
こんにちは、いつも楽しく拝見しています。
レーダーの回転軸配線についてですが、高価になりますが回転軸でも通電できるパーツがあります。
スリップリングやロータリーコネクタと言うようです。(後者はさらに高価)
探せば安いものがありそうです。
参考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&
投稿: もも吉 | 2016年2月28日 (日) 02時30分
こんにちは、もも吉さん。
情報ありがとうございます。記事が追いついてませんが、実は既に入手済みなんです、スリップリング。1つ目のツクモロボット館で買いました。
結局レーダーネタに走ったんですが…その辺りは明日公開予定。見た目も大きく変わってます。ご期待ください。
動画だけ、先行公開しておきます。
http://youtu.be/Hqkki-Jl4Y0
投稿: arkouji | 2016年2月28日 (日) 04時43分
入手済みとのこと良かったです。
早速、動画拝見しました!
むちゃくちゃかっこいいじゃないですか!
記事Up楽しみにしてます!
投稿: もも吉 | 2016年2月28日 (日) 16時06分
こんにちは、もも吉さん。
ありがとうございます。製作記は今書いてます。明日にはなんとか投稿できそう。
ノイズ除去ができてないため、点のばらつきがやや気になるところ、コンデンサー使わないといけないところですが、一旦このまま公開します。
投稿: arkouji | 2016年2月28日 (日) 17時35分
8ステップで指令を与える方法は2-2励磁ではなく、1-2励磁では?
投稿: | 2017年7月27日 (木) 02時41分
お世話になります。
”Raspberry Piでステッピングモーター28BYJを使ってみた”を真似して
MDP-35Aステッピングモーター
DRV8835ドライバーモジュールで動かしてみました。
試行錯誤しましたが正逆転、速度、何回転で止めるがうまく行きホッとしています。
この記事をネットに掲載していただき感謝しています。
これから製作するものの第一段階が終わりました。
ほんとうにありがとうございました。
投稿: ys | 2018年1月 2日 (火) 14時42分
こんにちは、ysさん。
まずはおめでとうございます。思い通り行くと楽しいですよね、電子工作って。
最近私はネタ切れで、なかなか製作できてませんが、いずれ何か作れたらと思ってます。
投稿: arkouji | 2018年1月 6日 (土) 20時55分
ステッピングモーターを動かしたくて、このサイトを参考にさせていただきました。
回っただけなのに動いたときは感動です。
ありがとうございます。
投稿: マサーラ | 2019年11月17日 (日) 07時38分
>マサーラさん
返事遅れましたが、ありがとうございます。お気持ちよく分かります。自在に動かせるって、感動しますよね。
投稿: arkouji | 2019年11月25日 (月) 20時47分
お世話になります。
私もラズパイでステッピングモータを動かしたくてこのサイトに行きつきました。
(まだラズパイ購入して一週間くらいです。)
何とか同じように動く事が出来ました。
ソフトに関しては素人で最初はこのプログラムのままでは動きませんでした。
多分、pythonのバージョンの違いだと思います。
ラズパイ4はpython3になっており、printの指令の後はカッコ( )で括らないと動作しませんでした。
素人のため、最初は何で?となり、エラーメッセージにカッコで括った指令文では?
の英語メッセージが出ていたので、カッコで括ったら動作しました。
ここから先が聞きたい事になります。
1/2000秒で頭打ちになったと記載されていますが、私の場合、5/1000秒までは動くのですが、
それ以上早く動かそうとするとモータが脱調してきちんと動いていません。
ドライバーのLEDの点滅間隔もちぐはぐになっています。
ラズパイの限界なのでしょうか?5/1000秒なので200Hzです。
だとするとラズパイちょっとがっかりです。
何か他に設定が必要なのでしょうか?
(モータもドライバーもこのブログと同じものを使用しています。モータには負荷もつけていません。)
コメント頂けたらと思います。
投稿: kitz | 2021年6月27日 (日) 20時24分
> kitzさん
おっしゃる通り、この頃のRaspberry Piではまだ、Python2を使ってました。今は3に完全移行したため、print文も括弧付きでないと動かないですね。
で、回転速度のことですが、Raspberry Piの限界といえば、その通りかもしれません。が、Raspberry Piからすれば、マルチタスクでいろいろとやらされてるのに、その上で規則正しいパルスを出力しろと言われてるわけで、どうしても高周波では不安定になりがちなようです。
その辺りは、単機能なArduinoのほうが優れてますね。このため、最近はArduinoにこの手の処理をさせて、Raspberry Piとはシリアル接続でつなぐ、というパターンにしてます。といっても、ステッピングモーターはほとんど使っておりませんが。
投稿: ディープタイピング | 2021年6月27日 (日) 21時28分
早々の回答ありがとうございます。
それでArduinoで駆動しているサイトが多いのですね。
せっかくラズパイを買ったのでソフト色々勉強していこうと思っています。
ありがとうございました。
投稿: kitz | 2021年6月27日 (日) 21時56分