//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

赤外線リモコン受信モジュールを使ってみる


Ethernetモジュールと温湿度センサーが繋がっていて、温湿度を定期的にMQTTブローカーにパブリッシュするようなファームウェアを書き込んだArduino Pro MiniにOSRB38CAA(秋月電子通商さんから購入)という赤外線リモコン受信モジュールを接続。VCC、GNDはそれぞれArduino Pro MiniのVCC、GRDに接続。信号ピン(下の写真では黄色いジャンパーコードが接続されているモジュールの左端のピン)をArduino Pro Miniのデジタル7番ピンに接続しました。

2016-08-29 03.15.41

 

OSRB38CAAからデータを取得する部分は、先駆者がおられましたので、そのコードを参考にさせていただきました。クラス化する必要があるとは思えないコードですが、実験用のコードを分離しておきたかったのでクラスにしました。

OSRB38CAA.h

#ifndef __OSRB38CAA__
#define __OSRB38CAA__
#include <Arduino.h>

class OSRB38CAA {
public:
 OSRB38CAA();
 void begin(uint8_t pin);
 void waitLow();
 int waitHigh();
 void receive();
 
private:
 uint8_t _readPin;
 unsigned long _now;
 unsigned long _last;
 int _state;
};

#endif

OSRB38CAA.cpp

#include "OSRB38CAA.h"

#define STATE_LOW 0
#define STATE_HIGH 1

OSRB38CAA::OSRB38CAA() {
}

void OSRB38CAA::begin(uint8_t readPin) {
 _readPin = readPin;
 pinMode(_readPin, INPUT);
 _state = STATE_HIGH;
 _now = micros();
 _last = micros();
}

void OSRB38CAA::waitLow() {
 while(digitalRead(_readPin) == LOW) {
 ;
 }
}

int OSRB38CAA::waitHigh() {
 unsigned long start = micros();
 while(digitalRead(_readPin) == HIGH) {
 if(micros() - start > 5000000) {
 return 1;
 }
 }
 return 0;
}

void OSRB38CAA::receive() {
 if(_state == STATE_LOW) {
 waitLow();
 } else {
 int ret = waitHigh();
 if(ret == 1) {
 Serial.print("\n");
 return;
 }
 }

 _now = micros();
 Serial.print((_now - _last) / 10, DEC);
 Serial.print(",");
 _last = _now;
 if(_state == STATE_HIGH) {
 _state = STATE_LOW;
 } else {
 _state = STATE_HIGH;
 }
}

呼び出し側では、OSRB38CAA.hをインクルードして、OSRB38CAA irReceiver などとしてインスタンスを生成し、setup()関数の中などで irReceiver.begin(デジタルIOピン番号)と初期化をし、loop()関数の中で irReceiver.receive()とすれば、受信したリモコンの信号をシリアルコンソールに出力します。

エアコンのリモコンを受信モジュールに向けて「ピピッ」とやっているところ。

2016-08-29 03.16.04

 

下の写真は上のプログラムを動かして得られる受信した信号です。

Arduino IDEのシリアルコンソールが使いにくかったので、screenコマンドを使ってシリアルコンソールへの出力を表示しています。(OSXのときはscreenコマンドが最初からインストールされていたようですが、Ubuntuでは自分でインストールしないといけないみたいです。sudo apt-get install screen とすればインストールできます)

screen_arduino_ir_receive

エアコンの電源の入り切り、温度設定、モード切り替え(暖房、冷房、除湿)、風量設定について、このような信号を解析して、同じ信号を赤外線LEDを使って送信してやればリモコンと同じ振る舞いをしてくれる筈です。解析するのが面倒くさそうですが。

リモコンを操作していないときでも、パラパラと何かを送信しているようですが、たぶん、それは無視しても構わないと思います。

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

手仕事日記

評価

ブログ統計

  • 515,370 ヒット

カテゴリー

アーカイブ

カレンダー

2016年8月
« 7月   9月 »
 123456
78910111213
14151617181920
21222324252627
28293031  
%d人のブロガーが「いいね」をつけました。