工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド

必要な部品と用品

Arduino Nano 33 IoT ×1
抵抗 330Ω ×1
IR受信モジュール(例: VS1838B) ×1
IR送信LED(赤外線LED) ×1
ジャンパーワイヤー ×1式
ブレッドボード ×1

使用するアプリとオンラインサービス

プロジェクト概要

注意: このチュートリアルは古い可能性があります。最新版は こちら を参照してください。

イントロ:Arduino IoT Cloud

Arduino IoT Cloudは、誰でも簡単にIoTデバイスを構築できるプラットフォームです。Alexaでテレビを操作するには、公式Arduino Alexaスキルも併用します。初心者はまず 入門プロジェクト でThing/Propertyの設定、ボードのオンボーディングを学ぶことを推奨します。

パート1:テレビを制御する仕組み

テレビのリモコン信号(赤外線)をArduinoで「学習」し、再送信することで制御します。回路組み立て後、以下のスケッチを書き込み、シリアルモニタを見ながらリモコンの各ボタンを押して生データ(rawData配列)を取得・記録します。

対象ボタン:

取得例(サムスン製リモコンの場合):

CHANNEL 1 unsigned int chan1[67] = {4450,4500, 550,1700, ... };
CHANNEL 2 unsigned int chan2[67] = {4500,4500, 550,1700, ... };
...(以下同様)
VOLUME UP unsigned int volUp[67] = {...};
VOLUME DOWN unsigned int volDown[67] = {...};
CHANNEL UP unsigned int chanUp[67] = {...};
CHANNEL DOWN unsigned int chanDown[67] = {...};

パート2:Arduino IoT Cloud設定

  1. IoT Cloudトップから新規Thing作成、名前を「TVRemoteController」等に設定
  2. 使用ボードを選択(本チュートリアルはNano 33 IoT)
  3. Propertyを1つ追加:カテゴリ「Smart Home」→ タイプ「TV」、Read/Write、更新トリガー「値変更時」
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド

パート3:Arduino Web Editorでコード追加

「EDIT SKETCH」ボタンでWeb Editorを開き、自動生成されたスケッチにカスタムコードを追加します。

1. IRライブラリ読み込み

#include <IRremote.h>

2. 信号配列定義


const unsigned int chan[9][67] = { {chan1}, {chan2}, ..., {chan9} };
const unsigned int volUp[67] = {...};
const unsigned int volDown[67] = {...};
const unsigned int chanUp[67] = {...};
const unsigned int chanDown[67] = {...};
const unsigned int onoff[67] = {...};   // 電源トグル用
const unsigned int mute[67] = {...};    // ミュート用

3. IR送信設定


IRsend irsend;
const int freq = 38;  // 38kHz搬送波

4. 送信ヘルパー関数


void sendIR(const unsigned int buf[]) {
  digitalWrite(LED_BUILTIN, HIGH);
  irsend.sendRaw(buf, 67, freq);
  delay(300);  // テレビによって調整必要
  digitalWrite(LED_BUILTIN, LOW);
}

5. プロパティ変更コールバック実装


void onTvChange() {
  Serial.println("==================");
  Serial.println("Switch:"+String(tv.getSwitch()));
  Serial.println("Volume:"+String(tv.getVolume()));
  Serial.println("Channel:"+String(tv.getChannel()));
  Serial.println("Mute:"+String(tv.getMute()));
  Serial.println("==================");

  if (first) {
    prevSwitch = tv.getSwitch(); prevVolume = tv.getVolume();
    prevChannel = tv.getChannel(); prevMute = tv.getMute();
    first = false; return;
  }

  // 音量変更
  if (tv.getVolume() > prevVolume) {
    tv.setMute(false); prevMute = false;
    for (int k = prevVolume+1; k <= tv.getVolume(); k++) {
      sendIR(volUp);
      Serial.println("Volume requested:"+String(tv.getVolume())+" Set:"+String(k));
    }
    prevVolume = tv.getVolume();
  } else if (tv.getVolume() < prevVolume) {
    tv.setMute(false); prevMute = false;
    for (int k = prevVolume-1; k >= tv.getVolume(); k--) {
      sendIR(volDown);
      Serial.println("Volume changed:"+String(tv.getVolume())+" Set:"+String(k));
    }
    prevVolume = tv.getVolume();
  }

  // ミュート変更
  if (tv.getMute() != prevMute && tv.getMute()) {
    prevMute = tv.getMute(); sendIR(mute);
    Serial.println("Mute changed:"+String(tv.getMute()));
  } else if (tv.getMute() != prevMute && !tv.getMute()) {
    prevMute = tv.getMute(); sendIR(mute);
    Serial.println("Mute changed:"+String(tv.getMute()));
  }

  // チャンネル変更
  if (tv.getChannel() != prevChannel) {
    int newChannel = tv.getChannel();
    if (newChannel > 0 && newChannel < 10) {
      sendIR(chan[newChannel-1]);
    } else if (newChannel > 9) {
      if (newChannel > prevChannel) {
        for (int ch = prevChannel; ch < newChannel; ch++) {
          sendIR(chanUp);
          Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch));
        }
      } else {
        for (int ch = prevChannel; ch > newChannel; ch--) {
          sendIR(chanDown);
          Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch));
        }
      }
    }
    prevChannel = newChannel;
    Serial.println("Channel changed:"+String(tv.getChannel()));
  }

  // 電源オン/オフ
  if (tv.getSwitch() != prevSwitch) {
    prevSwitch = tv.getSwitch();
    if (tv.getSwitch()) sendIR(chan[6]);  // 例: チャンネル7ボタンで電源オン
    else sendIR(onoff);
    Serial.println("Switch changed:"+String(tv.getSwitch()));
  }
}

パート4:Amazon Alexa設定

  1. Amazon Alexaアプリをインストール(iOS/Android)し、アカウントログイン
  2. スキルストアで「Arduino」を検索し、公式スキルを有効化
  3. Arduinoアカウントでリンク認証
  4. デバイス検出を実行 → 「TVRemoteController」が検出される
  5. デバイス名を「TV」等に設定
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド
Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド

音声コマンド例

Enjoy! 質問や作品報告はコメント欄へ。— Arduino Team

回路図

Arduino IoT CloudとAlexaでテレビを音声操作:ステップバイステップガイド

製造プロセス

  1. Alexaでシーリングファンを音声制御:ステップバイステップガイド
  2. Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
  3. Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
  4. Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
  5. ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
  6. IoTで遠隔操作する自作ロボットアーム:Arduino MKR1000とSimulink、ThingSpeak活用
  7. ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
  8. Arduino Cloud連携でどこからでも家の温度を監視
  9. FirmataとXbox OneコントローラーでArduinoローバーをシームレス操作
  10. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  11. Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー