Wi-Fi(wifi)モジュールESP8266の内、NodeMCU開発ボード1つとサーボモータ2つを使ってWiFi越しに縦並びの物理スイッチ(壁埋め込みの照明・電気スイッチ)2つをON/OFFするガジェットを作ってみるページ。
スマートとは言い難い気もしますが、一応、スマートスイッチ。
以前、やってみた電源タップでのArduino+サーボによるON/OFFデモを無線化し、実用的にしたもの。
取り付け方法にあぐねていたこともあり、必要性の点からも後回しにしてきました。
が、DCモータ、ギヤモータ、ステッピングモータ、サーボモータを使って何か実用品を作りたい!と思いつつ、なかなか思いつかない時は、やっぱりこれだよね、ということで今やることにした次第。
電動化後も、もちろん、手動での操作もできます。
無線操作するにあたり、ソフト的には、ESP8266・ESP32/WebSocketによる自作無線電動ロールスクリーンのステッピングモータをサーボモータに代えたに過ぎません。
結果、PC/スマホ/タブレットなどのブラウザからの操作だけでなく、スクリプト化し、デスクトップ版操作パネルからブラウザ操作パネルを表示したり、端末(≒ターミナル)からはもちろん、自作スマートスピーカーからの音声操作もできます。
WebSocketクライアント(ws://、SSL対応はwss://で始まるドメインやアドレスへのアクセス)には、JavaScriptやPython3.xを使いました。
完成後は不要かもしれませんが、モノがモノ、場所が場所だけにAruduinoOTAを使ってOTA(Over The Air/無線)アップデートできるようにしました。
そうそう要らないでしょ...と思っていたのですが、今回のケースでは、超絶便利でした。
これに伴い、3通りほどあるらしき、実装方法の内、Arduino IDEを使う前提のmDNS機能を必要とするものを選びました。
茶棚側面が10cmほどの距離で面した壁面スイッチにおいて茶棚側に画像の構造物を設置。
茶棚天板にL字ステー、これにストレートステーをつなげ、立ちおろし、ここに画像の構造物をボルト締め。
2つのL字ステー及び土台のストレートステーを共締めしたボルトの突起と、このL字ステーと先端のサーボ固定用小型L字ステーの大穴、長穴がスイッチまでの調整代(しろ)。
と言いつつ、これらのボルトは調整しろにするには、わずかに短く足りませんでした。
結局、微調整用のボルトナットとゴム板を駆使、その間、数回、茶棚自体も数mm?微妙に動かしたりもしました。
下のスイッチは完璧も逆さに付けたからか、個体の問題か、上のサーボがたまにびびることがあり、スイッチをONにした瞬間にOFFにしてしまったりで、それまで驚くほど思い描いた通りで順調だった中、最終的なスイッチまでの位置決めに最も時間がかかりました。
もう少し、スマートに位置決めできないものかと今尚、考えているほど。
[2020/12/20]
下向きに付けたサーボは、この半年以内だと思いますが、回転角が小さくなったりして著しく成功率が下がってきたので1回交換、更に、ここのところ、ロックがかかったかのように指で回してさえ、サーボホーンが動かなくなることも重なり、プラスチック製ギアのSG90から金属ギアのMG90Sに交換、少なくとも下方向などイレギュラーな?向きに付けるサーボは、金属ギアなどより頑強なサーボの方が良いようです。
[2020/12/28]
騙し騙し使ってきましたが、不安定なので正常な向きのサーボもMG90Sに替えました。
やはり、SG90は実験程度に留めた方が良さそうです。
[2024/06/01]
あれから数年、下段スイッチ側の上向きに設置したサーボは安定稼働している一方、逆さまにした上部スイッチの方は、金属サーボにしても動作が不安定となることもあり、ソフトウェアリセットや電源OFF/ONの強制リセットをしたりもして、それこそ騙し騙し使ってきたのですが、思いきってお気に入りのユニポーラのままのステッピングモータ28BYJ-48 5VとステップモータドライバULN2003に替えることにしました。
28BYJと適度なサイズにカットしたMDF板をフランジ式のシャフトカプラーで固定。
上にしても下にしても横にしても安定していて良い感じの28BYJ...って、どっちが上かわかりませんが、ステー構造物上部からシャフト・軸を下に向け、ステーをモータ取り付け穴と適度な長さに切ったタミヤのユニバーサルアームで鋏み、ボルトとナットで2箇所固定。
スイッチとの間隔は、ステー上の長穴サイズ内の良き位置に微調整。
変更したスケッチは、後述。
設置する向きは、こんな感じです。
尚、今回対象となる照明用スイッチは、大きめである上、ON/OFFで左右ともに押さなければいけないもので試す前は、ホーンに何か抱かせた方が...とも思ったものの、サーボSG90の付属ホーンでいけました。
仮設のまま常用していましたが、重い腰を上げて、ガジェット筐体として、すっかり、お気に入りの100均セリアでトレカケース、キャンドゥで名刺ケースとして売っているケースに入れることにしました。
配線用に切り欠きを入れて放り込んだだけですが...。
また、下のアームにぶら下げるべく、なんかないかと思案、ちょうど買ってきたばかりのダイソーやキャンドゥで売っている大網の白い滑り止めマットに目が止まり、適当なサイズに切り、2つ折りにして繰り返し使える結束バンド2本を使うことにしました。
スペース的にもほぼぴったりであることもあり、有事の際の取り出しやすさ、筐体が落ちない点を重視、2つ折りにしてあるだけなのでよじって横から取り出すことができ、滑り止めマットだけに滑り落ちることもなく、大判の網網なので視認性もよく、周囲の色と同色の白ということで完璧。
これまで400穴のブレッドボードにブレッドボード用電源、ACアダプタ12Vから電源供給しつつ、ESPボードにはUSB給電、サーボ2つ駆動というなんともかさばる構成を見えないことを良いことに茶棚側面に養生テープやブル・タックで仮留めした状態でしたが、ついでに電源をACアダプタ12Vのみからとり、降圧モジュールを追加、ミニブレッドボードに替えたので一気にすっきりしました。
ちなみにサーボの固定は養生テープから盛り盛りのブル・タックに替え、概ね良好も、この用途には、良くも悪くも粘度があって動作時の反動により、特に逆さまにしている上部スイッチ用は、極たまにスイッチ方向に押して近づけておいてあげる必要があります。
[後日談] 上のアームも巻き込んでブルタックをモリモリにしたら安定しました。
あ、画質落としすぎて茶棚や壁は特に荒くなってますね...。
一応、Fritzing。
Amazon(Prime対応品)だと4000円前後、Aliexpressだと、これの4〜5割くらいで1500〜2000円あたりかと。
ステーは、300mmのストレートステー1つは100均(ダイソー)、それ以外のステーは、ホームセンターで使った分は600円前後、ステー固定用ネジやステー間固定用ボルト・ワッシャー・ナットも100均でセットで300円前後、単品なら100円前後かと。
材料については、個々の環境に合わせて適宜用意。
mDNS機能を持つパッケージアプリケーションとしてLinuxならAvahi、Mac/WindowsならBonjourがインストール済みであること(macOSはBonjourはプリインストール済みのはず)。
Arduino IDEが利用できることは、もちろん、ESP8266やESP32をArduino IDEで使えるようにしておくこと。
ESP-01やESP-02〜ESP14などのESP8266チップなら、Arduino IDEの[ツール] => [ボード]から[Generic ESP8266 Module]を選択、ESPモジュールにスケッチをアップロードできる状態であること。
ESP32なら、[espressif/arduino-esp32]の要領でESPモジュールにスケッチをアップロードできる状態であること。
ちなみにこれらArduino IDEの環境設定で追加する方法の場合、カンマ区切りで複数指定可能。
ESP8266 NodeMCU | サーボ | 別電源 | 備考 |
---|---|---|---|
D4/GPIO02 | 信号線(橙) | - | サーボ1用 |
D8/GPIO15 | 信号線(橙) | - | サーボ2用 |
- | プラス(赤) | 5V | - |
GND | マイナス(茶) | マイナス |
ブレッドボード用電源を介した場合、サーボを2つ使ったからか、ステッピングモータではできた一方、サーボ2つではできなかったため、今回は、ESP8266 NodeMCUの電源については、USB接続を前提にしています。
が、別電源の条件によっては、ESP8266 NodeMCUもVINからの供給も可能と思われます。
また、よく調べていませんが、ESP8266 NodeMCUボードにおいては、2つのサーボを操作するにあたり、何通りか試したところ、できないポートもあるようでサーボの信号線につなぐポートは、D4/GPIO02とD8/GPIO15ならいけました。
ブレッドボード電源に降圧を任せた今回、電源投入直後、たまに基準位置合わせに失敗することがあったり、停止時にビビリ音と共にサーボが振動(何れもわずか)することがありますが、適切な降圧コンバータを使うなど電源を強化すれば解消するのではと思っています。
今回は、壁面スイッチの真下下方にコンセントがあるため、ここに集中スイッチ付き2口電源タップを、そこに別電源とした12V/2A ACアダプタとUSB充電ACアダプタを挿すことにしましたが、電源をVINからとれるなら、もちろん2口電源タップやUSB充電ACアダプタ、USBケーブルは不要です。
もし、OTA(On The Air/無線)アップデートがうまくいかない場合、サンプルスケッチBasicOTAにおいてWiFi SSIDとパスフレーズのみ環境に合わせ、NodeMCUボードにアップロードしてから、目的のスケッチをアップロードしてみるとよいかもしれません。
今回のWebsocketサーバとなるESPチップ側のスケッチは、こんな感じ。
WebSocket communicationプロジェクトのスケッチをベースにさせて頂いたものです。
便利なもので後述のように(今回は、JavaScriptから)WebSocketのパスが呼ばれるとESP8266/ESP32にアップロードしたスケッチのwebSocketEvent関数がコールされ、payload引数にその値が入ってきます。
WebScokets.hのライブラリや、ベースとさせて頂いたスケッチにおける基本的な修正点、ESP32を使う場合の変更点などは、ESP8266・ESP32/WebSocket自作無線電動ロールスクリーン同様です。
前述の通り、上部スイッチ側の逆さ状態のサーボSG90から替えてあったMG90Sをステッピングモータ28BBYJ-48に替えたのに伴うスケッチは次のようになりました。
なお、気づけば、スケッチはESP8266のままとなっていますが、数年前からESP32、これによりライブラリもESPmDNSに替えてあり、Androidデバイス対策としてIPも固定、なぜか使えなくなったESP32WebServerにも対処するなど所々、変更を加えてあります。
なぜか、外部CSSは適用されるのに外部JavaScript(WebSocket.js)は適用されなかったのでJavaScript部分は、HTMLに埋め込みました。
押下ボタンを判別、送信するメソッド・関数sendCtrl(btn){}以外は、参照させて頂いたプロジェクト同様です。
テキスト(input type=text)は、外部スクリプトでうまくいかなかった際のボタン押下時のvalue値確認用です。
index.htmlのhead内は、必要な行のみ使い、外部CSSにも手は加えましたが、ちょっと雑さが目立ちますし、なくても機能確認には十分なので割愛します。
ブラウザにmDNS名でmDNS.local/index.htmlか、IPアドレスで***.***.***.***/index.htmlにアクセスすると、ダイニング用ライト、キッチン用ライトそれぞれのオン・オフ操作パネルが表示されます。
これなら、別途、ESP8266/ESP32で作って運用中の集中操作パネルとしているブラウザ版スマートホーム操作パネルに簡単に統合できます。
押下ボタンがわかると言えばわかるのでテキストボックスである必要はないものの、確認用なのであってもなくても可。
例えば、Python(Python3)だと、まず、WebSocketクライアント(今回は、pipでwebsocket-client-py3)をインストール、スクリプトをこんな風に書けば、引数を渡して操作できます。
このようにスクリプトから操作できると自作ラズパイスマートスピーカーでダイニングキッチンライトスイッチ切り替えサーボを音声操作するのも容易にできるようになります。
また、先の照明スイッチ用含め、ブラウザ版操作パネルをデスクトップ版操作パネルから呼ぶこともできます。