JUGEMテーマ:趣味


スイッチを押すとステッピングモーターが回転します。
Arduinoと秋月で購入したステッピングモーター(MDP-35A)
ドライバーとしてTA7774PG互換のTB6674PGを使用しています。

回路はデータシートを参考にしてこんな感じです。


右側のA、~A、~B、Bはステッピングモーターです。
TB6674の12番と13番ピンはGNDに接続します。
SW1とSW2をそれぞれ押すとモーターが回ります。
SW1が正転でSW2が逆転です。
ARDUINOはUNOでソースはこんな感じです。

----------------------------
//2相励磁でのステッピングモーター制御

#define VOLIMEPIN        0
#define INAPIN          7
#define INBPIN          6
#define PulseWidth       3.0  // 1パルス msec
#define MotorStep       48    //


void setup() {
  // put your setup code here, to run once:
    pinMode(INAPIN, OUTPUT);
    pinMode(INBPIN, OUTPUT);
    Serial.begin(9600);
}

struct OUTPUT_PIN_MAP
{
  int A;
  int B;
};
struct OUTPUT_PIN_MAP opMap[4] = {
  HIGH, HIGH,
  LOW , HIGH,
  LOW , LOW,
  HIGH, LOW
};

int nIdx=0;
int OldStep=-1;

void loop() {
  //1回転で何ステップなのか確かめる実験
  //今回のモーターは51STEPで1回転だった。仕様が48なので良し。
//    for(int j=0;j<51;j++){
//      digitalWrite(INAPIN, opMap[nIdx].A);
//      digitalWrite(INBPIN, opMap[nIdx].B);
//      delay(PulseWidth);
//      nIdx++;
//      if(nIdx>=4){
//        nIdx=0;
//      }
//    }
//    while(1);
 
      // put your main code here, to run repeatedly:
     
      //2相励磁なので最低STEP角度は以下の計算式になる
      float fStepKakudo = (float)360/(float)MotorStep;
      Serial.print("fStepKakudo=");
      Serial.println(fStepKakudo);

        int nVolume = analogRead(VOLIMEPIN);  //0-1023
        Serial.print("nVolume=");
        Serial.println(nVolume);
        //ボリュームの値を360度にマッピングする
        float nVolumeKakudo = (float)nVolume / ((float)1024.0/(float)360.0);
        Serial.print("nVolumeKakudo=");
        Serial.println(nVolumeKakudo);
        //
        int Step = (int)((float)nVolumeKakudo / (float)fStepKakudo);
        if(OldStep==-1){
          OldStep = Step;
          return;
        }
        Serial.print("Step=");
        Serial.println(Step);
        //
        int nSa = Step - OldStep;
        Serial.print("nSa=");
        Serial.println(nSa);
        for(int i=0;i<abs(nSa);i++){
         
          if(nSa>0){
            nIdx++;
            if(nIdx>=4){
              nIdx=0;
            }
          }
          else{
            nIdx--;
            if(nIdx<=-1){
              nIdx=3;
            }
          }
         
          digitalWrite(INAPIN, opMap[nIdx].A);
          digitalWrite(INBPIN, opMap[nIdx].B);
          delay(PulseWidth);
        }
        OldStep = Step;
//        delay(2000);
}