0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでステッピングモーターを動かす

Last updated at Posted at 2023-05-12

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を起動すると自動的にステッピングモーターを自動的に回すことができるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?