// 2-2相励磁
// このサンプルコードは28BYJ-48の時計回り・逆回りを行うデモです。
// ULN2003 インターフェースボードを使用。つまりただのトランジスタアレイで駆動するだけ
// 28BYJ-48モーターは4相、8ビートモーター。
// 減速ギア非68倍。 1バイポーラ巻線。ステップ角は5.625/64。
// 動作周波数100PPS。電流92mA。
// URL変わった模様。
// http://hp.hana-neko.com/archives/693
// => https://hp.hana-neko.com/archives/693
/*
モータ停止状態でもコイルには電流が流れ続けます。
なので結構な発熱があります。
停止中に電流切るには
int lookup[9] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001, B00000};
などとやって、停止中は9番目の要素を意図的に呼び出すと吉。
*/
////////////////////////////////////////////////
//Base Code
// 4tronix Arduino http://www.4tronix.co.uk/arduino/Stepper-Motors.php
int motorPin1 = 8; // Blue - 28BYJ48 pin 1
int motorPin2 = 9; // Pink - 28BYJ48 pin 2
int motorPin3 = 10; // Yellow - 28BYJ48 pin 3
int motorPin4 = 11; // Orange - 28BYJ48 pin 4
// Red - 28BYJ48 pin 5 (VCC)
int motorSpeed = 1200; //速度。数値が小さいほど速くなる。800以下は脱調して動かない
//int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
int lookup[9] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001, B00000};
const int btnL = 4; // 反時計回りボタン用
const int btnR = 5; // 時計回りボタン用
const int btnS = 6; // 停止ボタン用
//////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
//declare the motor pins as outputs
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(btnL, INPUT_PULLUP);
pinMode(btnR, INPUT_PULLUP);
pinMode(btnS, INPUT_PULLUP);
}
//////////////////////////////////////////////////////////////////////////////
void loop(){
if(!digitalRead(btnR)) {
while(digitalRead(btnS)) {
if(!digitalRead(btnL)) break;
clockwise();
}
}
else if(!digitalRead(btnL)) {
while(digitalRead(btnS)) {
if(!digitalRead(btnR)) break;
anticlockwise();
}
}
else if(!digitalRead(btnS)) {setOutput(9);}
}
//////////////////////////////////////////////////////////////////////////////
void anticlockwise() //反時計回り
{
for(int i = 0; i < 8; i++)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}
void clockwise() //時計回り
{
for(int i = 7; i >= 0; i--)
{
setOutput(i);
delayMicroseconds(motorSpeed);
}
}
void setOutput(int out)
{
digitalWrite(motorPin1, bitRead(lookup[out], 0));
digitalWrite(motorPin2, bitRead(lookup[out], 1));
digitalWrite(motorPin3, bitRead(lookup[out], 2));
digitalWrite(motorPin4, bitRead(lookup[out], 3));
}