ラズベリーパイでステッピング・モータ (2) リニア移動環境

リード・スクリュで回転を直線運動へ

 3Dプリンタでは、X,Y軸の移動する手段の多くはプーリやタイミング・ベルトを使ったり、リード・スクリュが使われます。

 なるべく直線距離が長いと、近接センサなどの実験がやりやすいですが、大きいと取り回しがよくないです。

 ラズパイは電源及びモータ・ドライバとともにDINレールに取り付けて、コンパクトに制御部を実装しました。マイクロステップはM1,M2をONの1/16に設定しています。

両端で止めないといけない

 モータを回転していくと、端を超えても進みます。ここでは、マイクロスイッチでリミット部分を実装しました。ON/OFFする部分が機械式のスイッチです。ローラ・レバーと呼ばれる構造になっていて、台座部分が通りすぎるときに接点がONになります。これをラズパイのGPIOにつなぎ、信号が入ったら緊急停止するようにプログラムを用意します。

 マイクロスイッチは、GPIO26を左側、GPIO19を右側に実装して、ONになるとGNDと短絡します。そのため、二つの入力端子は初期設定時にプルアップしています。取り付け位置は、こちらのオムロンの解説ページを参照して行いました。どちらのスイッチもONになると、割り込み処理関数STOP()でモータの回転を止めます。

 try:部分がメインのプログラムです。RPi.GPIOライブラリは、GPIO.cleanup()で終了しないと、次回動かしたときに、ポートが使われているというメッセージが出ます。おもに、キーボードでCTRL+Cを押したときの対処です。

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
ENable = 4 #07pin
CW = 17 #11pin# 1=CW,0=CCW
CLK= 18 #12pin
stopL = 26
stopR = 19

#init
GPIO.setmode(GPIO.BCM)
GPIO.setup(ENable , GPIO.OUT)
GPIO.output(ENable , 0)
GPIO.setup(CW , GPIO.OUT)
GPIO.setup(CLK , GPIO.OUT)
GPIO.setup(stopL,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(stopR,GPIO.IN,pull_up_down=GPIO.PUD_UP)
pwm = GPIO.PWM(CLK, 100) #100Hz Max 200kHz
pwm.start(50) #duty 50%

def forward(speed):
GPIO.output(CW , 1)
GPIO.output(ENable , 1)
print ("forward ",speed)
pwm.ChangeFrequency(speed/3)
pwm.ChangeFrequency(speed)

def backwards(speed):
GPIO.output(CW, 0)
GPIO.output(ENable , 1)
print ("backwards",speed)
pwm.ChangeFrequency(speed/3)
pwm.ChangeFrequency(speed)

def Stop():
GPIO.output(ENable , 0)
pwm.stop()

def STOP(pin):
print ("stop")
Stop()
print ("Done!")
GPIO.cleanup()

GPIO.add_event_detect(stopR,GPIO.FALLING)
GPIO.add_event_callback(stopR,callback=STOP)
GPIO.add_event_detect(stopL,GPIO.FALLING)
GPIO.add_event_callback(stopL,callback=STOP)
#main
try:
print ("start")
forward(8000)
time.sleep(10)
backwards(8000)
time.sleep(15)
Stop()
GPIO.cleanup()
except:
print ("Done!")
Stop()
GPIO.cleanup()

 開発時にThonnyを使ってSTOPボタンを押すと、割り込みが異常になる場合があります。また、モータが止まらないこともあります。その場合、別のターミナルを立ち上げ、次のstop.pyを動かします。

#!/usr/bin/python
import time
import RPi.GPIO as GPIO
GPIO.cleanup()
ENable = 4 #07pin
CW = 17 #11pin# 1=CW,0=CCW
CLK= 18 #12pin
stopL = 26
stopR = 19
#init
GPIO.setmode(GPIO.BCM)
GPIO.setup(ENable , GPIO.OUT)
GPIO.output(ENable , 0)
GPIO.setup(CW , GPIO.OUT)
GPIO.setup(CLK , GPIO.OUT)
GPIO.setup(stopL,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(stopR,GPIO.IN,pull_up_down=GPIO.PUD_UP)
pwm = GPIO.PWM(CLK, 100) #100Hz Max 200kHz
pwm.start(50) #duty 50%
GPIO.output(ENable , 0)
pwm.stop()
GPIO.cleanup()

※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルはuname -a で確認。4.9.73でした。

※プログラムを仮にmotor.pyという名前で/home/piに保存すると、sudo chmod 755 motor.py で実行権を付け、ターミナルから、python motor.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
 プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで修正してください。

※I2Cの有効化は、こちらの説明を参照ください。SPIなどにもEnableにチェックを入れています。

DINレール 8mm x 400mmスチールベアリングシリンダーレール リニアレールシャフトクランプガイド リニアスライドユニット8mm 500*8mmT8 リードスクリュー セット

 マイクロスイッチ NEMA17 ステッピングモータ

 スイッチング電源(DINレール取付、DC5V) スイッチング電源(DINレール取付、低背、DC24V出力)