Alexaでシーリングファンを音声制御:ステップバイステップガイド
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Raspberry Pi 3 Model B | 1 | ローカルサーバー用 |
| Arduino UNO | 1 | リレー制御用 |
| リレー(汎用) | 1 | 5V駆動タイプまたはリレーインターフェースボード推奨 |
| ファンレギュレーター | 1 | 抵抗ブロック式の旧型が端子接続しやすく推奨 |
必要な工具
- はんだごて
必要なソフトウェア・サービス
- Arduino IDE
- Amazon Alexa Skills Kit(開発者コンソール)
- ngrok(ローカルサーバーを公開するトンネリングサービス)
プロジェクト概要
一般的なシーリングファンをAmazon Alexa対応のスマートファンに改造します。Alexaスキルで音声コマンドを受け取り、ngrok経由でローカルのRaspberry Piサーバーにリクエストをルーティング。Raspberry Piからシリアル通信でArduinoに指令を送り、リレーを介してファンレギュレーターの速度段階を切り替えます。
Raspberry Piローカルサーバーの構築
必要パッケージのインストール
# Python pip(Python 2.7/3なら標準付属)
sudo apt-get install python-pip
# Flask(軽量Webフレームワーク)
pip install flask
# flask-ask(Alexaスキル開発用拡張)
pip install flask-ask
# pyserial(シリアル通信)
sudo apt-get install pyserial
# Python開発ヘッダー
sudo apt-get install libpython2.7-dev
Pythonサーバーコード(Flask + Flask-Ask)
from flask import Flask
from flask_ask import Ask, statement
import serial
ser = serial.Serial("/dev/ttyAMA0", 9600)
app = Flask(__name__)
ask = Ask(app, '/')
@ask.launch
@ask.intent("FanOn")
def on():
ser.write(b'1')
return statement("Ceiling Fan turned on.")
@ask.intent("FanOff")
def off():
ser.write(b'0')
return statement("Ceiling Fan turned off.")
@ask.intent("FanLevelUp")
def up():
ser.write(b'+')
return statement("Ceiling Fan speed up.")
@ask.intent("FanLevelDown")
def down():
ser.write(b'-')
return statement("Ceiling Fan speed down.")
if __name__ == "__main__":
app.run(debug=True)
このスクリプトを実行し、Raspberry Piの自動起動に登録します。
ngrokのセットアップ
- ngrok公式サイトからARM版をダウンロード・解凍
- 実行:
./ngrok http 5000 - 生成されたHTTPS URL(例:
https://xxxx.ngrok.io)をAlexaスキルのエンドポイントに設定
Alexaスキルの作成
- Amazon Developer Consoleで開発者登録・ログイン
- 「Alexa Skills Kit」→「Add new skill」
- スキル名・呼び出し名(Invocation Name)を設定(例:「シーリングファン」)
- インテント定義(JSON):
{
"intents": [
{ "intent": "FanOn" },
{ "intent": "FanOff" },
{ "intent": "FanLevelUp" },
{ "intent": "FanLevelDown" }
]
}
- サンプル発話:
FanOn say fan on / say on
FanOff say off / say fan off
FanLevelUp say fan level up / say increase fan speed
FanLevelDown say fan level down / say decrease fan speed
- エンドポイント設定:HTTPS選択、ngrokのURLを指定
- SSL証明書:2番目のオプション(自動信頼)を選択
- テスト:ngrokとPythonサーバー両方稼働中にAlexaシミュレーター或は実機で発話テスト
Arduinoスケッチ
6段階の速度制御に対応(リレー6個を制御)。シリアルコマンド:'1'=ON(最低速), '0'=OFF, '+'=速度UP, '-'=速度DOWN。
int Fan[] = {13, 12, 11, 10, 9, 8}; // 6つのリレー制御ピン
int n = 0; // 現在の速度段階(0=OFF, 1-6=速度段階)
void setup() {
for (int i = 0; i < 6; i++) {
pinMode(Fan[i], OUTPUT);
}
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
char x = Serial.read();
reset();
set(x);
}
}
void reset() {
for (int i = 0; i < 6; i++) digitalWrite(Fan[i], LOW);
}
void set(char x) {
switch (x) {
case '1': n = 1; break; // ON(最低速)
case '+': n++; break; // 速度UP
case '-': n--; break; // 速度DOWN
case '0': n = 0; break; // OFF
}
// 範囲制限
if (n < 0) n = 0;
if (n > 6) n = 6;
if (n > 0) digitalWrite(Fan[n-1], HIGH); // 配列0-index調整
}
ハードウェア接続
回路図を参照。ファンレギュレーターの各速度端子をリレーで切り替え、ArduinoのD8-D13に接続。Raspberry PiのUART(/dev/ttyAMA0)とArduinoのUSB/シリアルで接続。
応用アイデア
同様の仕組みで、照明、エアコン、カーテンなど任意の家電を音声制御可能です。
製造プロセス
- 家庭用の低コストワイヤレスセンサーネットワークを構築
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino電源制御センター:N-FET/P-FET/リレー/RTC搭載キット
- ラズベリーパイとNode-REDでAlexaからLEDを制御する - 簡単ステップバイステップガイド
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Windows 10 CortanaでBluetooth経由でArduinoのLEDを制御
- Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
- セントラルヒーティングをArduinoでスマート制御:OpenThermシールド活用ガイド
- Arduino Unoで25kHz 4ピンPWMファンを制御 – 製作・コード・テスト