Pages

2012年12月14日

Raspberry PiでSPG20-1332を回す


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()
ループ部分は以前の記事に近い形で書き直せるはず。(放置)

2 件のコメント:

  1. Arduinoでステッピングモーターを動かした場合モータードライバーを使用していますが、Raspberry Piでは使用しない理由を教えてください。
    また、Raspberry Piでステッピングモーターを動かすときにトランジスタアレイを使用する理由として、『Raspberry PiのI/Oは3.3V系なので』と書いてありますが、勉強不足で理由が理解できません。
    お手数ですが説明していただけると幸いです。よろしくお願いします。

    返信削除
    返信
    1. まず、Raspberry PiのGPIOの入出力電圧は3.3Vです。
      Raspberry PiやArduino Dueは入出力電圧の最大値が3.3V、Arduino UNOやMEGAは入出力電圧の最大値が5Vで、前者を3.3V系、後者を5V系と呼んでいます。
      出力では最大値以上の電圧は出力されず、入力では最大値以上の電圧を入れるとマイコンが故障する可能性があります。
      いつも私が使っているモータドライバ、MP4401はゲートに入れる電圧が4V以上でないと駆動できません。
      Raspberry Piからの出力3.3Vでは駆動できないので、3.3Vで駆動できるトランジスタアレイを使いました。

      削除

記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。