ESP-WROOMを使用してお家IoTを実現するためにリモコンの赤外線信号を赤外線LEDから発信する

icon-calendar 2017/12/3 エンジニアリング

スクリーンショット 2017-07-01 16.07.15

第一回:ESP-WROOMを使用してお家IoTを実現するために温度と湿度をセンサーから取得してMQTTでpublishする

赤い線の範囲が今回のスコープです

第2回:リモコンを動かす

前回はセンサーの情報をクラウドに送ることができましたので、今度はリモンコンの波形をコピーする解析機を作ります

今回の材料は以下の通り

解析機

・ESP-WROOM-02(ESP-8266)

おすすめは秋月のこっち

このりんく

・uxcell 赤外線リモコン受光モジュール 赤外線受信モジュール 受信距離18M 10 Pcs

今回は赤外線を飛ばすためのリモンコンを作成します

IMG_0233

この黒い変な突起物が赤外線の受光モジュールなわけで、こいつに向かってリモコンを押すと波形が送られてくる仕様です。

分析プログラムはこちらを元ネタにいじいじさせてもらいました。

#include
#include

// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
uint16_t RECV_PIN = 0;

IRrecv irrecv(RECV_PIN);

decode_results results; // Somewhere to store the results
irparams_t save; // A place to copy the interrupt state while decoding.

void setup() {
// Status message will be sent to the PC at 115200 baud
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
irrecv.enableIRIn(); // Start the receiver
}

// Display encoding type
//
void encoding(decode_results *results) {
switch (results->decode_type) {
default:
case UNKNOWN: Serial.print("UNKNOWN"); break;
case NEC: Serial.print("NEC"); break;
case SONY: Serial.print("SONY"); break;
case RC5: Serial.print("RC5"); break;
case RC6: Serial.print("RC6"); break;
case DISH: Serial.print("DISH"); break;
case SHARP: Serial.print("SHARP"); break;
case JVC: Serial.print("JVC"); break;
case SANYO: Serial.print("SANYO"); break;
case SANYO_LC7461: Serial.print("SANYO_LC7461"); break;
case MITSUBISHI: Serial.print("MITSUBISHI"); break;
case SAMSUNG: Serial.print("SAMSUNG"); break;
case LG: Serial.print("LG"); break;
case WHYNTER: Serial.print("WHYNTER"); break;
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break;
case PANASONIC: Serial.print("PANASONIC"); break;
case DENON: Serial.print("DENON"); break;
case COOLIX: Serial.print("COOLIX"); break;
}
if (results->repeat) Serial.print(" (Repeat)");
}

// Dump out the decode_results structure.
//
void dumpInfo(decode_results *results) {
if (results->overflow)
Serial.println("WARNING: IR code too long."
"Edit IRrecv.h and increase RAWBUF");

// Show Encoding standard
Serial.print("Encoding : ");
encoding(results);
Serial.println("");

// Show Code & length
Serial.print("Code : ");
serialPrintUint64(results->value, 16);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}

// Dump out the decode_results structure.
//
void dumpRaw(decode_results *results) {
// Print Raw data
Serial.print("Timing[");
Serial.print(results->rawlen - 1, DEC);
Serial.println("]: ");

for (uint16_t i = 1; i < results->rawlen; i++) {
if (i % 100 == 0)
yield(); // Preemptive yield every 100th entry to feed the WDT.
uint32_t x = results->rawbuf[i] * USECPERTICK;
if (!(i & 1)) { // even
Serial.print("-");
if (x < 1000) Serial.print(" "); if (x < 100) Serial.print(" "); Serial.print(x, DEC); } else { // odd Serial.print(" "); Serial.print("+"); if (x < 1000) Serial.print(" "); if (x < 100) Serial.print(" "); Serial.print(x, DEC); if (i < results->rawlen - 1)
Serial.print(", "); // ',' not needed for last one
}
if (!(i % 8)) Serial.println("");
}
Serial.println(""); // Newline
}

// Dump out the decode_results structure.
//
void dumpCode(decode_results *results) {
// Start declaration
Serial.print("uint16_t "); // variable type
Serial.print("rawData["); // array name
Serial.print(results->rawlen - 1, DEC); // array size
Serial.print("] = {"); // Start declaration

// Dump data
for (uint16_t i = 1; i < results->rawlen; i++) {
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
if (i < results->rawlen - 1)
Serial.print(","); // ',' not needed on last one
//if (!(i & 1)) Serial.print(" ");
}

// End declaration
Serial.print("};"); //

// Comment
Serial.print(" // ");
encoding(results);
Serial.print(" ");
serialPrintUint64(results->value, 16);

// Newline
Serial.println("");

// Now dump "known" codes
if (results->decode_type != UNKNOWN) {
// Some protocols have an address &/or command.
// NOTE: It will ignore the atypical case when a message has been decoded
// but the address & the command are both 0.
if (results->address > 0 || results->command > 0) {
Serial.print("uint32_t address = 0x");
Serial.print(results->address, HEX);
Serial.println(";");
Serial.print("uint32_t command = 0x");
Serial.print(results->command, HEX);
Serial.println(";");
}

// All protocols have data
Serial.print("uint64_t data = 0x");
serialPrintUint64(results->value, 16);
Serial.println(";");
}
}

// The repeating section of the code
//
void loop() {
// Check if the IR code has been received.
if (irrecv.decode(&results, &save)) {
dumpInfo(&results); // Output the results
dumpRaw(&results); // Output the results in RAW format
dumpCode(&results); // Output the results as source code
Serial.println(""); // Blank line between entries
}
}

さっそく分析してみよう

えーーーーーい

ライト ON
Encoding : UNKNOWN
Code : 83083445 (26 bits)
Timing[51]:
+ 550, - 950 + 300, -2100 + 300, -2100 + 250, - 950
+ 250, - 950 + 250, -2100 + 250, -2100 + 300, - 950
+ 300, -2100 + 300, - 900 + 300, - 950 + 300, - 950
+ 250, -2100 + 300, -2100 + 300, - 950 + 300, - 950
+ 250, - 950 + 250, - 950 + 300, - 950 + 250, - 950
+ 250, - 950 + 300, -2100 + 300, - 950 + 300, - 950
+ 300, - 950 + 300
uint16_t rawData[51] = {550,950,300,2100,300,2100,250,950,250,950,250,2100,250,2100,300,950,300,2100,300,900,300,950,300,950,250,2100,300,2100,300,950,300,950,250,950,250,950,300,950,250,950,250,950,300,2100,300,950,300,950,300,950,300}; // UNKNOWN 83083445


ライトOFF
Encoding : UNKNOWN
Code : F531650F (26 bits)
Timing[51]:
+ 600, - 950 + 300, -2100 + 300, -2100 + 300, - 950
+ 300, - 950 + 300, -2100 + 300, -2100 + 300, - 950
+ 300, -2100 + 250, - 950 + 300, - 950 + 300, - 950
+ 250, -2100 + 300, - 950 + 300, -2100 + 300, - 950
+ 250, - 950 + 250, - 950 + 250, - 950 + 300, - 950
+ 300, - 950 + 300, - 950 + 300, -2100 + 300, - 950
+ 250, - 950 + 250
uint16_t rawData[51] = {600,950,300,2100,300,2100,300,950,300,950,300,2100,300,2100,300,950,300,2100,250,950,300,950,300,950,250,2100,300,950,300,2100,300,950,250,950,250,950,250,950,300,950,300,950,300,950,300,2100,300,950,250,950,250}; // UNKNOWN F531650F

※とあるリモコンライトの波形です・・・・

最後に

こんな感じに波形の分析をすることが出来ました!次回はいよいよ、波形を発振器に送ってリモコン操作をしてみましょう!!

コメント

コメントを書く

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)