ブラシレスモータをArduinoで回す

ブラシレスモータを回すにはラジコン用のESCを使うのが簡単です。ArduinoとESCを接続して回すことも出来ます。モータを高速回転させるにはそれで良いのですがゆっくり回したい場合など特殊な使い方をしたい場合にはESCを作る必要があります。

ESC回路図
ブラシレスモータ用ESC回路図

まずは参考にしたサイトです。

こんなサイトを参考にしながらこの記事の最初にある回路図を書きました。IR2302を使いN ch MOS FETを駆動しています。MOS FETを2つ使いハーフブリッジを作ります。ブラシレスモータはコイルが3つスター配線になっているのでこの回路が3組必要になります。ハーフブリッジでハイ側のMOS FETをONにするにはブートストラップを使っています。最初にハイ側をONにするにはここのコンデンサが充電されている必要があります。

フォトカプラを使う方法も考えましたが、IR2302を使う方が簡単そうなのでその方法でやりました。IR2302の資料はこちら。IR2302の入力と出力ですが次の図のようになります。INとSDをArduinoにつなぎ、HOとLOはMOS FETに入ります。HOとLOが同時にONになると電流が一気に流れてMOS FETを破壊してしまいます。IR2303はHOとLOが同時にONになる事が無いので安心して使えます。

ArduinoからINにはPWM出力が可能なピンから。SDにはデジタル出力のピンでつなぎます。

ブラシレスモータは3つのコイルがスター配線になります。3つの、コイルにある順番で電流を流していくと回す事ができます。

ブラシレスモータを正確に回すにはロータの位置を検出するセンサーが必要らしいですが、とりあえず回すだけならセンサー無しで電流の順番を変えるだけで回ります。電流を流す順番についての説明は先に挙げたルネサスの「BLDCモータの制御」の説明がわかりやすいです。

部品は次の通りです。全て秋月で揃えました。【】内は秋月の品番です。

  • 【P-10147】積層セラミックコンデンサー 0.1μF250V 5mmピッチ
  • 【P-02724】電源用電解コンデンサー100μF35V105℃ ルビコンZ
  • 【P-08155】絶縁ラジアルリード型積層セラミックコンデンサー 10μF50V5mm
  • 【I-06208】ハーフブリッジドライバ IR2302PBF 8-DIP
  • 【I-08423】NchパワーMOSFET EKI04047 40V80A
  • 【I-07783】高速スイッチング・ダイオード 1SS178(100本入)

その他は抵抗、ターミナルブロックなどなどです。基板はサンハヤトの感光基板で作りました。感光基板の作り方は以下ツイートのスレッドの通り。

電源は実験用の電源装置で電圧を調整しながらテストしています。コイルの抵抗は低いので電圧をかけるとあっというまに電流が流れすぎて基板が焼けてしまいます。

回ってる様子は以下をご覧ください。

Arduinoのコードは次の通りです。Arduinoと基板の接続はポートの2,3,4,5,9,8番を使っています。

const int IN_U = 3;
const int SD_U = 2;

const int IN_V = 5;
const int SD_V = 4;

const int IN_W = 9;
const int SD_W = 8;

int delayTime = 1000;

void setup() {
  // put your setup code here, to run once:
  pinMode(IN_U, OUTPUT);
  pinMode(IN_V, OUTPUT);
  pinMode(IN_W, OUTPUT);

  pinMode(SD_U, OUTPUT);
  pinMode(SD_V, OUTPUT);
  pinMode(SD_W, OUTPUT);

  analogWrite(IN_U, 0);//UVWのPWM 0〜255
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);//HIGHで通電 LOWでハイインピーダンス
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
  delay(100);

}

/*mosfet ハーフブリッジ駆動
  IN:LOW -> highSide:off   lowSide:on
  SD:HIGH

  IN:HIGH -> highSide:on   lowSide:off
  SD:HIGH

  IN:LOW -> highSide:off   lowSide:off
  SD:LOW

  IN:HIGH -> highSide:off   lowSide:off
  SD:LOW
*/

void loop() {
  //1 U->W
  //2 U->V
  //3 W->V
  //4 W->U
  //5 V->U
  //6 V->W

  //1 U->W
  analogWrite(IN_U, 255);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, LOW);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  //2 U->V
  analogWrite(IN_U, 255);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, LOW);
  delay(delayTime);

  //3 W->V
  analogWrite(IN_U, 0);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 255);
  digitalWrite(SD_U, LOW);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  //4 W->U
  analogWrite(IN_U, 0);
  analogWrite(IN_V, 0);
  analogWrite(IN_W, 255);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, LOW);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

  //5 V->U
  analogWrite(IN_U, 0);
  analogWrite(IN_V, 255);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, HIGH);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, LOW);
  delay(delayTime);

  //6 V->W
  analogWrite(IN_U, 0);
  analogWrite(IN_V, 255);
  analogWrite(IN_W, 0);
  digitalWrite(SD_U, LOW);
  digitalWrite(SD_V, HIGH);
  digitalWrite(SD_W, HIGH);
  delay(delayTime);

}