非リモコン家電もGoogle Homeで操作したい

# ファンヒーターを赤外線操作に対応させる

[Nature Remo](https://nature-jp.myshopify.com)を買いました。Nature RemoはGoogle Homeと連携して、赤外線リモコンで家電を操作できる便利なデバイスです。[IFTTTを利用することで赤外線操作をGoogle Homeから指示できます](https://qiita.com/wyokobe/items/62653f40ec9ea0461171)。例えば、Google Homeに「エアコンをつけて」と話すと、Nature Remoから赤外線で電源ONの信号が発せられて、エアコンをつけることができます。
ですが、我が家で冬に一番活躍している家電「灯油ファンヒーター」は赤外線リモコン機能が付いていません。そこで、Google Homeからファンヒーターを操作するために、ファンヒーターを赤外線操作に対応させてみました。

ちなみに、赤外線で操作可能にすると、留守中などに誤って電源が入ってしまうのが怖いですね。我が家のファンヒーターは３時間稼働で自動で電源OFFになるので、まあOKとしました。

# 準備
工作にあたって下記のものを揃えました。

 * [Arduino Pro Mini 328 3.3V 8MHz](https://www.switch-science.com/catalog/876/)
 * [USB-シリアルアダプタ](https://www.switch-science.com/catalog/343/)（Arduino Pro Miniのスケッチ書き込み用)
 * [赤外線リモコン受信モジュール](http://akizukidenshi.com/catalog/g/gI-01570/)
 * [フォトカプラ TLP785](http://akizukidenshi.com/catalog/g/gI-07554/)
 * [CdSセル](http://akizukidenshi.com/catalog/g/gI-00110/)
 * 抵抗1kΩ (CdSセンサ読み取りのプルダウン？抵抗として)
 * セラミックコンデンサ1μF (赤外線受信モジュールのパスコンとして)

# 赤外線を受信する
ファンヒーター内部には広めの空間があり、そこは熱くならないことを確認できたので、そこにArduinoを設置することにしました。ですが、赤外線を受信する赤外線モジュールだけは外に出す必要があります。ファンヒーターの操作盤は、一部が薄いシールのようになっており、カッターで切れました。そこで下の写真のように切り込みを入れて赤外線受信モジュールの顔を外にださせることにしました。

<img width="256" alt="スクリーンショット 2018-01-30 10.17.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/2ae9d738-7227-d4af-1be3-3eb8e72c59d5.png">


# 電源操作
ファンヒーターの操作盤を見たところタクトスイッチを押すと電源のON/OFFが切り替わる仕様でした。タクトスイッチの箇所に下の図のようにフォトカプラをつなげて、Arduinoからの操作で、タクトスイッチが通電するようにしました。
<img width="376" alt="switch.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/d1dc86e6-f800-baab-9020-19a82a92c4a9.png">

# 電源状態チェック
ファンヒーターをOFFにするときは確実にOFFにしたいですが、ファンヒーターの電源はトグル式なので、確実にOFFにするためにはON/OFF状態を認識する必要があります。電子工作素人のため、よく分かっていないファンヒータ側の回路にarduinoの回路を接続したくなかったので、電源ランプ(LED)の光を光センサ(CdSセル)で検知してON/OFFをチェックするようにしました。CdSセルはグルーガンで固定してます。
<img width="242" alt="スクリーンショット 2018-01-30 10.12.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/bb40036d-bbcc-9afa-bb08-042149f0e429.png">

# プログラムを書く
受信した赤外線の解析には「[IRremote Arduino Library](https://github.com/z3t0/Arduino-IRremote)」を利用しました。[ダウンロードページ](https://github.com/z3t0/Arduino-IRremote/releases)からIRremote.zipをダウンロードして、Arduinoのライブラリに追加します。Macでは「書類→Arduino→libraries」以下に解凍して配置すればOKでした。
そして、重要なこととして**「/Applications/Arduino/Contents/Java/libraries/Arduino-IRremote-master.zip」を削除する**必要がありました。これを削除しないとコンパイル時にエラーになりました。READMEにきちんと書いてますね。
無事にライブラリが追加できるとサンプルスケッチも追加されるので、「IRrecvDemo」を参考にプログラムを書きます。

```arduino
#include <IRremote.h>
int OUT_PIN = 12;
int CDS_PIN = 13;
IRrecv irrecv(10);
decode_results results;
void setup()
{
  irrecv.enableIRIn(); // Start the receiver
  pinMode(OUT_PIN, OUTPUT); // フォトカプラ通電用
  pinMode(CDS_PIN, OUTPUT); // CdS通電用
}

void loop() {
  if (irrecv.decode(&results)) {
    irrecv.resume(); 
    if (results.value == 0x1768976 /* ON操作  */ ||
        results.value == 0x17601FE /* OFF操作 */) { 
// 電源LED状態チェック
      digitalWrite(CDS_PIN, HIGH);
      delay(500);
      int brightness = analogRead(0);
      digitalWrite(CDS_PIN, LOW);
// ON操作 & すでに電源ONならなにもしない
      if (results.value == 0x1768976 && brightness > 12) { // 12は経験則 
        return;
      }
// OFF操作 & すでに電源OFFならなにもしない
      if (results.value == 0x17601FE && brightness <= 12) {
        return;
      }
// フォトカプラに１秒間通電
      digitalWrite(OUT_PIN, HIGH);
      delay(1000);
      digitalWrite(OUT_PIN, LOW);
    }
```

# 完成！
最後に赤外線モジュールやフォトカプラ、CdSセルをArduinoに配線して完成です。設置スペースが広かったのでブレッドボードのままで完成としました。電源は9V電池をArduinoのRAWとGNDに直接つないでます。どれくらい持つかな？

<img width="402" alt="スクリーンショット 2018-01-30 11.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/2e1ebc2e-84db-7ce2-ba69-80dc755dfe40.png">

## Nature Remoからうごかない？

家の照明の赤外線リモコンでコード(0x1768976、0x17601FE)で動くようにプログラムし、Nature Remoにも同じリモコンで学習させました。ですが、照明のリモコンからは操作を受け付けるのに、Nature Remoからは操作を受け付けません。

## 修正
受信したコードを表示させてみたところ、リモコンの赤外線コード(0x1768976、0x17601FE)と、リモコンを学習させたNature Remoからでる赤外線コード(0xA63015C, 0xA2D0DADC)が異なってました。
理由はわかりませんが、Nature Remoからの赤外線コードにも対応するようにプログラムを修正して、無事に動くようになりました。

# おねがい

私は電子工作しろうとなので、上記の方法で危険な箇所などあるかもしれません。そのような場合はぜひやさしくご指摘いただけると助かります。