ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【ESP32】PWMでモーターを制御する方法

ESP32でPWM制御をやってみました。ESP32ではPWM用のピンがあるわけではなく、ソフト側でPWMの設定を行います。


1:ESP32でのPWMの使い方
 ledcSetup、ledcAttachPin、ledcWriteの関数を使用します。
 ledcSetupでPWMの設定、ledcAttachPinでチャンネルとピンを対応、ledcWriteで実行という流れです。

// 1:ledcSetup(チャンネル, 周波数, PWMの範囲);
ledcSetup(0, 490, 8);

// 2:ledcAttachPin(ピン番号, チャンネル);
ledcAttachPin(7, 0);

// 3:ledcWrite(チャンネル, PWM値);
ledcWrite(0, 255);

※ledcSetupでのPWMの範囲は、8(8bit)を設定した場合は0〜255、10(10bit)の場合は0〜1023になります。

 これでPWMの使い方がわかったので、ESP32でモーターの制御をやっていきます。


1:材料
・電池ボックス
電池ボックス 単3×2本 リード線・スイッチ付: パーツ一般 秋月電子通商 電子部品 ネット通販

・モータードライバ(半田付けが必要)
DRV8835使用ステッピング&DCモータドライバモジュール: 組立キット 秋月電子通商 電子部品 ネット通販

・モーター
DCモーター FA−130RA−2270: パーツ一般 秋月電子通商 電子部品 ネット通販

・単3電池2本


2:プログラム

/* 使うピンの定義 */
const int IN1 = 25;
const int IN2 = 26;

/* チャンネルの定義 */
const int CHANNEL_0 = 0;
const int CHANNEL_1 = 1;

const int LEDC_TIMER_BIT = 8;   // PWMの範囲(8bitなら0〜255、10bitなら0〜1023)
const int LEDC_BASE_FREQ = 490; // 周波数(Hz)
const int VALUE_MAX = 255;      // PWMの最大値

void setup() {
  pinMode(IN1, OUTPUT); // IN1
  pinMode(IN2, OUTPUT); // IN2

  // ピンのセットアップ
  ledcSetup(CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
  ledcSetup(CHANNEL_1, LEDC_BASE_FREQ, LEDC_TIMER_BIT);

  // ピンのチャンネルをセット
  ledcAttachPin(IN1, CHANNEL_0);
  ledcAttachPin(IN2, CHANNEL_1);
}

void loop() {
  forward(255); // 正転
  delay(3000);
  coast();      // 空転
  delay(3000);
  reverse(100); // 逆転
  delay(3000);
  brake();      // ブレーキ
  delay(3000);
}

// 正転
void forward(uint32_t pwm) {
  if (pwm > VALUE_MAX) {
    pwm = VALUE_MAX;
  }
  ledcWrite(CHANNEL_0, pwm);
  ledcWrite(CHANNEL_1, 0);
}

// 逆転
void reverse(uint32_t pwm) {
  if (pwm > VALUE_MAX) {
    pwm = VALUE_MAX;
  }
  ledcWrite(CHANNEL_0, 0);
  ledcWrite(CHANNEL_1, pwm);
}

// ブレーキ
void brake() {
  ledcWrite(CHANNEL_0, VALUE_MAX);
  ledcWrite(CHANNEL_1, VALUE_MAX);
}

// 空転
void coast() {
  ledcWrite(CHANNEL_0, 0);
  ledcWrite(CHANNEL_1, 0);
}


3:回路図
f:id:rikoubou:20170605183739p:plain


 上記のように繋げばモーターが正転、逆転を始めます。PWMの値を変更すると、モーターの回転数も変化します。

 ESP32が3Vで駆動できるので、それに合わせて低い電圧でも動くモータードライバを選びました。基盤が熱くなると注意書きがありますが、3V程度の使用であれば問題はないようです。低電圧でも動くモータードライバもいいですね。