ESP32

ESP32でモーターを動かしてみます

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)を採用

接続

部品を以下のように接続していきます。

モータードライバ接続先説明
PWMAESP32の12ピンPWM入力
AIN2ESP32の14ピンchA 入力2
AIN1ESP32の13ピンchA 入力1
STBYESP32の25ピンスタンバイ(Power Save)モード
VMブレッドボードの赤のラインモーター用の電圧
VCCESP32の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つまでモーターの制御ができるので、そちらも引き続きやってみたいと思います。

【参考図書】