木材の穴あけは木工用ホールソー

木材にちょっとした穴を空けるとき、木工用ホールソーを使うと簡単です。インパクトドライバーに取り付けることができます。

木工用ホールソー

私の持っている木工用ホールソーは、25mm~64mmの穴をあけられます。電動ドリルでは開けられないサイズの穴を空けたいときに使います。

ホールソーはホームセンターで売っており、Amazonでも1,000円くらいからセットで売られています。

インパクトドライバーに取り付け

ネジ回しなどで利用頻度の高いインパクトドライバーに取り付けられることが、ホールソーの良いところです。

わざわざ別の電動工具を用意せずに使えるので、作業がはかどります。

お勧めの工具の一つです。

水位レーザーセンサー制作過程

前回作ったobnizの水位レーザーセンサーについて、土台の制作工程を記載します。ただの一例で、手元にある材料で工夫して組み立てるのがベストです。

木の板を加工

obnizと、センサーを取り付ける土台を作ります。

適当な木材にホールソーで穴を空け、給水ボトルが通るようにします。

木材はobnizの幅で、カットします。

スペーサー設置

カットした木材にネジ穴を空け、スペーサーを立てます。

obniz+受光センサーを設置する場所と、対面のレーザーモジュールを設置する場所、2か所に2本ずつスペーサーを立てました。

ネジ、スペーサーはよく使うので、常備しておくと便利です。

obnizとセンサー取り付け

obniz+受光センサーをネジで固定。反対側もレーザーモジュールを固定します。

USBケーブルがモルモットのケージと逆側になるようにします。

ケーブルをかじられてしまうかもしれません。

GoProジョイントで三脚に接続

たまたま3DプリントしたGoProジョイントがあったので、木材の裏に取り付けて、三脚に接続しました。

もしフックがあれば、ケージにひっかけて固定する方法が楽だと思います。

水位レーザーセンサー試作品完成

obnizの配線やプログラミングは前回の記事を参照してください。

動作検証が済んだら、この土台は分解して、モルモットのかじり木としてあたえることとします。

obnizで水位を知るレーザーセンサー

モルモットの給水ボトル。水が少なくなったら通知する仕組みをobnizで作りました。水位センサーは使わず、レーザーと感光センサーを利用しています。

光の屈折で水位を知れる?

衛生面が気になり、水にセンサーを入れず、水位を知る方法を考えます。

方法としては、ボトルの重さを測ったり、画像認識で解析したり、光で測ったり・・・いくつかありそうです。

今回は最も簡単そうな、レーザーと感光センサーを用いる方法を試します。

光の屈折を利用します。

水が入っている状態のボトルでは、レーザーが屈折して、感光センサーに光が当たらないようにします。

そして水がなくなったら、レーザーが直進して感光センサーが反応するようにします。

水位確認レーザーセンサー

目論見通りに水位を測れるか、まずは試作してみます。

obniz、レーザー、受光センサー、そして家にあった木材やネジで組み立てました。

レーザーは水位を測る時、瞬間的に照射すればよいので、通常はOFFにしています。

タイマーで10分毎にレーザーを放ち、計測するようにしました。

ボトルの水がなくなったとき

実際の挙動です。ボトルの水が少ない状態。

レーザーを0.1秒照射して赤く光った後、ブラウザに「水がないよ!」という通知が来ました。

ちなみに音声で「水がないよ!」と、しゃべっています。

水を補充したら

今度はボトルに水を入れた状態です。

レーザー照射後、ブラウザの表示が「水あるよ」に戻りました。

obnizの配線とコード

obnizボードの配線は下記のようにしました。

IO 6ピン・・・レーザーVCC
IO 8ピン・・・レーザーGND
IO 9ピン・・・感光センサーVCC
IO10ピン・・・感光センサーGND
IO11ピン・・・感光センサーデジタル入力

試作したHTMLでは、音声通知にWeb Speech APIを使っています。

実運用ではブラウザのタイマーより、obnizのサーバレスイベントに登録して実行したほうが良いでしょう。

ただ、サーバレスイベントだと当然、Web Speech APIは使えません。

代案として、IFTTTで水が少なくなったらLINEに通知する方法や、obnizボードに直接ブザーを付けて鳴らす方法などが考えられます。

自分のライフスタイルに合わせ、気づきやすい方法で知らせるのが良いかと思います。

モルモット自身も教えてくれる

最後に余談ですが、モルモットは何か欲しい時、「キューイ!キューイ!」と大きな声で鳴きます。

在宅中はブザーがなくても、水がないことをモルモット自身が教えてくれるかもしれません・・・。

obniz レーザー遮断センサー(短距離タイプ)

obnizでレーザー遮断センサーを作りました。以前も遮断センサーを作ったことがありますが、今回はジャンパーワイヤーが届く短距離で、より簡単に作ります。

レーザーモジュールと感光センサーモジュール

レーザー遮断センサーを作るときは、レーザーモジュールと感光センサーモジュールを利用したほうが楽です。

光センサー(Cdsセル)やレーザーが基盤にのっかているモジュールで、obnizに直接挿したり、ジャンパーワイヤーを使えたり、抵抗を付ける必要がなかったり、圧倒的に開発が簡単になります。

レーザー遮断センサーの挙動

感光センサーにレーザーが当たったら「true」、当たってなかったら「false」をブラウザで受け取るようにしました。

遮断センサーを作る場合、感光センサーがレーザーを常に受光するように固定します。

何か障害物によってレーザーを遮断すると、プログラムが実行する仕掛けとなっています。

感光センサーモジュールは受光感度を調整可能

もし、レーザーを当てなくても、部屋の明かりで感光センサーが反応してしまう場合、ドライバーで青いボックスのネジを回すと、光の感度を変更できます。

手軽に調整できるのが、感光センサーモジュールの良いところです。

遮断センサーのコード

obnizを利用した遮断センサーのコードです。

受光センサーモジュールをIOピン0~2、レーザーモジュール3~5に挿しています。

上記HTMLにobnizIDを入れて、適当なHTML名で保存してブラウザで起動すれば、遮断センサーの出来上がりです。

天気予報をHueでお知らせ

2つのスマートライト「Hue」で、天気予報をお知らせします。天気情報はOpenWeatherのAPIを使っています。

OpenWeatherのAPIの用意

天気情報を取得できるOpenWeatherのAPIがあります。アカウント登録をすると無料で天気データのJSONを受け取ることができます。(1分間に60リクエストまで)

アカウント登録方法、各種設定についてはネット上に多くの情報があり、ここでは多く書きません。

今回は東京の3時間ごとの天気予報を、下記URLで取得します。

http://api.openweathermap.org/data/2.5/forecast?id=1850147&units=metric&cnt=2&appid=<取得したid>

  • id=1850147が東京
  • units=metricは摂氏で温度取得
  • cnt=2で3時間ごとに天気予報データを2件取得。

私はあまり出かけないので3~6時間後の天気を知れればそれでよいです。

3時間ごとの天気予報をHueでお知らせ

JavaScriptで定期的にAPIを呼んで、天気予報をHueの色に変換して伝えます。

  • 快晴・・・オレンジ
  • 晴れ・・・薄めのオレンジ※1
  • 曇り・・・白っぽいオレンジ※1
  • 雨・・・水色※2
  • 雪・・・白っぽい紫
  • その他(竜巻とか砂埃とか)・・・白

※1 雲が多いほど彩度・明度が下がり、白っぽく暗くなります。
※2 降水量が多いほど彩度・明度が上がり、鮮やかで明るい水色になります。

HueをjQueryで操作する

動作はブラウザとローカルのHTMLファイルで、簡単に試せます。

jQueryでHueを操作する方法はこちらをご確認ください。

もし、稼働しっぱなしのPCやラズパイがあれば、setintervalなどで定期的に上記JavaScriptを実行することで、天気予報のHueライトが更新されていきます。

jQueryでHueを制御する

スマートライト「Hue」。ローカルのブラウザでjQueryを使って簡単に操作できます。やってみれば簡単ですが、毎回やり方を忘れて調べることになります。また、HueにjQueryを使おうとする記事がほぼないので、ここに書き留めます。

Hueをローカルで制御する準備

前程として、Hueブリッジが必要です。また、公式アプリでHueライトの動作確認が済んでいる状態で話を進めます。

Hueをローカルから制御するには、HueブリッジのAPIを発行します。

http://0.0.0.0/api/XXXXXXXX/lights/1/state/

上記のようなアドレスに、{“on”:true} というようなJSONを送ると、ライトがONになります。

まずはHueブリッジのIPアドレスを調べます。

https://discovery.meethue.comへアクセスすると、”internalipaddress”:”0.0.0.0″というような、HueブリッジのIPアドレスが表示されます。

ここから先は、公式ページのHow to develop for Hue? Step 3に沿って進めたほうが確実です。

Googleページ翻訳でだいたい意味は分かり、このページに沿って設定するのが最速でした。

1点だけ、途中にHueブリッジの物理ボタンを押す必要があるので、注意が必要です。PCの画面のボタンではなく、ブリッジのボタンです。

Go and press the button on the bridge and then press the POST button again and you should get a success response like below.

jQueryでPUTすればよい

APIを発行出来たら、{“on”:true} というようなHueライトの状態を書いたJSONをPUTします。Web制作でPUTメソッドを使う機会はほぼなく、ブラウザによっては問題が起こりそうなので、jQueryに頼ります。

適当なHTML(test.htmlなど)をローカルに作りましょう。

13行目のurlは、先ほど調べたAPIのurlに書き換えてください。

また、もしHueライトを複数持っている場合、/lights/の後の数字を変えてみてください。Hue公式アプリで登録順に数字がふられていると思います。一つしかなければ/lights/1です。

書き換えが完了したら、このHTMLをブラウザで開きます。

するとHueライトが赤色に変わります。

APIにJSONをPUTするだけ。分かってしまうと、簡単です。

ブラウザのJavaScriptで、自由にライトを操作できるようになりました。

setIntervalのズレ(ラズパイ3のブラウザで確認)

10分間隔でスプレッドシートに温度・湿度を記録するJavaScriptを作りました。しかし、なぜか途中から5分前後の間隔で記録されています。ラズパイ3のブラウザでsetInterval()を使ったときに起こりました。

ブラウザで定期的に動作

温度センサーで取得した値を、obniz経由でラズパイ3のブラウザChromiumに表示させています。

タイマー処理はラズパイのブラウザ上で動作しています。

ブラウザのJavaScriptで、10分間隔で何か実行する場合、下記のような記述方法があります。

setInterval()で、10分(=600,000ミリ秒)ごとに実行する書き方です。

3時間後、タイマーが狂う

ラズパイを放置していたら、3時間後に突然大きなズレが発生していました。ちなみにラズパイはディスプレイをつないでいない状態です。

冒頭のスプレッドシートを再掲します。

開始3時間は10分間隔でしたが、その後5分前後の間隔になっています。

理由は分かりません。

ラズパイ3か、ブラウザが省電力モードに入ったのかもしれません。

処理速度が落ちて間隔が伸びるのかなと考えていましたが、逆に縮まるようです。

決まった時間に処理実行

解決策として、現在時刻の分が10で割りきれる数(例えば1:00, 1:10, 1:20, 1:30, 1:40, 1:50)の時だけ実行するようにします。

1分間に2回処理しないよう、前回から分が変わっている時だけ実行するようにしました。(もっと良い書き方があるかもしれません。)

このコードであれば、3時間以降でもだいたい10分間隔で実行してくれます。

ラズパイのブラウザを起動しっぱなしで温度を記録しようとするのはレアケースだと思いますが、参考になる人がいれば・・・。

obnizで温度・湿度センサー「SHT20」を使う

obnizのパーツライブラリにある温度・湿度センサー「SHT20」。パーツライブラリ以外にあまり情報がないので、起こったトラブルとその対処法を記録に残します。

温度・湿度センサー「SHT20」購入

SHT20は、Amazonで900円くらいで買えます。

ピンのはんだ付けは必要でした。

パーツライブラリのコード調整

SHT20のピンは4本ですが、サンプルコードでは6本指定があります。

adrとaddressmodeは、指定しなくても問題なく動作しました。

たまに出るエラーに注意

温度、湿度を定期的に取得していると、たまに下記のエラーが発生します。

i2c0: writing error. Communication Failed. Maybe, target is not connected.

エラーは大きく2パターンあり、数値を取得できない場合と、-2で取得する場合です。

特に気温-2度は、ありえる数字なので要注意です。

エラーの対処法

使う場面で対処は異なりますが、今回はエラーや不正値の場合、前回の値を代入する対処とします。

sensor.get・・・でエラーがでたら前回の値代入。

これだけでは解決せず、-2と取得することがあります。

センサーで取得する気温や湿度の値は、少数点15位くらいまであり、-2ピッタリになることはまずありえません。

もし、-2だった場合も、前回の値を代入することにしました。

追記:超高温・高湿度エラー

まだエラーが発生しました。

まれに、気温が「53.1℃」とか、湿度「96.8%」とか、異常に高い数値を取得してしまいます。

window.onerrorで、ブラウザがエラーを感知した時、前回の値を代入するように追記して、様子をみます。

obniz常時稼働にラズパイを使う

obnizとリレーモジュールの組み合わせで、遠隔で家電を操作する仕組みを作りました。しかし、操作画面のブラウザを閉じたら、obnizの動作が停止し、家電の電源が切れてしまいます。苦肉の策でラズパイを導入しました。

家電の電源を保持できない

スマホで、ホットカーペットと加湿器を、ネット経由でONにできます。

しかし、操作画面のブラウザを閉じたり、スリープになると、リレーモジュールへの通電が止まり、家電の電源が落ちてしまいます。

ブラウザを常時起動

電源が落ちないようにする方法を考えなければなりません。

このプロダクト、最終的には24時間稼働して、温度・湿度センサーにより、自動でホットカーペットと加湿器の電源をON/OFF切り替えようとしています。

常時稼働はいくつか方法がありそうですが、暫定的に、ラズパイのブラウザを起動しっぱなしにする方法をとりました。最も簡単です。

スマートではないですが、これでobnizが常時動作してくれます。

obnizを使わず、ラズパイだけでよかったのでは・・・と、考えてしまいますが、開発の早さでobnizを愛用してしまいます。

obnizで電源タップのリレーBOX

リレーモジュール付き電源タップを2つobnizにつなぎ、インターネット経由で家電のON/OFFを操作できる仕組みをつくりました。ほこりがかぶらないよう、ガラスのふた付き木箱に入れています。

木箱に穴を空ける

ダイソーの100円木箱を使っています。木工用ホールソーで、電源タップを通す穴を空けます。(子供がやる場合、十分注意してください。)

左右2つずつ、計4つの穴を空けました。

リレーモジュールのスペーサー取り付け

リレーモジュールを浮かせるため、スペーサーを取り付けます。

木箱に直接取り付けるより、別の木の板を用意したほうがお勧めです。

作業がしやすく、失敗も許されます。

ダイソーの木の板(MDF材 6枚入り)を用意し、裏から穴を空け、スペーサーをねじ止めします。

ネジ穴と、ネジ皿が入る穴を、2段階で開けると良さそうです。

ネジ皿用の穴は、途中まで掘り、木材の面からネジ皿が飛び出ないようにします。

電源タップリレーモジュールを取り付け

スペーサーに電源タップリレーモジュールを取り付けます。

2つの家電を操作したかったので、2組取り付けました。

obnizとリレーをつなぐ

obnizとリレーモジュールを、ジャンパーワイヤーでつなぎます。

単純につなぐと、6つのIOピンが必要ですが、VCCとGNDを2つのリレーで共用すると、4つで済みます。

小さいブレッドボードを木材に取り付け、配線します。

obnizのIOピンは、以下のように挿しています。

VCC・・0
GND・・1
リレーその1-SIG・・2
リレーその2-SIG・・3

IOピン2、3に電流を流すと、リレーがON/OFF切り替わります。

リレー制御コード

obnizコンソール、デフォルトのHTMLを少しいじっただけです。

“obnizID”のところに自分のIDを入れ、適当なブラウザで立ち上げると動作します。

配線整理

最後に、少し配線がこんがらがって、電源タップの導線もむき出しで危なかったので整理しました。

obnizに挿すジャンパーワイヤーは、4本つづりのものに替え、電源タップの導線には、絶縁テープを巻いています。

テスト実行

地味な変化で分かりにくいですが・・・スマホで2つの家電のON/OFFを切り替えることが出来ました。