自宅テレビのリモコンが不調になった際の対処法

[谷ゼミの落書き帳](https://qiita.com/advent-calendar/2018/drawing_pad_from_tani_seminar)14日目の記事になります。
学生、社会人、教授、などなど色々な人が好き勝手に書いてる楽しいカレンダーなので、是非見てくださいね。

さあ今日の記事も頑張って書きます。

#はじめに
唐突ですが、我が家のテレビって大学時代から使っている（友人からもらった）物でして、もう10年くらいのものだと思うんですよ。
まあ、別に見ることに問題はないんですが、こっちが問題ですよね。
![75394.jpg](https://qiita-image-store.s3.amazonaws.com/0/212804/5b03cf8a-6373-f1fa-2523-5ee8d704d44e.jpeg)
（汚ねえ）
もう、全然操作ができないんですよ。
電源ボタンなんて、もう埋め込んで壊すくらいの力で押さないと反応しなくて、もう不便極まりないんですよね。
つけたいときにつかないし、消したい時に消えないし。
まあ買い替えろって話なんですけど、これ、もしかしてなんとかできるんじゃねって思って、ちょっとした思いつきで初めてみました。

皆さんも自宅のテレビリモコン不調ではないですか？
簡単ですので是非やってみてください。

#やりたいこと
**テレビのリモコンを作る**
Androidスマホ　→（Bluetooth）→ arduino　→（赤外線通信）→　テレビ
こんな感じを目指します。

#方法
（下準備）
１：arduinoの赤外線受信モジュールでリモコンの赤外線通信をフックして送信情報を見る
（本開発）
２：arduinoの赤外線送信モジュールで１でフックした情報を送信可能にする
３：スマホとarduinoをBluetoothで連携し、赤外線通信のトリガーをスマホから送信する

#必要な物
・arduino uno
・赤外線受信モジュール
・赤外線送信モジュール
・Bluetoothモジュール
・ブレッドボード
・ジャンパーワイヤー
・パソコン
・androidスマートフォン

#リモコンの赤外線をフックする
（フックという単語の使い方が合っているのか不安。かっこつけて使っているのである。）

私の記事ではよく登場します[osoyooさんのモジュールキット](http://osoyoo.com/ja/2015/03/11/osoyoo-sensor-modules-kit-for-arduino/)から[赤外線受信モジュール](http://osoyoo.com/ja/2015/03/25/ir-receiver-module/)を利用します。

回路とプログラムは[ここ](http://osoyoo.com/ja/2015/03/25/ir-receiver-module/)に書いてあることそのままです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">qiita埋め込み用動画。<br>赤外線通信をフックしてログに吐かせてみたの。 <a href="https://t.co/zxiEM5rqV2">pic.twitter.com/zxiEM5rqV2</a></p>&mdash; あーたろ (@kotarotaro_A) <a href="https://twitter.com/kotarotaro_A/status/1073955857941983234?ref_src=twsrc%5Etfw">2018年12月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
こうなります。
受信した赤外線情報を16進数でログに吐かせています。
<img width="435" alt="スクリーンショット 2018-12-15 17.19.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/212804/24c27960-f7c9-d91f-702c-b06772f3c242.png">
そして結果をまとめるとこんな感じ。

| 操作|通信情報|
|---|---|
|電源|AF5E817|
|4ch|6A952ED1|
|5ch|6A95AE51|
|6ch|6A956E91|
|7ch|6A95EE11|
|8ch|6A951EE1|
おそらく、メーカーとかによって通信情報は異なるんだと思います。
赤外線の通信規格についても調べたのですが、あれは光の概念なので、波長を変更することでデータをやりとりしているという、ふんわりした感じの理解だけで止まりました。
多分深追いして調べても深淵に落ちていく気がしたので、ふんわりした理解でもリモコンくらい作れるやろっていう感覚で次に進みます。

#arduinoから赤外線を送信する
続いて、同様の[モジュールキット](http://osoyoo.com/ja/2015/03/11/osoyoo-sensor-modules-kit-for-arduino/)から[赤外線送信モジュール](http://osoyoo.com/ja/2015/03/25/infrared-transmitter-module/)を利用して、赤外線を送信する部分を作成します。

こちらも同様に[こちら](http://osoyoo.com/ja/2015/03/25/infrared-transmitter-module/)のサイトにある回路とコードそのまま使います。
（ここまで全くもって開発をしていない。もしやコピペだけでリモコンができるのではないか。。。）

上記サイトにある、実際に送信している部分を、先ほどフックした電源ボタンの情報に書き換えます。

```c++:send.ino
if (buttonState == HIGH) {
// turn LED on:
irsend.sendNEC(0x80BFA15E, 32);
}
```
これで無事、テレビの電源がつくことが確認できました。
（動作確認の動画撮るの忘れた）

#arduinoとスマホをBluetoothで連携する
もうこれは勝ちました。
ここまできたらもう勝ちです。
[私の過去の記事](https://qiita.com/kotarotaro_A/items/e34aa54f459e1cf1f7dc)を参考にBluetoothからの操作を受けつける回路と処理を作成します。
（ここは少し組み合わせが必要でした。コピペだけではできませんでした。）

赤外線送信モジュールと、Bluetoothモジュールを組み合わせて回路を組むとこんな感じ。
![75395.jpg](https://qiita-image-store.s3.amazonaws.com/0/212804/a78c48e4-115e-76b1-a898-fb4825f958aa.jpeg)
例によって回路のイラストを書く気力はないので写真で。要望があればイラスト書き（ry

そしてソースコードはこちら

```c++:send.ino
#include <IRremote.h>
IRsend irsend;
void setup()
{
    Serial.begin(115200);
}
void loop() {
    if (Serial.available() > 0)
    {
        char input = Serial.read();
        Serial.println(input);
        //電源
        if(input == '1')
        {
            irsend.sendNEC(0x80AF5E817, 32);
        }
        else if(input == '4')
        {
            irsend.sendNEC(0x806A952ED1, 32);
        }
        else if(input == '5')
        {
            irsend.sendNEC(0x806A95AE51, 32);
        }
        else if(input == '6')
        {
            irsend.sendNEC(0x806A956E91, 32);
        }
        else if(input == '7')
        {
            irsend.sendNEC(0x806A95EE11, 32);
        }
        else if(input == '8')
        {
            irsend.sendNEC(0x806A951EE1, 32);
        }
    }
}
```

はい、赤外線部分の処理の為にosoyooさんの配布しているライブラリを使っていますが、[前回の記事](https://qiita.com/kotarotaro_A/items/e34aa54f459e1cf1f7dc)のコードほぼそのままですね。トリガー受信時の処理を変更しただけでございます。
そしてスマホ側も前回に引き続き[こちら](https://play.google.com/store/apps/details?id=com.circuitmagic.arduinobluetooth&hl=ja)のアプリを使わせていただきました。

設定はこうです。
![75391.jpg](https://qiita-image-store.s3.amazonaws.com/0/212804/16ffaec2-48c9-eca6-2a55-c0167f32e823.jpeg)

#結果
できた。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">qiita埋め込み用。<br>スマホからのBluetoothでトリガーを与えて、フックした赤外線情報をarduinoから送信してテレビを操作してみる。 <a href="https://t.co/BmgdhwI6If">pic.twitter.com/BmgdhwI6If</a></p>&mdash; あーたろ (@kotarotaro_A) <a href="https://twitter.com/kotarotaro_A/status/1073961608118820865?ref_src=twsrc%5Etfw">2018年12月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
無事操作することができました。
動画だとarduinoから操作している感が非常にわかりづらいですが、
冒頭に記載した
Androidスマホ　→（Bluetooth）→ arduino　→（赤外線通信）→　テレビ
この動作にしっかりなっています。

#まとめ
簡単にリモコンを作成することができましたね。
論理的にはリモコンのボタン情報を全部フックすれば全ての操作をスマホに移譲することも可能ですね。

え？スマホのリモコンアプリがあるじゃないかって？
自分で作ることに意味があると僕は思うんだ。
自分で方法を考えて、調査して、実装して、できた時の感動や、実際の仕組みを理解すること。そこに価値があると僕は思う。
（テレビが古すぎてアプリで操作できなかったわけでは決してないですよ。）

リモコン作ってみた結果、非常に便利なことがわかりました。
てかそもそものリモコンが不便すぎたので、こんなにストレスなくテレビが操作できることに感動すら覚えました。
もうこのarduinoリモコン用に固定して部屋に設置したいレベルです。
（arduinoで遊べなくなっちゃうからやらないけど）

以上になります。
残りカレンダーも半分切りましたねー。
頑張りましょう。
ありがとうございましたー。

#おまけ
今回の開発から[arduino ide](https://www.arduino.cc/en/Main/Software)ではなくVScodeの拡張機能、Visual Studio Code extension for Arduinoを使いました。
<img width="698" alt="スクリーンショット 2018-12-16 1.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/212804/e3d83209-9286-dfb5-90ff-6224ebbf3498.png">
これめっちゃ便利です。開発するならおすすめです。
気が向いたらインストールから設定方法まで備忘録的に記事にするかも。。。