ESP32でモーターを動かしてみたいと思います。モーターを動かすために、LEDの明るさ制御と同じくPWMを使用したいと思います。
ESP32とモーターの接続
ESP32とモーターなど、周辺機器を接続していきます。
準備するもの
今回使用するものは、以下になります。
- ESP32
- ブレッドボード
- ジャンパーワイヤー
- モーター
- モータードライバ
- 電池
- 電池BOX
モーター
モーターは、秋月電子通商様から「DCモーター FA-130RA-2270」を購入しました。
主な仕様は以下になります。
- 電圧範囲:1.5~3.0VDC(標準1.5V)
- 無負荷時電流:0.2A(0.26Amax)
- 無負荷時回転数:約8100~9900回転/分
- 定格負荷時電流:0.66A(0.85Amax)
- 定格負荷時回転数:約7,000回転/分
- 負荷:6.0g・cm
- 負荷出力:0.43W
- 効率:44%
- 静止電流:2.2A
- 静止トルク:26g・cm
- 軸径:φ2mm
- 重量:約17g
いろいろ仕様が並べられていますが、とりあえず今回は電圧範囲だけ気を付けていきたいと思います。というか、勉強不足であまりその他の項目について、詳しくわかりません。ちょっとずつ勉強していこうと思います。
モータードライバ
モータードライバは、Amazonから「デュアル モーター ドライバー モジュール TB6612FNG」を購入しました。
主な仕様は以下になります。
- 電源電圧 : VM = 15 V(Max)
- 出力電流:IOUT=1.2A(ave)/3.2A(peak)
- 出力低ON抵抗:0.5Ω(上+下 Typ.値 @VM≧5V)
- スタンバイ(Power save)機能
- 正転/逆転/ショートブレーキ/ストップ制御機能
- 熱遮断(TSD)回路および、低電圧検出回路を内蔵
- 小型面実装パッケージ(SSOP24:0.65mm Lead pitch)を採用
接続
部品を以下のように接続していきます。
モータードライバ | 接続先 | 説明 |
---|---|---|
PWMA | ESP32の12ピン | PWM入力 |
AIN2 | ESP32の14ピン | chA 入力2 |
AIN1 | ESP32の13ピン | chA 入力1 |
STBY | ESP32の25ピン | スタンバイ(Power Save)モード |
VM | ブレッドボードの赤のライン | モーター用の電圧 |
VCC | ESP32の3.3V | モータードライバ用の電圧 |
A02 | モーターの黄色線 | chA 出力2 |
A01 | モーターの緑線 | chA 出力1 |
GND | ブレッドボードの黒のライン | GND |
プログラム作成
モーターが回転することを確認するだけのプログラムを作成していきます。
プログラム
// モータ制御
const int PWMA = 12;
const int AIN1 = 13;
const int AIN2 = 14;
const int STBY = 25;
const int LEDC_CHANNEL = 0;
const int LEDC_BASE_FREQ = 1000;
void setup() {
// PWMの初期化
ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, 8);
ledcAttachPin(PWMA, LEDC_CHANNEL);
// GPIOピンの初期化
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(STBY, OUTPUT);
digitalWrite(STBY, HIGH);
}
void loop() {
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
// 加速
for(int i = 0; i <= 255; i++){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 減速
for(int i = 255; i >= 0; i--){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 停止
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
delay(500);
// 逆回転
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
// 加速
for(int i = 0; i <= 255; i++){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 減速
for(int i = 255; i >= 0; i--){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 停止
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
delay(500);
}
プログラムについて簡単に説明していきます。
// PWMの初期化
ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, 8);
ledcAttachPin(PWMA, LEDC_CHANNEL);
10行目の「ledcSetup関数」で、チャンネルごとのPWM動作の設定を行っています。
・ledcSetup(チャンネル番号, 周波数, ビット数);
今回は、チャンネル0を使用しています。周波数を1000Hzに指定して、ビット数に8を設定しています。
ビット数は、PWMのデューティー比に指定する値の範囲になります。8ビット指定だと0~255まで値を指定できます。
11行目の「ledcAttachPin関数」で、PWM出力に使うGPIOピンを設定しています。
・ledcAttachPin(ピン番号, チャンネル番号);
PWMの出力ピンと、先ほど設定したチャンネル番号を設定しています。
// GPIOピンの初期化
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(STBY, OUTPUT);
digitalWrite(STBY, HIGH);
15~18行目は、モータードライバに接続しているGPIOをOUTPUTの設定にしています。
20行目で「STBY」をHIGHにすることで、モータードライバの省電力モードを解除しています。LOWにすることでモータードライバを省電力モードで使用できます。
void loop() {
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
// 加速
for(int i = 0; i <= 255; i++){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 減速
for(int i = 255; i >= 0; i--){
ledcWrite(LEDC_CHANNEL, i);
delay(10);
}
// 停止
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
delay(500);
// 逆回転
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
23行目からは、繰り返し行う処理になります。
24、25行目で、AIN1にHIGH、AIN2にLOWを設定してモーターを正転させます。
28~31行目で、指定チェンネルのPWM出力のデューティ比を徐々に増加させることで、モーターを徐々に加速させます。
33~36行目で、指定チャンネルのPWM出力のデューティ比を徐々に減少させることで、モーターを徐々に減速させています。
38、39行目で、AIN1、および、AIN2を両方HIGHにすることで、モーターを停止させています(両方ともLOWでも変わりません)。
43、44行目で正転の設定とは逆に、AIN1にLOW、AIN2にHIGHを設定することで、モーターの回転方向が逆回転になります。
それ以降は、徐々に加速してから徐々に減速して停止をしています。
全体の動作としては、正転で加速から減速して停止、逆回転で加速してから減速して停止、という処理を繰り返しています。
動作確認
実際に接続して、プログラムを書き込んで動作させてみました。
電池はエネループを2本使用しています。1本で1.2Vなので、2本で2.4Vになります。モーターの電圧が1.5V~3Vとなっているので、たぶん大丈夫だと思いますが、標準1.5Vがちょっと気になります。もう少し勉強が必要そうです。
モーターが加速してから、減速して停止、今度は逆回転で加速してから、減速して停止までの動作が確認できました。当たり前ですが、プログラム通りに動きました。
まとめ
ESP32でモーターを動かしてみました。
自分でPWMの出力制御プログラムを作成することなく、簡単にモーターを動かすことができ、さらに回転速度まで簡単に操作できてしまいました。
もう少しモーターの勉強をしていきつつ、ラジコンでも作っていけたらと思います。
今回使用したモータードライバでは、2つまでモーターの制御ができるので、そちらも引き続きやってみたいと思います。
【参考図書】