Raspberry Pi 4+モータードライバでステッピングモーターを動かす(Python)
Raspberry Pi 4とモータードライブ基板を使ってステッピングモーターをPythonで操作する一連の手順をまとめます。
モータードライバ基板
ステッピングモーターはRaspberry Piから特殊な波形(PWM:パルス幅変調 Pluse Width Modulation)を受信する事により駆動します。頑張ればRaspberry Pi上でそういう波形を作り出す事も出来るのですが、ソフトウェアで作るため精度があまり良くありませんし、何より面倒…。なので精度が良く楽もしたいのであればRaspberry Pi用の「モータードライバ基板」を使う事をお勧めします。
今回僕が購入したのは以下のモータードライバ基板です:
世にモータードライバ基板は沢山あるのですが、その中でこの基板を選んだ理由は、カメラモジュールのリボンケーブルを出す隙間がちゃんと設けられていたからです。僕はカメラも併用したかったのですが、他の基板だとコネクタをふさいでしまいNGという…。もちろんステッピングモーターだけという事であれば別の物でも構いません。この基板にステッピングモーターとDCアダプタを繋げる事で簡単に制御できます。
ちなみに、上の基板は各コネクタがバラになっていまして、実際に使用するにはそれらを基板に半田付けする必要があります。と言っても難しくはありません。半田付けを少しした経験がある(僕もそうです)人なら大丈夫です。
ステッピングモーター
ステッピングモーターは決められたステップ角だけ正確に動く事が出来る特殊なモーターです。よくサーボモーターと混同されやすいのですが別物です。サーボモーターはある一定範囲の角度にダイレクトに動くモーターです。サーボモーターが「+72度へ移動せよ」と命令するのに対して、ステッピングモーターは「12ステップ右回りせよ」という指定の仕方をします。なのでステッピングモーターは左右にいくらでもぐるぐる回りますが、サーボモーターはある特定範囲しか回れません。
で、ステッピングモーターの中にも色々種類があります。大きく分けると「ユニポーラ型」と「バイポーラ型」があり、それぞれに2相、3相など分類があります。それらの違いについては他のサイトに詳しく解説されておりますのでここでは割愛致しますが、僕が購入したのは以下の小型のバイポーラ型2相ステッピングモーターです:
ステッピングモーターを動かす時には電圧や電流の大きさに気を付けて下さい。特に過電圧/過電流になるとモーターが焼けますので、必ずそのモーターにあった電圧や電流をかけるようにして下さい。上のモーターの場合、定格4.8V/0.2Aなので5V/1.0AくらいのDCアダプタが必要でです。場合によっては定電流ダイオード等を挟んでアンペアを定格値まで落とす必要があるかもしれません(この辺りの回路について僕は素人なので詳しい方是非教えて下さい(-_-;;)
モータードライバにステッピングモーターを取り付ける
モータードライバに接続コネクタをちまちまと半田付けすれば、ステッピングモーターを接続する事ができます。今回のAdafruit製のモータードライブ基板に取り付けた接続コネクタは「スクリュー端子台」でして、リード線をネジを締めて固定します:
バイポーラ型の場合、モーターからリード線が4本伸びています。2色で±の1セットになっていまして、どの色同士が組みになっているかはモーターのスペック表に必ず記載されています。僕が購入したNema 8モーターの場合、黒(A+)と緑(A-)、赤(B+)と青(B-)がそれぞれセットになっていました。その仕様に合わせたモータードライブの接続箇所は以下の通りです:
M1の上側が+、下が-です。その下がGNDになっていますが、バイポーラ型はGND線が無いので開けときます。同様にM2の上がもう一つの+で、その下が-です。スペック表と見比べてお使いのモーターを正しく取り付けて下さい。この基板は最大2台のステッピングモーターを同時に制御できるので、僕は2つ取り付けてみました。
モータードライバにDCアダプタを接続する
一般にステッピングモーターなどは駆動時に結構な電力を消費します。5Vモーターの場合Raspberry Piの電圧と同程度ではあるのですが、モーターが動く事でラズパイ側の電力が不安定になりラズパイが落ちる事があるため、外部電力は必須です。大抵のモータードライバは外部電力を供給する為のコネクタが設けられています。
僕は5VのDCアダプタを一つ購入しました。そのアダプタに付属していた変換コネクタにスクリュー端子台もあったため、モータードライバ基板の外部電力コネクタに配線して接続する事が出来ました:
左側がDCアダプタで、スクリュー端子台を介して右のモータードライブ基板に接続しています。間の線は少し太めのケーブルを加工しています。配線する時にDCアダプタの+と基板の+を合わせる事に注意して下さい。反対だと動きません。僕は…1度やらかしてパニくりました(^-^;
DCアダプタを外した状態で最後にモータードライブ基板を電源を切ったRaspberry Pi 4のGPIOコネクタにぶすーっと装着し、DCアダプタを再接続すればハードウェアのセット完了です。
アダプタを挿すと緑色のLEDが光ります。もし光らない場合はアダプタの+が基板の-に接続されてしまっているかもしれませんので確認してみてください。
ではRaspberry Piの電源を入れてOSを立ち上げましょう。
I2Cの有効化と接続確認
Adafruit製のラズパイ用モータードライブ基板はI2Cを通しRaspberry Piの命令をステッピングモーターに伝えます。I2CというはInter-Integrated Circuitというシリアルバス通信をする規格の事です。細かい事はWikipediaにありますが、
ざっくり言えば信号を伝えてくれる専用線です。詳細を気にしなくても今回は使えます(^-^;。I2CコネクタはRasberry PiのGPIOピンの中にあります。
ただI2Cに対応した基板やハードウェアがちゃんとRaspberry Pi上で認識されているかは確認した方が良いと思います。この後の作業で「動かない~」となった時に、実はRaspberry Piが認識してなかった…という事もありますので。
I2C有効化
デフォルトでRaspberry PiはI2Cが無効になっています。これを有効にするには、上メニューのラズベリーアイコンから[設定]→[Raspberry Piの設定]を選び、
インターフェイスタブにある[I2C]を有効にします:
これでI2Cが使えるようになりました。
接続チェック
I2C上にモータードライブ基板があるか調べるにはRaspberry Piのターミナルから以下のコマンドを入力します:
i2cdetect -y 1
i2cdetectコマンドはその名の通りI2Cに接続されているハードウェアを探すコマンドです。-yは「このコマンドにより動作中のI2Cハードウェアの挙動が乱れる可能性がある」という警告を許諾するオプションです。もし動いている最中のI2Cハードがある場合はこの点ちょっとご注意下さい。最後の1はI2Cコネクタのバス番号で、Raspberry Pi4は1バスなので1を指定しています。
コマンドを入れると、
こんな感じの一覧表が出ます。ここに数字があれば認識しています(オレンジの丸)。何も数字が出ていない場合は認識されていないので、モータードライブ基板の挿し込み具合等を確認してみて下さい。今回の基板はデフォルトで0x60が設定されているそうなので、ちゃんと合っているみたいですね。
さ、次はソフトウェアの準備です。
Adafruit MorterKitライブラリをインストール
Adafruit製のモータードライブ基板をPythonから扱うには専用のライブラリをインストールする必要があります。pipを使って以下のライブラリを入れて下さい:
sudo pip3 install adafruit-circuitpython-motorkit
詳細はこちらのリファレンスに:
これで必要な物を自動的にインストールしてくれます。これでついにPythonでモーターを制御するプログラムを書く準備が整いました。
ステッピングモーターを動かしてみる!
ではPythonコードを書いてみましょう。適当なエディタを開いて、以下のコードを入れて実行してみましょう:
from adafruit_motorkit import MotorKit
from adafruit_motor import stepper
import time
kit = MotorKit()
for i in range( 200 ):
kit.stepper1.onestep( direction=stepper.FORWARD, style=stepper.DOUBLE )
kit.stepper2.onestep( direction=stepper.FORWARD, style=stepper.DOUBLE )
time.sleep( 0.01 )
すると…
1回転しました~!このステッピングモーターは1ステップが1.8度なので、200ステップで丁度360度になります。
AdafruitのMotorKitについては後程詳細に記事にしようと思っていますが、とりあえず上のコードについて簡単に説明します。adafruit_motorkitライブラリの中にあるMotorKitが制御用のクラスです。その下のstepperというのはフラグの指定に必要です。
MotorKitクラスのコンストラクタでオブジェクトを一つ作ります。MotorKitクラスはステッピングモータ以外にもモーターを制御できるのですが、その中のstepper1とstepper2がそれぞれのステッピングモーターに対応しています。onestepメソッドが動作のほぼすべてで、これを呼ぶ事で1ステップだけモーターが駆動します。引数については別記事で(^-^;
sleep(0.01)を挟んでいるのは、あまり高速にメソッドを呼び出すと反応しないためです。公式のサンプルにも0.01秒とあるので、従っておきましょう。
終わりに
今回はAdafurit製のモータードライバをRaspberry Pi 4に取り付けて、2つのステッピングモーターを動かしてみました。ハードウェアの準備が案外面倒なのですが、ソフトウェア側はシンプルそのもの。気軽にモーター制御が出来ます。今回購入したAdafurit DC & Stepper Motor HATはステッピングモーターだけでなく直流モーター(DCモータ)にも対応しています。ただちょっと値段が高いので(^-^;、ステッピングモーターだけを安価に制御したいなら、互換性のある基板か別のお手頃な基板を試しても良いと思います。
次回はMoterKitでのステッピングモーターの制御をもう少し細かく見て行こうと思います。
ではまた(^-^)/