Ene1-GPも終わりもうそろそろ一年が終わりそうな今日この頃、来年の大会のためにもブラシレスモーターの制御を始めることにしました。うちのサークルで使っているモーターは、ブラシレスモーター でかつセンサーがついているので、今回はそれと同じ構造のモーターをAmazonで買い回してみました。

 全然関係ないんですが、fritzing有料化しました? ダウンロードページのデザインが変わっていて、無料ダウンロードのリンクがみつからないんですよね。何か知っている方がいたら教えてください。

 今回使ったモーターはこういうやつです。

 実際に買ったやつは在庫がないらしく検索ではヒットしなかったですが、こんな感じのやつでした。

 システムの概略としてはこんな感じです。
Untitled Diagram
 いつものvvvfを使い、その制御にブラシレスモーター からのセンサー入力を利用する方法をとっています。
 追加された回路はこんな感じです。
brushless_回路図
 モーターのセンサーの取り扱い回路とセンサーの値で決まるステップ表示用のLEDを増やしただけです。

 今回もプログラムは特筆すべきところがないのでコメントだけつけて最後に書いておきます。

 実際に回してみるとこんな感じです。

 まあほどほどにいい感じじゃないでしょうか? ただ問題があって、ブラシレスモーターはやたらと電流が流れるのでブレッドボードが溶けました。 まあ高校生の時に先生の前でVVVFを動かしてブレッドボードを溶かしたこともあるし問題ないです。ただ、このままで良いわけでもないのできちんと基板を作ろうと思います。それではまた今度。

見る価値があるか怪しいプログラムです。一応少しだけコメントをつけておきます。
#define thre 200

int nstep;
int bstep;
unsigned long timeset;
int delaytime;

void setup()  {
  Serial.begin(9600);
  //各出力ピンのモードを出力に設定
  pinMode(2, OUTPUT);//インダクタ接続
  pinMode(3, OUTPUT);//
  pinMode(4, OUTPUT);//
}
void loop()  {
  //センサーの値を見てステップを判断
  Serial.println(delaytime);
  if (analogRead(0) > thre) {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 1;
      }
      else {
        nstep = 2;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 3;
      }
      else {
        nstep = 4;
      }
    }
  }
  else {
    if (analogRead(1) > thre) {
      if (analogRead(2) > thre) {
        nstep = 5;
      }
      else {
        nstep = 6;
      }
    }
    else {
      if (analogRead(2) > thre) {
        nstep = 7;
      }
      else {
        nstep = 8;
      }
    }
  }

  
  //現在のステップを表示
  switch (nstep) {
    case 4:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;

    case 2:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 6:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      break;

    case 5:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 7:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 3:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      break;

    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      break;

    case 8:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      break;
  }


  //ステップの切り替えタイミングを計算
  if (nstep != bstep) {
    delaytime=(millis()-timeset)/5;
    timeset = millis();
  }


  //VVVFを駆動
  if ((millis() - timeset) > delaytime) {
    switch (nstep) {
      case 4:
        analogWrite(9, 250);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 2:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 0);
        break;

      case 6:
        analogWrite( 9, 0);
        analogWrite(10, 250);
        analogWrite(11, 250);
        break;

      case 5:
        analogWrite( 9, 0);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 7:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 250);
        break;

      case 3:
        analogWrite(9, 250);
        analogWrite(10, 0);
        analogWrite(11, 0);
        break;

      case 1:
        break;

      case 8:
        break;
    }
  }
  bstep = nstep;
}
/*センサーの値とステップの関係
   HHH 1
   HHL 2
   HLH 3
   HLL 4
   LHH 5
   LHL 6
   LLH 7
   LLL 8
*/
/*ステップの流れる順番
   4 2 6 5 7 3
*/