Alexaでテレビを操作:Arduino & ESP8266で実現する音声制御
必要な部品と用品
| Arduino UNO | ×1 | IR送信ダイオードと組み合わせてTVコマンドを送信 |
| NodeMCU ESP8266 ブレイクアウトボード | ×1 | Wi-Fiモジュール。Amazon Alexaアプリで「WEMO」デバイスとして認識。各デバイスごとにパルスをArduinoへ送信 |
| IR送信モジュール | ×1 | 100Ω抵抗と直列接続してTVへIRコマンド送信 |
必要な工具
- はんだごて
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
Alexaでテレビを操作!
概要: Alexaに話しかけるだけでテレビを操作できるようにします。リモコンでできる操作なら何でもAlexaで実行可能です。リモコンのIR信号を記録し、音声コマンドで同じ信号を再送信する仕組みです。以下の手順で実装するか、YouTube動画を参照してください。
Step 1: 必要なライブラリのダウンロード
以下のライブラリをArduino IDEのlibrariesフォルダに追加:
Step 2: NodeMCU(Wi-Fiモジュール)のプログラミング
ESP8266-Alexa.inoを開き、NodeMCUにアップロード(ボードマネージャでESP8266ボード情報を追加済みであること)。変更が必要なのは:
- Wi-Fi認証情報(SSID、パスワード)
- デバイス名(Alexaで呼び出す名前)
デバイス名はこのスケッチで、送信するIR信号はIR-Alexa-Send.inoでカスタマイズします。
Step 3: テレビリモコンのIR信号を読み取り
IR_REMOTE_read.inoをArduinoにアップロードし、リモコンのボタンを押して受信したIR信号(16進数コード)を記録します。詳細はこのチュートリアルを参照。
Step 4: ArduinoでIR信号を送信(Alexa連携)
IR-Alexa-Send.inoを開き、Arduino Unoにアップロード(ボードをUnoに切り替え)。
両モジュールに電源を供給し、配線で接続。IR送信機はArduinoのピン3に接続。詳細は添付の回路図を参照。
Step 5: Alexaでテスト
- Amazon Alexaアプリ(モバイル/PC)を開く
- 「スマートホーム」→「デバイスを追加」で、ESP8266-Alexa.inoで設定したデバイス名を検出
検出後、以下のコマンド構造でテスト:
- 「アレクサ、デバイス名をつけて」
- 「アレクサ、デバイス名 オン」
- 「アレクサ、デバイス名 をオンにして」
- 「アレクサ、デバイス名 つけて」
コード
ESP8266-Alexa.ino (C/C++) - NodeMCU用
NodeMCUに書き込み、WEMOデバイスをエミュレート
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "fauxmoESP.h"
// Wi-Fi認証情報
#define WIFI_SSID "your_ssid"
#define WIFI_PASS "your_password"
#define SERIAL_BAUDRATE 115200
fauxmoESP fauxmo;
void wifiSetup() {
WiFi.mode(WIFI_STA);
Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println();
Serial.printf("[WIFI] STATION Mode, SSID: %s, IP: %s\n",
WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}
// リレーピン定義(実際はArduinoへの信号出力ピン)
#define RELAY_PIN1 13
#define RELAY_PIN2 2
#define RELAY_PIN3 14
#define RELAY_PIN4 15
void setup() {
pinMode(RELAY_PIN1, OUTPUT); digitalWrite(RELAY_PIN1, LOW);
pinMode(RELAY_PIN2, OUTPUT); digitalWrite(RELAY_PIN2, LOW);
pinMode(RELAY_PIN3, OUTPUT); digitalWrite(RELAY_PIN3, LOW);
pinMode(RELAY_PIN4, OUTPUT); digitalWrite(RELAY_PIN4, LOW);
Serial.begin(SERIAL_BAUDRATE);
Serial.println("FauxMo demo sketch");
Serial.println("After connection, ask Alexa to 'turn pixels on/off' or 'turn relay on/off'");
wifiSetup();
// Alexaデバイス名登録
fauxmo.addDevice("TV");
fauxmo.addDevice("GregsNetflix");
fauxmo.addDevice("Sleep");
fauxmo.addDevice("Office");
fauxmo.onMessage(callback);
}
void callback(uint8_t device_id, const char * device_name, bool state) {
Serial.printf("[MAIN] %s state: %s\n", device_name, state ? "ON" : "OFF");
if (strcmp(device_name, "TV") == 0) {
digitalWrite(RELAY_PIN1, state ? HIGH : HIGH); // 両方HIGHは元コードの仕様
}
if (strcmp(device_name, "GregsNetflix") == 0) {
digitalWrite(RELAY_PIN2, state ? HIGH : LOW);
}
if (strcmp(device_name, "Sleep") == 0) {
digitalWrite(RELAY_PIN3, state ? HIGH : LOW);
}
if (strcmp(device_name, "Office") == 0) {
digitalWrite(RELAY_PIN4, state ? HIGH : LOW);
}
}
void loop() {
fauxmo.handle();
delay(500);
// パルス出力後はLOWに戻す
digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN3, LOW);
digitalWrite(RELAY_PIN4, LOW);
}
IR-Alexa-Send.ino (C/C++) - Arduino UNO用
NodeMCUからの信号を受け、対応するIRコマンドを送信
#include <IRremote.h>
IRsend irsend;
#define a 4 // TV
#define b 5 // GregsNetflix
#define c 6 // Sleep
#define d 7 // Office
void setup() {
Serial.begin(9600);
pinMode(a, INPUT);
pinMode(b, INPUT);
pinMode(c, INPUT);
pinMode(d, INPUT);
}
void loop() {
if (digitalRead(a) == HIGH) {
irsend.sendNEC(0x57E3E817, 32); // Power
Serial.println("TV");
delay(500);
}
if (digitalRead(b) == HIGH) {
// The Office 選択シーケンス
irsend.sendNEC(0x57E354AB, 32); // Enter
delay(2000);
irsend.sendNEC(0x57E39867, 32); // Up
delay(1000);
irsend.sendNEC(0x57E39867, 32); // Up
delay(1000);
irsend.sendNEC(0x57E39867, 32); // Up
delay(1000);
irsend.sendNEC(0x57E3B44B, 32); // Right
delay(1000);
irsend.sendNEC(0x57E354AB, 32); // Enter
delay(2000);
irsend.sendNEC(0x57E354AB, 32); // Enter
Serial.println("The Office");
delay(500);
}
if (digitalRead(c) == HIGH) {
// Sleep Timer 設定シーケンス
irsend.sendNEC(0x57E38679, 32); // Options
delay(1500);
for(int i=0;i<4;i++) {
irsend.sendNEC(0x57E3CC33, 32); // Down
delay(700);
}
irsend.sendNEC(0x57E3B44B, 32); // Right
delay(700);
irsend.sendNEC(0x57E3B44B, 32); // Right
delay(900);
irsend.sendNEC(0x57E38679, 32); // Options
Serial.println("Sleep Timer");
delay(500);
}
if (digitalRead(d) == HIGH) {
irsend.sendNEC(0x57E34AB5, 32); // Netflix
Serial.println("Greg's Netflix");
delay(500);
}
}
IR_REMOTE_read.ino (C/C++) - リモコン信号解析用
// 2017.06.22
#include <IRremote.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 9, 2);
int receiverpin = 10;
IRrecv irrecv(receiverpin);
decode_results results;
void setup() {
lcd.begin(16, 2);
pinMode(receiverpin, INPUT);
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();
lcd.clear();
lcd.print(results.value, HEX);
delay(150);
}
}
回路図
製造プロセス
- 産業用タッチスクリーン:修理か交換か?専門家の判断ガイド
- 経口避妊薬:歴史、メリット、リスク、製造
- Alexaでシーリングファンを音声制御:ステップバイステップガイド
- Windows 10 CortanaでBluetooth経由でArduinoのLEDを制御
- プロガイド:工作機械で金属穴あけ——エキスパートのヒント
- 車の修理をマスター:信頼性と節約のためのDIYヒント
- 産業制御システムの保護:実証済み戦略とベストプラクティス
- プロセス制御システムを診断・修正する8つの実証済みステップ
- PLCnextでWake-on-LANを使用してPCをリモート起動
- 産業制御システムをワイヤレスネットワークへ移行する
- なぜ熱硬化性複合材が現代製造の理想的選択なのか