前回の続きで、IRremoteライブラリを使ってエアコンのリモコンを実装してみたいと思います。
まずは受信機でエアコンの”冷房ボタン”を押したときの受信データを確認すると…
あららららら。エアコンの信号の長さに対して受信データを格納する配列が足りてないため、暴走してしまうみたいですね。
受信データを格納している配列はIRremoteInt.h内で宣言されているrawbufなので、このサイズを大きくすれば対応できそうです。↓はIRremoteInt.hの一部抜粋。
struct irparams_struct { // The fields are ordered to reduce memory over caused by struct-padding volatile uint8_t rcvstate; ///< State Machine state uint8_t recvpin; ///< Pin connected to IR data from detector uint8_t blinkpin; uint8_t blinkflag; ///< true -> enable blinking of pin on IR processing unsigned int rawlen; ///< counter of entries in rawbuf unsigned int timer; ///< State timer, counts 50uS ticks. unsigned int rawbuf[RAW_BUFFER_LENGTH]; ///< raw data uint8_t overflow; ///< Raw buffer overflow occurred };
見たまんまRAW_BUFFER_LENGTHの値を変更すればrawbufを拡張できそうです。デフォルトでRAW_BUFFER_LENGTHは101となっていたので、これを801とかにして再度エアコンの冷房信号を受信してみると…
ちゃんと受信できたっぽいです。配列長が531だったみたいですね。かなり長いなあ。
では、早速受信できたrawDataを前回作ったマルチリモコン用のプログラムのirSignal[]にべた書きで代入してみてエアコンを制御できるか確認してみます。
あ、その前にRAW_BUFFER_LENGTHの値が801のままだとメモリをいっぱい使ってしまうので、値は戻しておきましょう。私が使っているPro Microでは、801のままだとメモリ不足でコンパイル通りませんでした。
スケッチを書き込んでLEDをエアコンでタクトスイッチを押してみると…
ちゃんと点きました~。
そしてもう一個の方のタクトスイッチを押すとテレビのオンオフもできてるので、もうこれはマルチリモコンといってもいいでしょう。完成だ完成。
とりあえずできた
ということでArduinoで作るマルチリモコンいったん完成!!シーリングライトでつまずきましたが、そのほかの部分はけっこうすんなり実装できました。事前に調べていたときはエアコンの制御が苦労しそうかなと思っていましたが、そこはすんなりできましたね。IRremoteライブラリは偉大です。
今後はできたリモコンをベースに機能拡張をしていけたらいいなと思います。下記は次にやりたいことリストです。
- ボタンの数を増やす
- 受信信号をボタンに直接割り当てる学習機能の追加
- ユニバーサル基板上へ実装する
- シーリングライトを制御する
ここまでで、Arduinoで作るマルチリモコンはひと段落とします。上記リストの内容はおいおいクリアして、普段使いできるレベルには仕上げたいとは思っています。
次は何をやろうかな。