🐙

ブラシレスモーターを Arduino と ESC で動かす方法

2021/12/02に公開

1. 概要

  • ブラシレスモーターを Arduino で制御します
  • サーボテスターでブラシレスモーターの動作確認をする方法については過去記事に記載しています.

2. この記事中で使うもの

  • ブラシレスモーター
  • ESC
  • Arduino
    • ESC に PWM 信号を送信するために使います.
  • バッテリー
  • PC
  • その他パーツ
    • 可変抵抗
      • 抵抗値に応じて PWM信号の信号幅を変化させることに使います.
    • ジャンパワイヤ
    • ブレッドボード
    • USBケーブル
      • Arduino と PC を接続するために使います.

2.1 購入例

  • ブラシレスモーター + ESC
    • Powerfun EDF 50mm + ESC 40A
      • これは「ダクテッドファン」という,ブラシレスモーターにファンがついたパーツです.ブラシレスモーターのパワーを風圧で実感できます.

  • Arduino

  • その他のパーツは適当なもので十分です.

3. ブラシレスモーターを Arduino で動かす方法

3.1 設計

これから作るものの概念図です:

  • 過去記事との違いは,「サーボテスター」が「Arduino + 可変抵抗」に変わったことです
    • これにより,プログラムで制御内容を調整できます.
    • 可変抵抗で分圧された電圧値を Arduino で読み取り,その値をPWM信号のパルス幅に変換することでブラシレスモーターの速度を制御します.

3.2 接続

下図のように接続します:

3.2.1 Arduino の接続詳細

ピン 接続先 備考
D6 ESC 信号線(白)
GND ESC GND(黒)
GND 可変抵抗 向かって左側 画像の①番
A7 可変抵抗 向かって中央 画像の②番
5V 可変抵抗 向かって右側 画像の③番

3.2.2 その他の接続

  • ESC ⇔ ブラシレスモーター
    • 3つの端子の組み合わせはテキトーで大丈夫です.組み合わせを変えると逆回転にもできます.
  • バッテリー ⇔ ESC
    • これは最後に接続するのがよいです.電力が供給され,いつでもモーターが動かせる状態になります.最悪,繋げた直後に高速回転して怪我をします.
  • ブラシレスモーターはどこかに固定するのがよいです.固定しないと回転で激しく跳ねることがあります.
  • 可変抵抗のツマミは必ず最低の状態(反時計回りに最大限回したところ)にした状態で接続してください.ツマミが半端な位置にあると,意図しないタイミングでモーターが回転し始めて危険です.

3.3 プログラムの書き込み

Arduino にプログラムを書き込みます.

#include <Servo.h>

#define MAX_SIGNAL 2000  //PWM信号における最大のパルス幅[マイクロ秒]
#define MIN_SIGNAL 1000  //PWM信号における最小のパルス幅[マイクロ秒]
#define ESC_PIN 6  //ESCへの出力ピン
int volume = 0;  //可変抵抗の値を入れる変数
char message[50];  //シリアルモニタへ表示する文字列を入れる変数

Servo esc;  //Servoオブジェクトを作成する.今回はESCにPWM信号を送るので,`esc`と命名している.

void setup() {
  Serial.begin(9600);
  Serial.println("Program begin...");
  Serial.println("This program will calibrate the ESC.");
  Serial.println("Turn on power source, then wait 2 seconds and press any key.");
  
  while (!Serial.available());  //シリアルポートで何か入力されるまで待ちます
  Serial.read();

  esc.attach(ESC_PIN);  //ESCへの出力ピンをアタッチします
  Serial.println("Writing maximum output.");
  esc.writeMicroseconds(MAX_SIGNAL);  //ESCへ最大のパルス幅を指示します
  Serial.println("Wait 2 seconds.");
  delay(2000);
  Serial.println("Writing minimum output");
  esc.writeMicroseconds(MIN_SIGNAL);  //ESCへ最小のパルス幅を指示します
  Serial.println("Wait 2 seconds. Then motor starts");
  delay(2000);
}

void loop() {  
  volume = analogRead(A7) * 3.0;  //可変抵抗の値を1.0で掛けて変数volumeに入れる.値を調整したい場合は倍率を変更する.
  sprintf(message, "Pulse Width: %d micro sec", volume);  //シリアルモニタに表示するメッセージを作成
  Serial.println(message);  //可変抵抗の値をシリアルモニタに表示
  esc.writeMicroseconds(volume);  // パルス幅 `volume` のPWM信号を送信する
}

3.3.1 解説1

#define MAX_SIGNAL 2000  //PWM信号における最大のパルス幅[マイクロ秒]
#define MIN_SIGNAL 1000  //PWM信号における最小のパルス幅[マイクロ秒]

今回使用しているESC (商品名:Skywalker) では,ブラシレスモーターを作動させるための PWM信号のパルス幅の範囲を最初に指定する必要があります.ここではその最小値と最大値を設定しています.

ESCによって設定できる最小値/最大値が異なり,あまりに小さい値や大きい値は設定が無効なことがあります.

3.3.2 解説2

  volume = analogRead(A7) * 3.0;  //可変抵抗の値を3.0で掛けて変数volumeに入れる.値を調整したい場合は倍率を変更する.

ここでは可変抵抗によって分圧された電圧値を読み取り,適当な倍数をかけてPWMのパルス幅に変換しています.

多くの Arduino のアナログ入力端子は10ビットの分解能を持っています.これにより,Arduinoの入力端子にかかる電圧 0~5V を 2の10乗である 1024 までの数字 (0~1023) として読み取ることができます.詳細は下記記事を参照:

3.4 制御

  1. Arduino IDE から Arduino にプログラムを書き込みます.
  2. バッテリー と ESC を接続すると,ESCの仕様によりますがビープ音が何回か鳴ります.
    • 本記事と同じ Skywalker のESCを使用している場合,♪ドレミの音の後に短いビープ音が定期的に鳴るようになります.
  3. シリアルモニタから適当な文字を入力します.すると,最大のパルス幅と最小のパルス幅がESCに送信され,ブラシレスモーターの動作準備が完了します.
    • 本記事と同じ Skywalker のESCを使用している場合,短いビープ音が2連続で鳴るのが2回続き,その後短いビープ音が定期的に鳴るようになります.
    • 準備が完了すると,シリアルモニタで可変抵抗の抵抗値に応じた PWMパルス幅が表示されるようになります.
  4. 可変抵抗のツマミをゆっくりと回して制御します.
    • ある程度まで回さないとブラシレスモーターは動き始めません.PWMパルス幅が 1000~2000 の範囲でブラシレスモーターの速度を制御できます.1000以下では動きませんし,2000を超えても最大の出力までしか出せません.
  5. 心ゆくまでモーターの回転を楽しみます

以上です.

3.5 発展

  • 複数のブラシレスモーターを同時に制御することも可能です.複数を適切に制御することでドローンのように浮遊させることもできます

4. 参照

Discussion