シェアハウスの乾燥機の使用状況をサイネージに出すシステムを作った話
はじめに
現在入居しているシェアハウスでの暮らしはなかなか快適ですが、大人数で暮らす故の不便があります。
それは洗濯機、乾燥機といった生活家電の使用状況。
シェアハウスは4階建ての一軒家で、洗濯機と乾燥機が1Fに置いてあるのですが、3F以上にいると、洗濯機と乾燥機の使用状況が音でわからないので不便を感じていました。
洗濯物を入れた籠を持って1Fまで降りると使用中。仕方ないのでしばらくしてから行くと、他の人が直後に使用開始といった状況に何度も直面することになります。
ちなみに同様の問題は1Fの浴室の使用状況にもあるため、住人により使用状況を表示するIoT機器が設置されており、最近デジタルサイネージ(掲示板としてモニターを設置している)に変更されました。
ならばこのデジタルサイネージに乾燥機の稼働状況を表示することができれば、何度も下に降りる必要が無くなるのではないかと考え、自身のレベルアップも兼ねて作成してみることにしました。
機器の構成
とりあえず機器の構成は、以下を目的として考えました
まず第一に乾燥機の稼働を検出できること
これはCTセンサで電流を検出することにしました。
相手はAC100Vという高電圧かつ300W、つまり3Aもの大電流です。
これに自作の電子回路を接続する勇気はちょっとありません。
そこでCTセンサを用いることで非接触で測定します。
このセンサーをAC100Vの1本に咬ませて、2本の線の間に負荷抵抗を取り付ければ、端子間に電圧が発生するようになります。
問題は周波数が50Hzであり、発生する電圧も相当に小さいということです。
負荷抵抗10Ωで30Aを流すと0.1Vが発生するとなっています。
負荷抵抗を100Ωにすれば3Aで0.1V程度が生じるはずです。
これをマイコンで検出することにします。
第二にインターネットに接続することで、ブラウザから監視できること。
そこで、安価でインターネットに接続できるマイコンボードとして、ESP32の開発ボードを使用することにしました。
さて、CTセンサーで検出した電流ををESP32のADCに放り込むことができれば、そのまま検出できるかもしれません。しかし、気になるところがありました。
それは、この機器の汎用性です。乾燥機は相当な大電力を使用するので、ESP32のADCでも問題なく検出できるかもしれません。しかし、それ以下の電力の機器では動作するのでしょうか?
いろいろ調べた結果、下のようなリンクを見つけました。
おそらく乾燥機なら問題無く動作するでしょう。
しかし消費電力が少ない機器でも動作してくれると、量産して他の機器にも使用することができるようになります。
それに、どこまでの低電流を検出できるのか挑戦してみたいところでもあります。
そんなわけでシェアハウス住人に相談したところ、100V1Wの電球を借りることができました。なんと消費電力0.01Aです。この電流を検出することができるのならば、大抵の機器の稼働を検出できると思います。
そこでI2C接続故に速度は遅くなりますが、専用のADCを使用することで、この問題を解決しようと思います。
とりあえずADコンバータを利用して電流を検出し、フィルタにかけてスパイクを取り除くことで、機器の動作を非接触に検出できるようになりました。
そこで、まず最初に考えたのは、以前Qiitaに書いたこの記事を使ったシステムです。
HelloWorldを出せるのだから、AC100VのONOFFを画面に出すこともできるはずです。
実際にこれは成功し、ブラウザにIPアドレスを打ち込むことで、テキストでONOFFを表示させることができるようになりました。
動作状況をわかりやすくするために、インジケーターとしてその辺に転がっていたLEDをとりつけています。
筐体の作成
さて、乾燥機はシェアハウスのガレージに置かれています。
風雨は避けられますが、回路はむき出しですから何らかの防塵防滴処理が必要になります。
回路用絶縁用筐体
まずは回路を保護する筐体を、動作確認用LEDの点灯を確認するために透明なプラケースで作成しました。
プラケースにセンサ用の穴をあけ、基板はホットボンドで取り付けています。
回路の電源・あと工具類
回路の電源はUSBコネクタ付きのタップ(秋葉原にてジャンク品として購入)を使用するので、
コンセント→ケーブル→タップ→ケーブル(CTセンサー付き)→乾燥機
という構成になります。ケーブルの両端は再利用性等も考慮して、秋葉原のガード下で購入したコンセントプラグを使用し、その作成に圧着端子を使用するので、圧着工具と端子購入しました。
ケースを加工するのには、超音波カッターを利用しました。プラスチックが刃先で溶けていってサクサク加工できます。
相当にかさばる構成ですが、100Vをはんだ付けと素人工作の絶縁で運用する勇気はありませんでした。
装置全体の筐体
これらを格納できる容器として、タカチ電機工業のプラスチックケースを使用しました。
www.sengoku.co.jp
さらに、ケースとケーブルの間で断線が生じないようにコードプロテクターを入れます。
www.takachi-el.co.jp
こうして格納した写真がこのようになります。
これでとりあえずガレージに設置できる防塵、防滴のケースが完成しました。
ハードウェアの反省
とりあえず反省点としては
- USBの電源系統が5V電源とUSBケーブルを含めて嵩張っている
- 基板と絶縁用のケースが嵩張っている
- コードプロテクターの穴の開け方を間違えた
あたりが挙げられます。
- USBの電源系統が5V電源とUSBケーブルを含めて嵩張っている
これは市販のUSBポート付き電源とケーブルをそのまま流用したためです。ケーブルを切り詰めたり、電源を100VAC-5VDCの回路にしてUSBを用いずに電源を供給する等の手段で相当な容積を節約できたはずです。
- 基板と絶縁用のケースが嵩張っている
これは開発用のESP32基板を使用したためです。ESP32を内蔵したコンパクトで筐体が付属しているマイコンボードであるM5StackやM5StackCを活用すれば、よりコンパクトに設計することができたと思われます。また液晶がついているので、インジケーターとして活用すれば、デバッグ等も容易にできたと思われます。
ESP32の開発ボードは1000円という価格が魅力的ですが、インジケーターとしてのLEDや外部回路等を取り付け、回路自体の絶縁等も考える必要が出たせいで大きく回路が嵩張り、ケース等のコスト上昇を招くことになってしまいました。
- コードプロテクターの穴の開け方を間違えた
これは単純にミスです。コードプロテクターを千石電商の店頭で見つけて購入し、そのまま考えなし取付ようとしたため、嵌めることができなくなり、グルーガンで固定することになりました。
フロントエンドとバックエンドも作る
ネットワーク内のIPアドレスにアクセスすれば、接続された機器のONOFFを知ることができるというシステムは完成しました。
しかし、シェアハウスのサイネージでは、この方法は使えませんでした。
私はシェアハウス内にサイネージ用のサーバを置いていると予想していたのですが、どうやらサイネージへの組み込みに関してサイネージ製作者に聞いてみると、少し事情は複雑でした。
現在シェアハウスのネットワーク事情は各種機器を接続し続けたため、混沌としたものになっており、同一ネットワーク内のIPアドレスからの読み取りでは問題が発生する可能性が高いとのこと。
そういった事情も鑑み、現在のシェアハウスのサイネージシステムはGoogle firebase上にシステムを置いており、firebaseでデプロイした各種情報のWebサイトを表示しているというのがサイネージの仕組みでした。
要は乾燥機の稼働を検出する機器だけではなく、フロントエンドとバックエンドの両方を作る必要があったわけです。
まずはマイコンとバックエンド
そんなわけで、バックエンドとして、FirebaseのRealtimeDatabaseにESP32から送信したデータを保存するプログラムを次のリンクを参考に作ってみました。
Firebase RealtimeDatabaseに乾燥機のONOFFの状況を30秒毎に送信してやれば、実用上は問題ないはずです。
データベースからデータを読むフロントエンド部分
フロントエンド部分は次の動画の001~006を参考に、Reactで作っていきます。
https://www.youtube.com/watch?v=JchsQRonmk8&t=27s
動画ではCloud FireStoreを使用しているので、RaltimeDatabaseに合わせて、データの取得方法を変更します。
このコードはRaltimeDatabaseのイベントをリッスンしており、データの初回読み取り時、そしてデータが変更されると登録された関数を起動させます。
ここでつまずいたのは非同期処理の扱いです。
最初はfunction App()内にfirebase.database.Referenceインスタンスを生成して、onメソッド内にreturnを入れて、データベースからデータが返ってきてからHTMLをreturnすればいいと思っていました。
しかし、このコードでは
Firebase: Firebase App named '[DEFAULT]' already exists (app/duplicate-app).
というエラーが表示されてしまいました。
これはどういうことかというと、ReactとしてはreturnでHTMLを返したいのですが、いつまでたってもHTMLが返ってこないものだから、これは正常に動きませんねとエラーを出しているわけです。非同期処理なので、ちゃんとGoogleのデータベースに問い合わせは行われているのですが、Reactからすると問い合わせは遅すぎるのです。
これは非同期処理をしっかりと理解できていないせいでした。
ここで重要なのはまず表示して、後から書き換えるというjavascriptの勉強をやっていると必ず触れる初歩的な技術でした。
まずデータベースに問い合わせを行い、データが届くまではNow Loading等の情報を表示させる。そしてデータが届いたらonメソッドでDOMをidで取得して書き換えるというのがエラーが出ない実装方法でした。
これでデータベースの値の変化にリアルタイムに反応して、ページの表記を書き換えるコードが完成しました。
テストしてみると次のようになります。
基板のインジケーターのLEDが通電状況を検出し、それに合わせて画面の文字が「乾燥機停止中」から「乾燥機稼働中」に、「乾燥機稼働中」から「乾燥機停止中」に変わります。
フロントエンドのブラッシュアップ
実際は文字だけだと味気が無いので、画像を変更するようにします。
画像はいらすとやの乾燥機の画像、
背景はSubtle Patternsを使用し、
ステータスの文字に関してはPowerPointで図形を作って画像として保存しました
これらを組み合わせることで、以下のようなフロントエンドが完成しました。
まず画面には、データベースに乾燥機の運転情報を問い合わせているというステータスの画像が表示されます。
乾燥機が停止しているというデータをデータベースから読み取った場合には、ステータス画像が乾燥機が停止中であることを示すものに変更されます。
乾燥機が使用中であるというデータをデータベースから読み取った場合には、ステータス画像が乾燥機が使用中であることを示すものに変更されます。
このとき、乾燥機の画像が0.5秒毎に±10°幅で傾くことで、乾燥機の動作がわかりやすくなります。これは画像の角度を記録した配列を作り、タイマーで0.5秒ごとにdryingMachinePicTimerTickを呼び出すことでstyle.transformの角度を変更します。
稼働中にはタイマーを起動、停止を検出したらタイマーを停止して角度を0度にするという実装で、アニメーションは問題なく動きます。
恐らくReactには他のモダンな方法があるのかもしれませんが、現時点で実装するにはこれが一番現実的なので、このように実装しました。
実機での調整
さあこれで完成しました。
早速乾燥機に接続してやってみましたが、これが上手くいきません。
0.01Aを検出できるようにしたのが仇になったのか、僅かなノイズを拾って停止時にも稼働しているという信号を送信してしまいます。仕方ないので、寒空の下、電流検出の閾値を、実機で調整することで対応します。
最終的に乾燥機の動作情報を問題無く拾えるようになりました。
動画が白飛びしてしまっているのが反省点です。
製作を振り返って
ようやく実用までこぎつけることができました。
シェアハウスのデジタルサイネージに組み込まれれば、乾燥機の稼働状況をいつでも確認することができるようになります。
ただ、実際に作ってみると現時点で問題がいくつかあります。
- 筐体がやたらと大きい
- 基板側で稼働検出をするので、機器内部の閾値変更等の手間がかかる
このあたりでしょうか。
- 筐体がやたらと大きい
電源をコンセントやUSBタップで取り扱い、基板も絶縁用の筐体に入れ、センサ自体も大きなものを使用しているので、機能の割にはずいぶん筐体が大きくなりました。おそらく専用の基板等を使用すれば、コンセントのタップ程度に小さくなるでしょう。
ただその場合はAC100Vを取り扱うことになるので、安全性が問題になります。
- 基板側で稼働検出をするので、機器内部の閾値変更等の手間がかかる
当初はESP32にサーバの役割もやらせるつもりだったので、機器の動作検出機能をESP32側に組み込んでしまいました。
しかし最終的にFirebaseにデータを送信するようになったので、動作を検出する意味が無くなってしまいました。要は電流を計測して、その値をそのまま送信してやることで、フロントエンド側でONOFFの判定をすることができるはずなのです。途中でシステムを変更したので、マイコン側での動作検出機能は余計なものになってしまいました。
フロントエンド側で検出するのなら、他の機器に使用する際の閾値の調整等が容易になるので、これは今後同様のシステムを組む際の改善事項だと思います。
今回の制作ではI2Cやfirebase、Reactといった様々な技術に触れることができたので、その点では大きな進歩になったと思います。
シェアハウスの指紋認証鍵のシステムにちょっと携わった話
はじめに
現在入居しているシェアハウスでドアの施錠をどするのかという問題が持ち上がり、スマホから操作できるスマートロックのSESAMIが導入されました。
しかし問題が発生しました。
スマホを一々出してアプリを起動させて鍵を開けるのが面倒なのです。
そこでSUICAや指紋認証を利用して開錠するシステムを作るプロジェクトが立ち上がり、その一端に携わったのでここに記録として残します。
どんなシステムなのか
まず指紋センサーとして選ばれたのはこのセンサーです。
このセンサーとM5stackを組み合わせ、認証情報をシェアハウスのサーバーに送信し、スマートロックを操作します。
どの部分を担当したのか
指紋認証システムのマイコン用ライブラリの移植とセンサ筐体を作成しました。
配布されているライブラリはArduinoUno系専用のため、ESP32を使用しているM5Stackで使用するにはライブラリを書き直す必要がありました。
さらにM5Stackとセンサを取り付ける筐体を作成する必要がありました。
具体的に何をしたのか
指紋認証システムのライブラリ移植
これに関してはqiitaに記事を載せました。
まずはデモソフトを使ってセンサ自体の動作を確認します。
そして開発完了をVScodeに移します。
配布されているライブラリを書き換えて完了します。
筐体の作成
筐体はFusion360を使ってモデリングし、DMM.makeに発注します。
指紋センサのモデリング
指紋センサをモデリングします。
データシートに寸法があるので、そこからモデリングしていきます。
基本的に平面で構成されているので、簡単に完成しました。
M5stackの3Dデータのダウンロード
M5stackの3Dモデルを公開されている方がいたので、ダウンロードさせてもらいます。
このモデルはM5stackの筐体だけなので、厚みを測ってベース部分を作成します。
これで部品が揃ったので、筐体をモデリングします。
筐体のモデリング
まずパーツをいい感じに並べます。
そこから以下の条件で形状を詰めていきます。
- 電源はUSBケーブルで供給するので、側面にUSBケーブル用の穴をあける
- 蓋をつけると構造が複雑になり、はめ合い等も面倒になるので、単体の筐体にする
- M5stackをネジや接着剤等を使わずに固定できる
- プリント代節約のため、可能な限り小型の筐体にする
- M5Stackとセンサーを接続するケーブルを考慮する
- 筐体は壁面に両面テープで接着する
- M5stackは画面やボタンを使えるようにする
この辺を考えて試行錯誤するうちに、下の画像のようなモデルができました。
上の部分からM5Stackを差し込みます。
裏面は下のようになっています
ケーブルを通す空間を作り、ケーブルのソケットをM5Stackの抜け止めにします。
ケーブルを通す空間の寸法は、ソケットを抜き差しすることを考えて決めました。
側面にケーブル用の穴と、電源ボタンを棒で押すための穴をあけておきます。
厚みはDmm.makeに発注する際の3Dデータのルールを参考に、0.8mm以上としますが、見栄えも考慮して2mmとしました。
DMM.makeに発注
上京する際に3Dプリンターを置いてきてしまったので、DNN.makeに発注することにしました。
DMM.makeにstlデータをアップロードして、データに問題が無いことをチェックしてもらった後、素材を選択して発注します。素材は安価なナイロンです。コストは総額で2600円程度でした。
注文から製造開始まで1日、そこから発送まで4日でした。
3Dプリンタの設定でハマると1週間かかったりすることもあるので、これは早いです。
表面はザラザラしていますが運用上問題ないのでこのままです。
センサーの固定にはショート防止のため、プラスチックネジを使いました。
裏側のケーブルのコネクタを取り付けるのに苦労しました。
データ上では問題なく取り付けることができるはずだったのですが、ケーブルが後ろに生えることを失念していたのでキツくなってしまいました。
ここまでが担当でしたので、筐体はソフト担当の人に引き渡しました。
この後、指紋認証システムは完成し、現在シェアハウスで運用中です。
所感
・ライブラリは一見して複雑でしたが、一つずつ要素を分解して整理していくと想像以上にシンプルでした。面倒くさがらずにまず紙等に書いて整理してみると俯瞰できます。
・コネクタの取り付けが難しかった点に課題が残りました。
秋月電子通商のステッピングモーターを回してみる その3
前回
前回はステッピングモーターのホイールユニットを作りました。
しかし、このシステムには問題があります。
それは
ドライバが大きいこと
この回路滅茶苦茶に大きいんです
akizukidenshi.com秋月電子通商のステッピングモーターSPG27-1101と、公式で推奨している学習用のPICドライバキットなんですが、学習用にディスクリート部品だらけなせいでかなりデカいんです。
以前作ったArduinoを使ったXBeeコントローラーの基板と同じ位に大きくかさばります。いくらなんでもこれは使い勝手が悪すぎるので、コンパクトなドライバ無いもんかなと探してみたらありました。
ここを参考にちょっとやってみようと思います。
A4988モジュールというものです。Amazonにも売ってました。
5個セットで990円と言うのはかなり安いです。
このモジュールは3Dプリンタのバイポーラステッピングモーター制御用のキットです。
秋月のステッピングモーターはユニポーラーですが、線の繋ぎ方を変えるだけでバイポーラステッピングモーターとしても機能します。
参考になるURLがあったので載せておきます。
www.mechatroidea.comコイルの中間にある線Cを無視すれば機能させることができます。
まずはタクトスイッチで動かしてみます。
秋月電子通商のステッピングモーターSPG27-1101を回してみる その4
動きましたが脱調しているようです。恐らく、タクトスイッチのチャタリングをA4988が拾ってしまっているようです。
モータが駆動できるパルスの周波数を、チャタリングの周波数が超えてしまっているせいだと思われます。
次はArduinoにパルスを送らせてみます。
秋月電子通商のステッピングモーターSPG27-1101を回してみる その5
特に問題なく正転、逆転をすることができました。
これでこのコンパクトなモジュールを使ってステッピングモータを操作することができるようになりました。
秋月電子通商のステッピングモーターを回してみる その2
前回
ちょっと思いついたのでギヤで減速したホイールユニットを作ってみます
まずはステッピングモーターのモデリング
データシートを見ながら、Fusion360でゴリゴリ作ります
そんなに複雑な形状ではないので、時間をかけずにできました。
これに組み合わせるギヤはFusion360のアドインで作りました
ギヤを作ったら、ギヤにあわせてホイールも作り、ギヤとホイールを接続します。
ホイールにはミゾを付けて輪ゴムを取り付けることで滑り止めにします。
車輪の軸はボールベアリングを使おうかと思ったのですが、以前何かで見かけたネタをやってみます
軽量な軸受を作るために、近所のホームセンターで見つけたスチールシャフトとジュラコンブッシュを組み合わせて使います。
シャフトは直径4mm、長さ40mm
ジュラコンブッシュは穴直径4mmのものを使用します。
ジュラコンブッシュはとても滑りが良いプラスチックでできているので、軸受けに使うことでボールベアリングよりも軽量にできるというわけです。
後はモーターとシャフトを固定できるようにフレームを作ります。
組み立てができるように注意します。
そして3Dプリントして組み立てるとこのように動作します。
これにて目標達成です。
秋月電子通商のステッピングモーターSPG27-1101を回してみる その3
しかし、このホイールユニット、ギヤの動作は問題無いように見えるのですが、実はモーターをフレームに取り付けるネジを締め過ぎると回りにくくなります。
これはギヤの間隔がかなり詰まっているので、3Dプリントした際の誤差のせいでかみ合いが悪くなってしまっているのです。
実用する際にはギヤのクリアランスを考える必要がありそうです。
また、今回ホイールの摩擦のために輪ゴムを使用しましたが、実際はフレキシブルフィラメントを使用したほうがより完成度が高かったと思います。
秋月電子通商のステッピングモーターを回してみる その1
秋月のステッピングモーターを回してみます。
この二相ユニポーラステッピングモータを、公式で推奨している
akizukidenshi.comで回してみます。
まあドライバはキットなので部品を説明書通りに配置してハンダ付けすれば問題なく組みあがります。
モーターとドライバはQIコネクタで接続しています
電源を投入してみます
・・・回りません
振動するだけです
仕方ないので テスター片手に不良箇所を探します
しばらく探してようやく見つかりました
QIコネクタの圧着が不十分でした
取扱説明書の「トランジスタが壊れると回らなくなる」という記述を見てトランジスタを交換したりしてみたんですが、結果は単純な圧着不良でした。
これからはこういった部分は真っ先に確認するようにすべきですね。
秋月電子通商のステッピングモーターSPG27-1101を回してみる その2
3Dプリンターでロボット作ってみる 多脚ロボット編 37 コントローラを改良します3(完結)
前回 コントローラーの筐体を設計しました。
このロボットの3Dデータは下のリンクのものを使用しています
前回設計したパーツの出力にかかる時間は合計で15時間
プリンターの稼動音の関係で昼間しか動かせないので、結局2日かかりました。
3Dプリンターでロボット作ってみる 多脚ロボット編 37 コントローラを改良します3 その1
実際に組み立ててわかったことがあります
ボタンがひっかかって押せません
ボタンの穴はドリルを使って整えたのですが、マージン0.1mmというのは流石に狭すぎたようです。
こういうときの対処は簡単です
動くように修正すればいい!
まずこれが修正前のボタン
そしてこれが修正後のボタン
穴とボタンに0.5mmのオフセットをさせました。
これなら動くはずです。
ボタンがくるくる回転しないようにつけた裏側の六角形も0.5mmオフセットをさせました。
これで組み立てるとしっかりと動くようになりました
3Dプリンターでロボット作ってみる 多脚ロボット編 37 コントローラを改良します3 その2
完成したコントローラはこんな感じです
まず表
ネジが目立ちますが、とりあえずこれでよしとします。
そして裏
こちらもネジだらけです。
基板固定、電池固定、カバー固定で随分とネジを使いました。
これにて、多脚ロボット編 は完結です。
割としっかりしたロボットとコントローラーを作れたので満足しています。
3Dプリンターでロボット作ってみる 多脚ロボット編 36 コントローラを改良します2
前回 コントローラをモデリングして、試作部品を3Dプリントしました。
このロボットの3Dデータは下のリンクのものを使用しています
前回の試作でコントローラの改良をどうやって進めていくのか見通しが立ったので、改良版モデルを作りました。
前回作ったCADデータにねじ留め部分を追加し、各スイッチにパーツを追加しました。
上に被せるカバー部分は結構な大きさになりました。
3Dプリント時間を試算してみたところ、このカバーだけで8時間かかることがわかりました。
完成時から動かしても深夜にプリンタの稼動時間がずれこみそうだったので、今日はプリントは無しです。