GoogleアシスタントでArduinoを操作する - IFTTT・Webhook・ESP8266完全ガイド
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | メイン制御ボード |
| Espressif ESP8266 ESP-01 | 1 | Wi-Fiモジュール、Arduinoとシリアル通信 |
アプリとオンラインサービス
- Arduino IDE
- Microsoft Visual Studio 2017(サーバー側コード用)
- Google Assistant(Androidスマホ等)
- IFTTT(Webhook連携用)
- Webサーバー+データベース(PHP/MySQL等)
プロジェクト概要
このプロジェクトでは、インターネットサービスとArduinoボードを接続し、音声コマンドでArduinoのI/Oピン、PWM、シリアルポート等を制御する方法を学びます。完了時には以下が可能になります:
- Googleアシスタントからデータを取得する方法を理解
- IFTTTアプレットの作成・活用方法を習得
- WebhookとHTTPリクエストの仕組みを理解
- 音声でArduinoを操作できるようになる
GoogleアシスタントとIFTTTアプレット
GoogleアシスタントはAI搭載のバーチャルアシスタントで、自然な会話による双方向インタラクションが可能です。IFTTT(If This Then That)は「もし〜なら、それなら〜」という条件付きアクション(アプレット)を作成できる無料Webサービスで、Googleアシスタントを含む多数のサービスと連携できます。
WebhookとJSON
Webhook は、Webアプリケーションの振る舞いをカスタムコールバックで拡張する仕組みです。JSON (JavaScript Object Notation) は、属性-値ペアと配列でデータを表現する軽量フォーマットで、非同期通信の標準的なデータ形式として広く使われています。
GoogleアシスタントからArduinoへのデータフロー
- ユーザーがGoogleアシスタントに話しかける(例:「ピン9のPWMを255に設定」)
- IFTTTアプレットがトリガーされ、WebhookでサーバーへHTTP POSTリクエスト送信
- サーバーがデータをデータベースに保存
- ESP8266が定期的にサーバーをポーリングし、新しいコマンドを取得
- ESP8266がシリアル通信でArduinoへコマンド転送
- Arduinoがコマンドを解釈し、PWM出力等を実行
実装手順
1. IFTTTアプレット作成
- ifttt.com でアカウント作成・ログイン
- [My Applets] → [New Applet] → [THIS] で「Google Assistant」を選択
- 「Say a phrase with a number ingredient」(数値を含むフレーズ)を選択
- フレーズ設定例:
Set PWM of pin 9 to #(#が数値プレースホルダー) - 同義語も追加可能:
PWM 9 to #等 - 応答メッセージ設定例:
The PWM is updated - [Create Trigger] → [THAT] で「Webhooks」を選択 → [Make a web request]
- 設定:
- URL: あなたのサーバーのエンドポイント(例:
https://yourserver.com/api/Home/SetPWM) - Method: POST
- Content Type: application/json
- Body:
{"Number": "{{NumberField}}"}
- URL: あなたのサーバーのエンドポイント(例:
- [Create Action] で完了
2. サーバーとデータベース
IFTTTからのWebhookを受け取り、データベースに保存するサーバーサイドコードが必要です。サンプルコード(C#/ASP.NET)はプロジェクトページからダウンロード可能です。モデルを変更して用途に合わせて拡張できます。
3. ESP8266とArduinoのコード
前提: Arduino IDEのライブラリマネージャーで ArduinoJson をインストール済みであること(Sketch → Include Library → Manage Libraries → "ArduinoJson" で検索 → Install)。
ESP8266 (ESP-01) スケッチ - サーバーからコマンド取得・Arduinoへ転送
#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "ArduinoJson.h"
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://yourip/api/Home/GetAllApp"); // あなたのAPIエンドポイント
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload); // Arduinoへ転送(JSON文字列のまま)
// TODO: ここでJSONパースして必要な値のみ送信するのがベスト
}
http.end();
}
delay(3000); // 3秒ごとにポーリング
}
Arduino UNO スケッチ - ESP8266から受信しPWM制御実行
String inputString = "";
String buff;
bool stringComplete = false;
bool id;
int f, buf;
char x;
void setup() {
Serial.begin(9600);
inputString.reserve(200);
}
void loop() {
if (stringComplete) {
// 簡易パース: "id" と "number" フィールドを探す
f = 0;
while (f < 100) {
if (inputString.substring(f, f+2) == "id") { id = true; break; }
f++;
}
if (id) {
x = inputString.charAt(f + 4);
}
if (x == '4') { // コマンドID 4 = PWM制御
f = 0;
while (f < 100) {
if (inputString.substring(f, f+6) == "number") {
f += 9; // "number": " の分をスキップ
buff = "";
for (int i = 0; i < 3; i++) {
char c = inputString.charAt(f + i);
if (c == '"') break;
buff += c;
}
buf = buff.toInt();
analogWrite(9, buf); // ピン9にPWM出力
break;
}
f++;
}
}
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') stringComplete = true;
}
}
今後の拡張アイデア
- 出力ピンのON/OFF制御コマンドを追加(リレーモジュールで照明・家電制御)
- Arduinoからセンサーデータを送信し、Googleアシスタントに読み上げさせる
- 複数のデバイス・ピンを統合管理するダッシュボード構築
- 認証・認可機能を追加してセキュリティ強化
回路図
ESP-01のTX→Arduino RX (pin 0)、ESP-01のRX→Arduino TX (pin 1) でシリアル接続。ESP-01は3.3V駆動のため、レベルシフターまたは抵抗分圧で5V↔3.3V変換が必要です。電源は別系統またはArduino 3.3Vピン(電流容量注意)から供給。
製造プロセス
- QR・RFID・体温検知統合アクセス制御システム(Raspberry Piベース)
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Arduino & MPU6050:SG90 & MG996Rサーボの精密制御
- 音声で家電を操作:GoogleアシスタントとBluetoothでArduino家電制御
- u-blox LEA-6H 02 GPSモジュール: Arduino & Python 統合ガイド
- Arduino Dueでマスターする音声認識と音声合成
- ThimbleKrox: Arduino MicroとMPU-6050を用いた指装着型マウス制御
- ArduinoとGoogleスプレッドシート連携 リアルタイムRFID勤怠管理システム