Pythonでステッピングモーターを動かす
本記事の背景
現在の相場は分かりませんが、昔は100円で簡単に試せる「28BYJ-48」という安い世界で一番安いステッピングモーターがあります。データシート
ステッピングモーターの原理と配線とかは割愛しますが、Pythonで動かすことができます。
C言語で動かすこともできますが、コンパイルが必要だったりといろいろ面倒でした。
ソースコードは以下参照
# -*- coding: utf-8 -*-
from time import sleep
from gpiozero import OutputDevice as stepper
import datetime
import sys
class C28BYJ48:
def __init__(self, IN1, IN2, IN3, IN4):
self.IN1 = stepper(IN1)
self.IN2 = stepper(IN2)
self.IN3 = stepper(IN3)
self.IN4 = stepper(IN4)
#Setting GPIO
self.stepPins = [self.IN1, self.IN2, self.IN3, self.IN4]
self.sequenceNumber = 0
self.stepCount = 8
def seq(self):
return [[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]]
def SetRoll(self, angle, wait):
#入力値が0以下の場合
if angle <= 0 : return 0,0
#回転ステップ数の計算
#カメラ台座ギア比2:1のため、角度入力値を二倍にします
steps = int((angle * 2) * 4096 / 360)
#回転インターバル時間の計算
#入力値分単位を秒単位へ変換
interval = float(wait * 60.0 / steps)
return steps, interval
#シーケンスのピンをセットする
def SetPinVoltage(self, NSeq):
self.sequenceNumber = NSeq
for pin in range(0,4):
xPin = self.stepPins[pin]
seq = self.seq()
if seq[self.sequenceNumber][pin]!=0:
xPin.on()
else:
xPin.off()
def run(self, angle, wait, direction):
# Set to 1 for clockwise
# Set to -1 for anti-clockwise
self.direction = direction
#回転設定
steps, interval = self.SetRoll(angle, wait)
for i in range(0, steps):
self.SetPinVoltage(self.sequenceNumber)
self.sequenceNumber += self.direction
if self.sequenceNumber >= self.stepCount:
self.sequenceNumber = 0
if self.sequenceNumber < 0:
self.sequenceNumber = self.stepCount + self.direction
sleep(interval)
if __name__ == '__main__':
StepMotor = C28BYJ48(12,16,20,21)
while True:
#時計周り 180度回転/撮影時間1分
StepMotor.run(180, 0.1, 1)
sleep(2)
#反時計周り 180度回転/撮影時間1分
StepMotor.run(180, 0.1, -1)
sleep(2)
サービスの設定
上記のプログラムは単体でも動きますが、起動後にプログラムを実行する必要がある為少々面倒のため、RaspberryPi起動後にサービスをセットすることにより、自動実行できるようにします。
サービス本体は以下のように作成と配置を行います。
pi@raspberrypi:/etc/systemd/system $ pwd
/etc/systemd/system
pi@raspberrypi:/etc/systemd/system $ cat move_mouse_cursol.service
[Unit]
Description=move mouse cursole by stepping motor
After=network.target
[Service]
User=pi
WorkingDirectory=/home/pi/smartlife/camera_control
ExecStart=python gpiozero_stepping.py
[Install]
WantedBy=multi-user.target
システムコントロールに追加します。
pi@raspberrypi:/etc/systemd/system $ sudo systemctl enable move_mouse_cursol
pi@raspberrypi:/etc/systemd/system $ sudo systemctl is-enabled move_mouse_cursol
enabled
最後に
これでRaspberryPiを起動すると自動的にステッピングモーターを自動的に回すことができるようになります。