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