Kodaのアイコン画像
Koda 2021年05月16日作成
製作品 製作品 閲覧数 2500
Koda 2021年05月16日作成 製作品 製作品 閲覧数 2500

データをインテリアにする

データをインテリアにする

データを飾る

IoTやオープンデータの普及で、日々、様々なデータを見られるようになりました。
しかし、データが多いのも面倒です。毎日知りたいデータはスマホがなくても見たいです。

そこで、データをインテリアとして飾ることにしました。

デモ動画:降水確率のグラフを飾る

一例で、今日の6時間ごとの降水確率を、吊るした手まりで表示します。

ここに動画が表示されます

玄関に飾っておけば、傘を忘れません。

部品と材料

部品・材料名 個数
obniz Board 1Y 1
サーボモーターSG90 5
手まり2cm(大きいビーズや鈴でもOK) 5
ミシン糸 少々
有孔ボードと台(ダイソー) 1
木箱(ダイソー) 1
ブレッドボード 1
ジャンパーワイヤーやターミナルブロック 少々
単三×3電池ボックス 1

3Dプリントした材料

モデリング
サーボモーターを取り付ける台とビス。サーボホーン(8cm)をそれぞれ5セット3Dプリントしました。
見えない場所に使う部品なので、サーボホーンは割り箸で代用。サーボモーターはテープで止めでも良いと思います。

設計図:サーボモーターを5つ つなぐ

回路
サーボモーターのsignal(オレンジのコード)をobniz Boardの0~4ピンにつなぎます。
電源は単三電池×3本を利用し、サーボモーターとobniz Boardに供給します。

制作工程

ボードの裏
サーボモーターを有孔ボードに取り付けます。サーボホーンは0度の状態にして、偶数列の穴の上に来るよう配置します。
有孔ボードが裏返しのため、一番右がobniz Boardの0番と接続したサーボモーターとなります。※写真では間違って逆に取り付けてしまいました。0~4ピンのジャンパーワイヤーを逆に差し替えれば解決します。

箱詰めでほこり避け

箱詰め
長期間設置すると、ほこりが溜まります。obniz Boardや電池ボックスを箱詰めしましょう。配線の散かりも防げます。

手まりを吊るす

手まり刺しゅう前
発泡スチロールの球体に糸を巻き、ニスで固めれば簡易手まりになります。これだけでも可愛いと思います。吊るせれば何でもよいので、大き目のビーズや、鈴でも代用できます。

サーボホーンにミシン糸を通し、有孔ボードの穴を通した後、手まりなどを吊るします。

完成
糸の長さを調整します。後述のコードでサーボモーターを動かしながら、上限位置と下限位置を決めます。有孔ボードの上から2番目の行と、下から2番目の行の範囲で、手まりが上下するようにしました。

ソースコード

obniz開発者コンソールのリポジトリで新規作成ボタンを押し、「temari-graph.html」というWebAppを作成します。
ソースコードには下記を打ち込みました。
なお、天気予報は気象庁からJSONで頂いています。政府標準利用規約に準拠して利用できるとのことです。

temari-graph.html

<!DOCTYPE html> <html> <head> <script src="https://unpkg.com/obniz@3.14.0/obniz.js"></script> </head> <body> <div id="obniz-debug"></div> <script> const obniz = new Obniz("obniz-ID"); //気象庁 天気予報JSON取得 const callWeather = async () => { let res = await fetch( "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json" //東京 ); let resjson = await res.json(); return resjson[0].timeSeries[1].areas[0].pops; //6時間ごとの降水確率 } obniz.onconnect = async () => { const data = await callWeather(), max = 100, //グラフ縦軸最大値 min = 0, //グラフ縦軸最小値 //縦軸自動調整の場合 //max = Math.max.apply(null,data.map((o) => {return o.weight;})), //min = Math.min.apply(null,data.map((o) => {return o.weight;})), len = 5, //サーボモーターの数(=データ数) servos = []; //サーボモーターの角度を計算 const getDeg = (val) => { let x, //底辺(糸を引く長さ) y = 7.4, //斜辺(サーボホーンの長さ) h, //高さ a, //底角 b; //頂角(サーボモーターの角度) //糸の可動距離調整(必要あれば) val *= 0.67; //サーボ角度計算 x = (val - min) / (max - min) * y * 2; h = Math.sqrt(y ** 2 -x ** 2 / 4); a = Math.atan2(h, x / 2) * 180 / Math.PI; b = 180 - a * 2; //可動限界を超えないように b = 180 < b ? 180 : b; b = 0 > b ? 0 : b; return b; }; //サーボモーター作動 for(let i = 0; i < len; i++) { servos[i] = obniz.wired("ServoMotor", {signal:i}); servos[i].angle(getDeg(data[i])); await obniz.wait(1000); servos[i].off(); } //翌日深夜1時までスリープ let dt = new Date(); dt.setDate(dt.getDate() + 1); dt.setHours(1,0,0,0); obniz.sleep(dt); await obniz.wait(1000); if (typeof done === "function") { done(); } } </script> </body> </html>

サーバーレスイベント

サーバーレスイベント
最後にサーバーレスイベントに登録します。
obniz Boardがオンラインになったとき、先ほど登録したtemari-graph.htmlを実行するようにします。

これで毎日深夜1時に起動して、天気予報を更新したらスリープするようになります。省電力で長期間運用できるでしょう。

最後に

今回は降水確率を利用しましたが、様々なデータでも応用できます。必要なデータをインテリアにして、家を彩っていければと思います。
obniz Board 1Yだと電池で長期運用できるため、実用的になります。

6
Kodaのアイコン画像
元・手まり職人。手まりとIoTを掛け合わせ、後世に手まりを遺すことを目指す。
  • Koda さんが 2021/05/16 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する