hello (visible) world.

Raspberry PiでSPG20-1332を回す

2012.12.14 · 501 words · 1 minute readStepper motor , Raspberry Pi

Raspberry Piで秋月電子で売っている安いステッピングモーター(コパル製 SPG20-1332)を回す。
以前、Arduinoで二相励磁駆動させたものをRaspberry Piでやってみました。

回路は以下の様な感じで。

Raspberry PiのI/Oは3.3V系なので、トランジスタアレイ(TD62004APG)を入れてレベルシフトしています。

#include <stdio.h>

int main()
{
    int i;
    
    system("echo "7" > /sys/class/gpio/export");
    system("echo "8" > /sys/class/gpio/export");
    system("echo "9" > /sys/class/gpio/export");
    system("echo "10" > /sys/class/gpio/export");
    system("echo "out" > /sys/class/gpio/gpio7/direction");
    system("echo "out" > /sys/class/gpio/gpio8/direction");
    system("echo "out" > /sys/class/gpio/gpio9/direction");
    system("echo "out" > /sys/class/gpio/gpio10/direction");
    
    for (i=0; i<360; i++) {
            system("echo "1" > /sys/class/gpio/gpio7/value");
            system("echo "1" > /sys/class/gpio/gpio8/value");
            system("echo "0" > /sys/class/gpio/gpio7/value");
            system("echo "1" > /sys/class/gpio/gpio8/value");
            system("echo "1" > /sys/class/gpio/gpio9/value");
            system("echo "0" > /sys/class/gpio/gpio8/value");
            system("echo "1" > /sys/class/gpio/gpio9/value");
            system("echo "1" > /sys/class/gpio/gpio10/value");
            system("echo "0" > /sys/class/gpio/gpio9/value");
            system("echo "1" > /sys/class/gpio/gpio10/value");
            system("echo "1" > /sys/class/gpio/gpio7/value");
            system("echo "0" > /sys/class/gpio/gpio10/value");
    }
    
    system("echo "7" > /sys/class/gpio/unexport");
    system("echo "8" > /sys/class/gpio/unexport");
    system("echo "9" > /sys/class/gpio/unexport");
    system("echo "10" > /sys/class/gpio/unexport");
}

480ステップで1回転なので、120回ループしてあげれば1回転、上記では360回ループなので3回転します。

とりあえず動かすだけなので、system関数でシェルを呼び出す感じのへたれコード。
本格的に使うならレジスタを直で叩く方が良いと思います。(速度的に雲泥の差)

追記:PythonでRPi.GPIOを利用して上記をそっくりそのまま写すならこんな感じかな?(未検証)

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(8,GPIO.OUT)
GPIO.setup(9,GPIO.OUT)
GPIO.setup(10,GPIO.OUT)
    
for i in range(0,360):
      GPIO.output(7,GPIO.HIGH)
      GPIO.output(8,GPIO.HIGH)
      GPIO.output(7,GPIO.LOW)
      GPIO.output(8,GPIO.HIGH)
      GPIO.output(9,GPIO.HIGH)
      GPIO.output(8,GPIO.LOW)
      GPIO.output(9,GPIO.HIGH)
      GPIO.output(10,GPIO.HIGH)
      GPIO.output(9,GPIO.LOW)
      GPIO.output(10,GPIO.HIGH)
      GPIO.output(7,GPIO.HIGH)
      GPIO.output(10,GPIO.LOW)

GPIO.cleanup()

ループ部分は以前の記事に近い形で書き直せるはず。(放置)