Posted at

Google Home とIRKitとArduinoでホームオートメーション

More than 1 year has passed since last update.

下記記事を読ませていただいて、ウチはIRKitでホームオートメーションをしているので、

もしかしたら需要あるかもと思ったので書いてみます。

Google Home からSmartでない家電を動かす

Google Homeとスマートでない家電を接続する

また、今回は全くスマートでない「壁スイッチ照明」のコントロールをします。

Arduinoとサーボモータを使用して、こんなかんじのゴリ押しです。スマートでない感極まります。

↓Youtubeです

スマートでない壁スイッチをarduinoとIRKitとGoogleHomeで動かす。

照明のオンオフと調光ができます。

Arduinoに赤外線受光器を取り付け、赤外線で制御しています。


Arduino

こちらの記事が参考になること極まれりだったので、参考(丸パクリ)にさせていただきました。

誠にありがとうございます。

赤外線通信の実験パート2

(赤外線リモコンを送信器にして何か動かす)

Sketchはこんな感じです。

#include <Servo.h>

//モーターを定義しておきます。
Servo servo1;
Servo servo2;

#define IR_PIN 11 // 赤外線受信モジュール接続ピン番号
#define DATA_POINT 3 // 受信したデータから読取る内容のデータ位置

// 初期化処理
void setup()
{
Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う
pinMode(IR_PIN, INPUT) ; // 赤外線受信モジュールに接続ピンをデジタル入力に設定
}
// メインの処理
void loop()
{
int ans ;

ans = IRrecive() ; // 赤外線リモコンのデータを受信する
if (ans != 0) Serial.println(ans, HEX) ; // リモコンからデータを受信したら表示する
if (ans != 0) {
switch (ans) {
//caseで赤外線信号の値を指定してあげます。
case 0x86: //ライトオン
//ライトスイッチ
servo1.attach(9);
servo1.write(105);
delay(500);
servo1.write(90);
delay(100);
servo1.detach();
//dim
servo2.attach(5);
servo2.write(0);
delay(500);
servo2.detach();
break ;

case 0x87: //ライトオフ
//dim
servo2.attach(5);
servo2.write(180);
delay(500);
servo2.detach();
delay(100);
//ライトスイッチ
servo1.attach(9);
servo1.write(70);
delay(500);
servo1.write(90);
delay(100);
servo1.detach();
break ;
}
}
}
// 赤外線リモコンのデータを受信する処理関数
int IRrecive()
{
unsigned long t ;
int i , j ;
int cnt , ans ;
char IRbit[64] ;

ans = 0 ;
t = 0 ;
if (digitalRead(IR_PIN) == LOW) {
// リーダ部のチェックを行う
t = micros() ; // 現在の時刻(us)を得る
while (digitalRead(IR_PIN) == LOW) ; // HIGH(ON)になるまで待つ
t = micros() - t ; // LOW(OFF)の部分をはかる
}
// リーダ部有りなら処理する(3.4ms以上のLOWにて判断する)
if (t >= 3400) {
i = 0 ;
while (digitalRead(IR_PIN) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす
// データ部の読み込み
while (1) {
while (digitalRead(IR_PIN) == LOW) ; // OFF部分は読み飛ばす
t = micros() ;
cnt = 0 ;
while (digitalRead(IR_PIN) == HIGH) { // LOW(OFF)になるまで待つ
delayMicroseconds(10) ;
cnt++ ;
if (cnt >= 1200) break ; // 12ms以上HIGHのままなら中断
}
t = micros() - t ;
if (t >= 10000) break ; // ストップデータ
if (t >= 1000) IRbit[i] = (char)0x31 ; // ON部分が長い
else IRbit[i] = (char)0x30 ; // ON部分が短い
i++ ;
}
// データ有りなら指定位置のデータを取り出す
if (i != 0) {
i = (DATA_POINT - 1) * 8 ;
for (j = 0 ; j < 8 ; j++) {
if (IRbit[i + j] == 0x31) bitSet(ans, j) ;
}
}
}
return ( ans ) ;
}


IFTTT側の設定

Google Homeちゃんに、「電気つけて」って言ったら電気がつくようにしたいです。

IFTTT経由で、IRKitにHTTPリクエストすることで実現できそうです。

IRKit公式サイトのIRKit Device HTTP APIの項目を読んで、

Clienttoken/DeviceIDを取得&つかう赤外線信号を取っておきましょう。



IFTTTにログインして、New Appletで、まずはThisを選択しましょう。



Google Assistantを選択します。



今回は、"Say a simple phrase"をつかいます。

決まった言葉に対してトリガーしてくれる機能です。



"What do you want to say?"にトリガーにしたい言葉を入れます。

今回は「電気つけて」にします。

その下の(optional)と書いてあるところには、言葉のバリエーションを指定できます。

"What do you want the Assistant to say in response"には、

トリガーがかかったらGoogle Homeに返してほしい言葉を入れます。

最後のLanguageはJapaneseにしておきます。



次はThatです。



ThatにはWebhooksを指定します。



Make a Web requestを選択して、、



URLには https://api.getirkit.com/1/messages

MethodはPOST

Content Typeは application/x-www-form-urlencodedを指定します。

最後にBodyに、

clientkey=クライアントトークンを入れる&deviceid=デバイスIDを入れる&message={"format":"raw","freq":38,"data":[取得した赤外線信号の配列]}

を入れて、Create action→FinishでOKです。

これで、設定ができたはずなので、Google Homeちゃんに話しかけてみましょう!

「OK Google, 電気つけて」

「すみません、お役に立てそうにありません」

.....もごもご発音をきれいにしないとですね。

ということでこの記事は終わりです。