たぶん一番わかりやすいESP8266でMP4212を使ってモーターを制御する方法（正転、逆転、速度、停止、ブレーキ） ※MP4207も同様

[ESP8266](http://amzn.to/2zoZ2aj)でMP4212を使ってモーターを制御しようと思ったら、情報が断片的でハマったので、わかりやすくまとめてみました。
読みやすいサンプルソースも無かったので、なるべく読みやすく組みました。
Raspberry PiもGPIOが使えるので同様に制御できると思います。
MP4207も同様に制御できると思います。
※モータードライバTA7291Pが簡単だったのでMP4212も楽勝だろう思ったら、前提知識が多く必要で困りました。

MP4212はそもそもモータードライバではなく、汎用のHブリッジICなんですね。
Hブリッジについては、[こちらのページ](http://www.picfun.com/motor03.html)が分かりやすいです。

※MP4212は内部抵抗が小さくて発熱も少ない自作ラジコンやロボットに向いている優秀なICなのですが、生産が終了し流通在庫のみらしいので、欲しい場合は秋月電子通商の上位互換品[ＴＰＣ８４０７×２モジュール　ＭＰ４２１２ピン互換　パワーＭＯＳＦＥＴモジュール](http://akizukidenshi.com/catalog/g/gK-10721/)を買うと良いかもです。

## MP4212の等価回路
[MP4212のデータシート](http://akizukidenshi.com/download/ds/toshiba/MP4212.pdf)によると等価回路は以下の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/5cacddf0-a0fe-94d3-3569-2f81b63f863c.png)

**うん。初心者の私には全くわからん。**
ので、一つずつ読み解いていきます。

一番分かりやすいところ（電源）から行くと

- 10ピンは、モーター用の電源の（＋）を接続します
- 1ピンは、モーター用の電源の（－）GNDを接続します

これは簡単。

モーターをつなぐ所は、DCモーターの端子２つをそれぞれ、端子A、端子Bとして

- 3,7ピンはモーターの端子Aに接続します
- 5,9ピンはモーターの端子Bに接続します

残りは、制御用の信号をいれるピンです。

- 6,8,2,4ピンはGPIO４つに接続します。

制御方法は後述。

## FET（電解効果トランジスタ）のPチャネル、Nチャネル
次に電源の極性を逆転してモーターに伝える仕組みを理解する前提条件として、MP4212の内部でスイッチとして使われているFET（電解効果トランジスタ）のPチャネル、NチャネルのON/OFF条件の理解が必要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/d1fa342f-a132-7f97-9cca-3be349a85ab5.png)

- 赤いところがPチャネルのFETで、LOWでON、HIGHでOFFになります
- 青いところがNチャネルのFETで、HIGHでON、LOWでOFFになります
- だから
    - 6ピンまたは8ピンをONにするにはdigitalWrite(PIN, LOW)
    - 2ピンまたは4ピンをONにするにはdigitalWrite(PIN, HIGH)

ということを理解します。

それをふまえて、以下。

## モーターを正転
モーター(M)を正転するには次のように信号を制御します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/09a778df-dcea-4229-a03d-e9c7d105e88c.png)

- 6ピンと4ピンをONにすると正転

## モーターを逆転
モーター(M)を逆転するには次のように信号を制御します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/36d67ac0-15b5-af49-f5fe-c23a81f466c7.png)

- 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）
    - ですね


ここまで分かったらあとは簡単。

## 回路図
以下のように接続します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/7eeb3b1e-db31-65bf-ae46-c1c105293b5e.png)

![P5010235.jpg](https://qiita-image-store.s3.amazonaws.com/0/157770/25d68ec0-fd35-02f3-329b-3a584dd38ceb.jpeg)


## ソースコード
スケッチは以下の通り。

```c:MP4212.ino

// 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);

}

```

## 動作デモ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ESP8266でMP4212を使いモーターを制御してみた。（正転、逆転、速度、停止、ブレーキ） <a href="https://t.co/XRApK84Siy">pic.twitter.com/XRApK84Siy</a></p>&mdash; Yukito (@yukitter) <a href="https://twitter.com/yukitter/status/862793721162588160">2017年5月11日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>