IoT開発を始める:ESP8266Arduinoチュートリアル

公開: 2022-03-11

このESP8266Arduinoチュートリアルの目的は、IoT空間でのアクセシビリティと使いやすさでメーカーコミュニティ(および一般的な開発者)の間で非常に人気のあるチップ上のArduinoの組み込みプログラミングに慣れることです。 チュートリアルでは、非公式の「ハック」を使用してAlexaに手を汚し、Alexaに自宅での入札を行わせます(この手法は、本番環境での使用を目的としたものではなく、自宅でのデモンストレーションのみを目的としています)。 自宅でこれを試してみてください。ただし、職場では試してはいけません。

ESP8266Arduinoチュートリアルの抽象的なグラフィック表現

このテクニックの優れている点は、自宅で使用して、Alexaに電気で動作するほぼすべての文字を自動化できることです。 追加のボーナスとして、Arduinoを使用した組み込みプログラミングについての洞察を得ることができます。このスキルは、最近の主流のプログラマーの間ではあまり一般的ではないかもしれません。 最後に、人気のあるESP8266チップを使用します。これは、日曜大工の間で人気があります。 これは、このプロジェクトに必要な組み込みのWifiチップを備えた、あらゆる種類のものを実行する機能を備えた驚くべき小さなチップです。 これにより、Alexaデバイスとチップが互いに直接通信できるようになります。

Alexaプログラミングの背景:Alexaの「スキル」プログラミングモデルは次のように機能します。

Alexaの抽象的なグラフィック表現

  • Alexaに話しかけます。
  • AlexaはあなたのスピーチをAmazonのクラウドにルーティングします。
  • 音声コマンドは、Alexaの「スキル」(Amazonのクラウドで実行されるプログラム)にルーティングされます。

Alexaの「スキル」がコマンドの処理を引き継ぎます。 通常、応答がAlexaデバイスに返送され、応答としてユーザーに何かを伝えます。 Alexa IoTの場合、コマンドはAmazonのクラウド上の「デバイスシャドウ」にルーティングされ、最終的には応答が自宅の他のデバイスに送信されます。 私たちはハックでそれらすべてをバイパスしています。 Alexaデバイスが、クラウドに何も送信したり返送したりせずに、家の中でESP8266チップと直接通信できるようにしたいのです。 AlexaがESP8266に直接リクエストを送信し、自宅のWi-Fiネットワーク内でのみ送信するようにします。

私たちのハックは本当に秘密ではありません。 ESP8266をWemoBelkinに「エミュレート」します。これは、Amazonとの特別なライセンスを持つデバイスであり、上記のすべてのAmazonクラウド通信をバイパスしてAlexaデバイスと直接通信できます。

Wemoを装って、ESP8266はAlexaから直接コマンドを受信できるという特権を享受しています。

ESP8266Arduinoチュートリアルの基本計画

  • 互換性のあるデバイスのローカルwifiネットワークでプローブを送信するAlexaデバイスのESP8266をリッスンし、「I'maWemo」と言ってこれらのプローブに応答します。
  • Alexaデバイスによって信頼されたら、そのデバイスからのさらなるコマンドをリッスンします。 IR送信機を介してIRコードを送信し、テレビのオン/オフを切り替えて処理します。

ハードウェア要件

AlexaタワーやArduinoボードなどのハードウェアの抽象的なグラフィック表現

このチュートリアルを完了するには、自分でいくつかのアイテムを入手する必要があります。これらはすべて簡単に入手できます。

  • Alexaデバイス。 このチュートリアルはAlexaDotで開発しました。 チュートリアルはEchoシミュレーターで機能しますか? かもしれない! (しかし、私はそれをテストしていません)。 冒険的(または質素)な気分になったら、試してみてください。 Alexaデバイスはポケットマネーがかかりますが、Echosimの使用は無料です。
  • ESP8266チップ。 この記事の執筆時点では、費用はわずか数米ドルです。 あなたはそれらをEbayで、またはオンラインでほぼすべての品揃えの豊富な金物店で手に入れることができます。
  • IR(赤外線)ダイオード。 これをESP8266チップに配線する必要があり、これは自分で行う必要があります。 このプロジェクトでは、送信機能のみが必要です。 IRの受信は気にしません。 このチュートリアルを機能させるには、必ずダイオードをGNDに配線し、0を出力してください。 (他の方法で行う場合は問題ありませんが、それに応じてチュートリアルコードを変更する必要もあります。このリンクが役立つ場合があります。ESP8266で使用されている番号付けスキームにより、ピン0に注意してください。 「D3」と表示される場合があります。
  • 一方がUSB(開発用コンピューターに接続するため)で、もう一方がESP8266チップに適合するシリアルアダプター。
  • ユーザー名とパスワードを知っているローカルwifiネットワーク。

EchoDotの横にあるアダプターに取り付けられたESP8266の写真
EchoDotの隣のアダプターに接続されたESP8266

IRダイオードを取り付けたESP8266の写真
IRダイオードが接続されたESP8266

Arduinoソフトウェアツール

  • ArduinoIDE。 Windowsを含むすべての主要なOS用のバージョンがあります。 このチュートリアルはUbuntuバージョンで開発されましたが、WindowsにもArduinoをインストールして使用しましたが、問題はありません。
  • Arduino用のESP8266開発ライブラリ。
  • 運転手。 幸い、アダプターのドライバーはプラグアンドプレイである可能性が高いため、追加のドライバーは必要ありません。

すべてを設定する

  • ArduinoIDEをインストールします。
  • BoardsManagerを使用してESP8266ライブラリをインストールします。

Boards Managerを使用してESP8266ライブラリをインストールするには:

  • Arduino IDEで、 [ファイル]->[設定]を開きます。
  • 「AdditionalBoardsManagerURL」に次のURLを入力します:http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • [OK]をクリックします

ボードマネージャーのURLフィールドを強調したESP8266Arduinoチュートリアルのスクリーンショット

  • ボードマネージャーに移動します( [ツール]-> [ボード:[現在のボード]-> [ボードマネージャー] )。

    BoardsManagerメニュー項目を強調したスクリーンショット

  • 「フィルター」テキストボックスに「ESP8266」と入力します。
  • 追加のボードマネージャーが追加されたので、「esp8266」のエントリを取得する必要があります。 それを選択し、「インストール」をクリックします。

インストールプロセスを強調したBoardsManagerのESP8266Arduinoチュートリアルスクリーンショット

  • しばらくお待ちください。すべてをダウンロードするには時間がかかります。
  • ArduinoIDEを再起動します。
  • [ツール]->[ボード]を開きます。今回は、[汎用ESP8266モジュール]まで下にスクロールして選択します。

汎用ESP8266モジュールのメニューオプションを強調したESP8266Arduinoチュートリアルのスクリーンショット

サードパーティライブラリの追加

Arduinoは、プロジェクトに外部ライブラリを追加するためのさまざまな方法、つまり「スケッチ」を提供しています。 物事をできるだけ単純にするために、このチュートリアルでは、フォルダをコピーするだけで、最も簡単に説明します。 チュートリアルを機能させるには、IRemoteESP8266とhttps://github.com/me-no-dev/ESPAsyncTCPの2つの外部ライブラリを追加する必要があります。

  • GitHubのチュートリアルコードで、「libraries」ディレクトリを見つけます。
  • Arduinoのルートインストールディレクトリ(C:\ Program Files \ Arduinoなど)で、「libraries」サブディレクトリを見つけます。
  • IRemoteESP8266ディレクトリをチュートリアルの「libraries」ディレクトリからArduinoの「libraries」ディレクトリにコピーします。
  • ESPAsyncTCPディレクトリをチュートリアルの「libraries」ディレクトリからArduinoの「libraries」ディレクトリにコピーします。
  • ArduinoIDEを再起動します。

これで、IR送信と非同期TCPのライブラリがプロジェクトに含まれます。

設定

以下の画像は、私と私のハードウェアで機能する一般的な設定を示していますが、ユーザーごとに異なる場合があります。 以下の設定を試すことができますが、特定のチップとアダプターに基づいて設定を調整しなければならない場合があります。 たとえば、私のものはnodemcuなので、リセット方法を「ck」(デフォルト)から「nodemcu」に変更する必要がありました。 また、シリアルデバッガを使用できるように「デバッグポート」を「シリアル」に設定してください。 私の設定は非常に典型的な設定なので、私の設定をベースとして使用できます。 コンパイルとフラッシュのプロセスを機能させるためにそれらをいじる必要がある場合でも、驚かないでください。

シリアルデバッグポートメニューオプションのスクリーンショット

ESP8266HelloWorldでセットアップを証明する

Arduinoプロジェクトは.inoファイルで始まります。 .inoファイルは、セットアップとループの2つのエントリポイントを定義します。 「HelloWorld」では、コードが機能することを確認するために、ESP8266で少しライトをオンにします。

 //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 #define LED_PIN 2 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); pinMode(LED_PIN, OUTPUT); } /*---------------------------------------*/ //Runs constantly void loop() { digitalWrite(LED_PIN, LOW); delay(1000); digitalWrite(LED_PIN, HIGH); delay(1000); }

コードをコンパイルしてフラッシュする

これまでの設定が正しければ、コンパイルとフラッシュは簡単な手順です。 フラッシュせずにコンパイルするには、Arduinoメニューから[スケッチ]->[検証/コンパイル]に移動します。

スケッチメニューのアップロードメニューオプションのスクリーンショット

コードをチップにフラッシュしてコンパイルするには、Arduinoメニューから[スケッチ]->[アップロード]を選択します。

進行中のアップロードのスクリーンショット

フラッシュが成功すると、進行状況の表示が0%から100%になります。その間、チップのLEDが実際に点滅または点滅する可能性があります。

シリアルデバッグが機能していることをテストするには:

  • まず、デバッグポートがシリアルに設定されていることを確認します( [ツール]-> [デバッグポート])。
  • コードのチップへのフラッシュが終了したら、[ツール]->[シリアルモニター]を選択します。

シリアルデバッグポートメニューオプションのスクリーンショット

正常に起動した後のシリアルデバッガーの出力:

正常に起動した後のシリアルデバッガーの出力のスクリーンショット

すばらしいので、うまくいきます。 次に、IR出力を確認します。 IR送信機を介して信号を送信し、信号が通過していることを確認しましょう。

既存のArduinoIRライブラリを利用して支援します。 Arduinoの優れた点の1つは、ライブラリとモジュールのスナップインとスナップアウトがいかに簡単かということです。 C ++フレームワークにとって非常に新鮮です!

そのGitリポジトリのREADMEファイルの指示に従ってArduinoにインストールしてください。

このコードは、IRトランスミッターを繰り返し点滅させるだけです。 IRは人間の目には見えませんが、それをテストするためのヒントがあります。 このコードを実行し、(デバッガーを介して)チップ上で実行されていることを確認してから、モバイルデバイスのカメラを開きます。 カメラを通してIRダイオード電球を直接見てください。 それが機能している場合は、電球が目に見えてオンとオフになっているのが見えるはずです。 これは、動作しているリモコン(たとえば、標準のテレビのリモコン)でも試すことができます。 次のコードにより、IR電球が0.5秒ごとに点滅を開始します。 実際には、LGのオン/オフコマンドを送信するため、近くにある場合は実際にLGTVの電源をオフにしてからオンにすることができます。

 #include <IRremoteESP8266.h> // IR Library IRsend* irSend; // infrared sender //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize the IR irSend = new IRsend(IR_PIN, true); irSend->begin(); } /*---------------------------------------*/ //Runs constantly void loop() { irSend->sendNEC(0x20DF10EF, 32, 3); delay(1000); }

ESP8266チュートリアルを開始します

これまでにすべてが機能していれば、基本的な機器とセットアップが機能していることに満足でき、チュートリアルの要点を開始する準備ができていると思います。

Wifiに接続する

まず、ローカルWi-Fiに接続する必要があります。 以下のコードはWifiへの接続を試み、接続の成功を報告します(シリアルデバッガーを介して)。 コードサンプルでは、​​myWifiSsidの値をwifiネットワークのユーザー名に置き換え、myWifiPasswordの値を正しいパスワードに置き換えることを忘れないでください。

 #include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection // this file is part of my tutorial code #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //connect to wifi if (wifi->connect()) { debugPrint("Wifi Connected"); } } /*---------------------------------------*/ //Runs constantly void loop() { }

Wemoサーバーを実行する

接続されていますか? 良い。 これで、プロジェクトの要であるWemoサーバーにたどり着きました。

このチュートリアルのソースファイルには、私自身のWemoエミュレータが含まれています。 これで、Googleを検索して、より単純なWemoエミュレーターを見つけることができます。 より少ないコードで書かれていて、理解しやすいものを見つけることができます。 ぜひ、自由に調べたり、実験したり、自分で書いたりしてください。これが、このチュートリアルを自分のものにするためのすべての部分です。

私の背後にある理由は、ESPAsyncTCPを使用しているということです。 なぜこれが良いのですか? そうですね、ESP8266でこの方法を使用して実行できるサーバー(またはデバイス)は非常に多く、信頼性が低下し始める前に、Alexaがデバイスの欠落を開始し(デバイスが見つからない)、コマンドがドロップされ、パフォーマンスが低下するという意味です。遅くなります。 この数は、ESPAsyncTCPライブラリを使用することで最大化されることがわかりました。

それがないと、10〜12台のデバイスに忍び寄る信頼性が低いことがわかりました。 このチュートリアルを拡張して、チップで実行できることの限界を探りたい場合は、私のバージョンを使用することをお勧めします。 自分の理解のためだけにもっと簡単なバージョンを見たい場合は、Googleで「wemoエミュレーターArduino」を検索してください。 たくさんの例が見つかるはずです。

次に、ESPAsyncTCPライブラリをインストールする必要があります。 IRライブラリと同じようにインストールします。 Gitページに移動し、指示に従います。

このライブラリは、私のesp8266arduinoサンプルコードにも含まれています。 これは、wifi接続を開き、Alexaディスカバリー要求をリッスンし、「IamWemo」応答を返すことで処理するためのコードです。

 #include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection #include "Wemulator.h" // Our Wemo emulator #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection Wemulator* wemulator; // wemo emulator IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //initialize the IR irSend = new IRsend(IR_PIN, false); irSend->begin(); //initialize wemo emulator wemulator = new Wemulator(); //connect to wifi if (wifi->connect()) { wemulator->begin(); //start the wemo emulator (it runs as a series of webservers) wemulator->addDevice("tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("television", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my television", new WemoCallbackHandler(&commandReceived)); } } /*---------------------------------------*/ //Runs constantly void loop() { //let the wemulator listen for voice commands if (wifi->isConnected) { wemulator->listen(); } }

事前テスト

Alexaで実行して、これまでの機能(wifiとエミュレーター)をテストします。 このチュートリアルは、Alexaデバイスがセットアップされて自宅にインストールされていることを前提としています。

テストの発見:

アレクサに「アレクサ、デバイスを見つけて」と言います。

これにより、AlexaはローカルwifiネットワークでUDPリクエストをブロードキャストし、Wemosやその他の互換性のあるデバイスをスキャンします。 この要求は、 wemulator->listen();の呼び出しで受信する必要があります。 loop()関数で。 これにより、WemulatorのhandleUDPPacket(*)メソッドにルーティングされます。 nextUDPResponse()メソッドで応答が送信されます。 その応答の内容に注意してください。

 const char UDP_TEMPLATE[] PROGMEM = "HTTP/1.1 200 OK\r\n" "CACHE-CONTROL: max-age=86400\r\n" "DATE: Sun, 20 Nov 2016 00:00:00 GMT\r\n" "EXT:\r\n" "LOCATION: http://%s:%d/setup.xml\r\n" "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n" "01-NLS: %s\r\n" "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" "ST: urn:Belkin:device:**\r\n" "USN: uuid:Socket-1_0-%s::urn:Belkin:device:**\r\n\r\n";

これは、Alexaに「私はWemo(Belkin)です、どうすればお手伝いできますか?」というコードです。 Alexaがこの応答を受信すると、将来のスマートホームコマンドがこのデバイスにルーティングされる可能性があることを認識して記憶します。

この時点でのシリアルデバッガーの出力は、次の画像のようになります。 検出が完了すると、Alexaはネットワーク上で「[N]デバイスを検出した」ことを口頭で通知します。

Alexa出力のスクリーンショット

setup()関数で、次のスニペットに注意してください。

 new WemoCallbackHandler(&commandReceived)

これは、Alexaからコマンドをキャプチャするコールバックです。 その本体はWemoCallbackHandler.h(WemoCallbackHandler :: handleCallback)で定義されています。 Alexaからコマンドをキャプチャしたら、それを使って好きなことを行うことができます。 その前の行では、次のコード行を使用して、使用できるコマンドを設定しました。

 wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");

つまり、これらは、チップ上で実行している4つの別個の「サーバー」またはリスナーです。 これにより、Alexaに次のコマンドのいずれかを発声する機能が設定されます。

Alexa、テレビAlexaをオンにする、テレビAlexaをオフにする、テレビAlexaをオンにする、テレビAlexaをオフにする、テレビAlexaをオンにする、テレビAlexaをオフにする、テレビAlexaをオンにする、テレビをオフにする

そして、これが私たちがそれをテストする方法です。 これらのコマンドのいずれかを言うと、コードがウェイクアップしてそのコールバックに入り、そこで好きなことを実行できると期待しています。

コマンドを言うと何が起こるかのスクリーンショット

IRコマンドを追加する

コマンドを受信したので、次はテレビの電源をオン/オフして処理します。 つまり、これがすべて(wifi、wemoエミュレーター、IR)になります。 私のテレビはLGなので、オン/オフの適切なシーケンスを調べて、IRライブラリのsendNEC関数(LGはNECプロト​​コルを使用)を介して送信しました。 IRエンコード/デコードはそれ自体が別の主題であり、メッセージは信号の変調でエンコードされます。 これは、非常に正確なタイミング、マーク、およびスペースの仕様です。 各メーカーは、コマンドに独自のプロトコルを使用する傾向があり、タイミングも異なります。 それは非常に興味深いものであり、そのIRライブラリのソースコードやグーグルなどを調べることで、より深く掘り下げることができます。しかし、私たちの便宜のために、私たちのIRライブラリによってすべての詳細が処理されます。

あなたのテレビはLGではありませんか? 正しいコードをグーグルで検索してください。 これがSonyTVのコマンドです(注意:テストされていません):

 irSend.sendSony(0xa90, 12);

本当に自分でできるようにしたい場合は、IR受信機をセットアップし、リモコン(または任意のIR送信機)をそれに向けて、送信するコードをデコードすることができます。 ただし、これは別のチュートリアルです。

エンドツーエンドテスト

  • Alexaを聞こえる場所に配置します。
  • テレビのリモコンの範囲内に、IRダイオードが接続されたESP8266を配置します。
  • 「アレクサ、デバイスを見つけて」と言います。 成功を報告するのを待ちます(少なくとも1つのデバイスを検出する必要があります)。
  • 「アレクサ、テレビの電源を入れて」または「アレクサ、テレビの電源を切って」と言います。

Alexaはコマンドを理解し(特定のスキルに向けられていないスマートホームコマンドとして)、それを処理するローカルデバイスを検索し、コマンドをデバイス(ESP8266)に送信する必要があります。 デバイスはそれを受信し、リモコンコマンドをテレビに送信する必要があります。 携帯電話のカメラを通してダイオードを表示して、ダイオードが発光していることを確認できます。

テレビをオフにするIRコードは、テレビをオンにするコードと同じであるため、「オン」または「オフ」のどちらをオンにするかは関係ありません。 これは同じコードで、状態を切り替えます。 テレビがオフの場合はオンになり、オンの場合はオフになります。

トラブルシューティング

Wifiに接続していますか?

正しい変数値に正しいユーザー名/パスワードを入力しましたか?

 //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";

Wifiに接続しているときに、失敗メッセージ、またはシリアルデバッグポートを介したエラーが表示されますか?

Wifiがオンになっていますか?他の通常の方法でWi-Fiに接続できますか?

お使いのデバイスはAlexaによって検出されていますか?

「アレクサ、デバイスを検出して」と言うと、アレクサはデバイスを検出するリクエストを送信します。

Alexaを適切に構成および設定し、ESP8266と同じWifiネットワークに接続する必要があります。

Fauxmo.hを見てください。 関数Fauxmo::handle()を参照してください。 これは、ESP8266が呼び出しを聞いたときに実行される最初のコードです。 デバッグメッセージを入れて、後にコードがあるかどうかを確認します

 if (len > 0) {

が走っています。 そうでない場合、コマンドは受信されていません。 そうである場合、コマンドは受信されているように見えますが、正しく処理されていません。 そこからのコードに従って、問題が何であるかを調べます。

ネットワーク上に他にも多くの検出可能なデバイスがありますか? 多すぎると、検出の実行が遅くなったり、場合によっては失敗したりする可能性があります。

デバイスはコマンドを受信して​​いますか?

コマンド「Alexa、テレビをオンにして」を発行すると、実行はWemoCallbackHandler::handleCallback handler (WemoCallbackHandler.hファイル内)に入るはずです。 まだ行っていない場合は、そこにデバッグメッセージを出力して、コマンドを発行したときに確実に起動するようにしてください。 また、コマンドを発行する前に、「Alexa、デバイスを検出して」と言って、Alexaがデバイスを認識していることを確認してください。 この手順は、デバイスの検出が成功したことを前提としています。

IRダイオードは発光していますか?

前に説明したように、デバイスが発光していると思われる場合は、携帯電話のカメラをデバイスに向け、カメラを通してダイオードを確認します。 実生活では何も見えませんが、カメラを通しては、通常のライトが点灯して点滅しているように見えるはずです。 あなたがこれを見れば、それは…何かを放出しています。

IR信号が反転していますか?

IRダイオードは、信号が本質的に反転するように配線されている場合があります。 私は電子機器や配線の専門家ではないので、説明にご容赦ください。ただし、ダイオードの配線を間違えると、デフォルトでIRライトがオンになりますが、IRSendライブラリがオンになるとオフになります。それを。 この場合、 setup()コードが実行された後、他の何かが発生する前に、デフォルトでIRライトがオン(カメラから見える)になっているはずです。 loop()内のすべてのコードをコメントアウトする場合は、継続的にオンのままであることがわかります。

これを修正する方法をより明確に確認するには、チュートリアルコードのlibraries / IRemoteESP8266/srcフォルダーに移動します。 コンストラクターを参照してください。

 IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }

「反転した」引数とそれを処理するロジックが、私たちが話していることです。 配線が逆になっている場合、最も簡単な解決策は、これを可能にするためにコードに小さな変更を加えることです(再配線するのではなく…しかし、もちろん、必要に応じてそれを行うことができます)。 AlexaTvRemote.inoでこの行を変更するだけです。

 //initialize the IR irSend = new IRsend(IR_PIN, false);

 //initialize the IR irSend = new IRsend(IR_PIN, true);

適切なリモートコントロールコードとコマンドがありますか?

他のすべてがうまくいっているように見えても、テレビが従わない場合は、IRコードに何か問題がある可能性があります。 そのIRライブラリインターフェイスでさまざまな関数呼び出し(たとえば、 sendLGsendPanasonicsendSharpなど)を試すか、使用しているものがハードウェアと一致することを確認してください。 テレビのハードウェアがそのライブラリでサポートされていない可能性はほとんどありませんが、技術的には可能だと思います。

送信するコードがハードウェアに適していることを確認してください。 あなたは正しいものを見つけるためにグーグルでいくつかの掘り下げをしなければならないかもしれません。 他のすべてが失敗した場合、電源ボタンを押したときに、作業中のリモコンから放出されるコードを検出するオプションが常にありますが、これは別のチュートリアルであり、別のハードウェアが必要です。

まとめ

うまくいけば、すべてがあなたのためにうまくいきました。 もしそうなら(そしておそらくそうでなくても)、これは一度にいくつかの主題であなたの歯を切る良い方法でした:

  • Alexa
  • 組み込みプログラミング
  • ESP8266チップ
  • Arduino IDE

またもちろん、音声コマンドでテレビのオン/オフを切り替えることができるという、わずかな便利さもあります。

なぜハック?

なぜこれがハックであり、Alexaの基本的なAPIの一部ではないのですか? 最初のAlexaスキルを開発する方法を学んだ後、私が本当に知りたかったのは、「Alexaからネットワーク上の別のデバイスにコマンドを直接送信するにはどうすればよいですか?」ということだけでした。 「スキル」または「スマートホーム」パラダイム(すべてをAWSに送信する必要がある)を経由せずに、AmazonがAlexaデバイスとローカルネットワーク上の他のオブジェクトとの間の通信用の本格的なAPIを公開していないのは残念です何かをする前に)、しかし彼らはそうしていません。

さらに進んでみてください

一連のリモコンコマンドを試して、チャンネルの変更や音量の制御など、テレビをより完全に制御してください。 1つのESP8266でリッスンできるさまざまなコマンドの数を確認して、チップの限界をテストします(ヒント:非常に巧妙なプログラミングを行わなくても、数が2桁を超えることはほとんどありません)。 ハードウェアに長けている場合は、他のデバイスをIRを介さに、ESP8266チップに直接配線して制御してみてください。 照明などのように。 wemoを再発明してください!

関連している:
  • 完全に機能するArduinoウェザーステーションの作り方
  • ESP32オーディオサンプリングの操作