SORACOM Airを使ってリモート操作可能な赤外線リモコンを作ってみた

このエントリー[SORACOM Advent Calendar 2016](http://qiita.com/advent-calendar/2016/soracom) 12/21分です。

ソラコムインターンエンジニアの岩瀬です。
今回は、SORACOM Air および SORACOM Beamを使ってリモート操作可能な赤外線リモコンを作成していきます。

## アーキテクチャ
![demo_pic.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/47744/a9b40b72-5b85-fdbb-b69c-b7ddb7f694f8.jpeg)

## 準備するもの
- SORACOM Air
- USB ドングル
- Raspberry Pi
- PC(Mac、Windowsなど)
- SDカードリーダー/ライター (PC本体にSDスロットがある場合には不要)
- Micro SD カード (8GB以上が望ましい)  
 ※もし初代Raspberry Piを利用する場合には、通常サイズのSDカードを用意して下さい
- 赤外線受信モジュール(秋月電子通商で販売 OSRB38C9AA)
- 赤外線LED(秋月電子通商で販売 OSI5FU5111)
- ブレッドボード(秋月電子通商などで販売)
- 抵抗(100Ω程度)
- Githubアカウント
- RubyがインストールされたホストPC


SORACOM Airの接続方法に関しては、

* [簡単にRaspberry PiでSORACOM Airを使う(FS01BU USBモデムを用いて自動接続)](http://qiita.com/dietposter/items/068019ee53252206a6bf)
* [Raspberry PiでSORACOM SIMを使う(ZTE MF120, MF112)](http://qiita.com/dietposter/items/068019ee53252206a6bf)

を参考にしてください。

## 赤外線リモコンの信号を解析する

###  LIRCとは？  
Linux Infrared Remote Controlの略で、Linux上での赤外線信号の送受信のコントロールを簡単にできるようにするためのライブラリです。今回はこのライブラリを使うことによって、送信したい赤外線信号の解析および送信を行っていきます。

### LIRCのインストール
- LIRCをインストールする  
`pi@raspberrypi:~ $ sudo apt-get install lirc`

- LIRCを有効にする  
`pi@raspberrypi:~ $ sudo vim /etc/lirc/hardware.conf`

- hardware.confを以下のコマンドを用いて修正する

```
pi@raspberrypi:~ $ wget https://s3-ap-northeast-1.amazonaws.com/soracom-demo/edit_hardware_conf.sh // スクリプトをダウンロード
pi@raspberrypi:~ $ cp /etc/lirc/hardware.conf ~/hardware.conf // バックアップを取る
pi@raspberrypi:~ $ chmod +x edit_hardware_conf.sh // 実行権限を付与
pi@raspberrypi:~ $ sudo ./edit_hardware_conf.sh // hardware.confを編集
```


- 起動時にLIRCを有効にする。

```
pi@raspberrypi:~ $ wget https://s3-ap-northeast-1.amazonaws.com/soracom-demo/edit_hardware_conf.sh // スクリプトをダウンロード
pi@raspberrypi:~ $ chmod +x edit_boot_conf.sh // 実行権限を付与
pi@raspberrypi:~ $ sudo ./edit_boot_conf.sh // boot/config.txt の末尾にdtoverlay=lirc-rpi,gpio_in_pin=22,gpio_out_pin=23を追加
```

- Raspberry Piを再起動する  
`pi@raspberrypi:~ $ sudo reboot`

- 有効になっているか確認  
下記コマンドを実行して`lirc_rpi`が表示されていることを確認する。

```
pi@raspberrypi:~ $ lsmod | grep lirc
  lirc_rpi                6638  0
  lirc_dev                8169  1 lirc_rpi
  rc_core                16956  1 lirc_dev
```

- LIRCを停止する  
`pi@raspberrypi:~ $ sudo /etc/init.d/lirc stop`

### 配線
- 下記の配線図のように配線を行います。
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/5-4.png)

- 配線後、下記の写真のようになっていることを確認してください(Raspberry Pi 2 B+を使用)
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/5-1.JPG)
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/5-2.JPG)
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/5-3.JPG)

### センサーの動作確認
上記コマンドを実行した後、センサーに向かってリモコンのボタンを押す。
このとき、下記のような数字列が出力されることを確認する。

```
pi@raspberrypi:~ $ mode2 -md /dev/lirc0
490      571      583      595      505      576
556      595      538      592      511      621
511      593     1615      647     1625      576
1654      525     1710      634     1648      589
1645      553     1682      621     1640      592
1645      589      520      612      484      649
510      554     1681      619      501      565
553      617      487      643      484      533
1729      614     1647      593     1617      576
583      585     1649      664     1546      644
1641      590
```

### 赤外線信号のデータを取得する
- 信号の解析データを保存する。  
待機状態になるので、赤外線受信モジュールにリモコンを向けて、一度だけ電源オンボタンを押してください。  
下記コマンドで赤外線信号を解析したデータがpower_on.datに保存されます。  
`pi@raspberrypi:~ $ mode2 -md /dev/lirc0 | tee power_on.dat`

- 信号の解析データを設定ファイルに書き込む   
下記コマンドを実行して、登録名を表示してくださいとでてきたらpower_onと入力。

```
pi@raspberrypi:~ $ sudo ruby ir_tools/irrecord.rb power_on.dat
登録名を入力してください (Ex: switch_on)
power_on
```

## 赤外線LEDから信号を送信する

下記コマンドを入力して、正しく機器が操作できるか確認する。  
赤外線LEDは指向性が強いので、うまく反応しない場合は近づけたり方向を変えたりしてみてください。

```
pi@raspberrypi:~ $ irsend SEND_ONCE controller power_on
```

## Sango(MQTTブローカ)に登録する

### Sangoとは
パブリッシュ/サブスクライブ型の軽量なプロトコルであるMQTTを簡単に利用できるサービスです。今回はSangoを用いて、SORACOM Airを通した通信を行っていきます。

### Sangoに登録する
- Sangoのホームページ(https://sango.shiguredo.jp/) から新規登録(Githubアカウントが必要になります。)
- ログイン後、MQTTの接続情報を確認する
![MQTT接続情報](https://github.com/sh8/maker_faire_2016/wiki/images/7-1.png)
鍵のアイコンをクリックするとパスワードが表示されます。

## SORACOM Beamの設定

### SORACOM Beamとは
SORACOM Beam とは、IoTデバイスにかかる暗号化等の高負荷処理や接続先の設定を、クラウドにオフロードできるサービスです。Beam を利用することによって、暗号化処理が難しいデバイスに代わって、デバイスからサーバー間の通信を暗号化することが可能になります。
プロトコル変換を行うこともできます。例えば、デバイスからはシンプルなTCP、UDPで送信し、BeamでHTTP/HTTPSに変換してクラウドや任意のサーバーに転送することができます。

現在、以下のプロトコル変換に対応しています。  
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-2.png)


また、上記のプロトコル変換に加え、Webサイト全体を Beam で転送することもできます。(Webサイトエントリポイント) 全てのパスに対して HTTP で受けた通信を、HTTP または HTTPS で転送を行う設定です。

### SORACOM Beamの設定
今回は以下のBeamを使用します。

- MQTTにおけるユーザ名、パスワードの設定をSORACOM Beamにオフロード(MQTTエンドポイント)

ここでは、Sangoへのデータ転送設定 (MQTTエンドポイント)を設定します。
BeamはAir SIMのグループに対して設定するので、まず、グループを作成します。

### グループの作成
- コンソールのメニューから[グループ]から、[追加]をクリックします。
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-3.png)
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-4.png)

- グループ名を入力して、[グループ作成]をクリック
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-5.png)

### SIMのグループ割り当て
- SIMをこのグループに紐付けする
SIM管理画面から、SIMを選択して、操作→所属グループ変更を押します。
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-6.png)
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-7.png)

- 先ほど作成したグループを選択し、[SORACOM Beam 設定] のタブを選択
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-8.png)

- [SORACOM Beam 設定] から[MQTTエントリポイント]をクリック
![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-9.png)

表示された画面で以下のように設定

```
- 設定名： SangoMQTT(別の名前でも構いません)
- 転送先のプロトコル： MQTT
- ホスト名： lite.mqtt.shiguredo.jp
- ユーザ名: <Githubのユーザ名>@github
- パスワード: <Sangoで取得したパスワード>
```

![](https://raw.githubusercontent.com/soracom/handson/master/irsensor/docs/images/8-10.png)

以上でSORACOM Beamの設定は完了です。

##　SORACOM Beam経由で赤外線信号を送信する

### Raspberry Piにプログラムをダウンロード

- MQTTクライアントをインストール  
`pi@raspberrypi:~ $ sudo gem install mqtt`

- 環境変数を設定する  
`pi@raspberrypi:~ $ export MQTT_USERNAME=<Sangoで取得したユーザ名>`

- スクリプトをダウンロードしてMQTTを受信する

```
pi@raspberrypi:~ $ wget https://s3-ap-northeast-1.amazonaws.com/soracom-demo/ir_tools/subscriber.rb
pi@raspberrypi:~ $ ruby subscriber.rb
```

上記のプログラムを起動したまま別のタブでホストPCにログイン
### ホストPCでMQTTをsubscribe
- MQTTクライアントをインストール  
`$ gem install mqtt`

- 環境変数を設定する

```
$ export MQTT_PASSWORD=<Sangoで取得したパスワードを入力>
$ export MQTT_USERNAME=<Sangoで取得したユーザ名>
```
- スクリプトをダウンロード・実行してMQTTを送信し、赤外線信号が送信されることを確認
```
$ wget https://s3-ap-northeast-1.amazonaws.com/soracom-demo/ir_tools/publisher.rb
$ ruby publisher.rb power_on
```
power_onを他の命令に変えることで他の信号も送信できます。  
詳しくは下記の「応用編」を参照してください。  

### 応用編
- 追加で信号の解析データを保存する。  
待機状態になるので、赤外線受信モジュールにリモコンを向けて、登録したいボタンを一度だけ押してください。    
`pi@raspberrypi:~ $ mode2 -md /dev/lirc0 | tee <ボタンの名称(任意のファイル名も可)>.dat`

- 信号の解析データを設定ファイルに書き込む   
下記コマンドを実行して、登録名を表示してくださいとでてきたら「ボタンの名称」を入力。

```
pi@raspberrypi:~ $ sudo ruby ir_tools/irrecord.rb power_on.dat
ボタンの名称を入力してください (Ex: switch_on)
<power_off等の任意のボタンの名称を入力>
```

これで追加のボタンの信号データが登録されました。

- 登録されたボタンの一覧を確認する  
`pi@raspberrypi:~ $ irsend LIST controller ""`  

- 登録したボタンの信号を送信する  
「SORACOM Beam経由で赤外線信号を送信する」でのコマンドを上記で登録したものに変更すると、新しく登録した赤外線信号が送信できます。

## まとめ
[Facebook CEOであるMark Zuckerberg氏が家庭内にJarvisと呼ばれる家庭内アシスタントを構築した](http://japan.cnet.com/news/service/35094061/)というニュースが話題になりましたが、今回作成したリモート操作可能な赤外線リモコンも、そういった世界を実現するための一歩としてみなさまのお役に立てればなと思っています。比較的簡単に作成できるの、お時間のある方は是非トライしてみてください！！  

質問コメントお待ちしております。