2017年1月31日火曜日

ESP-WROOM-02 で赤外線 LED を制御してエアコンを操作してみた

概要

前回 Arduino で赤外線 LED を使って Panasonic のエアコンを制御しました
今回は同じように赤外線 LED を ESP-WROOM-02 (ESPr) で使って制御してみました

環境

ライブラリのインストール

Arduino のときに IRremote というライブラリを使いましたが、これは ESPr だと使えません
IRremoteESP8266 という専用のライブラリがあるのでこれを使います

Arduino IDE からインストールすることはできないので、Github から zip ファイルをダウンロードしましょう
そして

スケッチ -> ライブラリをインクルード -> .ZIP 形式のライブラリをインストール

でダウンロードした zip ファイルを選択してインストールしましょう
インストールが完了すると IRremoteESP8266.h が include できるようになります

配線

今回の配線は以下の通りです

上から
try_ir_with_espr_circuit1.jpg

サイドから
try_ir_with_espr_circuit2.jpg

逆サイドから
try_ir_with_espr_circuit3.jpg

基本は Arduino ときと同じなのですが、スイッチを 2 つ (冷房の起動と停止) にしたのとトランジスタを使って赤外線 LED の出力を増幅しています

これはあとで気づいたのですが、Arduino と ESPr では ESPr のほうが赤外線の出力が弱いです
なので、ESPr のときはトランジスタを使って赤外線の出力強度をあげています

送信用スケッチ

今回のスケッチは以下の通りです
440 バイト分の配列 start と stop はそれぞれエアコンの冷房ボタンと停止ボタンを学習した信号になります
赤外線の信号の学習は赤外線受信モジュールを使って事前に Arduino で行いました
Arduino + 赤外線受信モジュールを使って信号を学習する方法はこちらを参考にしてください

#include <IRremoteESP8266.h>

int START = 12;
int STOP = 14;
int khz = 38;
IRsend irsend(4);
unsigned int stop[440] = {3568, 1680, 512, 400, 476, 1244, 512, 404, 476, 408, 476, 404, 480, 372, 508, 404, 476, 408, 476, 404, 476, 404, 476, 376, 508, 376, 508, 372, 508, 1244, 512, 400, 476, 380, 504, 408, 476, 404, 476, 404, 476, 408, 476, 404, 476, 1244, 512, 1244, 508, 1252, 508, 376, 504, 376, 504, 1244, 512, 408, 476, 404, 476, 404, 476, 408, 472, 412, 476, 404, 476, 376, 504, 404, 476, 380, 504, 376, 508, 404, 476, 404, 476, 380, 504, 404, 476, 376, 504, 408, 472, 380, 508, 372, 508, 404, 476, 376, 504, 380, 504, 376, 504, 408, 476, 372, 508, 380, 504, 376, 504, 376, 504, 408, 476, 408, 476, 372, 508, 1244, 508, 1248, 508, 408, 476, 404, 476, 408, 472, 376, 508, 372, 504, 9976, 3564, 1684, 508, 376, 504, 1248, 508, 376, 504, 408, 476, 408, 472, 376, 504, 380, 504, 408, 476, 404, 476, 404, 476, 376, 504, 380, 508, 404, 472, 1248, 508, 376, 508, 380, 504, 376, 504, 376, 504, 376, 504, 380, 504, 404, 476, 1244, 512, 1244, 508, 1252, 508, 404, 476, 404, 476, 1248, 508, 380, 504, 404, 476, 408, 472, 408, 476, 408, 476, 376, 504, 404, 476, 404, 476, 380, 504, 376, 504, 376, 508, 404, 476, 380, 504, 376, 504, 408, 472, 376, 508, 408, 472, 1248, 508, 1248, 508, 404, 476, 380, 504, 408, 472, 376, 504, 1248, 508, 408, 476, 1244, 508, 1248, 508, 404, 476, 380, 508, 372, 508, 404, 476, 404, 476, 408, 476, 408, 476, 404, 476, 404, 472, 1256, 508, 404, 476, 1248, 508, 404, 476, 408, 476, 408, 476, 372, 504, 1248, 508, 408, 476, 408, 476, 404, 472, 408, 476, 380, 504, 376, 504, 404, 480, 372, 508, 408, 476, 404, 476, 404, 476, 404, 476, 380, 508, 404, 476, 404, 476, 376, 504, 380, 504, 404, 476, 1244, 512, 1244, 508, 380, 508, 404, 476, 376, 504, 372, 508, 408, 476, 408, 476, 404, 476, 404, 476, 408, 476, 404, 476, 1244, 508, 1244, 512, 408, 476, 408, 472, 376, 508, 404, 476, 380, 504, 404, 476, 408, 472, 408, 476, 408, 476, 404, 476, 372, 508, 404, 476, 412, 476, 372, 508, 404, 476, 372, 508, 408, 476, 404, 476, 404, 476, 408, 476, 408, 476, 376, 504, 404, 476, 404, 476, 1248, 512, 404, 476, 404, 476, 408, 476, 408, 480, 404, 476, 376, 504, 404, 476, 380, 508, 404, 472, 1244, 512, 1244, 512, 412, 476, 404, 476, 372, 508, 404, 476, 412, 476, 376, 504, 404, 476, 404, 476, 1252, 508, 1248, 508, 404, 476, 404, 476, 376, 508};
unsigned int start[440] = {3584, 1664, 532, 352, 524, 1228, 528, 388, 492, 392, 496, 384, 492, 388, 492, 392, 488, 396, 492, 388, 492, 388, 492, 388, 492, 392, 492, 388, 492, 1224, 528, 392, 492, 392, 492, 388, 492, 388, 492, 388, 492, 364, 520, 388, 492, 1228, 524, 1228, 528, 1232, 528, 388, 492, 388, 488, 1228, 532, 360, 524, 388, 488, 360, 524, 388, 492, 360, 524, 388, 492, 388, 496, 388, 488, 360, 524, 360, 524, 388, 492, 388, 412, 472, 492, 388, 492, 388, 492, 360, 520, 364, 520, 392, 492, 388, 488, 360, 524, 392, 492, 392, 488, 388, 496, 388, 416, 468, 412, 468, 412, 436, 524, 388, 492, 392, 492, 388, 488, 1232, 528, 1228, 524, 392, 492, 392, 412, 468, 488, 360, 520, 388, 492, 9956, 3584, 1660, 528, 392, 412, 1304, 528, 388, 492, 360, 524, 360, 520, 392, 492, 356, 444, 440, 520, 392, 488, 360, 524, 388, 416, 440, 520, 388, 492, 1228, 524, 392, 492, 392, 492, 388, 488, 396, 412, 468, 412, 472, 488, 392, 488, 1228, 524, 1228, 528, 1232, 528, 388, 492, 388, 488, 1232, 524, 364, 520, 392, 416, 464, 492, 388, 416, 468, 492, 392, 488, 360, 520, 360, 520, 364, 520, 360, 524, 388, 492, 388, 416, 468, 416, 1304, 448, 468, 488, 392, 488, 396, 488, 1228, 452, 1304, 448, 436, 448, 472, 412, 468, 412, 464, 492, 1228, 528, 360, 520, 1228, 452, 1304, 448, 468, 492, 360, 520, 392, 488, 396, 412, 468, 412, 472, 488, 356, 448, 468, 488, 392, 488, 1240, 524, 388, 416, 1304, 452, 464, 488, 364, 520, 360, 448, 464, 416, 1304, 524, 364, 448, 468, 412, 468, 488, 388, 492, 364, 520, 392, 412, 468, 412, 468, 416, 468, 488, 364, 444, 436, 444, 468, 488, 396, 412, 468, 412, 468, 488, 360, 448, 436, 448, 464, 412, 1304, 452, 1304, 528, 360, 524, 388, 416, 468, 412, 468, 412, 440, 444, 468, 412, 468, 416, 432, 448, 472, 412, 464, 488, 1228, 452, 1304, 452, 472, 412, 468, 412, 468, 488, 392, 412, 472, 412, 468, 488, 364, 444, 464, 416, 472, 412, 468, 412, 468, 412, 468, 412, 472, 416, 468, 412, 432, 448, 468, 412, 440, 444, 468, 412, 468, 412, 468, 412, 472, 416, 464, 416, 468, 412, 464, 416, 1308, 524, 396, 412, 464, 416, 468, 412, 472, 416, 468, 412, 468, 412, 468, 412, 472, 416, 464, 416, 1304, 448, 1304, 524, 400, 416, 432, 448, 464, 416, 468, 412, 472, 412, 1308, 448, 468, 412, 468, 412, 1308, 452, 1304, 452, 468, 412, 468, 412, 468, 412};

void setup() {
  irsend.begin();
  pinMode(START, INPUT);
  pinMode(STOP, INPUT);
  Serial.begin(115200);
}

void loop() {
  if (digitalRead(START) == HIGH) {
    Serial.println("START");
    irsend.sendRaw(start, sizeof(start) / sizeof(start[0]), khz);
  } else if (digitalRead(STOP) == HIGH) {
    Serial.println("STOP");
    irsend.sendRaw(stop, sizeof(stop) / sizeof(stop[0]), khz);
  }
  delay(500);
}

赤外線 LED の信号送信は 4 ピンで制御しています
タクトスイッチはそれぞれ 12, 14 ピンで制御しています

Arduino とほぼ同じように使えるのですが、若干違うところもあります
IRsend irsend(4); という感じで赤外線を送信するピンを指定することができます
Arduino のときは 3 ピン固定でした
また、irsend.begin(); で赤外線 LED を使うことを宣言する必要があります

動作確認

スケッチを書き込んでエアコンに向けてスイッチを押してみましょう
リモコンの信号がちゃんと学習できていればエアコンの起動と停止ができるはずです
今回はトランジスタで信号を増幅しているので距離は数メートル離れても大丈夫でした
自宅で試した感じだと 4 - 5m は全然大丈夫でした

最後に

ESPr で赤外線 LED を制御してみました
ほぼ Arudino と同じように制御できますが、完全互換では動作しませんでした
また、信号の出力が弱いのでトランジスタを挟んだほうが良いです

あとはこれに MQTT を Subscribe する機能を設けて扇風機のときのようにネットから制御できるようにしたいと思います

参考サイト

0 件のコメント:

コメントを投稿