PR

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

加工・組み立て

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

ブラシレスDCモーター

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

ブラシレスモーターは、ローター(回転子)に永久磁石、ステーター(固定子)にコイルが配置されています。ローターの位置を検出し、その位置に合わせてステーターのコイルに流れる電流を切り替えることで、回転を実現します。この電流の切り替えは、電子回路(インバーター回路)によって行われます。
下図のブラシレスモーターの場合は、外周のコイルに電流を流します。この時の電流の向きによりN極、またはS極の磁力が発生します。N極とS極は引き合い、同じ極同士(N極とN極、S極とS極)は反発します。これをインバーター回路により順番に切り替えることで、中心のローターが回転するという仕組みになっています。

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

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++

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

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をコピーしました