今回は実際にラズパイから制御してみます。
前回はGPIOとドライバーとの接続でした。
適当なpythonコードを書いて制御してみます。
#!/usr/bin/python
#coding:utf-8import RPi.GPIO as GPIO
import atexit
import timeDir = 27 #DIRピン設定
Step = 17 #STEPピン設定def end(): #終了時に呼ぶ
GPIO.cleanup() #GPIOの開放def init(): #GPIO初期化
GPIO.setmode( GPIO.BCM ) #BCMモード
GPIO.setup( Dir , GPIO.OUT ) #Dirピンを出力モードへ
GPIO.setup( Step , GPIO.OUT ) #Stepピンを出力モードへ
atexit.register( end ) #強制終了時にもGPIO開放するよう設定
def act( dir = 0 , step = 1 , sec = 1): #dir:回転方向、step:ステップ数、sec:秒GPIO.output( Dir , dir ) #正逆転セット
step = step *2 #STEP信号はHiごとに1stepなので2倍にしておく
sleep = float( sec ) / float( step ) #step間の待ち時間を算出
for i in range( step ): #step数繰り返し
GPIO.output( Step, 1 - GPIO.input( Step ) ) #反転出力
print GPIO.input( Step ), GPIO.input( Dir ) #動作確認用
time.sleep( sleep ) #step間の待ち時間
def fwd( step , sec ): #正転
act( 0 , step, sec ) #dirだけ決めてact()に投げる
def rvs( step , sec ): #逆転
act( 1 , step, sec ) #dirだけ決めてact()に投げる
def test(): #動作テスト
for i in range( 3 ):for j in range( 10 ):
fwd( 10 * ( j+1 ) , 1 )
print j
for j in range( 10 )[::-1]:
fwd( 10 * ( j+1 ) , 1 )
print jfor j in range( 10 ):
rvs( 10 * ( j+1 ) , 1 )
print j
for j in range( 10 )[::-1]:
rvs( 10 * ( j+1 ) , 1 )
print j
if __name__=='__main__':
init() #初期化
test() #動作テスト
これを実行すると、画面にSTEPに出力されている信号が01でズラーっと出て来ます。
そして、モーター側はこうなります。
当然回ります。はい、モーターですのでね。
このギアードモーターの最短パルスは400/s程度でした。それを超えると脱調という現象が起きて正確な制御が出来なくなります。
HDDから取り外したモーターも回してみました。
これは4線全てが内部で繋がっているステッピングモーターで機構が違うのでとりあえず2線だけで繋いでいます。
実際どうやって正常に動かすのかよくわかりませんが、とりあえず動くように繋いでみました。
ばりばり脱調していますが、周波数がピッタリ合うと水を得た魚のように元気に回転します。
実験の結果、だいたい200/s程度のパルスで安定して回るようです。
このように、ステッピングモーターによって特性が全く違うので動かしたいモーターの特性はデータシートが無ければ実験して把握するしかありません。
回るだけじゃ面白く無い!
ということで、古いエプソンのスキャナから取り外したステッピングモータ制御の直動機構も動かしてみました。
減速ギアの組まれたこんな立派なモーターです。
固定は面倒なのでテープ固定(笑)すっごい雑だけどちゃんと動いています。これも安定して動くパルス調があります。
この機構をXY軸で組めば単純なプロッタマシンですね。
いろいろなモーターの実験をしましたが、実際にモーターを高回転で安定して制御する場合に脱調を起こさないためにはArduinoなどのバックでOSやら何やら動かない単純なマイコン制御の方がコスパが良いでしょう。
ラズパイでPyhtonからだとどうしても正確なタイミングでのGPIO制御には限界があります。
このように、モータードライバーを使えば結構単純な回路でステッピングモーターの制御が可能になります。
工作の幅が広がりますのでLチカに飽きたら是非試してみてください。
作例として ↓この自作3Dスキャナでもステッピングモーターとドライバーを使っています。