Lazurite(Arduino互換)とRaspberryPiでエアコンを外から操作する

# 概要
ひょんなことから[Lazurite](http://www.lapis-semi.com/)なるArduino互換ボードを入手したまま蔵に入っていました．
もったいないので何か作ってみようと引っ張り出してきました．

そんなわけでエアコンを外部から操作したことを紹介します．

## 紹介
Lazuriteシリーズの売りは低消費電力らしいです．
スペック上の消費電流はSleep時2mA,動作中10mA．これが低いのかどうかは無知ゆえに知らないのですが低そうです(ArduinoUnoの消費電力を調べたのと比べる限り)
また920Mhz帯の無線モジュールとセットのモデルもあり，Raspberry Piシリーズに乗っけられるGatewayも発売しているそうです(chip1stopとかswitchscienceとかAmazonとか)．
この920MHz帯とは……以下参照してください．今回は全く生かせていません．
[Sub-GHz無線とは | 基礎知識 | ROHM TECH WEB](http://micro.rohm.com/jp/techweb_iot/knowledge/iot03/s-iot03/01-s-iot03/43)

以上紹介でした．
詳しくは[製品情報 | Lazurite](http://www.lapis-semi.com/lazurite-jp/products)を見てください．

Arduino Unoと互換があるのでその回路図も見ると楽でした．

# エアコンをハックする
## 構成

使用機材

* Raspberry Pi2
* Lazurite Sub-GHz Rev.2
* Lazurite Pi Gateway A
* 赤外線受光/発光
* サーバ

使用開発環境/(サンプル)プログラム

* Lazurite IDE version 1.0.0
* (受信側)(Lazurite IDEに付いてきた)プロジェクトのサンプル>03.SubGHz>Print_SubGHz
* (送信側)([PyLaz](https://github.com/LAPIS-Lazurite/PyLaz)の)txsample.py

クラス図
![Lazurite_Airconditioner_ClassDiagram.png](https://qiita-image-store.s3.amazonaws.com/0/102650/cda87947-0f3c-0c73-e55d-516ff365313c.png)
今回は(クラスではないのですが)Lazurite部分を公開しました．
というかRaspberryPiの部分は公開したところで……というコードです．

## ソースコード
[lazurite_control_airconditioner.c(GitHubGist)](https://gist.github.com/enu000/2502fb5c72a704968fb95425f64315c1)

以下長々と苦労した点を述べているだけです．

## リモコン信号の読み取り
リモコン信号は大変でした．
受光に関してはRaspberryPiでは失敗，Lazuriteでも失敗，ArduinoMEGAで成功
発光に関してはRaspberryPiは試せず，Lazurite，ArduinoMEGAで成功
でした．

### 回路
受光部：[L-31ROPT1C(秋月電子通商)](http://akizukidenshi.com/catalog/g/gI-04213/)
発光部：TLN227
ともに部屋に転がっていたので使いました．発光部はできれば指向性が悪い(発散しやすい)物の方がいいです，拡散キャップを付けてもいいです．
というかTLN227が通販で売ってない;;もったいないことしたかなぁ
抵抗もプルダウンは大きめ，発光のはマイコンポートから流せる電流量を一応計算はしましたがてきとーです．壊れない保証はできません．

回路図は以下のようになっています．
![schematic_airconditioner.png](https://qiita-image-store.s3.amazonaws.com/0/102650/b747ad0f-349b-bd43-ce23-aa26402832f6.png)

### Raspberry Pi2単独での失敗
RaspberryPiで赤外線リモコンを操作するのに便利なLIRCというソフトがこの世に存在するそうです．エアコンは送信量が多いからダメとかもあったのですが，成功例も多々あったので行けるかもしれないと思い挑戦．数時間の格闘の結果無理でした．
我が家のエアコン，TV, 照明のリモコン全てにおいてだめだったので何がだめなのかよくわかりません，多分受光回路でしょうと回路のせいにしておきます．
一応失敗例として載せておきます．
LIRCのインストール/認識までは滞ることなく進みいざ受信するところで詰まりました．

```
mode2 -d /dev/lirc0
```

この命令を打ってリモコンのボタンを連打したり，部屋を真っ暗にしたり，別のリモコンにしてみたりと様々なパターンを試したのですがうんともすんとも言いませんでした．


仕方がないのでマイコンを出してきてエアコンをハックするかと思ったのですが，Arduinoでの成功例を見つけてしまったのでこちらで試すことにしました．
そのサイトがこちらです
[Arduinoでリモコン作成](http://eikatou.net/blog/2012/07/1796/)

ArduinoMEGAで直ぐに成功し，Lazuriteでも一応受光に30回ほど挑戦し始めのほうで1度だけ成功しています．
エアコンを操作する部分に関しては，前述の回路でサイトの通りでバッチリ動きましたのでそちらを参照してください．

## Raspberry Pi2からの(との)通信

### 結果
通信こそ成功したものの，思い通りにはなりませんでした．

送信側にて(サンプルのtxsample.pyを参照してください)
PyLaz()のinit/beginからclose/removeまでの間にsendを1度しか行わない場合受信結果が反映されない状況に陥りました．その後調査を進めたところ1発目だけは2度行わないとそれ以降通信が確立されない，ことまでは判明しています．
これが私の実装が悪いのかバグなのか通信の仕様なのかは調べる気力が足りなく，フォーラムに行く気力も足りないので諦めます．
仕方がないので使うことだけ考えると，beginしたら「This message was sent from Lazurite Pi Gateway」と送信して1つ無駄送信をし，その後本当に送信したい文字を送ることでお茶を濁そうとしたのですがその結果が

```
myAddress1 = ____
TIME	HEADER	SEQ	PANID	RX_ADDR	TX_ADDR	RSSI	PAYLOAD
-----------------------------------------------------------------------------------------------------------------
16012	A821	0	ABCD	____	____	255	This message was sent from Lazurite Pi Gateway
16020	A821	1	ABCD	____	____	255	1his message was sent from Lazurite Pi Gateway

```

となりました．まあ残っているのだから消せばいいのかと，サンプルコードとレファレンスをよく読んでみるとSerial.print()ではだめでSerial.write()を用いるべきであることがわかりましたので修正したところ

```
myAddress1 = ____
TIME	HEADER	SEQ	PANID	RX_ADDR	TX_ADDR	RSSI	PAYLOAD
-----------------------------------------------------------------------------------------------------------------
16012	A821	0	ABCD	____	____	255	This message was sent from Lazurite Pi Gateway
16020	A821	1	ABCD	____	____	255	1
```

無事?送れるようになりました．まさかここでつまづくとは思わなんだ．
ちなみにこの部分はRead_SubGHzではrx_lenを見ているので正常に動きそうですOTL

ともあれ通信はできるようになりました．
なので適当にエアコンの状態を知らせる数字を決めて送るプログラムを書きました．

以上でRaspberryPiから無線でLazuriteに指令を送り，エアコンのON/OFFを制御することに成功しました．

## 備考
なお始めは前回の状況を覚えておいて状態変化なしだったら送るのをやめるようにしたのですが，エアコンのリモコンが複雑な指令を送る理由的にそんなことをすると寒い部屋になってしまうことがあるかもしれないのでやめましょう．
またせっかくのSubGHZなのですが，わずか20cmの距離を無線通信しています．BluetoothとかZigBeeでよいのですが，まあ勉強ということで．