LINE Thingsでパトランプを回してみた

# はじめに
タイトルの通りです。（大阪の方の）日本橋で[パトランプキット](http://eleshop.jp/shop/g/gDBP412/)を買ったのでこれをLINE Thingsを使ってハックしてみました。

# 使用部品と回転動画
今回使ったメインの部品は以下になります。

| 部品名 | 製品名 |
| :-:  | :-: |
| マイコン | [ESP32](https://www.switch-science.com/catalog/3210/) |
| パトランプ | [赤色回転灯](http://eleshop.jp/shop/g/gDBP412/) |
| 電源 | [ACアダプタ DC12V 1A](http://eleshop.jp/shop/g/gFA8311/) |
| マイコン用電圧変換IC | [三端子レギュレーター　５Ｖ](http://akizukidenshi.com/catalog/g/gI-07903/) |
| リレーモジュール | [大電流大型リレーモジュールキット１２Ｖ](http://akizukidenshi.com/catalog/g/gK-06095/) |

後はコネクタやらコンデンサ（レギュレーター用の）を使いましたが~~面倒くさいので~~省略します。動作はこんな感じになります。

[![動画](http://img.youtube.com/vi/GGeINv8YT2g/0.jpg)](https://www.youtube.com/watch?v=GGeINv8YT2g)

このパトランプはPWMを使って回転を制御するわけですが、あるデューティ比以下になると回転を停止します。こうなるともう一度回転させるために電源を入れなおす必要があります。そのため、「回転 -> 無回転」みたいな制御をするにはパトランプ電源のON・OFFそのものを制御する必要があります。
しかしパトランプは12Vの電源で駆動しているので直接マイコンで制御はできません。そこでリレーモジュールを使って制御を行います。もしかしたら動画の中で「カチッ、カチッ」という音が聞こえた人がいるかもしれませんがこれはリレーの中の接点が切り替わる音です。
ちなみにこれは私のアホな体験談ですが、当初はリレーモジュール（要はドライバ回路ありのもの）を使わずにリレー単体を使って直接パトランプをスイッチ駆動させてました。実は最初はこれでも動くのですが、一ヶ月後、GPIOが壊れてしまったのか全く動かなくなりました。やっぱりリレーは結構電流を食う素子なので、ちゃんとコイル電源にはトランジスタを使うとか、逆起電力防止のためにダイオード使うことが大事だと学びました。まあ、こんな失敗するの私だけかもしれませんがｗ

# LINE Thingsにつなげてみる
LINE Thingsを知ったのは1ヵ月以上前の話だったのですが、やってみたいなーと思いながらも実際にはなかなか手を動かす気力がなくこんな時期に記事を書くことになりましたw
でもこの項目についてはあまり書くことが無いなーというのが本音です。LINE Thingsについては[このLINEさんのハンズオンの記事](https://qiita.com/hktechno/items/bb83cc898c75819b2664)に詳しく書かれています。ここでは公式のサンプルコードからいじった箇所（UUIDとかは除いて）について触れます。
ESP32の方のコード（Arduinoなのでスケッチと言うべきか）は`setup()`関数にPWMピンの設定を加えます。

```c++:Arduino.ino
void setup() {
  Serial.begin(115200);

  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, LOW);
  
  pinMode(PATLAMP, OUTPUT);
  ledcSetup(CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
  ledcAttachPin(PATLAMP, CHANNEL_0);
  ledcAttachPin(PATLAMP, CHANNEL_0);
  ledcWrite(CHANNEL_0, 512);

  BLEDevice::init("");
  BLEDevice::setEncryptionLevel(ESP_BLE_SEC_ENCRYPT_NO_MITM);

  // Security Settings
  BLESecurity *thingsSecurity = new BLESecurity();
  thingsSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND);
  thingsSecurity->setCapability(ESP_IO_CAP_NONE);
  thingsSecurity->setInitEncryptionKey(ESP_BLE_ENC_KEY_MASK | ESP_BLE_ID_KEY_MASK);

  setupServices();
  startAdvertising();
  Serial.println("Ready to Connect");
}
```
加えたのは以下のリレーと回転灯へのPWM信号に関するGPIOの設定です。ESP32の場合は`ledWrite()`関数を使ってPWMを設定します。

```c++:
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);

pinMode(PATLAMP, OUTPUT);
ledcSetup(CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
ledcAttachPin(PATLAMP, CHANNEL_0);
ledcWrite(CHANNEL_0, 512);
```
ちなみに`CHANNEL_0`はチャンネル番号で`0`に、`LEDC_BASE_FREQ`はPWMの周波数で`20000`に（あまり低い数値だとパトランプのモーターが脱調する）、`LEDC_TIMER_BIT`はPWMのデューティ比に関するビットサイズで`10`（0で0%、1023で100%）に設定しました。今回はデフォルトで`ledWrite()`で512（デューティ比50%）の設定でPWMを永続的に発生させています。
また、`RELAY`はGPIOが設定できるピン番号を、`PATLAMP`はPWMに対応している適当なピンを指定しました。ピンアサインは[適当なサイト](https://leico.github.io/TechnicalNote/Arduino/esp32-pinmap)で参照してください。
今回はリレーのON・OFFのみ制御してパトランプを「回転 -> 無回転 -> 回転」とLINE Thingsで操作します。つまりのところ、LINE Things[ハンズオンのページ](https://qiita.com/hktechno/items/bb83cc898c75819b2664)を見てくれた人は分かったかと思いますが、他のコード（特にliffのところ）は全くいじってません。
なので以後のliffとの連携はハンズオンの記事と全く同じなので~~面倒くさいので~~省略します。

#さいごに
LINE Thingsは結構簡単に始められます。~~実際こんな手抜き記事みてないで~~[ハンズオンの記事](https://qiita.com/hktechno/items/bb83cc898c75819b2664)を見て初めて見るといいと思います。とりあえず今後の目標としてパトランプの回転速度をliff側でコントロールしたいなと思ってます。
そのためにはhtml/css/JavaScriptにも着手する必要があるのですが、そこらへんは苦手領域なのでその部分を重点的に勉強していきたいです。何かオススメの勉強法あれば教えてください、何でもしますから！