ESP-WROOM-02で鉄道模型を遠隔制御（第２回）

#概要
　鉄道模型をマイコン制御してやろうと思われている皆さん、こんにちは。綾瀬です。ESP-WROOM-02を使って鉄道模型を制御してきたことをまとめていくシリーズの第２回の今回は、ESP-WROOM-02でPWM出力をして、鉄道模型車両を動かしてみたいと思います。写真のiPad miniとアプリは今後使用しますが、今回は使用しません。

![image01.jpg](https://qiita-image-store.s3.amazonaws.com/0/89137/ab76a055-6901-d7d7-5dc5-cae4c21a3b3e.jpeg)

#構成
　今回必要となるものは、以下のものです。動作検証なのでブレッドボード上で回路を組みます。
　ESP-WROOM-02の4番ピン（IO4、Cerevoのブレイクアウトボードでは10番ピンに相当する）と5番ピン（IO5、Cerevoのブレイクアウトボードでは14番ピンに相当する）をフルブリッジドライバTA8428Kの1番端子と2番端子に接続しています。
　TA8428Kの3番端子と5番端子を線路に接続します。
　外部電源として、ACアダプタ（12V/1A）を使用します。ESP-WROOM-02は3.3V駆動なので、３端子レギュレータで3.3Vを生成して入力します。TA8428Kの７番端子（電源端子）には12Vをそのまま入力します。これで、ESP-WROOM-02のPWM出力を、TA8428Kで12Vに変換して線路に流すことができます。

- ESP-WROOM-02及びブレイクアウトボード（今回はCerevo製のものを使用）
- Arduino IDE ver 1.6.5
- ESP8266 core for Arduino [GitHub](https://github.com/esp8266/Arduino)
- フルブリッジモータドライバ（東芝TA8428K） [秋月電子通商](http://akizukidenshi.com/catalog/g/gI-02808/)
- 電解コンデンサ10μF [秋月電子通商](http://akizukidenshi.com/catalog/g/gP-03116/)
- セラミックコンデンサ0.1μF [秋月電子通商](http://akizukidenshi.com/catalog/g/gP-00090/)
- ３端子レギュレータ（3.3V/500mA） [秋月電子通商](http://akizukidenshi.com/catalog/g/gI-00538/)
- 10KΩ抵抗（ESP-WROOM-02のイネーブルピンとリセットピンのプルアップ用）
- ブレッドボード
- ACアダプタ（12V/1A）
- ブレッドボード用DCジャックDIP化モジュール [秋月電子通商](http://akizukidenshi.com/catalog/g/gK-05148/)

![IMG_5832.jpg](https://qiita-image-store.s3.amazonaws.com/0/89137/afb504fb-cf04-edcc-ee81-1e5c5fbea447.jpeg)

#準備
　このシリーズでは、ESP-WROOM-02をArduino化して使用します。そのため、Arduino core for ESP8266をあらかじめArduino IDEに組み込んでおきます。組み込み手順は、すでにいろいろな方が書かれているので省略します。
　以下のサイトに組み込み手順が書かれています。
　[Arduino core for ESP8266](https://github.com/esp8266/Arduino)

#ソースコード
　PWM出力は、analogWriteするだけですので簡単です。analogWriteを４番ピンと５番ピンのいずれか一方に出力することで、線路に流す電圧の大きさ（速度）と極性（進行方向）を変えられます。
　このコードでは、だんだん速度を上げて、最高速度になるとだんだん速度を落として停止、進行方向を変えて、だんだん速度を上げて、最高速度になるとだんだん速度を落として停止することを繰り返します。

```sample.ino
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const int pwmPinR = 4; //IO4（Cerevoのブレイクアウトボードでは10番ピン）
const int pwmPinL = 5; //IO5（Cerevoのブレイクアウトボードでは14番ピン）

//初期化処理
void setup() {
  Serial.begin(115200);
  delay(10);
  
  pinMode(pwmPinR, OUTPUT);
  pinMode(pwmPinL, OUTPUT);
  analogWrite(pwmPinR, 0);
  analogWrite(pwmPinL, 0);

  Serial.println("WiFi module setting... ");
  WiFi.softAP("mySSID", "myPass"); //任意のSSIDとPASSを指定
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP());
}

//PWM出力制御
//speed_num: 速度 0〜250
//LR: 1:右方向　0:左方向
void funcspeed_run(int speed_num, int LR){
  if(LR == 1){
    analogWrite(pwmPinR, speed_num*4);
    analogWrite(pwmPinL, 0);
  }
  else{
    analogWrite(pwmPinR, 0);
    analogWrite(pwmPinL, speed_num*4);
  }
}

//本体処理
void loop() {
  for(int cnt = 0; cnt <= 25; ++cnt){
    funcspeed_run(cnt * 10, 1);
    delay(500);
  }
  for(int cnt = 0; cnt <= 25; ++cnt){
    funcspeed_run((25-cnt) * 10, 1);
    delay(500);
  }
  for(int cnt = 0; cnt <= 25; ++cnt){
    funcspeed_run(cnt * 10, 0);
    delay(500);
  }
  for(int cnt = 0; cnt <= 25; ++cnt){
    funcspeed_run((25-cnt) * 10, 0);
    delay(500);
  }
}
```

#まとめ
　以上の通り、ESP-WROOM-02をArduino化すると、簡単にPWM出力で鉄道模型の制御ができることがわかりました。

#次回予告
　今回のコードではWi-Fi機能をまったく活用していません。次回は、外部から速度や進行方向を変えられるように、ESP-WROOM-02が制御メッセージを受信できるようにするため、ESP-WROOM-02にWebサーバを構築してみたいと思います。

#参考資料

- [技適済みWi-Fiモジュール「ESP8266」で始めるIoT入門（ブレイクアウトボード実装編）](http://tech-blog.cerevo.com/archives/859/)
- [Arduino互換マイコンで鉄道模型を遊ぼう](http://www.geocities.jp/y_taka216/ramonino/home.html)
- [TA8428Kデータシート](http://toshiba.semicon-storage.com/info/lookup.jsp?lang=ja&pid=TA8428K)

#最後に宣伝
　コミックマーケット89において、ESP-WROOM-02とFlashAirの電子工作における比較記事を掲載した電子工作（と酒）の同人誌を頒布します。ESP-WROOM-02とFlashAirで比較製作したGゲージ鉄道模型車両の遠隔制御装置の回路図も掲載しています。冬コミにお越しの際は、ぜひお寄りください。また、冬コミ後には通販でも入手できると思います。
12/31(木) ３日目 東メ－08a「空と月」
![サ－クルカット.png](https://qiita-image-store.s3.amazonaws.com/0/89137/15a2c023-0a31-4688-69ec-69c9be008981.png)