ESP8266でMP4212を使ってモーターを制御しようと思ったら、情報が断片的でハマったので、わかりやすくまとめてみました。
読みやすいサンプルソースも無かったので、なるべく読みやすく組みました。
Raspberry PiもGPIOが使えるので同様に制御できると思います。
MP4207も同様に制御できると思います。
※モータードライバTA7291Pが簡単だったのでMP4212も楽勝だろう思ったら、前提知識が多く必要で困りました。
MP4212はそもそもモータードライバではなく、汎用のHブリッジICなんですね。
Hブリッジについては、こちらのページが分かりやすいです。
※MP4212は内部抵抗が小さくて発熱も少ない自作ラジコンやロボットに向いている優秀なICなのですが、生産が終了し流通在庫のみらしいので、欲しい場合は秋月電子通商の上位互換品TPC8407×2モジュール MP4212ピン互換 パワーMOSFETモジュールを買うと良いかもです。
MP4212の等価回路
MP4212のデータシートによると等価回路は以下の通りです。
うん。初心者の私には全くわからん。
ので、一つずつ読み解いていきます。
一番分かりやすいところ(電源)から行くと
- 10ピンは、モーター用の電源の(+)を接続します
- 1ピンは、モーター用の電源の(-)GNDを接続します
これは簡単。
モーターをつなぐ所は、DCモーターの端子2つをそれぞれ、端子A、端子Bとして
- 3,7ピンはモーターの端子Aに接続します
- 5,9ピンはモーターの端子Bに接続します
残りは、制御用の信号をいれるピンです。
- 6,8,2,4ピンはGPIO4つに接続します。
制御方法は後述。
FET(電解効果トランジスタ)のPチャネル、Nチャネル
次に電源の極性を逆転してモーターに伝える仕組みを理解する前提条件として、MP4212の内部でスイッチとして使われているFET(電解効果トランジスタ)のPチャネル、NチャネルのON/OFF条件の理解が必要です。
- 赤いところがPチャネルのFETで、LOWでON、HIGHでOFFになります
- 青いところがNチャネルのFETで、HIGHでON、LOWでOFFになります
- だから
- 6ピンまたは8ピンをONにするにはdigitalWrite(PIN, LOW)
- 2ピンまたは4ピンをONにするにはdigitalWrite(PIN, HIGH)
ということを理解します。
それをふまえて、以下。
モーターを正転
- 6ピンと4ピンをONにすると正転
モーターを逆転
- 8ピンと2ピンをONにすると逆転
モーターの速度
モーターの速度を制御する場合は、
- 正転の場合6ピンをPWM制御します。
- 逆転の場合8ピンをPWM制御します。
- PWM制御というと難しそうですがようするにanalogWriteです。
- LOW(=0)がONなので、analogWrite(PIN, 0)が速く、1023に近いほど遅く回転します。
モーターを停止
モーターを停止する場合は、
- 6ピン、8ピン、2ピン、4ピンを全部OFFにします
- つまり、
- 6ピン、8ピンをHIGH(OFF)
- 2ピン、4ピンをLOW(OFF)
- ですね
モーターをブレーキ
モーターをブレーキする場合は、モーターの端子をショートさせれば良いので、
- 2ピン、4ピンのみをONにします
- つまり、
- 6ピン、8ピンをHIGH(OFF)
- 2ピン、4ピンをHIGH(ON)
- ですね
ここまで分かったらあとは簡単。
回路図
ソースコード
スケッチは以下の通り。
// GPIOのPIN設定
const int FET6 = 5; // MP4212 Pch LOW :on HIGH:off
const int FET8 = 14; // MP4212 Pch LOW :on HIGH:off
const int FET2 = 12; // MP4212 Nch HIGH:on LOW :off
const int FET4 = 4; // MP4212 Nch HIGH:on LOW :off
// 正転
void forward(int speed) {
analogWrite (FET6, 1023-speed); // on
digitalWrite(FET8, HIGH); // off
digitalWrite(FET2, LOW); // off
digitalWrite(FET4, HIGH); // on
}
// 逆転
void back(int speed) {
digitalWrite(FET6, HIGH); // off
analogWrite (FET8, 1023-speed); // on
digitalWrite(FET2, HIGH); // on
digitalWrite(FET4, LOW); // off
}
// 停止
void stop() {
digitalWrite(FET6, HIGH); // off
digitalWrite(FET8, HIGH); // off
digitalWrite(FET2, LOW); // off
digitalWrite(FET4, LOW); // off
}
// ブレーキ
void brake() {
digitalWrite(FET6, HIGH); // off
digitalWrite(FET8, HIGH); // off
digitalWrite(FET2, HIGH); // on
digitalWrite(FET4, HIGH); // on
}
void setup() {
pinMode(FET6, OUTPUT);
pinMode(FET8, OUTPUT);
pinMode(FET2, OUTPUT);
pinMode(FET4, OUTPUT);
}
void loop() {
// 正転(徐々に加速)
for (int sp=0;sp<=1023;sp++) {
forward(sp);
delay(2);
}
delay(1000);
// 停止(慣性)
stop();
delay(1000);
// 逆転(徐々に加速)
for (int sp=0;sp<=1023;sp++) {
back(sp);
delay(2);
}
delay(1000);
// ブレーキ
brake();
delay(1000);
}
動作デモ
ESP8266でMP4212を使いモーターを制御してみた。(正転、逆転、速度、停止、ブレーキ) pic.twitter.com/XRApK84Siy
— Yukito (@yukitter) 2017年5月11日