PR

ロボット制作 #22 ブラシレスモーターを動かしてみる
ブラシレスモーターをArduino UNO R3とESCを使って動かしてみた

加工・組み立て

今回は、ブラシレスモーターを動かしてみたいと思います。
ブラシレスモーターは、ブラシと整流子を持たないため、長寿命、高効率、高精度な制御、静音性、メンテナンス性の高さなどが特徴です。ただし、ESC(Electric Speed Controller)という専用の制御装置が必要で、モーターとESCでそれなりの費用がかかります。

ブラシレスDCモーター

今回は、タミヤの「TBLM-02S」というブラシレスモーターをAmazonで購入しました。
6,000円弱します。結構、高価な買い物でした。

TBLM-02S 取り扱い説明書(抜粋)

ブラシレスモーターは、ローター(回転子)に永久磁石、ステーター(固定子)にコイルが配置されています。ローターの位置を検出し、その位置に合わせてステーターのコイルに流れる電流を切り替えることで、回転を実現します。この電流の切り替えは、電子回路(インバーター回路)によって行われます。
ローター(回転子)とステーター(固定子)が接触していないため、摩擦が発生しないので長寿命、高効率、低ノイズなどのメリットがあります。

インバーター回路

インバーター回路は、スイッチング素子(スイッチの役割をする半導体部品)を適宜オン・オフにして電流の向きを変えることにより、プラスとマイナス両方の電圧を生成し、直流を交流に変換する仕組みになっています。

右図のようにスイッチが4つ(❶~❹)ある回路を使用します。
スイッチ❶とスイッチ❹をオンにすると負荷に対して左から右に電流が流れます。
スイッチ❷とスイッチ❸をオンにすると負荷に対して右から左に電流が流れます。

この交流の波形の切り替わる速さを周波数とよび、1秒間に波形を何周するかをHz(ヘルツ)という単位で表す。例えば、日本のコンセントは、電圧は100V、周波数は東日本は50Hzで西日本は60Hzです。

コイル

コイルとは、一般的に針金や導線を螺旋状に巻いた電子部品のことです。
電気回路において、電流を流すと磁界が発生し、この磁界の変化によって電圧を発生させる(電磁誘導)などの働きをします。

銅線は、右ネジ方向に下から上に巻いたものを想定して考えます。
このコイルの右の端子にVCC、左の端子にGNDを接続するとVCCからGNDに向けて電流が流れます。この向きは磁界の向きとなり出口はN極、入口はS極の特性を持ちます。

つまり上記のインバーター回路により電流の向きを制御することでコイルのN極、S極の特性を動的に切り替えることができます。
そして磁石は、NとNは反発し、NとSは引き合う力が発生します。この力を上手く制御することで回転運動に繋げるという仕組みです。

ESC(Electric Speed Controller)

ESCもタミヤの「TBLE-04S」を購入しました。ブラシレスモーターと合わせて11,400円です。
安いものを探せばあると思いますが、今回はタミヤで揃えました。

ESCの信号線にPWM信号を流すことで接続したモーターを回転させることが出来ます。
ちなみに受信機コネクタの端子には、黒、赤、白のケーブルが繋がっており、黒はGNDですが、赤にVCCを繋ぐ必要はありません。これは受信機等への5V出力になっています。白が信号線でスピード制御のためのPWM信号の入力線になっています。

バッテリー

ここまできたらバッテリーもタミヤで揃えます。高い…

うーん。このコネクタは、直接接続できない…
バッテリーはT型コネクタ、ESCはタミヤコネクタになっている。

旧仕様だと変換コネクタ付きだったようですが、新仕様(2024年8月28日以降)は、変換コネクタが別売りになっておりカスタマーサービスで買わないといけないようです。

タミヤの純正品ではないですが、同じ用途の変換コネクタがあったのでこちらを購入しました。

あと 6.6V 2200mAhというのも少し独特ですね。(よくあるのは、3.7V、7.4V…)

DC充電器

通常の充電器は持っているのですが、タミヤのバッテリーに適合するものは持っていなかったので、新しく購入しました。タミヤ純正の充電器は、Amazonには無かったためハイテックの充電器を購入しました。

バッテリーのメインケーブル(T型コネクタ)とバランスコネクタケーブルをバッテリーと充電器間で繋ぎます。液晶の表示は、正直よく分かりませんでした。(充電中ということだけは分かる)

ESCテスターでブラシレスモーターを動かしてみる

とりあえずブラシレスモーターを動かしてみるということでテスターを使って駆動確認してみます。
以下のテスターを使いました。

モーターに取り付けたファンが勢いよく回転しました。
ただ、使い方が良くわからない・・・800μSよりも下は指定できないようです。

ここからは、Arduino UNO R3 を使って動かすように実験装置を作っていきたいと思います。

Arduino UNO R3 でブラシレスモーターを動かしてみる

さて、ここからは実際にArduino UNO R3 から ESC に信号を送ってブラシレスモーターを動かしてみたいと思います。

ブラシレスモーターにファンを取り付ける

まずは、モーターのブランケットを作成します。
※↑のテスターでも使用済みですが…

ブランケットを取り付けて、次にモーター軸にファンを取り付けます。
今回は、実験なのでイモネジなどでの固定はしていません。

最後にカバーを取り付けます。

Arduino UNO R3 にポテンショメータを繋ぐ

操作用のボリュームつまみタイプのポテンショメータを使います。

実際にはミニブレッドボードを使っていますが、ポテンショメータの真ん中の端子をArduinoのA0と繋ぎます。間には220Ωの抵抗を入れています。

これでポテンショメーターのつまみを回転させて、0 ~ 1023 のアナログ値に変換されて入力されます。

Arduino UNO R3 と ESC を繋ぐ

Arduino UNO R3 の D3(PD3)ピンとESCの信号線、GNDとESCのGNDを繋ぎます。

これで接続は完了です。

ブラシレスモーターを動かしてみる

ポテンショメーターからのインプットをESCへのPWM信号にして出力するようにスケッチを作ります。

/*  BLDC_Motor_Ctrl2.ino
 *  Brushless Motor controll program ver 0.10
 *  by chikuma <https://chiukma-creative.com>
 *
 *  last modified 5 July 2025  by chikuma
 */ 
#include <Wire.h>

#define POT_PIN   A0    // Connect to the output wire of the Potentiometer.
#define ESC_PIN   3     // Connect to the ESC signal line. (PD3)

int pot_value;          // Potentiometer input value. (0 - 1023)
int pwm_value;          // ESC output PWM value (us)
#define ESC_MAX_PWM   250   // ESC PWM MAX value (us)
#define ESC_MIN_PWM   125   // ESC PWM MIN value (us)
#define ESC_NTR_PWM   125   // ESC PWM NEUTRAL value (us)
#define SHOW_PWM      true  // Display PWM on the serial monitor

uint8_t TCCR2A_FORWARD;
uint8_t TCCR2A_REVERSE;

/*  setup code:
      Initializes the serial port to communicate with the PC and
      waits for input of the operating mode.
 */
void setup() {
  Serial.begin(9600);
  // Create and save a timer register value.
  TCCR2A_FORWARD = TCCR2A;
  TCCR2A_REVERSE = TCCR2A | 1 << COM2B0;
  // Display the start message on the serial monitor.
  Serial.println("Start the BLDC motor controll program via ESC...");
  // initialize the pin mode etc.
  pinMode(POT_PIN, INPUT);
  pinMode(ESC_PIN, OUTPUT);
  delay(1000);
}

/*  main code:
      Controls the ESC according to the manual mode.
 */
void loop() {
  pot_value = analogRead(POT_PIN) - 511;
  if (pot_value >= 0) {
    if (TCCR2A != TCCR2A_FORWARD) {
      TCCR2A = TCCR2A_FORWARD;
    }
    pwm_value = map(pot_value, 0, 511, ESC_MIN_PWM, ESC_MAX_PWM);
  } else {
    if (TCCR2A != TCCR2A_REVERSE) {
      TCCR2A = TCCR2A_REVERSE;
    }
    pwm_value = map(pot_value * -1, 0, 511, ESC_MIN_PWM, ESC_MAX_PWM);
  }
  if (SHOW_PWM) {
    if (TCCR2A == TCCR2A_FORWARD) {
      Serial.print("FORWARD: ");
    } else {
      Serial.print("REVERSE: ");
    }
    Serial.println(pwm_value);
  }
  analogWrite(ESC_PIN, pwm_value);
  delay(10);
  // If an interrupt occurs, the operation mode is changed.
  if (Serial.available() > 0) {
    Serial.read();
    while (Serial.available() > 0) {
      Serial.read();
    }
    Serial.println("Exit the program.");
    delay(1000);
    exit(0);
  }
}
C++
Expand

少し複雑なことをしているので解説します。

ESCに出力するPWM信号のHIGHとLOWを反転させるためにタイマ2のレジスタを書き換えています。

PWM出力方法
出力ピン:PB3(D11)
PWM出力方法
出力ピン:PD3(D3)
未使用未使用タイマのモード設定
ビット76543210
名前COM2A1COM2A0COM2B1COM2B0WGM01WGM00
指定なし000000標準
トグル010110CTC
LOW101001通常PWM
HIGH111111高速PWM
TCC2A – タイマ2設定レジスタ

今回は、ESCの信号線にD3(PD3)を繋いでいるので、反転させる場合はTCCR2Aの5ビットを1、4ビットを0に設定します。
TCCR2A_FORWARD = 0b00000001(2進数)… 正回転
TCCR2A_REVERSE = 0b00100001(2進数)… 逆回転

ポテンショなるメータの入力を-511~+511の幅に設定し、マイナスなら逆回転、プラスなら正回転にしています。

なお、ピンのPDとかPBとかの呼び方は、上記のようにD0~D7はポートC群として、D8~D13はポートB群に設定されていることからPDx、PBxと表現されています。(分かり難い…)

動画を確認

以上

コメント

タイトルとURLをコピーしました