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:回路図
上記のように繋げばモーターが正転、逆転を始めます。PWMの値を変更すると、モーターの回転数も変化します。
ESP32が3Vで駆動できるので、それに合わせて低い電圧でも動くモータードライバを選びました。基盤が熱くなると注意書きがありますが、3V程度の使用であれば問題はないようです。低電圧でも動くモータードライバもいいですね。