ESP8266・ESP32/WebSocket2020/02/12Wi-Fi(wifi)モジュールESP8266の内、NodeMCU開発ボードを使ってWiFi越しに動く電動ロールスクリーンを作ってみるページ。以前、作ったArduino+ステッピングモータ28BYJ-48製電動ロールカーテンを無線化したもの。無線版としては、MQTT版ロールスクリーンと併行して、今回は、操作にあたり、HTML5実装のWebSocketを介すことにしました。Piなどのハードウェアは不要、操作は端末ではなく、ブラウザから手軽にできるのでPCでもスマホやタブレットでも操作可能です。WebSocketの接続(ws://、SSL対応はwss://で始まるドメインやアドレスへのアクセス)には、JavaScriptを使いました。Air/無線)アップデートできるようにしました。要らないでしょ...と思っていたのですが、今回のケースでは、超絶便利でした。IDEを使う前提のmDNS機能を必要とするものを選びました。x2ほとんどは、Arduino版やMQTT版に書いた通りですが、材料については、個々の環境に合わせて適宜用意していただければ。前提mDNS機能を持つパッケージアプリケーションとしてLinuxならAvahi、Mac/WindowsならBonjourがインストール済みであること(macOSはBonjourはプリインストール済みのはず)。IDEで使えるようにしておくこと。Module]を選択、ESPモジュールにスケッチをアップロードできる状態であること。ESP32なら、[espressif/arduino-esp32]の要領でESPモジュールにスケッチをアップロードできる状態であること。ついては、ほぼ、Arduino版のArduinoが、ESPボードに変わっただけです。実のところ、今回は、逆流防止のダイオードは入れなかったのですが、少なくともスクリーンの上限下限の位置決めが終わるまでは、シャフトを手動で回すことがあったりし、発電機のような状態になるので各モーターピン用にいるかもなと思った次第です。操作は、物理スイッチではなく、後述の通り、同じネットワーク上にいるPCやタブレット、スマホなどのブラウザを介し、遠隔操作するだけです。電源は、十分な電流を供給できるACアダプタなどを降圧して使えば、5V程度(今回は、ブレッドボード用電源)でもESPボードのVIN/GNDとモーター用5V/GNDを共用しても、もちろん、モーター用と分けても十分機能します。共有する場合の電源が、モバイルバッテリーだと(機能時、電流を要するため、自動OFFはしないものの、)特に巻き上げ時、トルク不足と勘違いするような状況で稀にしかうまくいきません。モーターを別電源とし、ESPボードへの電源供給専用としてならモバイルバッテリーでも十分ですが、別電源によってスクリーン動作中であってもESPボードには供給(充電)不要と判断され、自動OFFしてしまいます。よって強力な電源で共用するか、ESPボードは、電源タップに挿したAC充電アダプタから供給するかの何れかになるでしょう。AruduinoOTAサンプルスケッチBasicOTAのアップロードいろいろやってみた中で、これをしなくてもできたのですが...。SSIDとパスフレーズのみ環境に合わせたBasicOTAをNodeMCUボードにアップロード。AruduinoOTAを使うスケッチを無線アップデートできているESPボードであれば、この必要はありません。独自スケッチのアップロード初めてArduinoOTAを使うボードの場合、BasicOTAの、既に他スケッチで機能していた場合、OTA用の内容を網羅したオリジナルスケッチをNodeMCUボードにアップロード。することでOTAアップデートできるようになります。スケッチ今回のスケッチは、こんな感じ。communicationプロジェクトのスケッチとMQTT版(Arduino版ロールスクリーンで使ったスケッチ、Stepper、ArduinoOTA、ESP8266mDNS各ライブラリ)の合作です。便利なもので後述のように(今回は、JavaScriptから)WebSocketのパスが呼ばれるとESP8266/ESP32にアップロードしたスケッチのwebSocketEvent関数がコールされ、payload引数にその値が入ってきます。WebScokets.hは、複数のライブラリで利用可能なようですが、今回は、arduinoWebSocketsライブラリを使用しました。IDEからOTAアップデートしました。マルチアクセスポイント対応でアクセスポイントモードでしたが、ステーションモードに変更しました。元のスケッチだと4つの内、一部は、モータードライバのLEDが点灯するものの、全点灯せず、モーターが回わらなかったため、既に動作確認がとれているスケッチからコードを取り込みました。モーターを回すためのループが完了した後もモータードライバ上のランプが点灯したままとなるため、これを消灯させるべく、停止を入れています。server(80);に変更、モーター用出力ピンには、ESP32相応のピンを指定する必要があります。ちなみにそのままだと.gzファイルにも対応しているため、それを残したまま解凍・展開して編集しても反映されない!と慌てないよう要注意。type="text"></div></center></body></html>なぜか、外部CSSは適用されるのに外部JavaScript(WebSocket.js)は適用されなかったのでJavaScript部分は、HTMLに埋め込みました。(ん?CSSのHTML内のクオートがシングル、かたやダブルだけど、まさかそれ?)押下ボタンを判別、送信するメソッド・関数sendCtrl(btn){}以外は、参照させて頂いたプロジェクト同様です。type=text)は、外部スクリプトでうまくいかなかった際のボタン押下時のvalue値確認用です。charset="utf-8">を入れておけば日本語も文字化けしないと当サイト別ページに...)。index.htmlのhead内は、必要な行のみ使い、外部CSSにも手は加えましたが、ちょっと雑さが目立ちますし、なくても機能確認には十分なので割愛します。操作方法ブラウザにmDNS名でxxx.local/index.htmlか、IPアドレスでxxx.xxx.xxx.xxx/index.htmlにアクセスすれば、UP、STOP、DOWNボタン付きの操作パネルが表示されます。これなら、別途、ESP8266/ESP32で作って運用中のブラウザ版スマートホーム操作パネルに簡単に統合できます。流用させて頂いたスケッチについては、アクセス時index.htmlを省略する方法がいまいちわかりませんでした...。押下ボタンがわかると言えばわかるのでテキストボックスである必要はないものの、あってもよいですが、前述の通り、確認用なのでテキストボックスはなくても構いません。2例えば、Pythonだと、WebSocketクライアントをこんな風に書けば、引数を渡して操作できます。このようにスクリプトから操作できるということは、自作スマートスピーカーからでも操作できます。TCP/IP同期通信のようにフリーズすることなく、ボタン操作自体は受け付けますが、今のところ、割り込み方法を思いつかず、途中での逆転や停止はしません(よってSTOPボタンは実質意味がありません)。自動で行ってくれます。いうことは、間違えて続けて押してしまうと開けたつもりなのに閉まってる!とか、その逆もあり得るという話。UP/DOWNをそれぞれ続けてクリック・タップしても直後にメインメニューに戻る(ロールスクリーンのメニューを抜ける)と最初の動作だけ行って2つめ含む以降の動作はしないことがわかりました。ロールスクリーンのメニューも各操作もロールスクリーン用に割り当てたESPチップのフラッシュメモリ上に展開されたパスにアクセスすることで表示・操作できるようになっており、フラッシュメモリ内にアクセス中は、操作における値を保持、アクセスしなくなる(=ロールスクリーン用に割り当てたESPチップのスケッチを抜ける・スケッチの範囲外になる)と即、値も破棄されるということなのでしょう。5000としてループさせており、リミットスイッチがなくとも上限、下限に達すると自動で停止しますが、リミットスイッチがないため、UPやDOWNなど同じ操作ボタンを続けて2回以上押してしまうとスクリーン長とは無関係に巻き上げ・巻下げしてしまうので注意(運用でカバー)。Gymで強化学習シミュレーションメインメニューホームページ作成メニューウェブ開発メニュー2004-2008-someday。