🐙
ブラシレスモーターを Arduino と ESC で動かす方法
1. 概要
- ブラシレスモーターを Arduino で制御します.
- サーボテスターでブラシレスモーターの動作確認をする方法については過去記事に記載しています.
2. この記事中で使うもの
- ブラシレスモーター
- ESC
-
Arduino
- ESC に PWM 信号を送信するために使います.
- バッテリー
- PC
-
その他パーツ
- 可変抵抗
- 抵抗値に応じて PWM信号の信号幅を変化させることに使います.
- ジャンパワイヤ
- ブレッドボード
- USBケーブル
- Arduino と PC を接続するために使います.
- 可変抵抗
2.1 購入例
- ブラシレスモーター + ESC
-
Powerfun EDF 50mm + ESC 40A
- これは「ダクテッドファン」という,ブラシレスモーターにファンがついたパーツです.ブラシレスモーターのパワーを風圧で実感できます.
-
Powerfun EDF 50mm + ESC 40A
- Arduino
-
ELEGOO Nano
- Arduino Nanoの互換ボードです.
-
ELEGOO Nano
- バッテリー
-
RCスタジアムセイキ SC4000 NIMH 7.2V 4000mAh + AC急速充電器
- ニッケル水素(Ni-MH)バッテリーです.
-
RCスタジアムセイキ SC4000 NIMH 7.2V 4000mAh + AC急速充電器
- その他のパーツは適当なもので十分です.
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 制御
- Arduino IDE から Arduino にプログラムを書き込みます.
- バッテリー と ESC を接続すると,ESCの仕様によりますがビープ音が何回か鳴ります.
- 本記事と同じ Skywalker のESCを使用している場合,♪ドレミの音の後に短いビープ音が定期的に鳴るようになります.
- シリアルモニタから適当な文字を入力します.すると,最大のパルス幅と最小のパルス幅がESCに送信され,ブラシレスモーターの動作準備が完了します.
- 本記事と同じ Skywalker のESCを使用している場合,短いビープ音が2連続で鳴るのが2回続き,その後短いビープ音が定期的に鳴るようになります.
- 準備が完了すると,シリアルモニタで可変抵抗の抵抗値に応じた PWMパルス幅が表示されるようになります.
- 可変抵抗のツマミをゆっくりと回して制御します.
- ある程度まで回さないとブラシレスモーターは動き始めません.PWMパルス幅が 1000~2000 の範囲でブラシレスモーターの速度を制御できます.1000以下では動きませんし,2000を超えても最大の出力までしか出せません.
- 心ゆくまでモーターの回転を楽しみます.
以上です.
3.5 発展
- 複数のブラシレスモーターを同時に制御することも可能です.複数を適切に制御することでドローンのように浮遊させることもできます.
Discussion