Arduino Uno R4 WiFiでスマートリモコンを作る


Arduino Uno R4 WiFiには通信機能があるので簡単にウェブサイトにアクセスできます。ウェブサイト上のリンクを押すと自宅のエアコンを遠隔でON/OFFできるスマートリモコンを作ってみました。

必要な機材

  1. Arduino Uno R4 WiFi
  2. GROVE ベースシールド
  3. GROVE 赤外線受信器
  4. GROVE 赤外線発信器

赤外線受信器をD2、赤外線発信器をD3に取り付けます。


ライブラリのダウンロードと設定

まずリモコンの赤外線データを読み込んで文字列に変換します。以下「IRremote」ライブラリをダウンロードして使用します。


ReceiveDump.ino」を開き「define RAW_BUFFER_LENGTH 750」「define RECORD_GAP_MICROS 12000」を追記します。

※初期設定では、エアコンのリモコンから送信される赤外線データ量が多すぎて全てのデータを取得できずに不完全なデータとなりリモコン操作を実行できませんでした。

#define RAW_BUFFER_LENGTH 750
#define RECORD_GAP_MICROS 12000
/*
 * ReceiveDump.cpp
 *
 * Dumps the received signal in different flavors.
 * Since the printing takes so much time (200 ms @115200 for NEC protocol, 70ms for NEC repeat),
 * repeat signals may be skipped or interpreted as UNKNOWN.
 *
 *  This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
 *
 ************************************************************************************
 
...以下省略...
*/

赤外線データの読み込み

ReceiveDump.ino」を実行して「シリアルモニタ」を開きます。その後、赤外線受信器に向かってリモコンのボタンを押します。


上記のように赤外線データが数値化された状態で表示されます。今回は「uint16_t rawData」形式のデータを利用します。


 uint16_t rawData[439] = {3430,1770, 430,470, 380,1320, 430,470, 430,470, 380,520, 380,470, 380,470, 430,470, 380,470, 380,520, 380,470, 430,420, 430,470, 380,1370, 430,470, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,1320, 430,1320, 430,1320, 430,470, 380,470, 430,1320, 430,470, 380,470, 430,470, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 380,520, 380,470, 380,520, 380,470, 380,470, 430,470, 430,470, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,1320, 430,1320, 430,420, 430,470, 380,520, 380,470, 430,420, 380,10120, 3480,1770, 380,470, 430,1320, 430,470, 380,520, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,1320, 430,470, 430,420, 430,470, 380,470, 430,470, 430,420, 430,470, 380,1370, 430,1270, 430,1320, 430,470, 430,470, 380,1320, 430,470, 430,470, 380,470, 430,470, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,1320, 430,470, 380,470, 430,1320, 430,470, 430,470, 380,1320, 430,470, 380,470, 430,470, 380,470, 430,470, 380,1320, 430,1320, 430,470, 430,470, 380,470, 380,470, 430,470, 430,420, 430,470, 380,520, 380,470, 430,1270, 430,1320, 430,470, 430,470, 380,470, 430,470, 380,1320, 430,470, 430,1320, 380,1320, 430,470, 430,470, 380,1320, 430,520, 380,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,420, 430,470, 380,1320, 430,1320, 430,1320, 430,470, 430,470, 380,470, 430,470, 380,470, 380,520, 380,470, 380,520, 380,470, 430,1320, 430,1320, 430,1270, 430,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 430,470, 380,470, 380,520, 380,470, 430,470, 380,470, 430,420, 430,470, 380,1320, 430,470, 430,1320, 430,470, 380,470, 430,470, 380,1320, 430,470, 380,470, 430,1320, 430,470, 380,1370, 430,1270, 430,470, 430,1320, 430,470, 380,470, 430,1320, 430,470, 380,470, 430,470, 380,470, 430,1270, 430,1320, 430,470, 430,470, 380,1320, 430,1320, 430,470, 430,1320, 430,420, 380};

今回押したリモコンのボタンの赤外線データが上記のものとなるので、各リモコンのボタン毎の赤外線データを収集する必要があります。

エアコンの場合にはリモコンの温度表示を変えた状態でボタンを押すと、その温度でエアコンを起動できます。今回作ったスマートリモコンでは以下の赤外線データを収集しました。

  • 運転/停止
  • 除湿ON(温度指定なし)
  • 暖房ON(19℃)
  • 暖房ON(23℃)
  • 冷房ON(17℃)
  • 冷房ON(20℃)
  • 冷房ON(23℃)
  • 冷房ON(26℃)

赤外線データの送信

シンプルな赤外線送信スケッチです。

#include <IRremote.h>
#define IR_SEND_PIN 3 //送信ピン指定
IRsend irsend(IR_SEND_PIN);
void setup() {
	Serial.begin(115200);
}
void loop() {
	int khz = 38; //38kHz carrier frequency for the NEC protocol
	uint16_t rawData[] = {3430,1770, 430, 省略...};
	irsend.sendRaw(rawData, sizeof(rawData) / sizeof(rawData[0]), khz); //赤外線送信
	delay(5000); //5秒毎に
}

自身のリモコンの赤外線データを取り込んで、rawData部分にペーストして実行してみてください。これで機器が反応すれば赤外線の送信成功です。


スマートリモコンとして使うには?

スマートリモコンとして使うには以下の作業が必要です。

  • ウェブサイト上のボタンを押すと判定用のフラグを生成する
  • Arduino Uno R4 WiFiから、ウェブサイトを定期的(5分毎など)にチェックする
  • 判定用のフラグがあればArduinoから赤外線を送信する

複雑すぎてサンプルは掲載しませんが、Arduino側からHTTPレスポンスを読み込む部分が上手くいかなかったので、以下のコードで無理やりレスポンスBODYの文字列を判別する事ができました。参考にしてください。

Arduinoからウェブサイトにアクセスする方法

HTTPレスポンスからBODYのみ取り出す関数

String read_response() {
	boolean header_flag = true;
	String body;
	Serial.println("response-->");
	while (client.available()) {
		String line = client.readStringUntil('\r');
		line.trim();
		Serial.print("line:");
		Serial.println(line);
		if(line.compareTo("") == 0){
			header_flag = false;
		}
		if(!header_flag){
			body += line;
		}
	}
	Serial.println("<---response");
	Serial.print("body:");
	Serial.println(body);
	return body;
}

まとめ

Arduino Uno R4 WiFiの通信機能を使うことで、クラウド温度計兼スマートリモコンを作る事ができました。これを応用すると温度変化によって自動的にエアコンON/OFFまでできてしまいます。安くて小さくて何でもできて便利ですね!