自作リモコンでエアコン操作


少し前に赤外線リモコンでエアコン操作を実験した結果。

##必要な部品を準備

調達部品(すべて秋月さんで購入)
　・赤外線リモコン受信モジュール（100円）
　・赤外線RED（150円）
　・ジャンパーコード（200円)
　・arduino nano（3000円くらい）
　・抵抗/ブレッドボード（合わせて300円くらい）
![IMG_0111.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/09c77889-d5de-3ec8-0a1c-d10a01480774.jpeg)

操作用のPCを除けば、値段は5,000円以下で調達可能です。



##ブレッドボードで配線
![IMG_0116.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/209feebd-17f8-3199-ace4-acbe18eb435a.jpeg)



次にarduinoと接続して赤外線受信ポートにリモコンをつなげてリモコン操作を記録。


受信プログラム

```c++
#define READ_PIN 2
#define LOW_STATE 0
#define HIGH_STATE 1

unsigned long now = micros();
unsigned long lastStateChangedMicros = micros();
int state = HIGH_STATE;
int delimiter = 0;

// 初期化
void setup(){
  Serial.begin(57600);
  pinMode(READ_PIN, INPUT);
  Serial.print("\n");
}

void waitLow() {
  while (digitalRead(READ_PIN)==LOW) {
    ;
  }
}

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

void loop() {
    if (state == LOW_STATE) {
      waitLow();
    } else {
      int ret = waitHigh();
      if (ret == 1) {
        Serial.print("\n");
        return;
      }
    }
    now = micros();
    if (delimiter == 1) {
      Serial.print(",");
    }
    Serial.print((now - lastStateChangedMicros) / 10, DEC);
    delimiter  = 1;
    lastStateChangedMicros = now;
    if (state == HIGH_STATE) {
      state = LOW_STATE;
    } else {
      state = HIGH_STATE;
    }
}
```

このプログラムをマイコンに書き込んで、赤外線受信ポートにリモコンを向けて操作。

![スクリーンショット 2014-10-03 0.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/52867/5b60a83f-1624-fbfe-c706-616029c2978b.png)

各操作の信号が取得できます。
エアコンは信号が多い。。。


##エアコン操作
小型ブレッドボードに配線してラズベリーパイとシリアル接続でON/OFFシグナルで実行できるようにして組み込み。

![IMG_0119.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/22d980a6-43f4-47aa-60d0-8b02b2558d42.jpeg)


プログラム(arduino側)

```c++
byte val=0;

int output = 2;

int aircon_on[] =  {340,171,43,128,　……先ほど取得したデータを貼付け};
int aircon_off[] = {340,171,43,1288};

int last = 0;
unsigned long us = micros();

void setup() { 
  Serial.begin(9600);
  pinMode(output, OUTPUT);
}


void send(int data[]) {
  int dataSize = sizeof(data) / sizeof(data[0]);
  for (int cnt = 0; cnt < dataSize; cnt++) {
    unsigned long len = data[cnt]*10; 
    unsigned long us = micros();
    do {
      digitalWrite(output, 1 - (cnt&1)); 
      delayMicroseconds(8); 
      digitalWrite(output, 0);
      delayMicroseconds(7);
    } while (long(us + len - micros()) > 0);
  }
}

//シリアル処理の待ち受け
void loop() {
  if(Serial.available() > 0){ 
    val = Serial.read();
   } else if(val == 'ON'){
     send(aircon_on);
   } else if(val == 'OFF') { 
     send(aircon_off);
   }
   delay(3000);
}   

```

ラズベリーパイから信号を送信すると、エアコンの電源が入ります。
※ラズベリーパイからはnode.jsで実行しました。

【補足】
応用でラズベリーパイをWEBサーバにして、iOSのシェイクイベントなどを利用して
ジェスチャーで直感的にリモコン操作の家電を操作できます。



シェイクイベント取得はgShake.jsが便利です（example）

```html
<script src="jquery.min.js" type="text/javascript"></script>
<script src="gShake.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
  $(this).gShake(function() {
  // ajax
    $.ajax({
      type: "GET",
      url: "/aircon/on",
      dataType: "script"
    });  
  });
});
</script>
```